Skip to content

Commit fe3f993

Browse files
author
Raymond Feng
committed
Tidy up where for relations
1 parent f9cdbaf commit fe3f993

File tree

2 files changed

+111
-90
lines changed

2 files changed

+111
-90
lines changed

lib/sql.js

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,23 @@ SQLConnector.prototype.tableEscaped = function(model) {
230230
* @returns {String} The escaped column name
231231
*/
232232
SQLConnector.prototype.columnEscaped = function(model, property) {
233-
return this.tableEscaped(model) + '.' + this.escapeName(this.column(model, property));
233+
return this.escapeName(this.column(model, property));
234+
};
235+
236+
/**
237+
* Get the escaped qualified column name (table.column for join)
238+
* @param {String} model The model name
239+
* @param {String} property The property name
240+
* @returns {String} The escaped column name
241+
*/
242+
SQLConnector.prototype.qualifiedColumnEscaped = function(model, property) {
243+
var table = this.tableEscaped(model);
244+
var index = table.indexOf('.');
245+
if (index !== -1) {
246+
// Remove the schema name
247+
table = table.substring(index);
248+
}
249+
return table + '.' + this.escapeName(this.column(model, property));
234250
};
235251

236252
/*!
@@ -1017,18 +1033,7 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) {
10171033
}
10181034
}
10191035

1020-
var haveRelationFilters = false;
1021-
if (filter.where) {
1022-
var relations = this.getModelDefinition(model).model.relations;
1023-
if (relations) {
1024-
for (var key in filter.where) {
1025-
if (key in relations) {
1026-
haveRelationFilters = true;
1027-
break;
1028-
}
1029-
}
1030-
}
1031-
}
1036+
var haveRelationFilters = this.hasRelationClause(model, filter.where);
10321037
var distinct = haveRelationFilters ? 'DISTINCT ' : '';
10331038

10341039
var selectStmt = new ParameterizedSQL('SELECT ' + distinct +
@@ -1084,8 +1089,8 @@ SQLConnector.prototype.buildJoins = function(model, where) {
10841089
innerIdField[keyTo] = true;
10851090
innerFilter.fields = assign({}, innerFilter.fields, innerIdField);
10861091

1087-
var condition = this.columnEscaped(modelFrom, keyFrom) + '=' +
1088-
this.columnEscaped(modelTo, keyTo);
1092+
var condition = this.qualifiedColumnEscaped(modelFrom, keyFrom) + '=' +
1093+
this.qualifiedColumnEscaped(modelTo, keyTo);
10891094

10901095
var innerSelect = this.buildSelect(modelTo, innerFilter, {
10911096
skipParameterize: true
@@ -1113,7 +1118,7 @@ SQLConnector.prototype.buildJoins = function(model, where) {
11131118
// n:m relation
11141119
var modelThrough = rel.modelThrough.definition.name;
11151120
var keyThrough = rel.keyThrough;
1116-
var modelToKey = rel.modelTo.definition._ids[0].name;
1121+
var modelToKey = rel.modelTo.definition.idName();
11171122
var innerFilter = {fields: {}};
11181123
innerFilter.fields[keyThrough] = true;
11191124

@@ -1229,25 +1234,36 @@ SQLConnector.prototype.find = function(model, id, options, cb) {
12291234
Connector.defineAliases(SQLConnector.prototype, 'find', ['findById']);
12301235

12311236
/**
1232-
* Build a SQL SELECT statement to count rows
1233-
* @param {String} model Model name
1234-
* @param {Object} where Where object
1235-
* @param {Object} options Options object
1236-
* @returns {ParameterizedSQL} Statement object {sql: ..., params: [...]}
1237+
* Check if the where statement contains relations
1238+
* @param model
1239+
* @param where
1240+
* @returns {boolean}
12371241
*/
1238-
SQLConnector.prototype.buildCount = function(model, where, options) {
1239-
var haveRelationFilters = false;
1242+
SQLConnector.prototype.hasRelationClause = function(model, where) {
1243+
var found = false;
12401244
if (where) {
12411245
var relations = this.getModelDefinition(model).model.relations;
12421246
if (relations) {
12431247
for (var key in where) {
12441248
if (key in relations) {
1245-
haveRelationFilters = true;
1249+
found = true;
12461250
break;
12471251
}
12481252
}
12491253
}
12501254
}
1255+
return found;
1256+
};
1257+
1258+
/**
1259+
* Build a SQL SELECT statement to count rows
1260+
* @param {String} model Model name
1261+
* @param {Object} where Where object
1262+
* @param {Object} options Options object
1263+
* @returns {ParameterizedSQL} Statement object {sql: ..., params: [...]}
1264+
*/
1265+
SQLConnector.prototype.buildCount = function(model, where, options) {
1266+
var haveRelationFilters = this.hasRelationClause(model, where);
12511267

12521268
var count = 'count(*)';
12531269
if (haveRelationFilters) {

0 commit comments

Comments
 (0)