Skip to content

Commit aa8422e

Browse files
author
Di Wu
committed
Ternary between and tests
1 parent 03287e4 commit aa8422e

8 files changed

Lines changed: 126 additions & 8 deletions

File tree

lib/dialect/postgres.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Postgres.prototype.visit = function(node) {
4545
case 'COLUMN': return this.visitColumn(node);
4646
case 'JOIN': return this.visitJoin(node);
4747
case 'TEXT': return node.text;
48+
case 'TERNARY': return this.visitTernary(node);
4849
case 'UNARY': return this.visitUnary(node);
4950
case 'PARAMETER': return this.visitParameter(node);
5051
case 'DEFAULT': return this.visitDefault(node);
@@ -215,6 +216,31 @@ Postgres.prototype.visitBinary = function(binary) {
215216
return result;
216217
};
217218

219+
Postgres.prototype.visitTernary = function(ternary) {
220+
var self = this;
221+
var result = '(' + this.visit(ternary.left) + ' ' + ternary.operator + ' ';
222+
223+
var visitPart = function(value) {
224+
var text = '';
225+
if (Array.isArray(value)) {
226+
text += '(' + value.map(function (node) {
227+
return self.visit(node);
228+
}).join(', ') + ')';
229+
}
230+
else {
231+
text += self.visit(value);
232+
}
233+
return text;
234+
};
235+
236+
result += visitPart(ternary.middle);
237+
result += ' ' + ternary.separator + ' ';
238+
result += visitPart(ternary.right);
239+
240+
result += ')';
241+
return result;
242+
};
243+
218244
Postgres.prototype.visitUnary = function(unary) {
219245
return '(' + this.visit(unary.left) + ' ' + unary.operator + ')';
220246
};

lib/node/binary.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

3-
var _ = require('lodash');
4-
var Node = require(__dirname);
3+
var _ = require('lodash');
4+
var Node = require(__dirname);
55
var valueExpressionMixin = require(__dirname + '/valueExpression');
66

77
var valueExpressionMixed = false;
@@ -12,10 +12,9 @@ var BinaryNode = Node.define(_.extend({
1212
this.left = config.left;
1313
this.operator = config.operator;
1414
this.right = config.right;
15+
1516
// Delay mixin to runtime, when all nodes have been defined, and
16-
// mixin only once.
17-
// There is circular dependency between unary, binary and value
18-
// expression mixin, thus this must be delayed to runtime.
17+
// mixin only once. ValueExpressionMixin has circular dependencies.
1918
if (!valueExpressionMixed) {
2019
valueExpressionMixed = true;
2120
_.extend(BinaryNode.prototype, valueExpressionMixin());

lib/node/ternary.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'use strict';
2+
3+
var _ = require('lodash');
4+
var Node = require(__dirname);
5+
var valueExpressionMixin = require(__dirname + '/valueExpression');
6+
7+
var valueExpressionMixed = false;
8+
var TernaryNode = Node.define(_.extend({
9+
type: 'TERNARY',
10+
constructor: function(config) {
11+
Node.call(this);
12+
this.left = config.left;
13+
this.middle = config.middle;
14+
this.operator = config.operator;
15+
this.right = config.right;
16+
this.separator = config.separator;
17+
18+
// Delay mixin to runtime, when all nodes have been defined, and
19+
// mixin only once. ValueExpressionMixin has circular dependencies.
20+
if (!valueExpressionMixed) {
21+
valueExpressionMixed = true;
22+
_.extend(TernaryNode.prototype, valueExpressionMixin());
23+
}
24+
},
25+
}));
26+
27+
module.exports = TernaryNode;

lib/node/unary.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

3-
var _ = require('lodash');
4-
var Node = require(__dirname);
3+
var _ = require('lodash');
4+
var Node = require(__dirname);
55
var valueExpressionMixin = require(__dirname + '/valueExpression');
66

77
var valueExpressionMixed = false;

lib/node/valueExpression.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var processParams = function(val) {
1818
// "thunk" around it.
1919
var ValueExpressionMixin = module.exports = function() {
2020
var BinaryNode = require(__dirname + '/binary');
21+
var TernaryNode = require(__dirname + '/ternary');
2122
var UnaryNode = require(__dirname + '/unary');
2223

2324
var binaryMethod = function(operator) {
@@ -30,6 +31,18 @@ var ValueExpressionMixin = module.exports = function() {
3031
};
3132
};
3233

34+
var ternaryMethod = function(operator, separator) {
35+
return function(middle, right) {
36+
return new TernaryNode({
37+
left: this.toNode(),
38+
middle: processParams(middle),
39+
operator: operator,
40+
right: processParams(right),
41+
separator: separator
42+
});
43+
};
44+
};
45+
3346
var unaryMethod = function(operator) {
3447
/*jshint unused: false */
3548
return function(val) {
@@ -61,6 +74,7 @@ var ValueExpressionMixin = module.exports = function() {
6174
in : binaryMethod('IN'),
6275
notIn : binaryMethod('NOT IN'),
6376
isNull : unaryMethod('IS NULL'),
64-
isNotNull: unaryMethod('IS NOT NULL')
77+
isNotNull: unaryMethod('IS NOT NULL'),
78+
between : ternaryMethod('BETWEEN', 'AND')
6579
};
6680
};
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
3+
var Harness = require('./support');
4+
var customer = Harness.defineCustomerTable();
5+
var post = Harness.definePostTable();
6+
var Table = require(__dirname + '/../../lib/table');
7+
8+
Harness.test({
9+
query : customer.select().where(customer.age.between(18, 25)),
10+
pg : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN $1 AND $2)',
11+
sqlite: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN $1 AND $2)',
12+
mysql : 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` BETWEEN ? AND ?)',
13+
params: [18, 25]
14+
});
15+
16+
Harness.test({
17+
query : post.select().where(post.userId.between(customer.subQuery().select(customer.id.min()), customer.subQuery().select(customer.id.max()))),
18+
pg : 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))',
19+
sqlite: 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))',
20+
mysql : 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` BETWEEN (SELECT MIN(`customer`.`id`) AS `id_min` FROM `customer`) AND (SELECT MAX(`customer`.`id`) AS `id_max` FROM `customer`))',
21+
params: []
22+
});

test/ternary-clause-tests.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/* global test */
2+
'use strict';
3+
4+
var assert = require('assert');
5+
var Table = require(__dirname + '/../lib/table');
6+
7+
var Foo = Table.define({
8+
name: 'foo',
9+
columns: ['baz','bar']
10+
});
11+
12+
test('operators', function() {
13+
assert.equal(Foo.bar.between(1, 2).operator, 'BETWEEN');
14+
assert.equal(Foo.baz.between(1, 2).separator, 'AND');
15+
});

test/unary-clause-tests.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/* global test */
2+
'use strict';
3+
4+
var assert = require('assert');
5+
var Table = require(__dirname + '/../lib/table');
6+
7+
var Foo = Table.define({
8+
name: 'foo',
9+
columns: ['baz','bar']
10+
});
11+
12+
test('operators', function() {
13+
assert.equal(Foo.bar.isNull().operator, 'IS NULL');
14+
assert.equal(Foo.baz.isNotNull().operator, 'IS NOT NULL');
15+
});

0 commit comments

Comments
 (0)