Skip to content

Commit 70053bc

Browse files
author
Di Wu
committed
Adding having clause and tests
1 parent 8cba3ac commit 70053bc

4 files changed

Lines changed: 74 additions & 24 deletions

File tree

lib/dialect/postgres.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Postgres.prototype.visit = function(node) {
3939
case 'ORDER BY' : return this.visitOrderBy(node);
4040
case 'ORDER BY COLUMN' : return this.visitOrderByColumn(node);
4141
case 'GROUP BY' : return this.visitGroupBy(node);
42+
case 'HAVING' : return this.visitHaving(node);
4243
case 'RETURNING' : return this.visitReturning(node);
4344
case 'TABLE' : return this.visitTable(node);
4445
case 'COLUMN' : return this.visitColumn(node);
@@ -204,6 +205,11 @@ Postgres.prototype.visitGroupBy = function(groupBy) {
204205
return result;
205206
};
206207

208+
Postgres.prototype.visitHaving = function(having) {
209+
var result = ['HAVING', having.nodes.map(this.visit.bind(this)).join(' AND ')];
210+
return result;
211+
};
212+
207213
Postgres.prototype.visitUnary = function(unary) {
208214
var text = '(' + this.visit(unary.left) + ' ' + unary.operator + ')';
209215
return [text];

lib/node/having.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
var Node = require(__dirname);
4+
5+
module.exports = Node.define({
6+
type: 'HAVING'
7+
});

lib/node/query.js

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,31 @@ var util = require('util');
55

66
var sliced = require('sliced');
77

8-
var Node = require(__dirname);
9-
var Select = require(__dirname + '/select');
10-
var From = require(__dirname + '/from');
11-
var Where = require(__dirname + '/where');
12-
var OrderBy = require(__dirname + '/orderBy');
13-
var GroupBy = require(__dirname + '/groupBy');
14-
var Insert = require(__dirname + '/insert');
15-
var Update = require(__dirname + '/update');
16-
var Delete = require(__dirname + '/delete');
17-
var Returning = require(__dirname + '/returning');
18-
var Create = require(__dirname + '/create');
19-
var Drop = require(__dirname + '/drop');
20-
var Alter = require(__dirname + '/alter');
21-
var AddColumn = require(__dirname + '/addColumn');
22-
var DropColumn = require(__dirname + '/dropColumn');
23-
var RenameColumn = require(__dirname + '/renameColumn');
24-
var Rename = require(__dirname + '/rename');
25-
var Column = require(__dirname + '/../column');
8+
var Node = require(__dirname);
9+
var Select = require(__dirname + '/select');
10+
var From = require(__dirname + '/from');
11+
var Where = require(__dirname + '/where');
12+
var OrderBy = require(__dirname + '/orderBy');
13+
var GroupBy = require(__dirname + '/groupBy');
14+
var Having = require(__dirname + '/having');
15+
var Insert = require(__dirname + '/insert');
16+
var Update = require(__dirname + '/update');
17+
var Delete = require(__dirname + '/delete');
18+
var Returning = require(__dirname + '/returning');
19+
var Create = require(__dirname + '/create');
20+
var Drop = require(__dirname + '/drop');
21+
var Alter = require(__dirname + '/alter');
22+
var AddColumn = require(__dirname + '/addColumn');
23+
var DropColumn = require(__dirname + '/dropColumn');
24+
var RenameColumn = require(__dirname + '/renameColumn');
25+
var Rename = require(__dirname + '/rename');
26+
var Column = require(__dirname + '/../column');
2627
var ParameterNode = require(__dirname + '/parameter');
27-
var IfExists = require(__dirname + '/ifExists');
28-
var IfNotExists = require(__dirname + '/ifNotExists');
29-
var Indexes = require(__dirname + '/indexes');
30-
var CreateIndex = require(__dirname + '/createIndex');
31-
var DropIndex = require(__dirname + '/dropIndex');
28+
var IfExists = require(__dirname + '/ifExists');
29+
var IfNotExists = require(__dirname + '/ifNotExists');
30+
var Indexes = require(__dirname + '/indexes');
31+
var CreateIndex = require(__dirname + '/createIndex');
32+
var DropIndex = require(__dirname + '/dropIndex');
3233

3334
var Modifier = Node.define({
3435
constructor: function(table, type, count) {
@@ -119,6 +120,14 @@ var Query = Node.define({
119120
var groupBy = new GroupBy().addAll(args);
120121
return this.add(groupBy);
121122
},
123+
having: function() {
124+
var args = sliced(arguments);
125+
if (util.isArray(args[0])) {
126+
args = args[0];
127+
}
128+
var having = new Having().addAll(args);
129+
return this.add(having);
130+
},
122131
insert: function(o) {
123132
var self = this;
124133

@@ -155,7 +164,7 @@ var Query = Node.define({
155164
});
156165
return this.add(update);
157166
},
158-
'delete': function(params) {
167+
delete: function(params) {
159168
var result = this.add(new Delete());
160169
if(params) {
161170
result = this.where(params);

test/dialects/having-tests.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
'use strict';
2+
3+
var Harness = require('./support');
4+
var post = Harness.definePostTable();
5+
6+
Harness.test({
7+
query : post.select(post.userId, post.content.count()).group(post.userId).having(post.userId.gt(10)),
8+
pg : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1)',
9+
sqlite: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1)',
10+
mysql : 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?)',
11+
params: [10]
12+
});
13+
14+
Harness.test({
15+
query : post.select(post.userId, post.content.count()).group(post.userId).having(post.userId.gt(10), post.userId.lt(100)),
16+
pg : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)',
17+
sqlite: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)',
18+
mysql : 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?) AND (`post`.`userId` < ?)',
19+
params: [10, 100]
20+
});
21+
22+
Harness.test({
23+
query : post.select(post.userId, post.content.count()).group(post.userId).having([post.userId.gt(10), post.userId.lt(100)]),
24+
pg : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)',
25+
sqlite: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)',
26+
mysql : 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?) AND (`post`.`userId` < ?)',
27+
params: [10, 100]
28+
});

0 commit comments

Comments
 (0)