Browse Source

adding support for subqueries

auto-join
Justin Reidy 12 years ago
parent
commit
b3f4c271b6
  1. 20
      lib/dialect/postgres.js
  2. 8
      lib/table.js
  3. 17
      test/dialect-tests.js

20
lib/dialect/postgres.js

@ -10,9 +10,11 @@ Postgres.prototype.getQuery = function(queryNode) {
return { text: this.output.join(' '), values: this.params }; return { text: this.output.join(' '), values: this.params };
} }
Postgres.prototype.visit = function(node) { Postgres.prototype.visit = function(node) {
switch(node.type) { switch(node.type) {
case 'QUERY': return this.visitQuery(node); case 'QUERY': return this.visitQuery(node);
case 'SUBQUERY': return this.visitSubquery(node);
case 'SELECT': return this.visitSelect(node); case 'SELECT': return this.visitSelect(node);
case 'INSERT': return this.visitInsert(node); case 'INSERT': return this.visitInsert(node);
case 'UPDATE': return this.visitUpdate(node); case 'UPDATE': return this.visitUpdate(node);
@ -136,6 +138,24 @@ Postgres.prototype.visitQuery = function(queryNode) {
return this; return this;
} }
Postgres.prototype.visitSubquery = function(queryNode) {
var result = [];
for(var i = 0; i < queryNode.nodes.length; i ++) {
var res = this.visit(queryNode.nodes[i]);
result = result.concat(res);
}
//implicit 'from'
if(!this._visitedFrom) {
var select = result.slice(0, this._selectOrDeleteEndIndex);
var from = this.visitFrom(new From().add(queryNode.table.toNode()));
var rest = result.slice(this._selectOrDeleteEndIndex);
result = select.concat(from).concat(rest);
}
result[0] = '('+result[0];
result[result.length-1] = result[result.length-1] + ') ' + queryNode.alias;
return result;
}
Postgres.prototype.visitTable = function(tableNode) { Postgres.prototype.visitTable = function(tableNode) {
var table = tableNode.table; var table = tableNode.table;
var txt=""; var txt="";

8
lib/table.js

@ -54,6 +54,14 @@ Table.prototype.select = function() {
return query; return query;
} }
Table.prototype.subQuery = function(alias) {
//create the query and pass it off
var query = new Query(this);
query.type = 'SUBQUERY';
query.alias = alias;
return query;
}
Table.prototype.insert = function() { Table.prototype.insert = function() {
var query = new Query(this); var query = new Query(this);
query.insert.apply(query, arguments); query.insert.apply(query, arguments);

17
test/dialect-tests.js

@ -97,6 +97,23 @@ test({
pg : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' pg : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")'
}); });
test({
query : user
.select(user.name, post.content)
.from(user.join(
post
.subQuery('subposts')
.select(post.content, post.userId)
.from(post))
.on(user.id.equals(post.userId))),
pg : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" FROM "post") subposts ON ("user"."id" = "post"."userId")'
});
test({
query : user.select(user.name.as('user name'), user.id.as('user id')).from(user),
pg : 'SELECT "user"."name" as "user name", "user"."id" as "user id" FROM "user"'
});
test({ test({
query : user.select(user.name.as('user name')).from(user).where(user.name.equals('brian')), query : user.select(user.name.as('user name')).from(user).where(user.name.equals('brian')),
pg : 'SELECT "user"."name" as "user name" FROM "user" WHERE ("user"."name" = $1)' pg : 'SELECT "user"."name" as "user name" FROM "user" WHERE ("user"."name" = $1)'

Loading…
Cancel
Save