mythix-orm 1.10.2 → 1.11.1

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.
@@ -20,9 +20,9 @@ class QueryEngine extends QueryEngineBase {
20
20
  let context = Object.assign(
21
21
  Object.create(_context || {}),
22
22
  {
23
- currentScopeName: 'queryEngine',
24
- isQueryContext: true,
25
- contextID: QueryEngineBase.generateID(),
23
+ currentScopeName: 'queryEngine',
24
+ isQueryOperationContext: true,
25
+ contextID: QueryEngineBase.generateID(),
26
26
  },
27
27
  );
28
28
 
@@ -39,15 +39,15 @@ class QueryEngine extends QueryEngineBase {
39
39
  return this._newModelScope(model);
40
40
  }
41
41
 
42
- unscoped(context) {
42
+ unscoped() {
43
+ let context = this.getOperationContext();
43
44
  let QueryEngineClass = this.constructor;
44
- let currentContext = context || this.currentContext;
45
45
  let queryEngine = new QueryEngineClass({
46
- connection: currentContext.connection,
46
+ connection: this.getConnection(),
47
47
  });
48
48
 
49
- if (currentContext.rootModelName)
50
- queryEngine = queryEngine[currentContext.rootModelName];
49
+ if (context.rootModelName)
50
+ queryEngine = queryEngine[context.rootModelName];
51
51
 
52
52
  return queryEngine;
53
53
  }
@@ -59,36 +59,23 @@ class QueryEngine extends QueryEngineBase {
59
59
  return queryGenerator.toConnectionString(this, ...args);
60
60
  }
61
61
 
62
- MERGE(_queryEngine) {
63
- let queryEngine = _queryEngine;
64
- if (!queryEngine)
62
+ MERGE(_incomingQueryEngine, _options) {
63
+ let incomingQueryEngine = _incomingQueryEngine;
64
+ if (!incomingQueryEngine)
65
65
  return this;
66
66
 
67
- let thisQueryContext = this.getOperationContext();
68
- if (!QueryEngine.isQuery(queryEngine) && Nife.instanceOf(queryEngine, 'array', 'object', 'map', 'set'))
69
- queryEngine = Utils.generateQueryFromFilter(this.getConnection(), thisQueryContext.rootModel, queryEngine);
70
-
71
- let sourceQuery = queryEngine.getOperationStack();
72
- let currentModel = thisQueryContext.Model;
73
- let skipLogicalOperators = true;
74
-
75
- for (let i = 0, il = sourceQuery.length; i < il; i++) {
76
- let queryPart = sourceQuery[i];
77
- let mergeContext = Utils.objectAssignSpecial(queryPart, null, [
78
- // Skip the following keys
79
- // as they are provided by the
80
- // parent queryEngine
81
- 'connection',
82
- 'fieldContext',
83
- 'isQueryContext',
84
- 'modelContext',
85
- 'queryEngineScope',
86
- 'operationStack',
87
- 'rootContext',
88
- 'rootModel',
89
- 'rootModelName',
90
- '_queryFinalized',
91
- ]);
67
+ let options = _options || {};
68
+ let thisQueryContext = this.getOperationContext();
69
+ if (!QueryEngine.isQuery(incomingQueryEngine) && Nife.instanceOf(incomingQueryEngine, 'array', 'object', 'map', 'set'))
70
+ incomingQueryEngine = Utils.generateQueryFromFilter(this.getConnection(options.connection), thisQueryContext.rootModel, incomingQueryEngine);
71
+
72
+ let incomingOperationStack = incomingQueryEngine.getOperationStack();
73
+ let skippingLogical = true;
74
+ let logicalOperatorEncountered = false;
75
+ let queryEngine = this.clone();
76
+
77
+ for (let i = 0, il = incomingOperationStack.length; i < il; i++) {
78
+ let queryPart = incomingOperationStack[i];
92
79
 
93
80
  // For merges, we want to skip the first logical operators
94
81
  // found before any other operation.
@@ -98,32 +85,38 @@ class QueryEngine extends QueryEngineBase {
98
85
  // Since the result we want here is OR merge, not AND merge
99
86
  // we skip the first "AND" we encounter, leaving the "OR" as
100
87
  // the current logical operator.
101
- if (skipLogicalOperators && Object.prototype.hasOwnProperty.call(mergeContext, 'logical') && mergeContext.logical) {
102
- if (mergeContext.value == null && (mergeContext.operator === 'AND' || mergeContext.operator === 'OR'))
88
+ // Logical operators do not always come first in the query,
89
+ // so we need to rely on "logicalOperatorEncountered" to
90
+ // ensure we skip only the first one (or first few in a sequence).
91
+ if (skippingLogical && Object.prototype.hasOwnProperty.call(queryPart, 'logical') && queryPart.logical) {
92
+ if (queryPart.value == null && (queryPart.operator === 'AND' || queryPart.operator === 'OR')) {
93
+ logicalOperatorEncountered = true;
103
94
  continue;
95
+ }
104
96
  }
105
97
 
106
- if (Object.prototype.hasOwnProperty.call(mergeContext, 'operator')) {
107
- // Skip unneeded duplicate model entries
108
- if (mergeContext.operator === 'MODEL') {
109
- if (mergeContext.Model === currentModel)
110
- continue;
98
+ if (logicalOperatorEncountered)
99
+ skippingLogical = false;
111
100
 
112
- currentModel = mergeContext.Model;
113
- } else if (mergeContext.operator !== 'FIELD') {
114
- skipLogicalOperators = false;
115
- }
101
+ let value = queryPart.value;
102
+ if (Object.prototype.hasOwnProperty.call(queryPart, 'control') && queryPart.control === true) {
103
+ if (queryPart.operator === 'PROJECT' && options.projections !== true)
104
+ continue;
105
+
106
+ if (queryPart.operator === 'ORDER' && options.orders === false)
107
+ continue;
108
+
109
+ if (queryPart.operator === 'GROUP_BY' && options.groupBys === false)
110
+ continue;
111
+
112
+ if (queryPart.operator === 'PROJECT' || queryPart.operator === 'ORDER' || queryPart.operator === 'GROUP_BY')
113
+ value = [ '+' ].concat(value);
116
114
  }
117
115
 
118
- this._pushOperationOntoStack(Object.assign({
119
- Model: queryPart.Model,
120
- modelName: queryPart.modelName,
121
- Field: queryPart.Field,
122
- fieldName: queryPart.fieldName,
123
- }, mergeContext));
116
+ queryEngine = queryEngine[queryPart.queryProp](value, ...(queryPart.queryExtraArgs || []));
124
117
  }
125
118
 
126
- return this;
119
+ return queryEngine;
127
120
  }
128
121
 
129
122
  async all(options) {
@@ -269,6 +269,6 @@ class DateTimeType extends Type {
269
269
  }
270
270
 
271
271
  module.exports = {
272
- DATETIME: Type.wrapConstructor(DateTimeType),
272
+ DATETIME: Type.wrapConstructor(DateTimeType),
273
273
  DateTimeType,
274
274
  };
@@ -110,13 +110,13 @@ class SerializedType extends Type {
110
110
  options = { type: options };
111
111
 
112
112
  options = {
113
- serialize: ({ value }) => {
113
+ serialize: ({ value }) => {
114
114
  if (value == null)
115
115
  return value;
116
116
 
117
117
  return JSON.stringify(value);
118
118
  },
119
- deserialize: ({ value }) => {
119
+ deserialize: ({ value }) => {
120
120
  if (value == null)
121
121
  return value;
122
122
 
@@ -72,12 +72,12 @@ const TYPE_OPERATIONS = {
72
72
  if (!model.isDirty())
73
73
  return model;
74
74
 
75
- let [ storedModel ] = await connection.update(model.getModel(), [ model ], options);
75
+ await connection.update(model.getModel(), [ model ], options);
76
76
 
77
77
  // Update this model to reflect the update
78
- ModelUtils.setRelationalValues(connection, this.getModel(), this, storedModel.getModel(), storedModel);
78
+ ModelUtils.setRelationalValues(connection, this.getModel(), this, model.getModel(), model);
79
79
 
80
- return storedModel;
80
+ return model;
81
81
  }, options);
82
82
 
83
83
  // Save needs to go outside of the transaction
@@ -140,17 +140,17 @@ class RelationalTypeBase extends Type {
140
140
  };
141
141
 
142
142
  let target = {
143
- Model: leftContext.Model,
144
- modelName: leftContext.modelName,
145
- field: leftContext.Field,
146
- fieldName: leftContext.fieldName,
143
+ Model: leftContext.Model,
144
+ modelName: leftContext.modelName,
145
+ field: leftContext.Field,
146
+ fieldName: leftContext.fieldName,
147
147
  };
148
148
 
149
149
  let source = {
150
- Model: rightContext.Model,
151
- modelName: rightContext.modelName,
152
- field: rightContext.Field,
153
- fieldName: rightContext.fieldName,
150
+ Model: rightContext.Model,
151
+ modelName: rightContext.modelName,
152
+ field: rightContext.Field,
153
+ fieldName: rightContext.fieldName,
154
154
  };
155
155
 
156
156
  // The primary model is always the target
@@ -205,10 +205,10 @@ class RelationalTypeBase extends Type {
205
205
  let targetField = fkField.getTargetField(connection);
206
206
  let targetFieldName = fkField.getTargetFieldName(connection);
207
207
  let fkContext = {
208
- Model: targetModel,
209
- modelName: targetModelName,
210
- field: targetField,
211
- fieldName: targetFieldName,
208
+ Model: targetModel,
209
+ modelName: targetModelName,
210
+ field: targetField,
211
+ fieldName: targetFieldName,
212
212
  };
213
213
 
214
214
  if (!isAlreadyVisited(fkContext, rightQueryContext))
@@ -222,10 +222,10 @@ class RelationalTypeBase extends Type {
222
222
  let targetField = fkField.getTargetField(connection);
223
223
  let targetFieldName = fkField.getTargetFieldName(connection);
224
224
  let fkContext = {
225
- Model: targetModel,
226
- modelName: targetModelName,
227
- field: targetField,
228
- fieldName: targetFieldName,
225
+ Model: targetModel,
226
+ modelName: targetModelName,
227
+ field: targetField,
228
+ fieldName: targetFieldName,
229
229
  };
230
230
 
231
231
  if (!isAlreadyVisited(leftQueryContext, fkContext))
@@ -245,16 +245,16 @@ class RelationalTypeBase extends Type {
245
245
  // be copying field values from
246
246
  let targetModelName = TargetModel.getModelName();
247
247
  let source = {
248
- Model: TargetModel,
249
- modelName: targetModelName,
250
- Field: TargetField,
251
- fieldName: TargetField.fieldName,
248
+ Model: TargetModel,
249
+ modelName: targetModelName,
250
+ Field: TargetField,
251
+ fieldName: TargetField.fieldName,
252
252
  };
253
253
  let target = {
254
- Model: PrimaryModel,
255
- modelName: PrimaryModel.getModelName(),
256
- Field: context.field,
257
- fieldName: context.field.fieldName,
254
+ Model: PrimaryModel,
255
+ modelName: PrimaryModel.getModelName(),
256
+ Field: context.field,
257
+ fieldName: context.field.fieldName,
258
258
  };
259
259
 
260
260
  if (!isAlreadyVisited(source, target))
@@ -7,7 +7,6 @@ const AsyncStore = require('./async-store');
7
7
 
8
8
  const {
9
9
  collect,
10
- objectAssignSpecial,
11
10
  valueToDateTime,
12
11
  } = MiscUtils;
13
12
 
@@ -31,6 +30,7 @@ const {
31
30
  const {
32
31
  parseFilterFieldAndOperator,
33
32
  generateQueryFromFilter,
33
+ margeFields,
34
34
  } = QueryUtils;
35
35
 
36
36
  const {
@@ -48,7 +48,6 @@ module.exports = {
48
48
 
49
49
  // MiscUtils
50
50
  collect,
51
- objectAssignSpecial,
52
51
  valueToDateTime,
53
52
 
54
53
  // ModelUtils
@@ -70,6 +69,7 @@ module.exports = {
70
69
  // QueryUtils
71
70
  parseFilterFieldAndOperator,
72
71
  generateQueryFromFilter,
72
+ margeFields,
73
73
 
74
74
  // AsyncStore
75
75
  getContextStore,
@@ -2,5 +2,4 @@ import { DateTime } from 'luxon';
2
2
  import { GenericObject } from '../interfaces/common';
3
3
 
4
4
  declare function collect(iterator: AsyncIterator<any>): Promise<Array<any>>;
5
- declare function objectAssignSpecial(obj: GenericObject, proto?: GenericObject | null, skipKeys?: Array<string> | GenericObject): GenericObject;
6
5
  declare function valueToDateTime(value: DateTime | Date | number | BigInt | string, format?: string): DateTime;
@@ -12,29 +12,6 @@ async function collect(iterator) {
12
12
  return items;
13
13
  }
14
14
 
15
- function objectAssignSpecial(obj, proto, skipKeys) {
16
- const isKeySkipped = (key) => {
17
- if (Array.isArray(skipKeys))
18
- return (skipKeys.indexOf(key) >= 0);
19
-
20
- return Object.prototype.hasOwnProperty.call(skipKeys, key);
21
- };
22
-
23
- let newObj = Object.create(proto || {});
24
- let keys = Object.keys(obj);
25
-
26
- // eslint-disable-next-line guard-for-in
27
- for (let i = 0, il = keys.length; i < il; i++) {
28
- let key = keys[i];
29
- if (skipKeys && isKeySkipped(key))
30
- continue;
31
-
32
- newObj[key] = obj[key];
33
- }
34
-
35
- return newObj;
36
- }
37
-
38
15
  function valueToDateTime(value, format) {
39
16
  if (DateTime.isDateTime(value)) {
40
17
  return value;
@@ -59,6 +36,5 @@ function valueToDateTime(value, format) {
59
36
 
60
37
  module.exports = {
61
38
  collect,
62
- objectAssignSpecial,
63
39
  valueToDateTime,
64
40
  };
@@ -127,19 +127,18 @@ function fieldToFullyQualifiedName(field, Model) {
127
127
  }
128
128
 
129
129
  function sortModelNamesByDependencyOrder(connection, _modelNames, dependencyHelper) {
130
- const recursiveAdd = (modelName, _depth) => {
130
+ const recursiveAdd = (modelName, alreadyVisisted) => {
131
131
  if (modelNames.indexOf(modelName) < 0)
132
132
  return;
133
133
 
134
- let depth = _depth || 0;
135
-
136
- // eslint-disable-next-line no-magic-numbers
137
- if (depth > 10)
138
- throw new Error(`ModelUtils::sortModelNamesByDependencyOrder: Cyclic dependency detected with model "${modelName}".`);
139
-
140
134
  if (finalOrder.has(modelName))
141
135
  return;
142
136
 
137
+ if (alreadyVisited.has(modelName))
138
+ return;
139
+
140
+ alreadyVisited.add(modelName);
141
+
143
142
  let dependentModelNames = modelOrderMap[modelName];
144
143
  if (dependentModelNames == null) {
145
144
  let Model = connection.getModel(modelName);
@@ -153,22 +152,23 @@ function sortModelNamesByDependencyOrder(connection, _modelNames, dependencyHelp
153
152
 
154
153
  for (let j = 0, jl = dependentModelNames.length; j < jl; j++) {
155
154
  let dependentModelName = dependentModelNames[j];
156
- recursiveAdd(dependentModelName, depth + 1);
155
+ recursiveAdd(dependentModelName, alreadyVisited);
157
156
  }
158
157
 
159
158
  finalOrder.set(modelName, dependentModelNames);
160
159
  };
161
160
 
162
- let modelOrderMap = {};
163
- let modelNames = Nife.toArray(_modelNames).slice().sort();
164
- let finalOrder = new Map();
161
+ let modelOrderMap = {};
162
+ let modelNames = Nife.toArray(_modelNames).slice().sort();
163
+ let finalOrder = new Map();
164
+ let alreadyVisited = new Set();
165
165
 
166
166
  for (let i = 0, il = modelNames.length; i < il; i++) {
167
167
  let modelName = modelNames[i];
168
168
  if (!modelName)
169
169
  continue;
170
170
 
171
- recursiveAdd(modelName);
171
+ recursiveAdd(modelName, alreadyVisited);
172
172
  }
173
173
 
174
174
  let sortedModelNames = Array.from(finalOrder.keys());
@@ -206,11 +206,11 @@ async function getRelationalModelStatusForField(connection, self, field, ...args
206
206
  let primaryModelName = self.getModelName();
207
207
  let relationalMap = {
208
208
  [primaryModelName]: {
209
- create: !self.isPersisted(),
210
- instance: self,
211
- modelName: primaryModelName,
212
- Model: PrimaryModel,
213
- fields: new Map(),
209
+ create: !self.isPersisted(),
210
+ instance: self,
211
+ modelName: primaryModelName,
212
+ Model: PrimaryModel,
213
+ fields: new Map(),
214
214
  },
215
215
  };
216
216
 
@@ -4,8 +4,15 @@ import { Model, ModelClass } from '../model';
4
4
  import { QueryEngine } from '../query-engine';
5
5
 
6
6
  export declare function parseFilterFieldAndOperator(fieldName: string): { field: string, operator: string };
7
+
7
8
  export declare function generateQueryFromFilter(
8
9
  connection: ConnectionBase,
9
10
  Model: ModelClass,
10
11
  filter: Array<GenericObject | Model> | GenericObject | Model,
11
12
  ): QueryEngine;
13
+
14
+ export declare function margeFields(
15
+ connection: ConnectionBase,
16
+ currentFields: Map<string, any>,
17
+ incomingFields: Array<any>
18
+ ): Map<string, any>;
@@ -34,19 +34,19 @@ const Nife = require('nife');
34
34
  // WHERE firstName IN ('John', 'Bob', 'Mary')
35
35
 
36
36
  const FILTER_OPERATORS = {
37
- '=': (Model, fieldName, query, value) => {
37
+ '=': (Model, fieldName, query, value) => {
38
38
  return query.AND[fieldName].EQ(value);
39
39
  },
40
40
  '!=': (Model, fieldName, query, value) => {
41
41
  return query.AND[fieldName].NEQ(value);
42
42
  },
43
- '>': (Model, fieldName, query, value) => {
43
+ '>': (Model, fieldName, query, value) => {
44
44
  return query.AND[fieldName].GT(value);
45
45
  },
46
46
  '>=': (Model, fieldName, query, value) => {
47
47
  return query.AND[fieldName].GTE(value);
48
48
  },
49
- '<': (Model, fieldName, query, value) => {
49
+ '<': (Model, fieldName, query, value) => {
50
50
  return query.AND[fieldName].LT(value);
51
51
  },
52
52
  '<=': (Model, fieldName, query, value) => {
@@ -61,7 +61,7 @@ const FILTER_OPERATORS = {
61
61
  return query.AND(Model.where[fieldName].LT(value[0]).OR[fieldName].GT(value[1]));
62
62
  },
63
63
  // Like
64
- '*': (Model, fieldName, query, value) => {
64
+ '*': (Model, fieldName, query, value) => {
65
65
  return query.AND[fieldName].LIKE(value);
66
66
  },
67
67
  // NOT Like
@@ -180,7 +180,178 @@ function generateQueryFromFilter(connection, Model, _filter, _depth) {
180
180
  return query;
181
181
  }
182
182
 
183
+ function margeFields(queryEngine, currentFields, _incomingFields, extraData, _options) {
184
+ const RESET = 0;
185
+ const ADD = 1;
186
+ const SUB = 2;
187
+
188
+ const getInitialMode = (incomingFields) => {
189
+ for (let i = 0, il = incomingFields.length; i < il; i++) {
190
+ let incomingField = incomingFields[i];
191
+ if (!incomingField)
192
+ continue;
193
+
194
+ if (typeof incomingField.isLiteral === 'function' && incomingField.isLiteral(incomingField))
195
+ return RESET;
196
+
197
+ if (typeof incomingField.isModelClass === 'function' && incomingField.isModelClass(incomingField))
198
+ return RESET;
199
+
200
+ if (typeof incomingField.isField === 'function' && incomingField.isField(incomingField))
201
+ return RESET;
202
+
203
+ if (!Nife.instanceOf(incomingField, 'string'))
204
+ RESET;
205
+
206
+ let firstChar = incomingField.charAt(0);
207
+ if (firstChar === '+')
208
+ return ADD;
209
+
210
+ if (firstChar === '-')
211
+ return SUB;
212
+
213
+ return RESET;
214
+ }
215
+ };
216
+
217
+ const addOrRemove = (mode, key, item) => {
218
+ if (mode === ADD)
219
+ fields.set(key, { ...(extraData || {}), value: item });
220
+ else
221
+ fields.delete(key);
222
+ };
223
+
224
+ const addOrRemoveAllModelFields = (mode, Model) => {
225
+ let modelName = Model.getModelName();
226
+
227
+ Model.iterateFields(({ field, fieldName }) => {
228
+ if (field.type.isVirtual())
229
+ return;
230
+
231
+ let fullFieldName = `${modelName}:${fieldName}`;
232
+ addOrRemove(mode, fullFieldName, field);
233
+ });
234
+ };
235
+
236
+ let context = queryEngine.getOperationContext();
237
+ let incomingFields = _incomingFields.filter(Boolean);
238
+ if (Nife.isEmpty(incomingFields))
239
+ return new Map();
240
+
241
+ let options = _options || {};
242
+ let connection = queryEngine.getConnection();
243
+ let RootModel = context.rootModel;
244
+ let rootModelName = RootModel.getModelName();
245
+ let mode = getInitialMode(incomingFields);
246
+ let fields = (mode === RESET) ? new Map() : new Map(currentFields);
247
+ let allQueryModels;
248
+
249
+ if (mode === RESET)
250
+ mode = ADD;
251
+
252
+ for (let i = 0, il = incomingFields.length; i < il; i++) {
253
+ let incomingField = incomingFields[i];
254
+ if (!incomingField)
255
+ continue;
256
+
257
+ if (typeof incomingField.isLiteral === 'function' && incomingField.isLiteral(incomingField)) {
258
+ if (!connection)
259
+ throw new Error('QueryUtils::margeFields: "connection" is required, but not found.');
260
+
261
+ let result = incomingField.toString(connection, options);
262
+ addOrRemove(mode, result, result);
263
+ continue;
264
+ }
265
+
266
+ if (typeof incomingField.isModelClass === 'function' && incomingField.isModelClass(incomingField)) {
267
+ addOrRemoveAllModelFields(mode, incomingField);
268
+ continue;
269
+ }
270
+
271
+ if (typeof incomingField.isField === 'function' && incomingField.isField(incomingField)) {
272
+ let fullFieldName = `${incomingField.Model.getModelName()}:${incomingField.fieldName}`;
273
+ addOrRemove(mode, fullFieldName, incomingField);
274
+ continue;
275
+ }
276
+
277
+ if (!Nife.instanceOf(incomingField, 'string'))
278
+ continue;
279
+
280
+ if (!connection)
281
+ throw new Error('QueryUtils::margeFields: "connection" is required, but not found.');
282
+
283
+ if (!incomingField)
284
+ continue;
285
+
286
+ let firstChar = incomingField.charAt(0);
287
+ let currentMode = mode;
288
+
289
+ if (firstChar === '+') {
290
+ if (incomingField.length === 1) {
291
+ mode = ADD;
292
+ continue;
293
+ }
294
+
295
+ currentMode = ADD;
296
+ incomingField = incomingField.substring(1);
297
+ }
298
+
299
+ if (firstChar === '-') {
300
+ if (incomingField.length === 1) {
301
+ mode = SUB;
302
+ continue;
303
+ }
304
+
305
+ currentMode = SUB;
306
+ incomingField = incomingField.substring(1);
307
+ }
308
+
309
+ if (incomingField.charAt(0) === '@') {
310
+ incomingField = incomingField.substring(1);
311
+ addOrRemove(currentMode, incomingField, incomingField);
312
+ continue;
313
+ }
314
+
315
+ if (incomingField === '*') {
316
+ if (!allQueryModels)
317
+ allQueryModels = queryEngine.getAllModelsUsedInQuery();
318
+
319
+ for (let i = 0, il = allQueryModels.length; i < il; i++) {
320
+ let Model = allQueryModels[i];
321
+ addOrRemoveAllModelFields(currentMode, Model);
322
+ }
323
+
324
+ continue;
325
+ }
326
+
327
+ let def = connection.parseQualifiedName(incomingField);
328
+ if (!def.modelName)
329
+ def.modelName = rootModelName;
330
+
331
+ let Model = connection.getModel(def.modelName);
332
+ if (!Model)
333
+ throw new Error(`QueryUtils::margeFields: Model "${def.modelName}" not found.`);
334
+
335
+ if (Nife.isEmpty(def.fieldNames)) {
336
+ addOrRemoveAllModelFields(currentMode, Model);
337
+ continue;
338
+ }
339
+
340
+ let modelName = Model.getModelName();
341
+ let fieldName = def.fieldNames[0];
342
+ let field = connection.getField(fieldName, modelName);
343
+ if (!field)
344
+ throw new Error(`QueryUtils::margeFields: Field "${fieldName}" not found.`);
345
+
346
+ let fullFieldName = `${modelName}:${fieldName}`;
347
+ addOrRemove(currentMode, fullFieldName, field);
348
+ }
349
+
350
+ return fields;
351
+ }
352
+
183
353
  module.exports = {
184
354
  parseFilterFieldAndOperator,
185
355
  generateQueryFromFilter,
356
+ margeFields,
186
357
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mythix-orm",
3
- "version": "1.10.2",
3
+ "version": "1.11.1",
4
4
  "description": "ORM for Mythix framework",
5
5
  "main": "lib/index",
6
6
  "type": "commonjs",