orange-orm 4.5.1 → 4.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/changelog.md +2 -0
- package/package.json +1 -1
- package/src/client/index.mjs +186 -105
- package/src/map.d.ts +2 -12
- package/src/table/column/columnAggregate.js +15 -0
- package/src/table/column/columnAggregateGroup.js +35 -0
- package/src/table/column/newColumn.js +13 -0
- package/src/table/relatedTable/columnAggregate.js +1 -1
package/docs/changelog.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
## Changelog
|
|
2
|
+
__4.5.2__
|
|
3
|
+
Bugfix: Aggregate functions are not allowed on root tables . See [#120](https://github.com/alfateam/orange-orm/issues/121)
|
|
2
4
|
__4.5.1__
|
|
3
5
|
Bugfix: "Changed by Other User" Error Triggered by Precision Mismatch in Numeric Column. See [#120](https://github.com/alfateam/orange-orm/issues/120)
|
|
4
6
|
__4.5.0__
|
package/package.json
CHANGED
package/src/client/index.mjs
CHANGED
|
@@ -3951,6 +3951,178 @@ function requireExtractAlias () {
|
|
|
3951
3951
|
return extractAlias;
|
|
3952
3952
|
}
|
|
3953
3953
|
|
|
3954
|
+
var columnAggregate_1$1;
|
|
3955
|
+
var hasRequiredColumnAggregate$1;
|
|
3956
|
+
|
|
3957
|
+
function requireColumnAggregate$1 () {
|
|
3958
|
+
if (hasRequiredColumnAggregate$1) return columnAggregate_1$1;
|
|
3959
|
+
hasRequiredColumnAggregate$1 = 1;
|
|
3960
|
+
const getSessionSingleton = requireGetSessionSingleton();
|
|
3961
|
+
|
|
3962
|
+
function columnAggregate(context, operator, column, table, coalesce = true) {
|
|
3963
|
+
const quote = getSessionSingleton(context, 'quote');
|
|
3964
|
+
|
|
3965
|
+
const tableAlias = quote(table._rootAlias || table._dbName);
|
|
3966
|
+
const columnName = quote(column._dbName);
|
|
3967
|
+
|
|
3968
|
+
return {
|
|
3969
|
+
expression: (alias) => coalesce ? `COALESCE(${operator}(${tableAlias}.${columnName}), 0) as ${quote(alias)}` : `${operator}(${tableAlias}.${columnName}) as ${quote(alias)}`,
|
|
3970
|
+
joins: ['']
|
|
3971
|
+
};
|
|
3972
|
+
}
|
|
3973
|
+
|
|
3974
|
+
columnAggregate_1$1 = columnAggregate;
|
|
3975
|
+
return columnAggregate_1$1;
|
|
3976
|
+
}
|
|
3977
|
+
|
|
3978
|
+
var newDiscriminatorSql_1$1;
|
|
3979
|
+
var hasRequiredNewDiscriminatorSql$1;
|
|
3980
|
+
|
|
3981
|
+
function requireNewDiscriminatorSql$1 () {
|
|
3982
|
+
if (hasRequiredNewDiscriminatorSql$1) return newDiscriminatorSql_1$1;
|
|
3983
|
+
hasRequiredNewDiscriminatorSql$1 = 1;
|
|
3984
|
+
const getSessionSingleton = requireGetSessionSingleton();
|
|
3985
|
+
|
|
3986
|
+
function newDiscriminatorSql(context, table, alias) {
|
|
3987
|
+
const quote = getSessionSingleton(context, 'quote');
|
|
3988
|
+
alias = quote(alias);
|
|
3989
|
+
var result = '';
|
|
3990
|
+
var formulaDiscriminators = table._formulaDiscriminators;
|
|
3991
|
+
var columnDiscriminators = table._columnDiscriminators;
|
|
3992
|
+
addFormula();
|
|
3993
|
+
addColumn();
|
|
3994
|
+
return result;
|
|
3995
|
+
|
|
3996
|
+
function addFormula() {
|
|
3997
|
+
for (var i = 0; i<formulaDiscriminators.length; i++) {
|
|
3998
|
+
var current = formulaDiscriminators[i].replace('@this',alias);
|
|
3999
|
+
and();
|
|
4000
|
+
result += '(' + current + ')';
|
|
4001
|
+
}
|
|
4002
|
+
}
|
|
4003
|
+
|
|
4004
|
+
function addColumn() {
|
|
4005
|
+
for (var i = 0; i< columnDiscriminators.length; i++) {
|
|
4006
|
+
var current = columnDiscriminators[i].split('=');
|
|
4007
|
+
and();
|
|
4008
|
+
result += alias + '.' + quote(current[0]) + '=' + current[1];
|
|
4009
|
+
}
|
|
4010
|
+
}
|
|
4011
|
+
|
|
4012
|
+
function and() {
|
|
4013
|
+
if(result)
|
|
4014
|
+
result += ' AND ';
|
|
4015
|
+
else
|
|
4016
|
+
result = ' ';
|
|
4017
|
+
}
|
|
4018
|
+
}
|
|
4019
|
+
|
|
4020
|
+
newDiscriminatorSql_1$1 = newDiscriminatorSql;
|
|
4021
|
+
return newDiscriminatorSql_1$1;
|
|
4022
|
+
}
|
|
4023
|
+
|
|
4024
|
+
var newDiscriminatorSql_1;
|
|
4025
|
+
var hasRequiredNewDiscriminatorSql;
|
|
4026
|
+
|
|
4027
|
+
function requireNewDiscriminatorSql () {
|
|
4028
|
+
if (hasRequiredNewDiscriminatorSql) return newDiscriminatorSql_1;
|
|
4029
|
+
hasRequiredNewDiscriminatorSql = 1;
|
|
4030
|
+
var newDiscriminatorSqlCore = requireNewDiscriminatorSql$1();
|
|
4031
|
+
|
|
4032
|
+
function newDiscriminatorSql(context, table, alias) {
|
|
4033
|
+
var result = newDiscriminatorSqlCore(context,table,alias);
|
|
4034
|
+
if (result)
|
|
4035
|
+
return ' AND' + result;
|
|
4036
|
+
return result;
|
|
4037
|
+
|
|
4038
|
+
}
|
|
4039
|
+
|
|
4040
|
+
newDiscriminatorSql_1 = newDiscriminatorSql;
|
|
4041
|
+
return newDiscriminatorSql_1;
|
|
4042
|
+
}
|
|
4043
|
+
|
|
4044
|
+
var newShallowJoinSqlCore;
|
|
4045
|
+
var hasRequiredNewShallowJoinSqlCore;
|
|
4046
|
+
|
|
4047
|
+
function requireNewShallowJoinSqlCore () {
|
|
4048
|
+
if (hasRequiredNewShallowJoinSqlCore) return newShallowJoinSqlCore;
|
|
4049
|
+
hasRequiredNewShallowJoinSqlCore = 1;
|
|
4050
|
+
const newDiscriminatorSql = requireNewDiscriminatorSql();
|
|
4051
|
+
const newParameterized = requireNewParameterized();
|
|
4052
|
+
const getSessionSingleton = requireGetSessionSingleton();
|
|
4053
|
+
|
|
4054
|
+
function _new(context, rightTable, leftColumns, rightColumns, leftAlias, rightAlias, filter) {
|
|
4055
|
+
const quote = getSessionSingleton(context, 'quote');
|
|
4056
|
+
leftAlias = quote(leftAlias);
|
|
4057
|
+
rightAlias = quote(rightAlias);
|
|
4058
|
+
var sql = '';
|
|
4059
|
+
var delimiter = '';
|
|
4060
|
+
for (var i = 0; i < leftColumns.length; i++) {
|
|
4061
|
+
addColumn(i);
|
|
4062
|
+
delimiter = ' AND ';
|
|
4063
|
+
}
|
|
4064
|
+
|
|
4065
|
+
function addColumn(index) {
|
|
4066
|
+
var leftColumn = leftColumns[index];
|
|
4067
|
+
var rightColumn = rightColumns[index];
|
|
4068
|
+
sql += delimiter + leftAlias + '.' + quote(leftColumn._dbName) + '=' + rightAlias + '.' + quote(rightColumn._dbName);
|
|
4069
|
+
}
|
|
4070
|
+
|
|
4071
|
+
sql += newDiscriminatorSql(context, rightTable, rightAlias);
|
|
4072
|
+
var result = newParameterized(sql);
|
|
4073
|
+
if (filter)
|
|
4074
|
+
result = result.append(delimiter).append(filter);
|
|
4075
|
+
return result;
|
|
4076
|
+
}
|
|
4077
|
+
|
|
4078
|
+
newShallowJoinSqlCore = _new;
|
|
4079
|
+
return newShallowJoinSqlCore;
|
|
4080
|
+
}
|
|
4081
|
+
|
|
4082
|
+
var columnAggregateGroup$1;
|
|
4083
|
+
var hasRequiredColumnAggregateGroup$1;
|
|
4084
|
+
|
|
4085
|
+
function requireColumnAggregateGroup$1 () {
|
|
4086
|
+
if (hasRequiredColumnAggregateGroup$1) return columnAggregateGroup$1;
|
|
4087
|
+
hasRequiredColumnAggregateGroup$1 = 1;
|
|
4088
|
+
var getSessionContext = requireGetSessionContext();
|
|
4089
|
+
var newJoinCore = requireNewShallowJoinSqlCore();
|
|
4090
|
+
const getSessionSingleton = requireGetSessionSingleton();
|
|
4091
|
+
|
|
4092
|
+
function columnAggregate(context, operator, column, table, coalesce = true) {
|
|
4093
|
+
const quote = getSessionSingleton(context, 'quote');
|
|
4094
|
+
const rdb = getSessionContext(context);
|
|
4095
|
+
const outerAlias = 'y' + rdb.aggregateCount++;
|
|
4096
|
+
const outerAliasQuoted = quote(outerAlias);
|
|
4097
|
+
const alias = quote('x');
|
|
4098
|
+
const foreignKeys = getForeignKeys(table);
|
|
4099
|
+
const select = ` LEFT JOIN (SELECT ${foreignKeys},${operator}(${alias}.${quote(column._dbName)}) as amount`;
|
|
4100
|
+
const onClause = createOnClause(context, table, outerAlias);
|
|
4101
|
+
const from = ` FROM ${quote(table._dbName)} ${alias} GROUP BY ${foreignKeys}) ${outerAliasQuoted} ON (${onClause})`;
|
|
4102
|
+
const join = select + from;
|
|
4103
|
+
|
|
4104
|
+
return {
|
|
4105
|
+
expression: (alias) => coalesce ? `COALESCE(${outerAliasQuoted}.amount, 0) as ${quote(alias)}` : `${outerAliasQuoted}.amount as ${alias}`,
|
|
4106
|
+
joins: [join]
|
|
4107
|
+
};
|
|
4108
|
+
|
|
4109
|
+
function getForeignKeys(table) {
|
|
4110
|
+
return table._primaryColumns.map(x => `${alias}.${quote(x._dbName)}`).join(',');
|
|
4111
|
+
}
|
|
4112
|
+
}
|
|
4113
|
+
|
|
4114
|
+
function createOnClause(context, table, rightAlias) {
|
|
4115
|
+
let leftAlias = table._rootAlias || table._dbName;
|
|
4116
|
+
const columns = table._primaryColumns;
|
|
4117
|
+
return newJoinCore(context, table, columns, columns, leftAlias, rightAlias).sql();
|
|
4118
|
+
}
|
|
4119
|
+
|
|
4120
|
+
|
|
4121
|
+
|
|
4122
|
+
columnAggregateGroup$1 = columnAggregate;
|
|
4123
|
+
return columnAggregateGroup$1;
|
|
4124
|
+
}
|
|
4125
|
+
|
|
3954
4126
|
var newColumn;
|
|
3955
4127
|
var hasRequiredNewColumn;
|
|
3956
4128
|
|
|
@@ -3966,6 +4138,8 @@ function requireNewColumn () {
|
|
|
3966
4138
|
const _in = require_in();
|
|
3967
4139
|
const _extractAlias = requireExtractAlias();
|
|
3968
4140
|
const quote = requireQuote$1();
|
|
4141
|
+
const aggregate = requireColumnAggregate$1();
|
|
4142
|
+
const aggregateGroup = requireColumnAggregateGroup$1();
|
|
3969
4143
|
|
|
3970
4144
|
newColumn = function(table, name) {
|
|
3971
4145
|
var c = {};
|
|
@@ -4035,6 +4209,17 @@ function requireNewColumn () {
|
|
|
4035
4209
|
c.IN = c.in;
|
|
4036
4210
|
c.self = self;
|
|
4037
4211
|
|
|
4212
|
+
c.groupSum = (context, ...rest) => aggregateGroup.apply(null, [context, 'sum', c, table, ...rest]);
|
|
4213
|
+
c.groupAvg = (context, ...rest) => aggregateGroup.apply(null, [context, 'avg', c, table, ...rest]);
|
|
4214
|
+
c.groupMin = (context, ...rest) => aggregateGroup.apply(null, [context, 'min', c, table, ...rest]);
|
|
4215
|
+
c.groupMax = (context, ...rest) => aggregateGroup.apply(null, [context, 'max', c, table, ...rest]);
|
|
4216
|
+
c.groupCount = (context, ...rest) => aggregateGroup.apply(null, [context, 'count', c, table, false, ...rest]);
|
|
4217
|
+
c.sum = (context, ...rest) => aggregate.apply(null, [context, 'sum', c, table, ...rest]);
|
|
4218
|
+
c.avg = (context, ...rest) => aggregate.apply(null, [context, 'avg', c, table, ...rest]);
|
|
4219
|
+
c.min = (context, ...rest) => aggregate.apply(null, [context, 'min', c, table, ...rest]);
|
|
4220
|
+
c.max = (context, ...rest) => aggregate.apply(null, [context, 'max', c, table, ...rest]);
|
|
4221
|
+
c.count = (context, ...rest) => aggregate.apply(null, [context, 'count', c, table, false, ...rest]);
|
|
4222
|
+
|
|
4038
4223
|
function self(context) {
|
|
4039
4224
|
const tableAlias = quote(context,table._rootAlias || table._dbName);
|
|
4040
4225
|
const columnName = quote(context, c._dbName);
|
|
@@ -5670,110 +5855,6 @@ function requireNewColumnSql () {
|
|
|
5670
5855
|
return newColumnSql;
|
|
5671
5856
|
}
|
|
5672
5857
|
|
|
5673
|
-
var newDiscriminatorSql_1$1;
|
|
5674
|
-
var hasRequiredNewDiscriminatorSql$1;
|
|
5675
|
-
|
|
5676
|
-
function requireNewDiscriminatorSql$1 () {
|
|
5677
|
-
if (hasRequiredNewDiscriminatorSql$1) return newDiscriminatorSql_1$1;
|
|
5678
|
-
hasRequiredNewDiscriminatorSql$1 = 1;
|
|
5679
|
-
const getSessionSingleton = requireGetSessionSingleton();
|
|
5680
|
-
|
|
5681
|
-
function newDiscriminatorSql(context, table, alias) {
|
|
5682
|
-
const quote = getSessionSingleton(context, 'quote');
|
|
5683
|
-
alias = quote(alias);
|
|
5684
|
-
var result = '';
|
|
5685
|
-
var formulaDiscriminators = table._formulaDiscriminators;
|
|
5686
|
-
var columnDiscriminators = table._columnDiscriminators;
|
|
5687
|
-
addFormula();
|
|
5688
|
-
addColumn();
|
|
5689
|
-
return result;
|
|
5690
|
-
|
|
5691
|
-
function addFormula() {
|
|
5692
|
-
for (var i = 0; i<formulaDiscriminators.length; i++) {
|
|
5693
|
-
var current = formulaDiscriminators[i].replace('@this',alias);
|
|
5694
|
-
and();
|
|
5695
|
-
result += '(' + current + ')';
|
|
5696
|
-
}
|
|
5697
|
-
}
|
|
5698
|
-
|
|
5699
|
-
function addColumn() {
|
|
5700
|
-
for (var i = 0; i< columnDiscriminators.length; i++) {
|
|
5701
|
-
var current = columnDiscriminators[i].split('=');
|
|
5702
|
-
and();
|
|
5703
|
-
result += alias + '.' + quote(current[0]) + '=' + current[1];
|
|
5704
|
-
}
|
|
5705
|
-
}
|
|
5706
|
-
|
|
5707
|
-
function and() {
|
|
5708
|
-
if(result)
|
|
5709
|
-
result += ' AND ';
|
|
5710
|
-
else
|
|
5711
|
-
result = ' ';
|
|
5712
|
-
}
|
|
5713
|
-
}
|
|
5714
|
-
|
|
5715
|
-
newDiscriminatorSql_1$1 = newDiscriminatorSql;
|
|
5716
|
-
return newDiscriminatorSql_1$1;
|
|
5717
|
-
}
|
|
5718
|
-
|
|
5719
|
-
var newDiscriminatorSql_1;
|
|
5720
|
-
var hasRequiredNewDiscriminatorSql;
|
|
5721
|
-
|
|
5722
|
-
function requireNewDiscriminatorSql () {
|
|
5723
|
-
if (hasRequiredNewDiscriminatorSql) return newDiscriminatorSql_1;
|
|
5724
|
-
hasRequiredNewDiscriminatorSql = 1;
|
|
5725
|
-
var newDiscriminatorSqlCore = requireNewDiscriminatorSql$1();
|
|
5726
|
-
|
|
5727
|
-
function newDiscriminatorSql(context, table, alias) {
|
|
5728
|
-
var result = newDiscriminatorSqlCore(context,table,alias);
|
|
5729
|
-
if (result)
|
|
5730
|
-
return ' AND' + result;
|
|
5731
|
-
return result;
|
|
5732
|
-
|
|
5733
|
-
}
|
|
5734
|
-
|
|
5735
|
-
newDiscriminatorSql_1 = newDiscriminatorSql;
|
|
5736
|
-
return newDiscriminatorSql_1;
|
|
5737
|
-
}
|
|
5738
|
-
|
|
5739
|
-
var newShallowJoinSqlCore;
|
|
5740
|
-
var hasRequiredNewShallowJoinSqlCore;
|
|
5741
|
-
|
|
5742
|
-
function requireNewShallowJoinSqlCore () {
|
|
5743
|
-
if (hasRequiredNewShallowJoinSqlCore) return newShallowJoinSqlCore;
|
|
5744
|
-
hasRequiredNewShallowJoinSqlCore = 1;
|
|
5745
|
-
const newDiscriminatorSql = requireNewDiscriminatorSql();
|
|
5746
|
-
const newParameterized = requireNewParameterized();
|
|
5747
|
-
const getSessionSingleton = requireGetSessionSingleton();
|
|
5748
|
-
|
|
5749
|
-
function _new(context, rightTable, leftColumns, rightColumns, leftAlias, rightAlias, filter) {
|
|
5750
|
-
const quote = getSessionSingleton(context, 'quote');
|
|
5751
|
-
leftAlias = quote(leftAlias);
|
|
5752
|
-
rightAlias = quote(rightAlias);
|
|
5753
|
-
var sql = '';
|
|
5754
|
-
var delimiter = '';
|
|
5755
|
-
for (var i = 0; i < leftColumns.length; i++) {
|
|
5756
|
-
addColumn(i);
|
|
5757
|
-
delimiter = ' AND ';
|
|
5758
|
-
}
|
|
5759
|
-
|
|
5760
|
-
function addColumn(index) {
|
|
5761
|
-
var leftColumn = leftColumns[index];
|
|
5762
|
-
var rightColumn = rightColumns[index];
|
|
5763
|
-
sql += delimiter + leftAlias + '.' + quote(leftColumn._dbName) + '=' + rightAlias + '.' + quote(rightColumn._dbName);
|
|
5764
|
-
}
|
|
5765
|
-
|
|
5766
|
-
sql += newDiscriminatorSql(context, rightTable, rightAlias);
|
|
5767
|
-
var result = newParameterized(sql);
|
|
5768
|
-
if (filter)
|
|
5769
|
-
result = result.append(delimiter).append(filter);
|
|
5770
|
-
return result;
|
|
5771
|
-
}
|
|
5772
|
-
|
|
5773
|
-
newShallowJoinSqlCore = _new;
|
|
5774
|
-
return newShallowJoinSqlCore;
|
|
5775
|
-
}
|
|
5776
|
-
|
|
5777
5858
|
var newShallowJoinSql;
|
|
5778
5859
|
var hasRequiredNewShallowJoinSql;
|
|
5779
5860
|
|
|
@@ -9193,7 +9274,7 @@ function requireColumnAggregate () {
|
|
|
9193
9274
|
const columnName = quote(column._dbName);
|
|
9194
9275
|
|
|
9195
9276
|
return {
|
|
9196
|
-
expression: (alias) => coalesce ? `COALESCE(${operator}(${tableAlias}.${columnName}), 0) as ${quote(alias)}` : `${operator}(${tableAlias}.${columnName}) as ${alias}`,
|
|
9277
|
+
expression: (alias) => coalesce ? `COALESCE(${operator}(${tableAlias}.${columnName}), 0) as ${quote(alias)}` : `${operator}(${tableAlias}.${columnName}) as ${quote(alias)}`,
|
|
9197
9278
|
|
|
9198
9279
|
joins: newJoinArray(context, relations)
|
|
9199
9280
|
};
|
package/src/map.d.ts
CHANGED
|
@@ -664,23 +664,13 @@ type RelatedColumns<T> = RemoveNeverFlat<{
|
|
|
664
664
|
: never;
|
|
665
665
|
}>;
|
|
666
666
|
|
|
667
|
-
|
|
668
667
|
type AggregateColumns<T> = RemoveNeverFlat<{
|
|
669
|
-
[K in keyof T]:
|
|
670
|
-
T[K] extends ManyRelation
|
|
671
|
-
? AggregateColumns2<T[K]>
|
|
672
|
-
: T[K] extends RelatedTable
|
|
673
|
-
? AggregateColumns2<T[K]>
|
|
674
|
-
: never;
|
|
675
|
-
}>;
|
|
676
|
-
|
|
677
|
-
type AggregateColumns2<T> = RemoveNeverFlat<{
|
|
678
668
|
[K in keyof T]:
|
|
679
669
|
T[K] extends NumericColumnTypeDef<infer M> ? NumericColumnSymbol
|
|
680
670
|
: T[K] extends ManyRelation
|
|
681
|
-
?
|
|
671
|
+
? AggregateColumns<T[K]>
|
|
682
672
|
: T[K] extends RelatedTable
|
|
683
|
-
?
|
|
673
|
+
? AggregateColumns<T[K]>
|
|
684
674
|
: never;
|
|
685
675
|
}>;
|
|
686
676
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const getSessionSingleton = require('../getSessionSingleton');
|
|
2
|
+
|
|
3
|
+
function columnAggregate(context, operator, column, table, coalesce = true) {
|
|
4
|
+
const quote = getSessionSingleton(context, 'quote');
|
|
5
|
+
|
|
6
|
+
const tableAlias = quote(table._rootAlias || table._dbName);
|
|
7
|
+
const columnName = quote(column._dbName);
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
expression: (alias) => coalesce ? `COALESCE(${operator}(${tableAlias}.${columnName}), 0) as ${quote(alias)}` : `${operator}(${tableAlias}.${columnName}) as ${quote(alias)}`,
|
|
11
|
+
joins: ['']
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module.exports = columnAggregate;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var getSessionContext = require('../getSessionContext');
|
|
2
|
+
var newJoinCore = require('../query/singleQuery/joinSql/newShallowJoinSqlCore');
|
|
3
|
+
const getSessionSingleton = require('../getSessionSingleton');
|
|
4
|
+
|
|
5
|
+
function columnAggregate(context, operator, column, table, coalesce = true) {
|
|
6
|
+
const quote = getSessionSingleton(context, 'quote');
|
|
7
|
+
const rdb = getSessionContext(context);
|
|
8
|
+
const outerAlias = 'y' + rdb.aggregateCount++;
|
|
9
|
+
const outerAliasQuoted = quote(outerAlias);
|
|
10
|
+
const alias = quote('x');
|
|
11
|
+
const foreignKeys = getForeignKeys(table);
|
|
12
|
+
const select = ` LEFT JOIN (SELECT ${foreignKeys},${operator}(${alias}.${quote(column._dbName)}) as amount`;
|
|
13
|
+
const onClause = createOnClause(context, table, outerAlias);
|
|
14
|
+
const from = ` FROM ${quote(table._dbName)} ${alias} GROUP BY ${foreignKeys}) ${outerAliasQuoted} ON (${onClause})`;
|
|
15
|
+
const join = select + from;
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
expression: (alias) => coalesce ? `COALESCE(${outerAliasQuoted}.amount, 0) as ${quote(alias)}` : `${outerAliasQuoted}.amount as ${alias}`,
|
|
19
|
+
joins: [join]
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
function getForeignKeys(table) {
|
|
23
|
+
return table._primaryColumns.map(x => `${alias}.${quote(x._dbName)}`).join(',');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function createOnClause(context, table, rightAlias) {
|
|
28
|
+
let leftAlias = table._rootAlias || table._dbName;
|
|
29
|
+
const columns = table._primaryColumns;
|
|
30
|
+
return newJoinCore(context, table, columns, columns, leftAlias, rightAlias).sql();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
module.exports = columnAggregate;
|
|
@@ -7,6 +7,8 @@ const greaterThanOrEqual = require('./greaterThanOrEqual');
|
|
|
7
7
|
const _in = require('./in');
|
|
8
8
|
const _extractAlias = require('./extractAlias');
|
|
9
9
|
const quote = require('../../table/quote');
|
|
10
|
+
const aggregate = require('./columnAggregate');
|
|
11
|
+
const aggregateGroup = require('./columnAggregateGroup');
|
|
10
12
|
|
|
11
13
|
module.exports = function(table, name) {
|
|
12
14
|
var c = {};
|
|
@@ -76,6 +78,17 @@ module.exports = function(table, name) {
|
|
|
76
78
|
c.IN = c.in;
|
|
77
79
|
c.self = self;
|
|
78
80
|
|
|
81
|
+
c.groupSum = (context, ...rest) => aggregateGroup.apply(null, [context, 'sum', c, table, ...rest]);
|
|
82
|
+
c.groupAvg = (context, ...rest) => aggregateGroup.apply(null, [context, 'avg', c, table, ...rest]);
|
|
83
|
+
c.groupMin = (context, ...rest) => aggregateGroup.apply(null, [context, 'min', c, table, ...rest]);
|
|
84
|
+
c.groupMax = (context, ...rest) => aggregateGroup.apply(null, [context, 'max', c, table, ...rest]);
|
|
85
|
+
c.groupCount = (context, ...rest) => aggregateGroup.apply(null, [context, 'count', c, table, false, ...rest]);
|
|
86
|
+
c.sum = (context, ...rest) => aggregate.apply(null, [context, 'sum', c, table, ...rest]);
|
|
87
|
+
c.avg = (context, ...rest) => aggregate.apply(null, [context, 'avg', c, table, ...rest]);
|
|
88
|
+
c.min = (context, ...rest) => aggregate.apply(null, [context, 'min', c, table, ...rest]);
|
|
89
|
+
c.max = (context, ...rest) => aggregate.apply(null, [context, 'max', c, table, ...rest]);
|
|
90
|
+
c.count = (context, ...rest) => aggregate.apply(null, [context, 'count', c, table, false, ...rest]);
|
|
91
|
+
|
|
79
92
|
function self(context) {
|
|
80
93
|
const tableAlias = quote(context,table._rootAlias || table._dbName);
|
|
81
94
|
const columnName = quote(context, c._dbName);
|
|
@@ -11,7 +11,7 @@ function columnAggregate(context, operator, column, relations, coalesce = true)
|
|
|
11
11
|
const columnName = quote(column._dbName);
|
|
12
12
|
|
|
13
13
|
return {
|
|
14
|
-
expression: (alias) => coalesce ? `COALESCE(${operator}(${tableAlias}.${columnName}), 0) as ${quote(alias)}` : `${operator}(${tableAlias}.${columnName}) as ${alias}`,
|
|
14
|
+
expression: (alias) => coalesce ? `COALESCE(${operator}(${tableAlias}.${columnName}), 0) as ${quote(alias)}` : `${operator}(${tableAlias}.${columnName}) as ${quote(alias)}`,
|
|
15
15
|
|
|
16
16
|
joins: newJoinArray(context, relations)
|
|
17
17
|
};
|