mythix-orm 1.4.5 → 1.4.6
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/lib/connection/connection-base.js +24 -24
- package/lib/connection/literals/average-literal.js +2 -2
- package/lib/connection/literals/count-literal.js +2 -2
- package/lib/connection/literals/distinct-literal.js +2 -2
- package/lib/connection/literals/literal-field-base.js +7 -0
- package/lib/connection/literals/max-literal.js +2 -2
- package/lib/connection/literals/min-literal.js +2 -2
- package/lib/connection/literals/sum-literal.js +2 -2
- package/lib/connection/query-generator-base.js +56 -38
- package/package.json +1 -1
|
@@ -230,10 +230,10 @@ class ConnectionBase extends EventEmitter {
|
|
|
230
230
|
return SqlString.escape(value);
|
|
231
231
|
}
|
|
232
232
|
|
|
233
|
-
escape(field, _value) {
|
|
233
|
+
escape(field, _value, options) {
|
|
234
234
|
var value = _value;
|
|
235
235
|
if (LiteralBase.isLiteral(value))
|
|
236
|
-
return value.toString(this);
|
|
236
|
+
return value.toString(this, options);
|
|
237
237
|
|
|
238
238
|
value = field.type.serialize(value, this);
|
|
239
239
|
|
|
@@ -259,14 +259,14 @@ class ConnectionBase extends EventEmitter {
|
|
|
259
259
|
return parts.map((part) => SqlString.escapeId(part).replace(/^`/, '"').replace(/`$/, '"')).join('.');
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
-
escapeID(value) {
|
|
262
|
+
escapeID(value, options) {
|
|
263
263
|
if (LiteralBase.isLiteral(value))
|
|
264
|
-
return value.toString(this.connection);
|
|
264
|
+
return value.toString(this.connection, options);
|
|
265
265
|
|
|
266
266
|
return this._escapeID(value);
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
-
_averageLiteralToString(literal) {
|
|
269
|
+
_averageLiteralToString(literal, options) {
|
|
270
270
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
271
271
|
return;
|
|
272
272
|
|
|
@@ -274,10 +274,10 @@ class ConnectionBase extends EventEmitter {
|
|
|
274
274
|
if (!queryGenerator)
|
|
275
275
|
return;
|
|
276
276
|
|
|
277
|
-
return queryGenerator._averageLiteralToString(literal);
|
|
277
|
+
return queryGenerator._averageLiteralToString(literal, options);
|
|
278
278
|
}
|
|
279
279
|
|
|
280
|
-
_countLiteralToString(literal) {
|
|
280
|
+
_countLiteralToString(literal, options) {
|
|
281
281
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
282
282
|
return;
|
|
283
283
|
|
|
@@ -285,10 +285,10 @@ class ConnectionBase extends EventEmitter {
|
|
|
285
285
|
if (!queryGenerator)
|
|
286
286
|
return;
|
|
287
287
|
|
|
288
|
-
return queryGenerator._countLiteralToString(literal);
|
|
288
|
+
return queryGenerator._countLiteralToString(literal, options);
|
|
289
289
|
}
|
|
290
290
|
|
|
291
|
-
_distinctLiteralToString(literal) {
|
|
291
|
+
_distinctLiteralToString(literal, options) {
|
|
292
292
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
293
293
|
return;
|
|
294
294
|
|
|
@@ -296,10 +296,10 @@ class ConnectionBase extends EventEmitter {
|
|
|
296
296
|
if (!queryGenerator)
|
|
297
297
|
return;
|
|
298
298
|
|
|
299
|
-
return queryGenerator._distinctLiteralToString(literal);
|
|
299
|
+
return queryGenerator._distinctLiteralToString(literal, options);
|
|
300
300
|
}
|
|
301
301
|
|
|
302
|
-
_maxLiteralToString(literal) {
|
|
302
|
+
_maxLiteralToString(literal, options) {
|
|
303
303
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
304
304
|
return;
|
|
305
305
|
|
|
@@ -307,10 +307,10 @@ class ConnectionBase extends EventEmitter {
|
|
|
307
307
|
if (!queryGenerator)
|
|
308
308
|
return;
|
|
309
309
|
|
|
310
|
-
return queryGenerator._maxLiteralToString(literal);
|
|
310
|
+
return queryGenerator._maxLiteralToString(literal, options);
|
|
311
311
|
}
|
|
312
312
|
|
|
313
|
-
_minLiteralToString(literal) {
|
|
313
|
+
_minLiteralToString(literal, options) {
|
|
314
314
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
315
315
|
return;
|
|
316
316
|
|
|
@@ -318,10 +318,10 @@ class ConnectionBase extends EventEmitter {
|
|
|
318
318
|
if (!queryGenerator)
|
|
319
319
|
return;
|
|
320
320
|
|
|
321
|
-
return queryGenerator._minLiteralToString(literal);
|
|
321
|
+
return queryGenerator._minLiteralToString(literal, options);
|
|
322
322
|
}
|
|
323
323
|
|
|
324
|
-
_sumLiteralToString(literal) {
|
|
324
|
+
_sumLiteralToString(literal, options) {
|
|
325
325
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
326
326
|
return;
|
|
327
327
|
|
|
@@ -329,24 +329,24 @@ class ConnectionBase extends EventEmitter {
|
|
|
329
329
|
if (!queryGenerator)
|
|
330
330
|
return;
|
|
331
331
|
|
|
332
|
-
return queryGenerator._sumLiteralToString(literal);
|
|
332
|
+
return queryGenerator._sumLiteralToString(literal, options);
|
|
333
333
|
}
|
|
334
334
|
|
|
335
|
-
literalToString(literal) {
|
|
335
|
+
literalToString(literal, options) {
|
|
336
336
|
if (Literals.AverageLiteral.isLiteralType(literal))
|
|
337
|
-
return this._averageLiteralToString(literal);
|
|
337
|
+
return this._averageLiteralToString(literal, options);
|
|
338
338
|
else if (Literals.CountLiteral.isLiteralType(literal))
|
|
339
|
-
return this._countLiteralToString(literal);
|
|
339
|
+
return this._countLiteralToString(literal, options);
|
|
340
340
|
else if (Literals.DistinctLiteral.isLiteralType(literal))
|
|
341
|
-
return this._distinctLiteralToString(literal);
|
|
341
|
+
return this._distinctLiteralToString(literal, options);
|
|
342
342
|
else if (Literals.MaxLiteral.isLiteralType(literal))
|
|
343
|
-
return this._maxLiteralToString(literal);
|
|
343
|
+
return this._maxLiteralToString(literal, options);
|
|
344
344
|
else if (Literals.MinLiteral.isLiteralType(literal))
|
|
345
|
-
return this._minLiteralToString(literal);
|
|
345
|
+
return this._minLiteralToString(literal, options);
|
|
346
346
|
else if (Literals.SumLiteral.isLiteralType(literal))
|
|
347
|
-
return this._sumLiteralToString(literal);
|
|
347
|
+
return this._sumLiteralToString(literal, options);
|
|
348
348
|
else if (Literals.Literal.isLiteralType(literal))
|
|
349
|
-
return literal.toString(this);
|
|
349
|
+
return literal.toString(this, options);
|
|
350
350
|
|
|
351
351
|
throw new Error(`${this.constructor.name}::literalToString: Unsupported literal ${literal}.`);
|
|
352
352
|
}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const LiteralFieldBase = require('./literal-field-base');
|
|
4
4
|
|
|
5
5
|
class AverageLiteral extends LiteralFieldBase {
|
|
6
|
-
toString(connection) {
|
|
6
|
+
toString(connection, options) {
|
|
7
7
|
if (!connection)
|
|
8
8
|
return `${this.constructor.name} {}`;
|
|
9
9
|
|
|
10
|
-
return connection.literalToString(this);
|
|
10
|
+
return connection.literalToString(this, options);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -7,11 +7,11 @@ class CountLiteral extends LiteralFieldBase {
|
|
|
7
7
|
return false;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
toString(connection) {
|
|
10
|
+
toString(connection, options) {
|
|
11
11
|
if (!connection)
|
|
12
12
|
return `${this.constructor.name} {}`;
|
|
13
13
|
|
|
14
|
-
return connection.literalToString(this);
|
|
14
|
+
return connection.literalToString(this, options);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const LiteralFieldBase = require('./literal-field-base');
|
|
4
4
|
|
|
5
5
|
class DistinctLiteral extends LiteralFieldBase {
|
|
6
|
-
toString(connection) {
|
|
6
|
+
toString(connection, options) {
|
|
7
7
|
if (!connection)
|
|
8
8
|
return `${this.constructor.name} {}`;
|
|
9
9
|
|
|
10
|
-
return connection.literalToString(this);
|
|
10
|
+
return connection.literalToString(this, options);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -40,6 +40,13 @@ class LiteralFieldBase extends LiteralBase {
|
|
|
40
40
|
|
|
41
41
|
return `${definition.modelName}:${definition.fieldNames[0]}`;
|
|
42
42
|
}
|
|
43
|
+
|
|
44
|
+
getField(connection) {
|
|
45
|
+
if (!this.definition)
|
|
46
|
+
return null;
|
|
47
|
+
|
|
48
|
+
return this.definitionToField(connection, this.definition);
|
|
49
|
+
}
|
|
43
50
|
}
|
|
44
51
|
|
|
45
52
|
module.exports = LiteralFieldBase;
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const LiteralFieldBase = require('./literal-field-base');
|
|
4
4
|
|
|
5
5
|
class MaxLiteral extends LiteralFieldBase {
|
|
6
|
-
toString(connection) {
|
|
6
|
+
toString(connection, options) {
|
|
7
7
|
if (!connection)
|
|
8
8
|
return `${this.constructor.name} {}`;
|
|
9
9
|
|
|
10
|
-
return connection.literalToString(this);
|
|
10
|
+
return connection.literalToString(this, options);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const LiteralFieldBase = require('./literal-field-base');
|
|
4
4
|
|
|
5
5
|
class MinLiteral extends LiteralFieldBase {
|
|
6
|
-
toString(connection) {
|
|
6
|
+
toString(connection, options) {
|
|
7
7
|
if (!connection)
|
|
8
8
|
return `${this.constructor.name} {}`;
|
|
9
9
|
|
|
10
|
-
return connection.literalToString(this);
|
|
10
|
+
return connection.literalToString(this, options);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const LiteralFieldBase = require('./literal-field-base');
|
|
4
4
|
|
|
5
5
|
class SumLiteral extends LiteralFieldBase {
|
|
6
|
-
toString(connection) {
|
|
6
|
+
toString(connection, options) {
|
|
7
7
|
if (!connection)
|
|
8
8
|
return `${this.constructor.name} {}`;
|
|
9
9
|
|
|
10
|
-
return connection.literalToString(this);
|
|
10
|
+
return connection.literalToString(this, options);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -20,10 +20,12 @@ class QueryGeneratorBase {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
stackAssign(obj, ...
|
|
23
|
+
stackAssign(obj, ..._args) {
|
|
24
24
|
let newObj = Object.create(obj || {});
|
|
25
|
+
let args = _args.filter(Boolean);
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
if (args.length > 0)
|
|
28
|
+
Object.assign(newObj, ...args);
|
|
27
29
|
|
|
28
30
|
return newObj;
|
|
29
31
|
}
|
|
@@ -159,8 +161,14 @@ class QueryGeneratorBase {
|
|
|
159
161
|
continue;
|
|
160
162
|
|
|
161
163
|
if (LiteralBase.isLiteral(field)) {
|
|
162
|
-
let result = field.toString(this.connection);
|
|
163
|
-
let projectionField
|
|
164
|
+
let result = field.toString(this.connection, options);
|
|
165
|
+
let projectionField;
|
|
166
|
+
|
|
167
|
+
if (typeof field.getField === 'function')
|
|
168
|
+
projectionField = field.getField(this.connection);
|
|
169
|
+
else
|
|
170
|
+
projectionField = this.parseFieldProjection(result, true);
|
|
171
|
+
|
|
164
172
|
if (projectionField === result) {
|
|
165
173
|
// not able to parse projection
|
|
166
174
|
continue;
|
|
@@ -188,7 +196,7 @@ class QueryGeneratorBase {
|
|
|
188
196
|
return orderFieldMap;
|
|
189
197
|
}
|
|
190
198
|
|
|
191
|
-
sortedProjectedFields(projectedFields) {
|
|
199
|
+
sortedProjectedFields(projectedFields, options) {
|
|
192
200
|
return projectedFields.sort((a, b) => {
|
|
193
201
|
// If either value is a distinct literal
|
|
194
202
|
// then make certain it comes first in
|
|
@@ -197,8 +205,8 @@ class QueryGeneratorBase {
|
|
|
197
205
|
const distinctSortOrder = (a, b) => {
|
|
198
206
|
let x = LiteralBase.isLiteral(a);
|
|
199
207
|
let y = LiteralBase.isLiteral(b);
|
|
200
|
-
let xStr = (x) ? a.toString(this.connection) : a;
|
|
201
|
-
let yStr = (y) ? b.toString(this.connection) : b;
|
|
208
|
+
let xStr = (x) ? a.toString(this.connection, options) : a;
|
|
209
|
+
let yStr = (y) ? b.toString(this.connection, options) : b;
|
|
202
210
|
let xIsDistinct = (typeof xStr === 'string' && LITERAL_IS_DISTINCT_RE.test(xStr));
|
|
203
211
|
let yIsDistinct = (typeof yStr === 'string' && LITERAL_IS_DISTINCT_RE.test(yStr));
|
|
204
212
|
|
|
@@ -383,7 +391,7 @@ class QueryGeneratorBase {
|
|
|
383
391
|
result = Array.from(projectedFields.values());
|
|
384
392
|
|
|
385
393
|
// Convert projection fields to array and sort
|
|
386
|
-
result = this.sortedProjectedFields(result);
|
|
394
|
+
result = this.sortedProjectedFields(result, options);
|
|
387
395
|
|
|
388
396
|
// Now prefix the projection fields with the distinct
|
|
389
397
|
// literal if one exists on the query
|
|
@@ -442,7 +450,7 @@ class QueryGeneratorBase {
|
|
|
442
450
|
if (hasDistinct && Literals.DistinctLiteral.isLiteralType(projectionValue))
|
|
443
451
|
continue;
|
|
444
452
|
|
|
445
|
-
let key = projectionValue.toString(this.connection);
|
|
453
|
+
let key = projectionValue.toString(this.connection, options);
|
|
446
454
|
if (isAdding)
|
|
447
455
|
projectedFields.set(key, projectionValue);
|
|
448
456
|
else
|
|
@@ -556,8 +564,13 @@ class QueryGeneratorBase {
|
|
|
556
564
|
return result;
|
|
557
565
|
}
|
|
558
566
|
|
|
567
|
+
isFieldIdentifier(str) {
|
|
568
|
+
return (/^"[^"]+"."[^"]+"|"\w+:[\w.]+"/i).test(str);
|
|
569
|
+
}
|
|
570
|
+
|
|
559
571
|
getProjectedFields(queryEngine, _options, asMap) {
|
|
560
|
-
let
|
|
572
|
+
let options = _options || {};
|
|
573
|
+
let queryProjection = this.getProjectionFromQueryEngine(queryEngine, options);
|
|
561
574
|
let allProjectionFields = new Map();
|
|
562
575
|
|
|
563
576
|
for (let i = 0, il = queryProjection.length; i < il; i++) {
|
|
@@ -566,15 +579,20 @@ class QueryGeneratorBase {
|
|
|
566
579
|
continue;
|
|
567
580
|
|
|
568
581
|
if (LiteralBase.isLiteral(projectionField)) {
|
|
569
|
-
let result = projectionField.toString(this.connection);
|
|
570
|
-
let fullFieldName
|
|
582
|
+
let result = projectionField.toString(this.connection, options);
|
|
583
|
+
let fullFieldName;
|
|
584
|
+
|
|
585
|
+
if (typeof projectionField.getFullyQualifiedFieldName === 'function')
|
|
586
|
+
fullFieldName = projectionField.getFullyQualifiedFieldName();
|
|
587
|
+
else
|
|
588
|
+
fullFieldName = this.parseFieldProjection(result);
|
|
589
|
+
|
|
571
590
|
if (!fullFieldName)
|
|
572
591
|
fullFieldName = result;
|
|
573
592
|
|
|
574
593
|
if (fullFieldName && result)
|
|
575
594
|
allProjectionFields.set(fullFieldName, result);
|
|
576
|
-
|
|
577
|
-
if (result && !this.isFieldProjection(result))
|
|
595
|
+
else
|
|
578
596
|
allProjectionFields.set(result, result);
|
|
579
597
|
|
|
580
598
|
continue;
|
|
@@ -773,33 +791,33 @@ class QueryGeneratorBase {
|
|
|
773
791
|
return queryRoot.slice(index);
|
|
774
792
|
}
|
|
775
793
|
|
|
776
|
-
_averageLiteralToString(literal) {
|
|
794
|
+
_averageLiteralToString(literal, options) {
|
|
777
795
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
778
796
|
return;
|
|
779
797
|
|
|
780
|
-
let field = literal.
|
|
798
|
+
let field = literal.getField(this.connection);
|
|
781
799
|
let escapedFieldName;
|
|
782
800
|
|
|
783
801
|
if (LiteralBase.isLiteral(field))
|
|
784
|
-
escapedFieldName = field.toString(this.connection);
|
|
802
|
+
escapedFieldName = field.toString(this.connection, options);
|
|
785
803
|
else
|
|
786
|
-
escapedFieldName = this.getEscapedColumnName(field.Model, field, literal.options);
|
|
804
|
+
escapedFieldName = this.getEscapedColumnName(field.Model, field, this.stackAssign(options, literal.options));
|
|
787
805
|
|
|
788
806
|
return `AVG(${escapedFieldName})`;
|
|
789
807
|
}
|
|
790
808
|
|
|
791
|
-
_countLiteralToString(literal) {
|
|
809
|
+
_countLiteralToString(literal, options) {
|
|
792
810
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
793
811
|
return;
|
|
794
812
|
|
|
795
|
-
let field =
|
|
813
|
+
let field = literal.getField(this.connection);
|
|
796
814
|
let escapedFieldName;
|
|
797
815
|
|
|
798
816
|
if (field) {
|
|
799
817
|
if (LiteralBase.isLiteral(field))
|
|
800
|
-
escapedFieldName = field.toString(this.connection);
|
|
818
|
+
escapedFieldName = field.toString(this.connection, options);
|
|
801
819
|
else
|
|
802
|
-
escapedFieldName = this.getEscapedColumnName(field.Model, field, literal.options);
|
|
820
|
+
escapedFieldName = this.getEscapedColumnName(field.Model, field, this.stackAssign(options, literal.options));
|
|
803
821
|
} else {
|
|
804
822
|
escapedFieldName = '*';
|
|
805
823
|
}
|
|
@@ -807,58 +825,58 @@ class QueryGeneratorBase {
|
|
|
807
825
|
return `COUNT(${escapedFieldName})`;
|
|
808
826
|
}
|
|
809
827
|
|
|
810
|
-
_distinctLiteralToString(literal) {
|
|
828
|
+
_distinctLiteralToString(literal, options) {
|
|
811
829
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
812
830
|
return;
|
|
813
831
|
|
|
814
|
-
let field = literal.
|
|
832
|
+
let field = literal.getField(this.connection);
|
|
815
833
|
if (LiteralBase.isLiteral(field))
|
|
816
|
-
return `DISTINCT ${field.toString(this.connection)}`;
|
|
834
|
+
return `DISTINCT ${field.toString(this.connection, options)}`;
|
|
817
835
|
|
|
818
|
-
return `DISTINCT ${this.getEscapedProjectionName(field.Model, field, literal.options)}`;
|
|
836
|
+
return `DISTINCT ${this.getEscapedProjectionName(field.Model, field, this.stackAssign(options, literal.options))}`;
|
|
819
837
|
}
|
|
820
838
|
|
|
821
|
-
_maxLiteralToString(literal) {
|
|
839
|
+
_maxLiteralToString(literal, options) {
|
|
822
840
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
823
841
|
return;
|
|
824
842
|
|
|
825
|
-
let field = literal.
|
|
843
|
+
let field = literal.getField(this.connection);
|
|
826
844
|
let escapedFieldName;
|
|
827
845
|
|
|
828
846
|
if (LiteralBase.isLiteral(field))
|
|
829
|
-
escapedFieldName = field.toString(this.connection);
|
|
847
|
+
escapedFieldName = field.toString(this.connection, options);
|
|
830
848
|
else
|
|
831
|
-
escapedFieldName = this.getEscapedColumnName(field.Model, field, literal.options);
|
|
849
|
+
escapedFieldName = this.getEscapedColumnName(field.Model, field, this.stackAssign(options, literal.options));
|
|
832
850
|
|
|
833
851
|
return `MAX(${escapedFieldName})`;
|
|
834
852
|
}
|
|
835
853
|
|
|
836
|
-
_minLiteralToString(literal) {
|
|
854
|
+
_minLiteralToString(literal, options) {
|
|
837
855
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
838
856
|
return;
|
|
839
857
|
|
|
840
|
-
let field = literal.
|
|
858
|
+
let field = literal.getField(this.connection);
|
|
841
859
|
let escapedFieldName;
|
|
842
860
|
|
|
843
861
|
if (LiteralBase.isLiteral(field))
|
|
844
|
-
escapedFieldName = field.toString(this.connection);
|
|
862
|
+
escapedFieldName = field.toString(this.connection, options);
|
|
845
863
|
else
|
|
846
|
-
escapedFieldName = this.getEscapedColumnName(field.Model, field, literal.options);
|
|
864
|
+
escapedFieldName = this.getEscapedColumnName(field.Model, field, this.stackAssign(options, literal.options));
|
|
847
865
|
|
|
848
866
|
return `MIN(${escapedFieldName})`;
|
|
849
867
|
}
|
|
850
868
|
|
|
851
|
-
_sumLiteralToString(literal) {
|
|
869
|
+
_sumLiteralToString(literal, options) {
|
|
852
870
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
853
871
|
return;
|
|
854
872
|
|
|
855
|
-
let field = literal.
|
|
873
|
+
let field = literal.getField(this.connection);
|
|
856
874
|
let escapedFieldName;
|
|
857
875
|
|
|
858
876
|
if (LiteralBase.isLiteral(field))
|
|
859
|
-
escapedFieldName = field.toString(this.connection);
|
|
877
|
+
escapedFieldName = field.toString(this.connection, options);
|
|
860
878
|
else
|
|
861
|
-
escapedFieldName = this.getEscapedColumnName(field.Model, field, literal.options);
|
|
879
|
+
escapedFieldName = this.getEscapedColumnName(field.Model, field, this.stackAssign(options, literal.options));
|
|
862
880
|
|
|
863
881
|
return `SUM(${escapedFieldName})`;
|
|
864
882
|
}
|