From 771869961e9381083c5c6df6c8bdbba953c22a5a Mon Sep 17 00:00:00 2001 From: Peter Rust Date: Thu, 5 Dec 2013 12:29:05 -0800 Subject: [PATCH 1/2] Added support for subqueries in joins --- sql-bricks.js | 22 +++++++++++++++++----- tests/tests.js | 8 ++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/sql-bricks.js b/sql-bricks.js index 451ae47..1156c5c 100644 --- a/sql-bricks.js +++ b/sql-bricks.js @@ -100,6 +100,13 @@ Select.prototype.offset = function offset(count) { this._offset = count; return this; }; +Select.prototype.as = function as(tbl_name) { + if (tbl_name == null) + return this._as; + + this._as = tbl_name; + return this; +}; var compounds = { 'union': 'UNION', 'unionAll': 'UNION ALL', @@ -461,22 +468,27 @@ Join.prototype.autoGenerateOn = function autoGenerateOn(tbl, left_tbl) { }; Join.prototype.toString = function toString(opts) { var on = this.on, tbl = this.tbl, left_tbl = this.left_tbl; - if (!on || _.isEmpty(on)) { + if ((!on || _.isEmpty(on)) && !(tbl instanceof Statement)) { if (sql._joinCriteria) on = this.autoGenerateOn(tbl, left_tbl); else throw new Error('No join criteria supplied for "' + getAlias(tbl) + '" join'); } + + if (tbl instanceof Statement) + tbl = '(' + tbl._toString(opts) + ')' + (tbl.as() ? ' AS ' + tbl.as() : ''); if (isExpr(on)) { on = on.toString(opts); } else { - on = _.map(_.keys(on), function(key) { - return handleColumn(key, opts) + ' = ' + handleColumn(on[key], opts); - }).join(', ') + if (on) { + on = _.map(_.keys(on), function(key) { + return handleColumn(key, opts) + ' = ' + handleColumn(on[key], opts); + }).join(', ') + } } - return this.type + ' JOIN ' + tbl + ' ON ' + on; + return this.type + ' JOIN ' + tbl + (on ? ' ON ' + on : ''); }; diff --git a/tests/tests.js b/tests/tests.js index 9f0c2b4..d231ce1 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -361,6 +361,14 @@ describe('SQL Bricks', function() { check(select().from('usr').join('addr', eq('usr.addr_id', sql('addr.id'))), 'SELECT * FROM user usr INNER JOIN address addr ON usr.addr_id = addr.id'); }); + it('join() should accept a subquery for the table', function() { + check(select().from('user').join(select().from('user')), + 'SELECT * FROM user INNER JOIN (SELECT * FROM user)'); + }); + it('join() should accept a subquery for the table w/ an AS', function() { + check(select().from('user').join(select().from('user').as('new_users')), + 'SELECT * FROM user INNER JOIN (SELECT * FROM user) AS new_users'); + }); }); describe('on()', function() { From 00519d414e5d3a0d5ea08fb5177cb8000af44392 Mon Sep 17 00:00:00 2001 From: Peter Rust Date: Thu, 5 Dec 2013 12:57:34 -0800 Subject: [PATCH 2/2] JOIN criteria need to be ANDed together --- sql-bricks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-bricks.js b/sql-bricks.js index 1156c5c..ab65f31 100644 --- a/sql-bricks.js +++ b/sql-bricks.js @@ -485,7 +485,7 @@ Join.prototype.toString = function toString(opts) { if (on) { on = _.map(_.keys(on), function(key) { return handleColumn(key, opts) + ' = ' + handleColumn(on[key], opts); - }).join(', ') + }).join(' AND ') } } return this.type + ' JOIN ' + tbl + (on ? ' ON ' + on : '');