diff --git a/node_modules/loopback-connector/lib/sql.js b/node_modules/loopback-connector/lib/sql.js index 28446f1..8710623 100644 --- a/node_modules/loopback-connector/lib/sql.js +++ b/node_modules/loopback-connector/lib/sql.js @@ -1260,6 +1260,10 @@ SQLConnector.prototype.buildFields = function(model, data, excludeIds) { return this._buildFieldsForKeys(model, data, keys, excludeIds); }; +SQLConnector.prototype.buildGroupBy = function(groupBy) { + return 'GROUP BY ' + groupBy.join(','); +}; + /** * Build an array of fields for the database operation from data array * @param {String} model Model name @@ -1447,7 +1451,26 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) { } } + let extraSelect = ''; + if (filter.sum) { + extraSelect = `SUM(${filter.sum}) as sumOf${filter.sum}, `; + } + if (filter.count) { + extraSelect += `COUNT(${filter.count}) as countOf${filter.count}, `; + } + if (filter.avg) { + extraSelect += `AVG(${filter.avg}) as avgOf${filter.avg}, `; + } + if (filter.min) { + extraSelect += `MIN(${filter.min}) as minOf${filter.min}, `; + } + if (filter.max) { + extraSelect += `MAX(${filter.max}) as maxOf${filter.max}, `; + } + + let selectStmt = new ParameterizedSQL('SELECT ' + + extraSelect + this.buildColumnNames(model, filter) + ' FROM ' + this.tableEscaped(model)); @@ -1456,7 +1479,9 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) { const whereStmt = this.buildWhere(model, filter.where); selectStmt.merge(whereStmt); } - + if (filter.groupBy) { + selectStmt.merge(this.buildGroupBy(filter.groupBy)); + } if (filter.order) { selectStmt.merge(this.buildOrderBy(model, filter.order)); } @@ -1518,7 +1543,23 @@ SQLConnector.prototype.all = function find(model, filter, options, cb) { } const objs = data.map(function(obj) { - return self.fromRow(model, obj); + const object = self.fromRow(model, obj); + if (obj[`sumOf${filter.sum}`]) { + object[`sumOf${filter.sum}`] = obj[`sumOf${filter.sum}`]; + } + if (obj[`countOf${filter.count}`]) { + object[`countOf${filter.count}`] = obj[`countOf${filter.count}`]; + } + if (obj[`avgOf${filter.avg}`]) { + object[`avgOf${filter.avg}`] = obj[`avgOf${filter.avg}`]; + } + if (obj[`minOf${filter.min}`]) { + object[`minOf${filter.min}`] = obj[`minOf${filter.min}`]; + } + if (obj[`maxOf${filter.max}`]) { + object[`maxOf${filter.max}`] = obj[`maxOf${filter.max}`]; + } + return object; }); if (filter && filter.include) { self.getModelDefinition(model).model.include(