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.
@@ -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, ...args) {
23
+ stackAssign(obj, ..._args) {
24
24
  let newObj = Object.create(obj || {});
25
+ let args = _args.filter(Boolean);
25
26
 
26
- Object.assign(newObj, ...args);
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 = this.parseFieldProjection(result, true);
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 queryProjection = this.getProjectionFromQueryEngine(queryEngine, _options);
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 = this.parseFieldProjection(result);
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.definitionToField(this.connection, literal.definition);
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 = (literal.definition) ? literal.definitionToField(this.connection, literal.definition) : null;
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.definitionToField(this.connection, literal.definition);
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.definitionToField(this.connection, literal.definition);
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.definitionToField(this.connection, literal.definition);
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.definitionToField(this.connection, literal.definition);
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mythix-orm",
3
- "version": "1.4.5",
3
+ "version": "1.4.6",
4
4
  "description": "ORM for Mythix framework",
5
5
  "main": "lib/index.js",
6
6
  "type": "commonjs",