@@ -1260,6 +1260,15 @@ SQLConnector.prototype.buildFields = function(model, data, excludeIds) {
1260
1260
return this . _buildFieldsForKeys ( model , data , keys , excludeIds ) ;
1261
1261
} ;
1262
1262
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
+
1263
1272
/**
1264
1273
* Build an array of fields for the database operation from data array
1265
1274
* @param {String } model Model name
@@ -1439,7 +1448,25 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) {
1439
1448
}
1440
1449
}
1441
1450
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
+
1442
1468
let selectStmt = new ParameterizedSQL ( 'SELECT ' +
1469
+ extraSelect +
1443
1470
this . buildColumnNames ( model , filter ) +
1444
1471
' FROM ' + this . tableEscaped ( model ) ) ;
1445
1472
@@ -1449,6 +1476,10 @@ SQLConnector.prototype.buildSelect = function(model, filter, options) {
1449
1476
selectStmt . merge ( whereStmt ) ;
1450
1477
}
1451
1478
1479
+ if ( filter . groupBy ) {
1480
+ selectStmt . merge ( this . buildGroupBy ( filter . groupBy ) ) ;
1481
+ }
1482
+
1452
1483
if ( filter . order ) {
1453
1484
selectStmt . merge ( this . buildOrderBy ( model , filter . order ) ) ;
1454
1485
}
@@ -1510,7 +1541,23 @@ SQLConnector.prototype.all = function find(model, filter, options, cb) {
1510
1541
}
1511
1542
1512
1543
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 ;
1514
1561
} ) ;
1515
1562
if ( filter && filter . include ) {
1516
1563
self . getModelDefinition ( model ) . model . include (
0 commit comments