@fibery/expression-utils 5.0.0 → 6.0.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.
- package/lib/expression-utils.js +66 -67
- package/lib/utils.js +27 -43
- package/lib/visitors.js +65 -51
- package/package.json +6 -6
- package/index.js +0 -6
package/lib/expression-utils.js
CHANGED
|
@@ -193,21 +193,6 @@ var paramsPlaceholders = {
|
|
|
193
193
|
dateToDateTimeIntervalLookup: dateToDateTimeIntervalLookup
|
|
194
194
|
};
|
|
195
195
|
|
|
196
|
-
function _extends() {
|
|
197
|
-
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
198
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
199
|
-
var source = arguments[i];
|
|
200
|
-
for (var key in source) {
|
|
201
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
202
|
-
target[key] = source[key];
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return target;
|
|
207
|
-
};
|
|
208
|
-
return _extends.apply(this, arguments);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
196
|
const stringify = x => {
|
|
212
197
|
if (x === undefined) {
|
|
213
198
|
return "undefined";
|
|
@@ -254,30 +239,17 @@ const isAccessFunctionExpression = expresion => expresion.length === 2 && expres
|
|
|
254
239
|
const isBinaryExpression = expression => expression.length === 3 && binaryOperations.has(expression[0]);
|
|
255
240
|
const isNaryExpression = expression => expression.length > 1 && naryOperations.has(expression[0]);
|
|
256
241
|
const isVariableExpression = expression => ___default["default"].isString(expression) && expression.startsWith("$");
|
|
257
|
-
const
|
|
242
|
+
const isMultiFieldAccess = expression => ___default["default"].isArray(expression) && expression.length === 2 && !isFunctionCallExpression(expression) && expression.every(x => ___default["default"].isString(x));
|
|
243
|
+
const isMultiFieldExpression = expression => Array.isArray(expression) && !isFunctionCallExpression(expression) && expression.some(x => isMultiFieldAccess(x)) && expression.every(x => !isVariableExpression(x) && !binaryOperations.has(x) && (___default["default"].isString(x) || isMultiFieldAccess(x)));
|
|
244
|
+
const isFieldExpression = expression => Array.isArray(expression) && !isFunctionCallExpression(expression) && expression.every(x => !isVariableExpression(x) && ___default["default"].isString(x));
|
|
258
245
|
const isQueryExpression = expression => {
|
|
259
246
|
if (___default["default"].isObject(expression) && "q/from" in expression) {
|
|
260
247
|
const fromExpression = expression["q/from"];
|
|
261
248
|
//asc: fromExpression === null for denormalizeSelect for reference collection case
|
|
262
|
-
return fromExpression === null || isFieldExpression(fromExpression);
|
|
249
|
+
return fromExpression === null || isFieldExpression(fromExpression) || isFromRootFieldExpression(fromExpression) || isMultiFieldExpression(fromExpression);
|
|
263
250
|
}
|
|
264
251
|
return false;
|
|
265
252
|
};
|
|
266
|
-
// [q/count, [..., collection]]
|
|
267
|
-
// [q/start, [..., range]]
|
|
268
|
-
// [q/end, [..., range]]
|
|
269
|
-
// [q/access?, [..., field-expr]]
|
|
270
|
-
const isFunctionExpression = expression => {
|
|
271
|
-
if (!Array.isArray(expression)) {
|
|
272
|
-
return false;
|
|
273
|
-
}
|
|
274
|
-
if (isFieldExpression(expression)) {
|
|
275
|
-
return false;
|
|
276
|
-
} else if (isDateRangeFunctionExpression(expression) || isCollectionFunctionExpression(expression) || isAccessFunctionExpression(expression)) {
|
|
277
|
-
return true;
|
|
278
|
-
}
|
|
279
|
-
throw new Error("invalid expression:" + JSON.stringify(expression));
|
|
280
|
-
};
|
|
281
253
|
const collectFieldExpressions = (memo, expression) => {
|
|
282
254
|
if (isVariableExpression(expression)) ; else if (isFunctionCallExpression(expression)) {
|
|
283
255
|
for (const part of expression.slice(1)) {
|
|
@@ -315,6 +287,7 @@ const createExpressionVisitor = visitor => {
|
|
|
315
287
|
visitFunctionCallExpression: ([fnName, ...args]) => [fnName, ...args.map(x => visitorWithDefault.visitExpression(x))],
|
|
316
288
|
visitFromRootFieldExpression: ([fromRootKeyword, ...rest]) => [fromRootKeyword, ...rest.map(x => visitorWithDefault.visitExpression(x))],
|
|
317
289
|
visitFieldExpression: expression => expression,
|
|
290
|
+
visitMultiFieldExpression: expression => expression,
|
|
318
291
|
visitOrderByExpression: orderByExpression => orderByExpression.map(x => {
|
|
319
292
|
const [fieldExpression, orderDir] = x;
|
|
320
293
|
const fieldExpressionNew = visitorWithDefault.visitExpression(fieldExpression);
|
|
@@ -327,15 +300,21 @@ const createExpressionVisitor = visitor => {
|
|
|
327
300
|
"q/where": whereExpression,
|
|
328
301
|
"q/order-by": orderByExpression
|
|
329
302
|
} = subQueryExpression;
|
|
330
|
-
return
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
303
|
+
return {
|
|
304
|
+
...subQueryExpression,
|
|
305
|
+
...(fromExpression ? {
|
|
306
|
+
"q/from": visitorWithDefault.visitFieldExpression(fromExpression)
|
|
307
|
+
} : null),
|
|
308
|
+
...(selectExpression ? {
|
|
309
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => visitorWithDefault.visitExpression(val)) : visitorWithDefault.visitExpression(selectExpression)
|
|
310
|
+
} : null),
|
|
311
|
+
...(whereExpression ? {
|
|
312
|
+
"q/where": visitorWithDefault.visitExpression(whereExpression)
|
|
313
|
+
} : null),
|
|
314
|
+
...(orderByExpression ? {
|
|
315
|
+
"q/order-by": visitorWithDefault.visitOrderByExpression(orderByExpression)
|
|
316
|
+
} : null)
|
|
317
|
+
};
|
|
339
318
|
},
|
|
340
319
|
visitExpression: expression => {
|
|
341
320
|
if (expression === null) {
|
|
@@ -348,6 +327,8 @@ const createExpressionVisitor = visitor => {
|
|
|
348
327
|
return visitorWithDefault.visitFunctionCallExpression(expression, visitorDefault);
|
|
349
328
|
} else if (isFieldExpression(expression)) {
|
|
350
329
|
return visitorWithDefault.visitFieldExpression(expression, visitorDefault);
|
|
330
|
+
} else if (isMultiFieldExpression(expression)) {
|
|
331
|
+
return visitorWithDefault.visitMultiFieldExpression(expression, visitorDefault);
|
|
351
332
|
} else if (isQueryExpression(expression)) {
|
|
352
333
|
return visitorWithDefault.visitQueryExpression(expression, visitorDefault);
|
|
353
334
|
} else {
|
|
@@ -355,7 +336,10 @@ const createExpressionVisitor = visitor => {
|
|
|
355
336
|
}
|
|
356
337
|
}
|
|
357
338
|
};
|
|
358
|
-
visitorWithDefault =
|
|
339
|
+
visitorWithDefault = {
|
|
340
|
+
...visitorDefault,
|
|
341
|
+
...visitor
|
|
342
|
+
};
|
|
359
343
|
return visitorWithDefault;
|
|
360
344
|
};
|
|
361
345
|
|
|
@@ -376,9 +360,9 @@ var utils = {
|
|
|
376
360
|
isBinaryExpression: isBinaryExpression,
|
|
377
361
|
isNaryExpression: isNaryExpression,
|
|
378
362
|
isVariableExpression: isVariableExpression,
|
|
363
|
+
isMultiFieldExpression: isMultiFieldExpression,
|
|
379
364
|
isFieldExpression: isFieldExpression,
|
|
380
365
|
isQueryExpression: isQueryExpression,
|
|
381
|
-
isFunctionExpression: isFunctionExpression,
|
|
382
366
|
extractFieldExpressions: extractFieldExpressions,
|
|
383
367
|
createExpressionVisitor: createExpressionVisitor
|
|
384
368
|
};
|
|
@@ -439,14 +423,19 @@ const replaceIdsWithNamesVisitor = (typeObject, onFieldNotFound = defaultIdsWith
|
|
|
439
423
|
}).currentTypeObject;
|
|
440
424
|
if (subQueryTypeObject) {
|
|
441
425
|
const subQueryVisitor = replaceIdsWithNamesVisitor(subQueryTypeObject, onFieldNotFound);
|
|
442
|
-
return
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
426
|
+
return {
|
|
427
|
+
...subQueryExpression,
|
|
428
|
+
...{
|
|
429
|
+
"q/from": visitor.visitFieldExpression(fromExpression),
|
|
430
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => subQueryVisitor.visitExpression(val)) : subQueryVisitor.visitExpression(selectExpression)
|
|
431
|
+
},
|
|
432
|
+
...(whereExpression ? {
|
|
433
|
+
"q/where": subQueryVisitor.visitExpression(whereExpression)
|
|
434
|
+
} : null),
|
|
435
|
+
...(orderByExpression ? {
|
|
436
|
+
"q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
|
|
437
|
+
} : null)
|
|
438
|
+
};
|
|
450
439
|
}
|
|
451
440
|
return subQueryExpression;
|
|
452
441
|
}
|
|
@@ -509,14 +498,19 @@ const replaceNamesWithIdsVisitor = (typeObject, onFieldNotFound = defaultNamesWi
|
|
|
509
498
|
}).currentTypeObject;
|
|
510
499
|
if (subQueryTypeObject) {
|
|
511
500
|
const subQueryVisitor = replaceNamesWithIdsVisitor(subQueryTypeObject, onFieldNotFound);
|
|
512
|
-
return
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
501
|
+
return {
|
|
502
|
+
...subQueryExpression,
|
|
503
|
+
...{
|
|
504
|
+
"q/from": visitor.visitFieldExpression(fromExpression),
|
|
505
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => subQueryVisitor.visitExpression(val)) : subQueryVisitor.visitExpression(selectExpression)
|
|
506
|
+
},
|
|
507
|
+
...(whereExpression ? {
|
|
508
|
+
"q/where": subQueryVisitor.visitExpression(whereExpression)
|
|
509
|
+
} : null),
|
|
510
|
+
...(orderByExpression ? {
|
|
511
|
+
"q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
|
|
512
|
+
} : null)
|
|
513
|
+
};
|
|
520
514
|
}
|
|
521
515
|
return subQueryExpression;
|
|
522
516
|
}
|
|
@@ -557,14 +551,19 @@ const deleteExpressionsWithNotFoundFieldsVisitor = typeObject => {
|
|
|
557
551
|
const subQueryTypeObject = fromExpression.reduce((typeObject, field) => typeObject && typeObject.fieldObjectsByName.hasOwnProperty(field) ? typeObject.fieldObjectsByName[field].typeObject : null, typeObject);
|
|
558
552
|
if (subQueryTypeObject) {
|
|
559
553
|
const subQueryVisitor = deleteExpressionsWithNotFoundFieldsVisitor(subQueryTypeObject);
|
|
560
|
-
const subQueryExpressionNew = ___default["default"].pickBy(
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
554
|
+
const subQueryExpressionNew = ___default["default"].pickBy({
|
|
555
|
+
...subQueryExpression,
|
|
556
|
+
...{
|
|
557
|
+
"q/from": visitor.visitFieldExpression(fromExpression),
|
|
558
|
+
"q/select": subQueryVisitor.visitExpression(selectExpression)
|
|
559
|
+
},
|
|
560
|
+
...(whereExpression ? {
|
|
561
|
+
"q/where": subQueryVisitor.visitExpression(whereExpression)
|
|
562
|
+
} : null),
|
|
563
|
+
...(orderByExpression ? {
|
|
564
|
+
"q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
|
|
565
|
+
} : null)
|
|
566
|
+
});
|
|
568
567
|
const {
|
|
569
568
|
"q/select": selectExpressionNew
|
|
570
569
|
} = subQueryExpressionNew;
|
package/lib/utils.js
CHANGED
|
@@ -5,21 +5,6 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
5
5
|
|
|
6
6
|
var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
|
|
7
7
|
|
|
8
|
-
function _extends() {
|
|
9
|
-
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
10
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
11
|
-
var source = arguments[i];
|
|
12
|
-
for (var key in source) {
|
|
13
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
14
|
-
target[key] = source[key];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return target;
|
|
19
|
-
};
|
|
20
|
-
return _extends.apply(this, arguments);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
8
|
const stringify = x => {
|
|
24
9
|
if (x === undefined) {
|
|
25
10
|
return "undefined";
|
|
@@ -66,30 +51,17 @@ const isAccessFunctionExpression = expresion => expresion.length === 2 && expres
|
|
|
66
51
|
const isBinaryExpression = expression => expression.length === 3 && binaryOperations.has(expression[0]);
|
|
67
52
|
const isNaryExpression = expression => expression.length > 1 && naryOperations.has(expression[0]);
|
|
68
53
|
const isVariableExpression = expression => ___default["default"].isString(expression) && expression.startsWith("$");
|
|
69
|
-
const
|
|
54
|
+
const isMultiFieldAccess = expression => ___default["default"].isArray(expression) && expression.length === 2 && !isFunctionCallExpression(expression) && expression.every(x => ___default["default"].isString(x));
|
|
55
|
+
const isMultiFieldExpression = expression => Array.isArray(expression) && !isFunctionCallExpression(expression) && expression.some(x => isMultiFieldAccess(x)) && expression.every(x => !isVariableExpression(x) && !binaryOperations.has(x) && (___default["default"].isString(x) || isMultiFieldAccess(x)));
|
|
56
|
+
const isFieldExpression = expression => Array.isArray(expression) && !isFunctionCallExpression(expression) && expression.every(x => !isVariableExpression(x) && ___default["default"].isString(x));
|
|
70
57
|
const isQueryExpression = expression => {
|
|
71
58
|
if (___default["default"].isObject(expression) && "q/from" in expression) {
|
|
72
59
|
const fromExpression = expression["q/from"];
|
|
73
60
|
//asc: fromExpression === null for denormalizeSelect for reference collection case
|
|
74
|
-
return fromExpression === null || isFieldExpression(fromExpression);
|
|
61
|
+
return fromExpression === null || isFieldExpression(fromExpression) || isFromRootFieldExpression(fromExpression) || isMultiFieldExpression(fromExpression);
|
|
75
62
|
}
|
|
76
63
|
return false;
|
|
77
64
|
};
|
|
78
|
-
// [q/count, [..., collection]]
|
|
79
|
-
// [q/start, [..., range]]
|
|
80
|
-
// [q/end, [..., range]]
|
|
81
|
-
// [q/access?, [..., field-expr]]
|
|
82
|
-
const isFunctionExpression = expression => {
|
|
83
|
-
if (!Array.isArray(expression)) {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
if (isFieldExpression(expression)) {
|
|
87
|
-
return false;
|
|
88
|
-
} else if (isDateRangeFunctionExpression(expression) || isCollectionFunctionExpression(expression) || isAccessFunctionExpression(expression)) {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
throw new Error("invalid expression:" + JSON.stringify(expression));
|
|
92
|
-
};
|
|
93
65
|
const collectFieldExpressions = (memo, expression) => {
|
|
94
66
|
if (isVariableExpression(expression)) ; else if (isFunctionCallExpression(expression)) {
|
|
95
67
|
for (const part of expression.slice(1)) {
|
|
@@ -127,6 +99,7 @@ const createExpressionVisitor = visitor => {
|
|
|
127
99
|
visitFunctionCallExpression: ([fnName, ...args]) => [fnName, ...args.map(x => visitorWithDefault.visitExpression(x))],
|
|
128
100
|
visitFromRootFieldExpression: ([fromRootKeyword, ...rest]) => [fromRootKeyword, ...rest.map(x => visitorWithDefault.visitExpression(x))],
|
|
129
101
|
visitFieldExpression: expression => expression,
|
|
102
|
+
visitMultiFieldExpression: expression => expression,
|
|
130
103
|
visitOrderByExpression: orderByExpression => orderByExpression.map(x => {
|
|
131
104
|
const [fieldExpression, orderDir] = x;
|
|
132
105
|
const fieldExpressionNew = visitorWithDefault.visitExpression(fieldExpression);
|
|
@@ -139,15 +112,21 @@ const createExpressionVisitor = visitor => {
|
|
|
139
112
|
"q/where": whereExpression,
|
|
140
113
|
"q/order-by": orderByExpression
|
|
141
114
|
} = subQueryExpression;
|
|
142
|
-
return
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
115
|
+
return {
|
|
116
|
+
...subQueryExpression,
|
|
117
|
+
...(fromExpression ? {
|
|
118
|
+
"q/from": visitorWithDefault.visitFieldExpression(fromExpression)
|
|
119
|
+
} : null),
|
|
120
|
+
...(selectExpression ? {
|
|
121
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => visitorWithDefault.visitExpression(val)) : visitorWithDefault.visitExpression(selectExpression)
|
|
122
|
+
} : null),
|
|
123
|
+
...(whereExpression ? {
|
|
124
|
+
"q/where": visitorWithDefault.visitExpression(whereExpression)
|
|
125
|
+
} : null),
|
|
126
|
+
...(orderByExpression ? {
|
|
127
|
+
"q/order-by": visitorWithDefault.visitOrderByExpression(orderByExpression)
|
|
128
|
+
} : null)
|
|
129
|
+
};
|
|
151
130
|
},
|
|
152
131
|
visitExpression: expression => {
|
|
153
132
|
if (expression === null) {
|
|
@@ -160,6 +139,8 @@ const createExpressionVisitor = visitor => {
|
|
|
160
139
|
return visitorWithDefault.visitFunctionCallExpression(expression, visitorDefault);
|
|
161
140
|
} else if (isFieldExpression(expression)) {
|
|
162
141
|
return visitorWithDefault.visitFieldExpression(expression, visitorDefault);
|
|
142
|
+
} else if (isMultiFieldExpression(expression)) {
|
|
143
|
+
return visitorWithDefault.visitMultiFieldExpression(expression, visitorDefault);
|
|
163
144
|
} else if (isQueryExpression(expression)) {
|
|
164
145
|
return visitorWithDefault.visitQueryExpression(expression, visitorDefault);
|
|
165
146
|
} else {
|
|
@@ -167,7 +148,10 @@ const createExpressionVisitor = visitor => {
|
|
|
167
148
|
}
|
|
168
149
|
}
|
|
169
150
|
};
|
|
170
|
-
visitorWithDefault =
|
|
151
|
+
visitorWithDefault = {
|
|
152
|
+
...visitorDefault,
|
|
153
|
+
...visitor
|
|
154
|
+
};
|
|
171
155
|
return visitorWithDefault;
|
|
172
156
|
};
|
|
173
157
|
|
|
@@ -184,7 +168,7 @@ exports.isDateRangeFunctionExpression = isDateRangeFunctionExpression;
|
|
|
184
168
|
exports.isFieldExpression = isFieldExpression;
|
|
185
169
|
exports.isFromRootFieldExpression = isFromRootFieldExpression;
|
|
186
170
|
exports.isFunctionCallExpression = isFunctionCallExpression;
|
|
187
|
-
exports.
|
|
171
|
+
exports.isMultiFieldExpression = isMultiFieldExpression;
|
|
188
172
|
exports.isNaryExpression = isNaryExpression;
|
|
189
173
|
exports.isQueryExpression = isQueryExpression;
|
|
190
174
|
exports.isVariableExpression = isVariableExpression;
|
package/lib/visitors.js
CHANGED
|
@@ -5,21 +5,6 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
5
5
|
|
|
6
6
|
var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
|
|
7
7
|
|
|
8
|
-
function _extends() {
|
|
9
|
-
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
10
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
11
|
-
var source = arguments[i];
|
|
12
|
-
for (var key in source) {
|
|
13
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
14
|
-
target[key] = source[key];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return target;
|
|
19
|
-
};
|
|
20
|
-
return _extends.apply(this, arguments);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
8
|
const stringify = x => {
|
|
24
9
|
if (x === undefined) {
|
|
25
10
|
return "undefined";
|
|
@@ -50,12 +35,14 @@ const isCollectionFunctionExpression = expression =>
|
|
|
50
35
|
//expression has length 3 in case of q/join
|
|
51
36
|
(expression.length === 2 || expression.length === 3) && collectionOps.has(expression[0]);
|
|
52
37
|
const isVariableExpression = expression => ___default["default"].isString(expression) && expression.startsWith("$");
|
|
53
|
-
const
|
|
38
|
+
const isMultiFieldAccess = expression => ___default["default"].isArray(expression) && expression.length === 2 && !isFunctionCallExpression(expression) && expression.every(x => ___default["default"].isString(x));
|
|
39
|
+
const isMultiFieldExpression = expression => Array.isArray(expression) && !isFunctionCallExpression(expression) && expression.some(x => isMultiFieldAccess(x)) && expression.every(x => !isVariableExpression(x) && !binaryOperations.has(x) && (___default["default"].isString(x) || isMultiFieldAccess(x)));
|
|
40
|
+
const isFieldExpression = expression => Array.isArray(expression) && !isFunctionCallExpression(expression) && expression.every(x => !isVariableExpression(x) && ___default["default"].isString(x));
|
|
54
41
|
const isQueryExpression = expression => {
|
|
55
42
|
if (___default["default"].isObject(expression) && "q/from" in expression) {
|
|
56
43
|
const fromExpression = expression["q/from"];
|
|
57
44
|
//asc: fromExpression === null for denormalizeSelect for reference collection case
|
|
58
|
-
return fromExpression === null || isFieldExpression(fromExpression);
|
|
45
|
+
return fromExpression === null || isFieldExpression(fromExpression) || isFromRootFieldExpression(fromExpression) || isMultiFieldExpression(fromExpression);
|
|
59
46
|
}
|
|
60
47
|
return false;
|
|
61
48
|
};
|
|
@@ -66,6 +53,7 @@ const createExpressionVisitor = visitor => {
|
|
|
66
53
|
visitFunctionCallExpression: ([fnName, ...args]) => [fnName, ...args.map(x => visitorWithDefault.visitExpression(x))],
|
|
67
54
|
visitFromRootFieldExpression: ([fromRootKeyword, ...rest]) => [fromRootKeyword, ...rest.map(x => visitorWithDefault.visitExpression(x))],
|
|
68
55
|
visitFieldExpression: expression => expression,
|
|
56
|
+
visitMultiFieldExpression: expression => expression,
|
|
69
57
|
visitOrderByExpression: orderByExpression => orderByExpression.map(x => {
|
|
70
58
|
const [fieldExpression, orderDir] = x;
|
|
71
59
|
const fieldExpressionNew = visitorWithDefault.visitExpression(fieldExpression);
|
|
@@ -78,15 +66,21 @@ const createExpressionVisitor = visitor => {
|
|
|
78
66
|
"q/where": whereExpression,
|
|
79
67
|
"q/order-by": orderByExpression
|
|
80
68
|
} = subQueryExpression;
|
|
81
|
-
return
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
69
|
+
return {
|
|
70
|
+
...subQueryExpression,
|
|
71
|
+
...(fromExpression ? {
|
|
72
|
+
"q/from": visitorWithDefault.visitFieldExpression(fromExpression)
|
|
73
|
+
} : null),
|
|
74
|
+
...(selectExpression ? {
|
|
75
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => visitorWithDefault.visitExpression(val)) : visitorWithDefault.visitExpression(selectExpression)
|
|
76
|
+
} : null),
|
|
77
|
+
...(whereExpression ? {
|
|
78
|
+
"q/where": visitorWithDefault.visitExpression(whereExpression)
|
|
79
|
+
} : null),
|
|
80
|
+
...(orderByExpression ? {
|
|
81
|
+
"q/order-by": visitorWithDefault.visitOrderByExpression(orderByExpression)
|
|
82
|
+
} : null)
|
|
83
|
+
};
|
|
90
84
|
},
|
|
91
85
|
visitExpression: expression => {
|
|
92
86
|
if (expression === null) {
|
|
@@ -99,6 +93,8 @@ const createExpressionVisitor = visitor => {
|
|
|
99
93
|
return visitorWithDefault.visitFunctionCallExpression(expression, visitorDefault);
|
|
100
94
|
} else if (isFieldExpression(expression)) {
|
|
101
95
|
return visitorWithDefault.visitFieldExpression(expression, visitorDefault);
|
|
96
|
+
} else if (isMultiFieldExpression(expression)) {
|
|
97
|
+
return visitorWithDefault.visitMultiFieldExpression(expression, visitorDefault);
|
|
102
98
|
} else if (isQueryExpression(expression)) {
|
|
103
99
|
return visitorWithDefault.visitQueryExpression(expression, visitorDefault);
|
|
104
100
|
} else {
|
|
@@ -106,7 +102,10 @@ const createExpressionVisitor = visitor => {
|
|
|
106
102
|
}
|
|
107
103
|
}
|
|
108
104
|
};
|
|
109
|
-
visitorWithDefault =
|
|
105
|
+
visitorWithDefault = {
|
|
106
|
+
...visitorDefault,
|
|
107
|
+
...visitor
|
|
108
|
+
};
|
|
110
109
|
return visitorWithDefault;
|
|
111
110
|
};
|
|
112
111
|
|
|
@@ -166,14 +165,19 @@ const replaceIdsWithNamesVisitor = (typeObject, onFieldNotFound = defaultIdsWith
|
|
|
166
165
|
}).currentTypeObject;
|
|
167
166
|
if (subQueryTypeObject) {
|
|
168
167
|
const subQueryVisitor = replaceIdsWithNamesVisitor(subQueryTypeObject, onFieldNotFound);
|
|
169
|
-
return
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
168
|
+
return {
|
|
169
|
+
...subQueryExpression,
|
|
170
|
+
...{
|
|
171
|
+
"q/from": visitor.visitFieldExpression(fromExpression),
|
|
172
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => subQueryVisitor.visitExpression(val)) : subQueryVisitor.visitExpression(selectExpression)
|
|
173
|
+
},
|
|
174
|
+
...(whereExpression ? {
|
|
175
|
+
"q/where": subQueryVisitor.visitExpression(whereExpression)
|
|
176
|
+
} : null),
|
|
177
|
+
...(orderByExpression ? {
|
|
178
|
+
"q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
|
|
179
|
+
} : null)
|
|
180
|
+
};
|
|
177
181
|
}
|
|
178
182
|
return subQueryExpression;
|
|
179
183
|
}
|
|
@@ -236,14 +240,19 @@ const replaceNamesWithIdsVisitor = (typeObject, onFieldNotFound = defaultNamesWi
|
|
|
236
240
|
}).currentTypeObject;
|
|
237
241
|
if (subQueryTypeObject) {
|
|
238
242
|
const subQueryVisitor = replaceNamesWithIdsVisitor(subQueryTypeObject, onFieldNotFound);
|
|
239
|
-
return
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
243
|
+
return {
|
|
244
|
+
...subQueryExpression,
|
|
245
|
+
...{
|
|
246
|
+
"q/from": visitor.visitFieldExpression(fromExpression),
|
|
247
|
+
"q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => subQueryVisitor.visitExpression(val)) : subQueryVisitor.visitExpression(selectExpression)
|
|
248
|
+
},
|
|
249
|
+
...(whereExpression ? {
|
|
250
|
+
"q/where": subQueryVisitor.visitExpression(whereExpression)
|
|
251
|
+
} : null),
|
|
252
|
+
...(orderByExpression ? {
|
|
253
|
+
"q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
|
|
254
|
+
} : null)
|
|
255
|
+
};
|
|
247
256
|
}
|
|
248
257
|
return subQueryExpression;
|
|
249
258
|
}
|
|
@@ -284,14 +293,19 @@ const deleteExpressionsWithNotFoundFieldsVisitor = typeObject => {
|
|
|
284
293
|
const subQueryTypeObject = fromExpression.reduce((typeObject, field) => typeObject && typeObject.fieldObjectsByName.hasOwnProperty(field) ? typeObject.fieldObjectsByName[field].typeObject : null, typeObject);
|
|
285
294
|
if (subQueryTypeObject) {
|
|
286
295
|
const subQueryVisitor = deleteExpressionsWithNotFoundFieldsVisitor(subQueryTypeObject);
|
|
287
|
-
const subQueryExpressionNew = ___default["default"].pickBy(
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
296
|
+
const subQueryExpressionNew = ___default["default"].pickBy({
|
|
297
|
+
...subQueryExpression,
|
|
298
|
+
...{
|
|
299
|
+
"q/from": visitor.visitFieldExpression(fromExpression),
|
|
300
|
+
"q/select": subQueryVisitor.visitExpression(selectExpression)
|
|
301
|
+
},
|
|
302
|
+
...(whereExpression ? {
|
|
303
|
+
"q/where": subQueryVisitor.visitExpression(whereExpression)
|
|
304
|
+
} : null),
|
|
305
|
+
...(orderByExpression ? {
|
|
306
|
+
"q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
|
|
307
|
+
} : null)
|
|
308
|
+
});
|
|
295
309
|
const {
|
|
296
310
|
"q/select": selectExpressionNew
|
|
297
311
|
} = subQueryExpressionNew;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fibery/expression-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.1",
|
|
4
4
|
"description": "utils for working with fibery api expressions",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./lib/expression-utils.js",
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
"@fibery/helpers": "1.2.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@babel/core": "7.
|
|
32
|
+
"@babel/core": "7.23.9",
|
|
33
33
|
"@swc/jest": "0.2.29",
|
|
34
34
|
"jest": "27.5.1",
|
|
35
35
|
"jest-junit": "13.0.0",
|
|
36
|
-
"microbundle": "0.15.
|
|
37
|
-
"@fibery/babel-preset": "7.
|
|
38
|
-
"@fibery/eslint-config": "8.5.
|
|
36
|
+
"microbundle": "0.15.1",
|
|
37
|
+
"@fibery/babel-preset": "7.4.0",
|
|
38
|
+
"@fibery/eslint-config": "8.5.1"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@fibery/schema": "
|
|
41
|
+
"@fibery/schema": "10.0.1"
|
|
42
42
|
},
|
|
43
43
|
"jest": {
|
|
44
44
|
"testEnvironment": "node",
|
package/index.js
DELETED