mythix-orm 1.5.3 → 1.5.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 +50 -2
- package/lib/connection/literals/field-literal.js +14 -0
- package/lib/connection/literals/index.js +15 -13
- package/lib/connection/query-generator-base.js +27 -20
- package/lib/query-engine/field-scope.js +1 -0
- package/lib/query-engine/query-engine-base.js +16 -0
- package/package.json +1 -1
|
@@ -99,8 +99,43 @@ class ConnectionBase extends EventEmitter {
|
|
|
99
99
|
this.registerModels(options.models);
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
getDefaultOrder(
|
|
103
|
-
|
|
102
|
+
getDefaultOrder(Model, options) {
|
|
103
|
+
let order = Model.defaultOrder(options);
|
|
104
|
+
if (!order)
|
|
105
|
+
return;
|
|
106
|
+
|
|
107
|
+
order = Nife.arrayFlatten(Nife.toArray(order)).filter((value) => {
|
|
108
|
+
if (!value)
|
|
109
|
+
return false;
|
|
110
|
+
|
|
111
|
+
if (!Nife.instanceOf(value, 'string'))
|
|
112
|
+
return false;
|
|
113
|
+
|
|
114
|
+
return true;
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
if (Nife.isEmpty(order))
|
|
118
|
+
return;
|
|
119
|
+
|
|
120
|
+
let modelName = Model.getModelName();
|
|
121
|
+
return order.map((value) => ((value.indexOf(':') < 0) ? `${modelName}:${value}` : value));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
isLimitSupportedInContext(options) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
isOrderSupportedInContext(_options) {
|
|
129
|
+
let options = _options || {};
|
|
130
|
+
if (options.isSubQuery) {
|
|
131
|
+
let subQueryOperator = options.subQueryOperator;
|
|
132
|
+
if (subQueryOperator === 'EXISTS' || subQueryOperator === 'NOT EXISTS')
|
|
133
|
+
return true;
|
|
134
|
+
|
|
135
|
+
return 'PROJECTION_ONLY';
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return true;
|
|
104
139
|
}
|
|
105
140
|
|
|
106
141
|
_getFromModelCache(Model, key, defaultValue) {
|
|
@@ -306,6 +341,17 @@ class ConnectionBase extends EventEmitter {
|
|
|
306
341
|
return queryGenerator._distinctLiteralToString(literal, options);
|
|
307
342
|
}
|
|
308
343
|
|
|
344
|
+
_fieldLiteralToString(literal, options) {
|
|
345
|
+
if (!literal || !LiteralBase.isLiteral(literal))
|
|
346
|
+
return;
|
|
347
|
+
|
|
348
|
+
let queryGenerator = this.getQueryGenerator();
|
|
349
|
+
if (!queryGenerator)
|
|
350
|
+
return;
|
|
351
|
+
|
|
352
|
+
return queryGenerator._fieldLiteralToString(literal, options);
|
|
353
|
+
}
|
|
354
|
+
|
|
309
355
|
_maxLiteralToString(literal, options) {
|
|
310
356
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
311
357
|
return;
|
|
@@ -346,6 +392,8 @@ class ConnectionBase extends EventEmitter {
|
|
|
346
392
|
return this._countLiteralToString(literal, options);
|
|
347
393
|
else if (Literals.DistinctLiteral.isLiteralType(literal))
|
|
348
394
|
return this._distinctLiteralToString(literal, options);
|
|
395
|
+
else if (Literals.FieldLiteral.isLiteralType(literal))
|
|
396
|
+
return this._fieldLiteralToString(literal, options);
|
|
349
397
|
else if (Literals.MaxLiteral.isLiteralType(literal))
|
|
350
398
|
return this._maxLiteralToString(literal, options);
|
|
351
399
|
else if (Literals.MinLiteral.isLiteralType(literal))
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const LiteralFieldBase = require('./literal-field-base');
|
|
4
|
+
|
|
5
|
+
class FieldLiteral extends LiteralFieldBase {
|
|
6
|
+
toString(connection, options) {
|
|
7
|
+
if (!connection)
|
|
8
|
+
return `${this.constructor.name} {}`;
|
|
9
|
+
|
|
10
|
+
return connection.literalToString(this, options);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
module.exports = FieldLiteral;
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
3
|
+
const AverageLiteral = require('./average-literal');
|
|
4
|
+
const CountLiteral = require('./count-literal');
|
|
5
|
+
const DistinctLiteral = require('./distinct-literal');
|
|
6
|
+
const FieldLiteral = require('./field-literal');
|
|
7
|
+
const Literal = require('./literal');
|
|
8
|
+
const LiteralBase = require('./literal-base');
|
|
9
|
+
const LiteralFieldBase = require('./literal-field-base');
|
|
10
|
+
const MaxLiteral = require('./max-literal');
|
|
11
|
+
const MinLiteral = require('./min-literal');
|
|
12
|
+
const SumLiteral = require('./sum-literal');
|
|
12
13
|
|
|
13
14
|
module.exports = {
|
|
14
|
-
LiteralBase,
|
|
15
|
-
LiteralFieldBase,
|
|
16
|
-
Literal,
|
|
17
15
|
AverageLiteral,
|
|
18
16
|
CountLiteral,
|
|
17
|
+
DistinctLiteral,
|
|
18
|
+
FieldLiteral,
|
|
19
|
+
Literal,
|
|
20
|
+
LiteralBase,
|
|
21
|
+
LiteralFieldBase,
|
|
19
22
|
MaxLiteral,
|
|
20
23
|
MinLiteral,
|
|
21
|
-
DistinctLiteral,
|
|
22
24
|
SumLiteral,
|
|
23
25
|
};
|
|
@@ -46,11 +46,6 @@ class QueryGeneratorBase {
|
|
|
46
46
|
return this.connection.escapeID(...args);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
getTableNameFromQueryPart(queryPart) {
|
|
50
|
-
let Model = queryPart.Model;
|
|
51
|
-
return Model.getTableName(this.connection);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
49
|
getEscapedFieldName(_Model, field, options) {
|
|
55
50
|
let isString = Nife.instanceOf(field, 'string');
|
|
56
51
|
let fieldName = (isString) ? field : field.fieldName;
|
|
@@ -73,10 +68,23 @@ class QueryGeneratorBase {
|
|
|
73
68
|
if (!Model && field && !isString)
|
|
74
69
|
Model = field.Model;
|
|
75
70
|
|
|
71
|
+
if (options && options.columnNamePrefix)
|
|
72
|
+
columnName = `${options.columnNamePrefix}${columnName}`;
|
|
73
|
+
|
|
76
74
|
if (!Model || (options && options.columnNameOnly === true))
|
|
77
75
|
return this.escapeID(columnName);
|
|
78
76
|
else
|
|
79
|
-
return `${this.
|
|
77
|
+
return `${this.getEscapedTableName(Model)}.${this.escapeID(columnName)}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getEscapedTableName(_modelOrField, options) {
|
|
81
|
+
let Model = (_modelOrField.Model) ? _modelOrField.Model : _modelOrField;
|
|
82
|
+
let tableName = Model.getTableName(this.connection);
|
|
83
|
+
|
|
84
|
+
if (options && options.tableNamePrefix)
|
|
85
|
+
tableName = `${options.tableNamePrefix}${tableName}`;
|
|
86
|
+
|
|
87
|
+
return this.escapeID(tableName);
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
// eslint-disable-next-line no-unused-vars
|
|
@@ -361,7 +369,8 @@ class QueryGeneratorBase {
|
|
|
361
369
|
let projectedFields = _projectedFields;
|
|
362
370
|
let result;
|
|
363
371
|
|
|
364
|
-
|
|
372
|
+
let subQueryOperator = (options && options.subQueryOperator);
|
|
373
|
+
if (options && options.isSubQuery && !(subQueryOperator === 'EXISTS' || subQueryOperator === 'NOT EXISTS')) {
|
|
365
374
|
// If we are sub-selecting then only one
|
|
366
375
|
// field in the projection is allowed
|
|
367
376
|
|
|
@@ -773,19 +782,6 @@ class QueryGeneratorBase {
|
|
|
773
782
|
return orderLimitOffset;
|
|
774
783
|
}
|
|
775
784
|
|
|
776
|
-
queryHasConditions(query) {
|
|
777
|
-
for (let i = 0, il = query.length; i < il; i++) {
|
|
778
|
-
let queryPart = query[i];
|
|
779
|
-
if (!Object.prototype.hasOwnProperty.call(queryPart, 'condition'))
|
|
780
|
-
continue;
|
|
781
|
-
|
|
782
|
-
if (queryPart.condition === true)
|
|
783
|
-
return true;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
return false;
|
|
787
|
-
}
|
|
788
|
-
|
|
789
785
|
getQuerySliceFromQueryPart(queryPart) {
|
|
790
786
|
let queryRoot = queryPart.queryRoot;
|
|
791
787
|
let index = queryRoot.indexOf(queryPart);
|
|
@@ -838,6 +834,17 @@ class QueryGeneratorBase {
|
|
|
838
834
|
return `DISTINCT ${this.getEscapedProjectionName(field.Model, field, this.stackAssign(options, literal.options))}`;
|
|
839
835
|
}
|
|
840
836
|
|
|
837
|
+
_fieldLiteralToString(literal, options) {
|
|
838
|
+
if (!literal || !LiteralBase.isLiteral(literal))
|
|
839
|
+
return;
|
|
840
|
+
|
|
841
|
+
let field = literal.getField(this.connection);
|
|
842
|
+
if (LiteralBase.isLiteral(field))
|
|
843
|
+
return field.toString(this.connection, options);
|
|
844
|
+
|
|
845
|
+
return this.getEscapedColumnName(field.Model, field, this.stackAssign(options, literal.options));
|
|
846
|
+
}
|
|
847
|
+
|
|
841
848
|
_maxLiteralToString(literal, options) {
|
|
842
849
|
if (!literal || !LiteralBase.isLiteral(literal))
|
|
843
850
|
return;
|
|
@@ -256,6 +256,22 @@ class QueryEngineBase extends ProxyClass {
|
|
|
256
256
|
return false;
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
+
_queryHasConditions() {
|
|
260
|
+
let context = this._getRawQueryContext();
|
|
261
|
+
return context.hasCondition;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
_queryHasJoins() {
|
|
265
|
+
let queryParts = this._getRawQuery();
|
|
266
|
+
for (let i = 0, il = queryParts.length; i < il; i++) {
|
|
267
|
+
let queryPart = queryParts[i];
|
|
268
|
+
if (QueryEngineBase.isQuery(queryPart.value) && !queryPart.value.hasCondition)
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
|
|
259
275
|
_debugQuery() {
|
|
260
276
|
let query = this._getRawQuery();
|
|
261
277
|
for (let i = 0, il = query.length; i < il; i++) {
|