Skip to content

Commit b688d03

Browse files
author
Di Wu
committed
Alias Node, add alias behavior to unary, binary, ternary and function calls, with tests
1 parent 1746dc4 commit b688d03

9 files changed

Lines changed: 93 additions & 3 deletions

File tree

lib/dialect/postgres.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Postgres.prototype.visit = function(node) {
3333
case 'DELETE' : return this.visitDelete();
3434
case 'CREATE' : return this.visitCreate(node);
3535
case 'DROP' : return this.visitDrop(node);
36+
case 'ALIAS' : return this.visitAlias(node);
3637
case 'ALTER' : return this.visitAlter(node);
3738
case 'FROM' : return this.visitFrom(node);
3839
case 'WHERE' : return this.visitWhere(node);
@@ -155,6 +156,11 @@ Postgres.prototype.visitDrop = function(drop) {
155156
return result;
156157
};
157158

159+
Postgres.prototype.visitAlias = function(alias) {
160+
var result = [this.visit(alias.value) + ' AS ' + this.quote(alias.alias)];
161+
return result;
162+
};
163+
158164
Postgres.prototype.visitAlter = function(alter) {
159165
this._visitingAlter = true;
160166
// don't auto-generate from clause

lib/node/alias.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
3+
var _ = require('lodash');
4+
var Node = require(__dirname);
5+
6+
var AliasNode = Node.define({
7+
type: 'ALIAS',
8+
constructor: function(value, alias) {
9+
Node.call(this);
10+
11+
this.value = value;
12+
this.alias = alias;
13+
}
14+
});
15+
16+
var AliasMixin = {
17+
as: function(alias) {
18+
// create an alias node
19+
var aliasNode = new AliasNode(this, alias);
20+
21+
// defaults the properties of the aliased node
22+
_.defaults(aliasNode, this);
23+
24+
return aliasNode;
25+
}
26+
};
27+
28+
module.exports = AliasNode;
29+
module.exports.AliasMixin = AliasMixin;

lib/node/binary.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ var BinaryNode = Node.define(_.extend({
2222
},
2323
}));
2424

25+
// allow aliasing
26+
var AliasNode = require(__dirname + '/alias');
27+
_.extend(BinaryNode.prototype, AliasNode.AliasMixin);
28+
2529
module.exports = BinaryNode;

lib/node/functionCall.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@ var FunctionCallNode = Node.define({
1919
// mix in value expression
2020
_.extend(FunctionCallNode.prototype, valueExpressionMixin());
2121

22+
// allow aliasing
23+
var AliasNode = require(__dirname + '/alias');
24+
_.extend(FunctionCallNode.prototype, AliasNode.AliasMixin);
25+
2226
module.exports = FunctionCallNode;

lib/node/ternary.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ var TernaryNode = Node.define(_.extend({
2424
},
2525
}));
2626

27+
// allow aliasing
28+
var AliasNode = require(__dirname + '/alias');
29+
_.extend(TernaryNode.prototype, AliasNode.AliasMixin);
30+
2731
module.exports = TernaryNode;

lib/node/unary.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var Node = require(__dirname);
55
var valueExpressionMixin = require(__dirname + '/valueExpression');
66

77
var valueExpressionMixed = false;
8-
var UnaryNode = module.exports = Node.define({
8+
var UnaryNode = Node.define({
99
type: 'UNARY',
1010
constructor: function(config) {
1111
Node.call(this);
@@ -20,3 +20,9 @@ var UnaryNode = module.exports = Node.define({
2020
}
2121
}
2222
});
23+
24+
// allow aliasing
25+
var AliasNode = require(__dirname + '/alias');
26+
_.extend(UnaryNode.prototype, AliasNode.AliasMixin);
27+
28+
module.exports = UnaryNode;

lib/node/valueExpression.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 ParameterNode = require(__dirname + '/parameter');
66

77
// Process values, wrapping them in ParameterNode if necessary.

test/dialects/alias-tests.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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(customer.name.isNull().as('nameIsNull')),
10+
pg : 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"',
11+
sqlite : 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"',
12+
mysql : 'SELECT (`customer`.`name` IS NULL) AS `nameIsNull` FROM `customer`',
13+
params : []
14+
});
15+
16+
Harness.test({
17+
query : customer.select(customer.name.plus(customer.age).as('nameAndAge')).where(customer.age.gt(10).and(customer.age.lt(20))),
18+
pg : 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > $1) AND ("customer"."age" < $2))',
19+
sqlite : 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > $1) AND ("customer"."age" < $2))',
20+
mysql : 'SELECT (`customer`.`name` + `customer`.`age`) AS `nameAndAge` FROM `customer` WHERE ((`customer`.`age` > ?) AND (`customer`.`age` < ?))',
21+
params : [10, 20]
22+
});
23+
24+
Harness.test({
25+
query : customer.select(customer.age.between(10, 20).as('ageBetween')),
26+
pg : 'SELECT ("customer"."age" BETWEEN $1 AND $2) AS "ageBetween" FROM "customer"',
27+
sqlite : 'SELECT ("customer"."age" BETWEEN $1 AND $2) AS "ageBetween" FROM "customer"',
28+
mysql : 'SELECT (`customer`.`age` BETWEEN ? AND ?) AS `ageBetween` FROM `customer`',
29+
params : [10, 20]
30+
});

test/function-tests.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ var user = sql.define({
1010
});
1111

1212
suite('function', function() {
13+
test('alias function call', function() {
14+
var upper = sql.functions.UPPER;
15+
var aliasedUpper = upper(user.email).as('upperAlias').toQuery();
16+
17+
assert.equal(aliasedUpper.text, 'UPPER("user"."email") AS "upperAlias"');
18+
});
19+
1320
test('creating function call works', function() {
1421
var upper = sql.functionCallCreator('UPPER');
1522
var functionCall = upper('hello', 'world').toQuery();

0 commit comments

Comments
 (0)