@@ -1260,6 +1260,15 @@ SQLConnector.prototype.buildFields = function(model, data, excludeIds) {
12601260 return this . _buildFieldsForKeys ( model , data , keys , excludeIds ) ;
12611261} ;
12621262
1263+ /**
1264+ * Build a part of query for group by
1265+ * @param {String[] } groupBy Array of column names to be grouped by
1266+ * @returns a part of query for group by as a string
1267+ */
1268+ SQLConnector . prototype . buildGroupBy = function ( groupBy ) {
1269+ return 'GROUP BY ' + groupBy . join ( ',' ) ;
1270+ } ;
1271+
12631272/**
12641273 * Build an array of fields for the database operation from data array
12651274 * @param {String } model Model name
@@ -1439,7 +1448,25 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) {
14391448 }
14401449 }
14411450
1451+ let extraSelect = '' ;
1452+ if ( filter . sum ) {
1453+ extraSelect = `SUM(${ filter . sum } ) as sumOf${ filter . sum } , ` ;
1454+ }
1455+ if ( filter . count ) {
1456+ extraSelect += `COUNT(${ filter . count } ) as countOf${ filter . count } , ` ;
1457+ }
1458+ if ( filter . avg ) {
1459+ extraSelect += `AVG(${ filter . avg } ) as avgOf${ filter . avg } , ` ;
1460+ }
1461+ if ( filter . min ) {
1462+ extraSelect += `MIN(${ filter . min } ) as minOf${ filter . min } , ` ;
1463+ }
1464+ if ( filter . max ) {
1465+ extraSelect += `MAX(${ filter . max } ) as maxOf${ filter . max } , ` ;
1466+ }
1467+
14421468 let selectStmt = new ParameterizedSQL ( 'SELECT ' +
1469+ extraSelect +
14431470 this . buildColumnNames ( model , filter ) +
14441471 ' FROM ' + this . tableEscaped ( model ) ) ;
14451472
@@ -1449,6 +1476,10 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) {
14491476 selectStmt . merge ( whereStmt ) ;
14501477 }
14511478
1479+ if ( filter . groupBy ) {
1480+ selectStmt . merge ( this . buildGroupBy ( filter . groupBy ) ) ;
1481+ }
1482+
14521483 if ( filter . order ) {
14531484 selectStmt . merge ( this . buildOrderBy ( model , filter . order ) ) ;
14541485 }
@@ -1510,7 +1541,23 @@ SQLConnector.prototype.all = function find(model, filter, options, cb) {
15101541 }
15111542
15121543 const objs = data . map ( function ( obj ) {
1513- return self . fromRow ( model , obj ) ;
1544+ const object = self . fromRow ( model , obj ) ;
1545+ if ( obj [ `sumOf${ filter . sum } ` ] ) {
1546+ object [ `sumOf${ filter . sum } ` ] = obj [ `sumOf${ filter . sum } ` ] ;
1547+ }
1548+ if ( obj [ `countOf${ filter . count } ` ] ) {
1549+ object [ `countOf${ filter . count } ` ] = obj [ `countOf${ filter . count } ` ] ;
1550+ }
1551+ if ( obj [ `avgOf${ filter . avg } ` ] ) {
1552+ object [ `avgOf${ filter . avg } ` ] = obj [ `avgOf${ filter . avg } ` ] ;
1553+ }
1554+ if ( obj [ `minOf${ filter . min } ` ] ) {
1555+ object [ `minOf${ filter . min } ` ] = obj [ `minOf${ filter . min } ` ] ;
1556+ }
1557+ if ( obj [ `maxOf${ filter . max } ` ] ) {
1558+ object [ `maxOf${ filter . max } ` ] = obj [ `maxOf${ filter . max } ` ] ;
1559+ }
1560+ return object ;
15141561 } ) ;
15151562 if ( filter && filter . include ) {
15161563 self . getModelDefinition ( model ) . model . include (
0 commit comments