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.
@@ -99,8 +99,43 @@ class ConnectionBase extends EventEmitter {
99
99
  this.registerModels(options.models);
100
100
  }
101
101
 
102
- getDefaultOrder(rootModel, options) {
103
- return rootModel.defaultOrder.call(rootModel, options);
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 LiteralBase = require('./literal-base');
4
- const LiteralFieldBase = require('./literal-field-base');
5
- const Literal = require('./literal');
6
- const AverageLiteral = require('./average-literal');
7
- const CountLiteral = require('./count-literal');
8
- const MaxLiteral = require('./max-literal');
9
- const MinLiteral = require('./min-literal');
10
- const DistinctLiteral = require('./distinct-literal');
11
- const SumLiteral = require('./sum-literal');
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.escapeID(Model.getTableName(this.connection))}.${this.escapeID(columnName)}`;
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
- if (options && options.isSubQuery) {
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;
@@ -13,6 +13,7 @@ function addOperatorToQuery(name, inverseName, value, extraOptions) {
13
13
  operator: name,
14
14
  inverseOperator: inverseName,
15
15
  value: this._fetchOperatorValue(value),
16
+ hasCondition: true,
16
17
  };
17
18
 
18
19
  if (extraOptions)
@@ -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++) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mythix-orm",
3
- "version": "1.5.3",
3
+ "version": "1.5.6",
4
4
  "description": "ORM for Mythix framework",
5
5
  "main": "lib/index.js",
6
6
  "type": "commonjs",