proto.io 0.0.216 → 0.0.217
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/dist/adapters/file/aliyun-oss.d.ts +3 -3
- package/dist/adapters/file/database.d.ts +2 -2
- package/dist/adapters/file/database.js +1 -1
- package/dist/adapters/file/database.mjs +1 -1
- package/dist/adapters/file/filesystem.d.ts +3 -3
- package/dist/adapters/file/google-cloud-storage.d.ts +3 -3
- package/dist/adapters/storage/progres.d.ts +5 -3
- package/dist/adapters/storage/progres.js +474 -111
- package/dist/adapters/storage/progres.js.map +1 -1
- package/dist/adapters/storage/progres.mjs +474 -111
- package/dist/adapters/storage/progres.mjs.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +1 -7
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +2 -2
- package/dist/client.mjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/internals/{base-BO3ZP6EF.d.ts → base-CWnOBKD5.d.ts} +2 -2
- package/dist/internals/base-CWnOBKD5.d.ts.map +1 -0
- package/dist/internals/{chunk-DDkLpKXp.d.ts → chunk-CNNSQpRF.d.ts} +3 -3
- package/dist/internals/chunk-CNNSQpRF.d.ts.map +1 -0
- package/dist/internals/{index-CYhA8SU8.d.ts → index-BRIlS3mY.d.ts} +3 -9
- package/dist/internals/index-BRIlS3mY.d.ts.map +1 -0
- package/dist/internals/{index-HdMgLYtD.d.ts → index-Bs8n7Q8f.d.ts} +55 -18
- package/dist/internals/index-Bs8n7Q8f.d.ts.map +1 -0
- package/dist/internals/{index-DF2AfSGK.mjs → index-DfqABzjr.mjs} +134 -141
- package/dist/internals/index-DfqABzjr.mjs.map +1 -0
- package/dist/internals/{index-DfnPpl1I.js → index-DylUjD_1.js} +133 -146
- package/dist/internals/index-DylUjD_1.js.map +1 -0
- package/dist/internals/{validator-LNgZGT_l.mjs → validator-CEcBF4Cn.mjs} +728 -27
- package/dist/internals/validator-CEcBF4Cn.mjs.map +1 -0
- package/dist/internals/{validator-BBjOdLiT.js → validator-mcBCJP4P.js} +734 -27
- package/dist/internals/validator-mcBCJP4P.js.map +1 -0
- package/package.json +1 -1
- package/dist/internals/base-BO3ZP6EF.d.ts.map +0 -1
- package/dist/internals/chunk-DDkLpKXp.d.ts.map +0 -1
- package/dist/internals/index-CYhA8SU8.d.ts.map +0 -1
- package/dist/internals/index-DF2AfSGK.mjs.map +0 -1
- package/dist/internals/index-DfnPpl1I.js.map +0 -1
- package/dist/internals/index-HdMgLYtD.d.ts.map +0 -1
- package/dist/internals/validator-BBjOdLiT.js.map +0 -1
- package/dist/internals/validator-LNgZGT_l.mjs.map +0 -1
|
@@ -1,8 +1,99 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
-
import { T as TObject, l as isPrimitiveValue, m as isValue,
|
|
2
|
+
import { T as TObject, l as isPrimitiveValue, m as isValue, c as isPrimitive, j as isVector, k as _isTypeof, b as isShape, s as shapePaths, a as isRelation, i as isPointer, h as _typeof } from './index-BzDsTt4R.mjs';
|
|
3
3
|
import Decimal from 'decimal.js';
|
|
4
4
|
import { P as PVK } from './private-CNw40LZ7.mjs';
|
|
5
5
|
|
|
6
|
+
//
|
|
7
|
+
// expressions.ts
|
|
8
|
+
//
|
|
9
|
+
// The MIT License
|
|
10
|
+
// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.
|
|
11
|
+
//
|
|
12
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
// in the Software without restriction, including without limitation the rights
|
|
15
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
// furnished to do so, subject to the following conditions:
|
|
18
|
+
//
|
|
19
|
+
// The above copyright notice and this permission notice shall be included in
|
|
20
|
+
// all copies or substantial portions of the Software.
|
|
21
|
+
//
|
|
22
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
28
|
+
// THE SOFTWARE.
|
|
29
|
+
//
|
|
30
|
+
const TZeroParamExprKeys = [
|
|
31
|
+
'$now',
|
|
32
|
+
'$rand',
|
|
33
|
+
];
|
|
34
|
+
const TUnaryExprKeys = [
|
|
35
|
+
'$abs',
|
|
36
|
+
'$neg',
|
|
37
|
+
'$sqrt',
|
|
38
|
+
'$cbrt',
|
|
39
|
+
'$ceil',
|
|
40
|
+
'$floor',
|
|
41
|
+
'$round',
|
|
42
|
+
'$exp',
|
|
43
|
+
'$ln',
|
|
44
|
+
'$log2',
|
|
45
|
+
'$log10',
|
|
46
|
+
'$sin',
|
|
47
|
+
'$cos',
|
|
48
|
+
'$tan',
|
|
49
|
+
'$asin',
|
|
50
|
+
'$acos',
|
|
51
|
+
'$atan',
|
|
52
|
+
'$asinh',
|
|
53
|
+
'$acosh',
|
|
54
|
+
'$atanh',
|
|
55
|
+
'$sinh',
|
|
56
|
+
'$cosh',
|
|
57
|
+
'$tanh',
|
|
58
|
+
'$degrees',
|
|
59
|
+
'$radians',
|
|
60
|
+
'$sign',
|
|
61
|
+
'$size',
|
|
62
|
+
'$lower',
|
|
63
|
+
'$upper',
|
|
64
|
+
];
|
|
65
|
+
const TBinaryExprKeys = [
|
|
66
|
+
'$divide',
|
|
67
|
+
'$subtract',
|
|
68
|
+
'$log',
|
|
69
|
+
'$pow',
|
|
70
|
+
'$atan2',
|
|
71
|
+
'$trim',
|
|
72
|
+
'$ltrim',
|
|
73
|
+
'$rtrim',
|
|
74
|
+
'$first',
|
|
75
|
+
'$last',
|
|
76
|
+
'$ldrop',
|
|
77
|
+
'$rdrop',
|
|
78
|
+
];
|
|
79
|
+
const TTernaryExprKeys = [
|
|
80
|
+
'$lpad',
|
|
81
|
+
'$rpad',
|
|
82
|
+
];
|
|
83
|
+
const TListExprKeys = [
|
|
84
|
+
'$add',
|
|
85
|
+
'$multiply',
|
|
86
|
+
'$ifNull',
|
|
87
|
+
'$concat',
|
|
88
|
+
];
|
|
89
|
+
const TDistanceExprKeys = [
|
|
90
|
+
'$distance',
|
|
91
|
+
'$innerProduct',
|
|
92
|
+
'$negInnerProduct',
|
|
93
|
+
'$cosineDistance',
|
|
94
|
+
'$rectilinearDistance',
|
|
95
|
+
];
|
|
96
|
+
|
|
6
97
|
//
|
|
7
98
|
// keys.ts
|
|
8
99
|
//
|
|
@@ -49,13 +140,6 @@ const TConditionalKeys = [
|
|
|
49
140
|
'$nor',
|
|
50
141
|
'$or',
|
|
51
142
|
];
|
|
52
|
-
const TDistanceKeys = [
|
|
53
|
-
'$distance',
|
|
54
|
-
'$innerProduct',
|
|
55
|
-
'$negInnerProduct',
|
|
56
|
-
'$cosineDistance',
|
|
57
|
-
'$rectilinearDistance',
|
|
58
|
-
];
|
|
59
143
|
|
|
60
144
|
//
|
|
61
145
|
// utils.ts
|
|
@@ -81,7 +165,7 @@ const TDistanceKeys = [
|
|
|
81
165
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
82
166
|
// THE SOFTWARE.
|
|
83
167
|
//
|
|
84
|
-
const isNum = (x) => _.isNumber(x) || x instanceof BigInt || x instanceof Decimal;
|
|
168
|
+
const isNum$1 = (x) => _.isNumber(x) || x instanceof BigInt || x instanceof Decimal;
|
|
85
169
|
const equalNum = (lhs, rhs) => {
|
|
86
170
|
if (lhs instanceof Decimal && rhs instanceof Decimal) {
|
|
87
171
|
return lhs.equals(rhs);
|
|
@@ -113,7 +197,7 @@ const lessNum = (lhs, rhs) => {
|
|
|
113
197
|
const equal = (lhs, rhs) => {
|
|
114
198
|
if (_.isNil(lhs) && _.isNil(rhs))
|
|
115
199
|
return true;
|
|
116
|
-
if (isNum(lhs) && isNum(rhs))
|
|
200
|
+
if (isNum$1(lhs) && isNum$1(rhs))
|
|
117
201
|
return equalNum(lhs, rhs);
|
|
118
202
|
if (lhs instanceof TObject && rhs instanceof TObject) {
|
|
119
203
|
if (lhs.className !== rhs.className)
|
|
@@ -146,7 +230,7 @@ const lessThan = (lhs, rhs) => {
|
|
|
146
230
|
return lhs < rhs;
|
|
147
231
|
if (_.isDate(lhs) && _.isDate(rhs))
|
|
148
232
|
return lhs < rhs;
|
|
149
|
-
if (isNum(lhs) && isNum(rhs))
|
|
233
|
+
if (isNum$1(lhs) && isNum$1(rhs))
|
|
150
234
|
return lessNum(lhs, rhs);
|
|
151
235
|
if (_.isArray(lhs) && _.isArray(rhs)) {
|
|
152
236
|
for (const i of _.range(Math.min(lhs.length, rhs.length))) {
|
|
@@ -225,6 +309,272 @@ const cosine = (v1, v2) => {
|
|
|
225
309
|
return _.sumBy(_.zip(v1, v2), ([a, b]) => a * b) / Math.sqrt(s1 * s2);
|
|
226
310
|
};
|
|
227
311
|
|
|
312
|
+
//
|
|
313
|
+
// utils.ts
|
|
314
|
+
//
|
|
315
|
+
// The MIT License
|
|
316
|
+
// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.
|
|
317
|
+
//
|
|
318
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
319
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
320
|
+
// in the Software without restriction, including without limitation the rights
|
|
321
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
322
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
323
|
+
// furnished to do so, subject to the following conditions:
|
|
324
|
+
//
|
|
325
|
+
// The above copyright notice and this permission notice shall be included in
|
|
326
|
+
// all copies or substantial portions of the Software.
|
|
327
|
+
//
|
|
328
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
329
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
330
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
331
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
332
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
333
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
334
|
+
// THE SOFTWARE.
|
|
335
|
+
//
|
|
336
|
+
const isNum = (x) => _.isNumber(x) || x instanceof Decimal;
|
|
337
|
+
const MathUtils = {
|
|
338
|
+
sum: (lhs, rhs) => {
|
|
339
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
340
|
+
throw Error('Invalid operation');
|
|
341
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
342
|
+
return Decimal.add(lhs, rhs);
|
|
343
|
+
return lhs + rhs;
|
|
344
|
+
},
|
|
345
|
+
subtract: (lhs, rhs) => {
|
|
346
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
347
|
+
throw Error('Invalid operation');
|
|
348
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
349
|
+
return Decimal.sub(lhs, rhs);
|
|
350
|
+
return lhs - rhs;
|
|
351
|
+
},
|
|
352
|
+
multiply: (lhs, rhs) => {
|
|
353
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
354
|
+
throw Error('Invalid operation');
|
|
355
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
356
|
+
return Decimal.mul(lhs, rhs);
|
|
357
|
+
return lhs * rhs;
|
|
358
|
+
},
|
|
359
|
+
divide: (lhs, rhs) => {
|
|
360
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
361
|
+
throw Error('Invalid operation');
|
|
362
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
363
|
+
return Decimal.div(lhs, rhs);
|
|
364
|
+
return lhs / rhs;
|
|
365
|
+
},
|
|
366
|
+
abs: (lhs) => {
|
|
367
|
+
if (!isNum(lhs))
|
|
368
|
+
throw Error('Invalid operation');
|
|
369
|
+
if (lhs instanceof Decimal)
|
|
370
|
+
return lhs.abs();
|
|
371
|
+
return Math.abs(lhs);
|
|
372
|
+
},
|
|
373
|
+
neg: (lhs) => {
|
|
374
|
+
if (!isNum(lhs))
|
|
375
|
+
throw Error('Invalid operation');
|
|
376
|
+
if (lhs instanceof Decimal)
|
|
377
|
+
return lhs.neg();
|
|
378
|
+
return -lhs;
|
|
379
|
+
},
|
|
380
|
+
ceil: (lhs) => {
|
|
381
|
+
if (!isNum(lhs))
|
|
382
|
+
throw Error('Invalid operation');
|
|
383
|
+
if (lhs instanceof Decimal)
|
|
384
|
+
return lhs.ceil();
|
|
385
|
+
return Math.ceil(lhs);
|
|
386
|
+
},
|
|
387
|
+
floor: (lhs) => {
|
|
388
|
+
if (!isNum(lhs))
|
|
389
|
+
throw Error('Invalid operation');
|
|
390
|
+
if (lhs instanceof Decimal)
|
|
391
|
+
return lhs.floor();
|
|
392
|
+
return Math.floor(lhs);
|
|
393
|
+
},
|
|
394
|
+
round: (lhs) => {
|
|
395
|
+
if (!isNum(lhs))
|
|
396
|
+
throw Error('Invalid operation');
|
|
397
|
+
if (lhs instanceof Decimal)
|
|
398
|
+
return lhs.round();
|
|
399
|
+
return Math.round(lhs);
|
|
400
|
+
},
|
|
401
|
+
exp: (lhs) => {
|
|
402
|
+
if (!isNum(lhs))
|
|
403
|
+
throw Error('Invalid operation');
|
|
404
|
+
if (lhs instanceof Decimal)
|
|
405
|
+
return lhs.exp();
|
|
406
|
+
return Math.exp(lhs);
|
|
407
|
+
},
|
|
408
|
+
sqrt: (lhs) => {
|
|
409
|
+
if (!isNum(lhs))
|
|
410
|
+
throw Error('Invalid operation');
|
|
411
|
+
if (lhs instanceof Decimal)
|
|
412
|
+
return lhs.sqrt();
|
|
413
|
+
return Math.sqrt(lhs);
|
|
414
|
+
},
|
|
415
|
+
cbrt: (lhs) => {
|
|
416
|
+
if (!isNum(lhs))
|
|
417
|
+
throw Error('Invalid operation');
|
|
418
|
+
if (lhs instanceof Decimal)
|
|
419
|
+
return lhs.cbrt();
|
|
420
|
+
return Math.cbrt(lhs);
|
|
421
|
+
},
|
|
422
|
+
mod: (lhs, rhs) => {
|
|
423
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
424
|
+
throw Error('Invalid operation');
|
|
425
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
426
|
+
return Decimal.mod(lhs, rhs);
|
|
427
|
+
return lhs % rhs;
|
|
428
|
+
},
|
|
429
|
+
pow: (lhs, rhs) => {
|
|
430
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
431
|
+
throw Error('Invalid operation');
|
|
432
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
433
|
+
return Decimal.pow(lhs, rhs);
|
|
434
|
+
return Math.pow(lhs, rhs);
|
|
435
|
+
},
|
|
436
|
+
log: (lhs, rhs) => {
|
|
437
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
438
|
+
throw Error('Invalid operation');
|
|
439
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
440
|
+
return Decimal.log(lhs, rhs);
|
|
441
|
+
return Math.log(lhs) / Math.log(rhs);
|
|
442
|
+
},
|
|
443
|
+
log10: (lhs) => {
|
|
444
|
+
if (!isNum(lhs))
|
|
445
|
+
throw Error('Invalid operation');
|
|
446
|
+
if (lhs instanceof Decimal)
|
|
447
|
+
return lhs.log();
|
|
448
|
+
return Math.log10(lhs);
|
|
449
|
+
},
|
|
450
|
+
log2: (lhs) => {
|
|
451
|
+
if (!isNum(lhs))
|
|
452
|
+
throw Error('Invalid operation');
|
|
453
|
+
if (lhs instanceof Decimal)
|
|
454
|
+
return lhs.log(2);
|
|
455
|
+
return Math.log2(lhs);
|
|
456
|
+
},
|
|
457
|
+
ln: (lhs) => {
|
|
458
|
+
if (!isNum(lhs))
|
|
459
|
+
throw Error('Invalid operation');
|
|
460
|
+
if (lhs instanceof Decimal)
|
|
461
|
+
return lhs.ln();
|
|
462
|
+
return Math.log(lhs);
|
|
463
|
+
},
|
|
464
|
+
sin: (lhs) => {
|
|
465
|
+
if (!isNum(lhs))
|
|
466
|
+
throw Error('Invalid operation');
|
|
467
|
+
if (lhs instanceof Decimal)
|
|
468
|
+
return lhs.sin();
|
|
469
|
+
return Math.sin(lhs);
|
|
470
|
+
},
|
|
471
|
+
cos: (lhs) => {
|
|
472
|
+
if (!isNum(lhs))
|
|
473
|
+
throw Error('Invalid operation');
|
|
474
|
+
if (lhs instanceof Decimal)
|
|
475
|
+
return lhs.cos();
|
|
476
|
+
return Math.cos(lhs);
|
|
477
|
+
},
|
|
478
|
+
tan: (lhs) => {
|
|
479
|
+
if (!isNum(lhs))
|
|
480
|
+
throw Error('Invalid operation');
|
|
481
|
+
if (lhs instanceof Decimal)
|
|
482
|
+
return lhs.tan();
|
|
483
|
+
return Math.tan(lhs);
|
|
484
|
+
},
|
|
485
|
+
asin: (lhs) => {
|
|
486
|
+
if (!isNum(lhs))
|
|
487
|
+
throw Error('Invalid operation');
|
|
488
|
+
if (lhs instanceof Decimal)
|
|
489
|
+
return lhs.asin();
|
|
490
|
+
return Math.asin(lhs);
|
|
491
|
+
},
|
|
492
|
+
acos: (lhs) => {
|
|
493
|
+
if (!isNum(lhs))
|
|
494
|
+
throw Error('Invalid operation');
|
|
495
|
+
if (lhs instanceof Decimal)
|
|
496
|
+
return lhs.acos();
|
|
497
|
+
return Math.acos(lhs);
|
|
498
|
+
},
|
|
499
|
+
atan: (lhs) => {
|
|
500
|
+
if (!isNum(lhs))
|
|
501
|
+
throw Error('Invalid operation');
|
|
502
|
+
if (lhs instanceof Decimal)
|
|
503
|
+
return lhs.atan();
|
|
504
|
+
return Math.atan(lhs);
|
|
505
|
+
},
|
|
506
|
+
sinh: (lhs) => {
|
|
507
|
+
if (!isNum(lhs))
|
|
508
|
+
throw Error('Invalid operation');
|
|
509
|
+
if (lhs instanceof Decimal)
|
|
510
|
+
return lhs.sinh();
|
|
511
|
+
return Math.sinh(lhs);
|
|
512
|
+
},
|
|
513
|
+
cosh: (lhs) => {
|
|
514
|
+
if (!isNum(lhs))
|
|
515
|
+
throw Error('Invalid operation');
|
|
516
|
+
if (lhs instanceof Decimal)
|
|
517
|
+
return lhs.cosh();
|
|
518
|
+
return Math.cosh(lhs);
|
|
519
|
+
},
|
|
520
|
+
tanh: (lhs) => {
|
|
521
|
+
if (!isNum(lhs))
|
|
522
|
+
throw Error('Invalid operation');
|
|
523
|
+
if (lhs instanceof Decimal)
|
|
524
|
+
return lhs.tanh();
|
|
525
|
+
return Math.tanh(lhs);
|
|
526
|
+
},
|
|
527
|
+
asinh: (lhs) => {
|
|
528
|
+
if (!isNum(lhs))
|
|
529
|
+
throw Error('Invalid operation');
|
|
530
|
+
if (lhs instanceof Decimal)
|
|
531
|
+
return lhs.asinh();
|
|
532
|
+
return Math.asinh(lhs);
|
|
533
|
+
},
|
|
534
|
+
acosh: (lhs) => {
|
|
535
|
+
if (!isNum(lhs))
|
|
536
|
+
throw Error('Invalid operation');
|
|
537
|
+
if (lhs instanceof Decimal)
|
|
538
|
+
return lhs.acosh();
|
|
539
|
+
return Math.acosh(lhs);
|
|
540
|
+
},
|
|
541
|
+
atanh: (lhs) => {
|
|
542
|
+
if (!isNum(lhs))
|
|
543
|
+
throw Error('Invalid operation');
|
|
544
|
+
if (lhs instanceof Decimal)
|
|
545
|
+
return lhs.atanh();
|
|
546
|
+
return Math.atanh(lhs);
|
|
547
|
+
},
|
|
548
|
+
atan2: (lhs, rhs) => {
|
|
549
|
+
if (!isNum(lhs) || !isNum(rhs))
|
|
550
|
+
throw Error('Invalid operation');
|
|
551
|
+
if (lhs instanceof Decimal || rhs instanceof Decimal)
|
|
552
|
+
return Decimal.atan2(lhs, rhs);
|
|
553
|
+
return Math.atan2(lhs, rhs);
|
|
554
|
+
},
|
|
555
|
+
degrees: (lhs) => {
|
|
556
|
+
if (!isNum(lhs))
|
|
557
|
+
throw Error('Invalid operation');
|
|
558
|
+
if (lhs instanceof Decimal)
|
|
559
|
+
return Decimal.div(Decimal.mul(lhs, 180), Math.PI);
|
|
560
|
+
return (lhs * 180) / Math.PI;
|
|
561
|
+
},
|
|
562
|
+
radians: (lhs) => {
|
|
563
|
+
if (!isNum(lhs))
|
|
564
|
+
throw Error('Invalid operation');
|
|
565
|
+
if (lhs instanceof Decimal)
|
|
566
|
+
return Decimal.div(Decimal.mul(lhs, Math.PI), 180);
|
|
567
|
+
return (lhs * Math.PI) / 180;
|
|
568
|
+
},
|
|
569
|
+
sign: (lhs) => {
|
|
570
|
+
if (!isNum(lhs))
|
|
571
|
+
throw Error('Invalid operation');
|
|
572
|
+
if (lhs instanceof Decimal)
|
|
573
|
+
return Decimal.sign(lhs);
|
|
574
|
+
return Math.sign(lhs);
|
|
575
|
+
},
|
|
576
|
+
};
|
|
577
|
+
|
|
228
578
|
//
|
|
229
579
|
// expressions.ts
|
|
230
580
|
//
|
|
@@ -249,6 +599,9 @@ const cosine = (v1, v2) => {
|
|
|
249
599
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
250
600
|
// THE SOFTWARE.
|
|
251
601
|
//
|
|
602
|
+
const combineNumericTypes = (...list) => {
|
|
603
|
+
return _.some(_.flattenDeep(list), x => x === 'decimal') ? ['decimal'] : ['number'];
|
|
604
|
+
};
|
|
252
605
|
class QueryExpression {
|
|
253
606
|
static decode(expr, dollerSign) {
|
|
254
607
|
const exprs = [];
|
|
@@ -257,16 +610,45 @@ class QueryExpression {
|
|
|
257
610
|
if (_.includes(TConditionalKeys, key) && _.isArray(query)) {
|
|
258
611
|
exprs.push(new QueryCoditionalExpression(key, _.map(query, x => QueryExpression.decode(x, dollerSign))));
|
|
259
612
|
}
|
|
613
|
+
else if (_.includes(TZeroParamExprKeys, key)) {
|
|
614
|
+
exprs.push(new QueryZeroParamExpression(key));
|
|
615
|
+
}
|
|
616
|
+
else if (_.includes(TUnaryExprKeys, key)) {
|
|
617
|
+
exprs.push(new QueryUnaryExpression(key, QueryExpression.decode(query, dollerSign)));
|
|
618
|
+
}
|
|
619
|
+
else if (_.includes(TBinaryExprKeys, key) && _.isArray(query) && query.length === 2) {
|
|
620
|
+
const [left, right] = query;
|
|
621
|
+
exprs.push(new QueryBinaryExpression(key, QueryExpression.decode(left, dollerSign), QueryExpression.decode(right, dollerSign)));
|
|
622
|
+
}
|
|
623
|
+
else if (_.includes(TTernaryExprKeys, key) && _.isArray(query) && query.length === 3) {
|
|
624
|
+
const [first, second, last] = query;
|
|
625
|
+
exprs.push(new QueryTernaryExpression(key, QueryExpression.decode(first, dollerSign), QueryExpression.decode(second, dollerSign), QueryExpression.decode(last, dollerSign)));
|
|
626
|
+
}
|
|
627
|
+
else if (_.includes(TListExprKeys, key) && _.isArray(query)) {
|
|
628
|
+
if (query.length === 0)
|
|
629
|
+
throw Error('Invalid expression');
|
|
630
|
+
exprs.push(new QueryListExpression(key, _.map(query, x => QueryExpression.decode(x, dollerSign))));
|
|
631
|
+
}
|
|
260
632
|
else if (_.includes(TComparisonKeys, key) && _.isArray(query) && query.length === 2) {
|
|
261
633
|
const [left, right] = query;
|
|
262
634
|
exprs.push(new QueryComparisonExpression(key, QueryExpression.decode(left, dollerSign), QueryExpression.decode(right, dollerSign)));
|
|
263
635
|
}
|
|
264
|
-
else if (_.includes(
|
|
636
|
+
else if (_.includes(TDistanceExprKeys, key) && _.isArray(query) && query.length === 2) {
|
|
265
637
|
const [left, right] = query;
|
|
266
638
|
const _left = _.isArray(left) ? _.map(left, x => QueryExpression.decode(x, dollerSign)) : QueryExpression.decode(left, dollerSign);
|
|
267
639
|
const _right = _.isArray(right) ? _.map(right, x => QueryExpression.decode(x, dollerSign)) : QueryExpression.decode(right, dollerSign);
|
|
268
640
|
exprs.push(new QueryDistanceExpression(key, _.castArray(_left), _.castArray(_right)));
|
|
269
641
|
}
|
|
642
|
+
else if (key === '$cond' && _.isPlainObject(query)) {
|
|
643
|
+
const { branch: _branch, default: defaultCase } = query;
|
|
644
|
+
const branch = _.castArray(_branch ?? []);
|
|
645
|
+
if (branch.length === 0)
|
|
646
|
+
throw Error('Invalid expression');
|
|
647
|
+
exprs.push(new QueryCondExpression(_.map(branch, ({ case: c, then: t }) => ({
|
|
648
|
+
case: QueryExpression.decode(c, dollerSign),
|
|
649
|
+
then: QueryExpression.decode(t, dollerSign),
|
|
650
|
+
})), QueryExpression.decode(defaultCase, dollerSign)));
|
|
651
|
+
}
|
|
270
652
|
else if (key === '$not') {
|
|
271
653
|
exprs.push(new QueryNotExpression(QueryExpression.decode(query, dollerSign)));
|
|
272
654
|
}
|
|
@@ -430,6 +812,317 @@ class QueryArrayExpression extends QueryExpression {
|
|
|
430
812
|
return ['array'];
|
|
431
813
|
}
|
|
432
814
|
}
|
|
815
|
+
class QueryZeroParamExpression extends QueryExpression {
|
|
816
|
+
type;
|
|
817
|
+
constructor(type) {
|
|
818
|
+
super();
|
|
819
|
+
this.type = type;
|
|
820
|
+
}
|
|
821
|
+
eval(value) {
|
|
822
|
+
switch (this.type) {
|
|
823
|
+
case '$now': return new Date();
|
|
824
|
+
case '$rand': return Math.random();
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
evalType(schema, className) {
|
|
828
|
+
switch (this.type) {
|
|
829
|
+
case '$now': return ['date'];
|
|
830
|
+
case '$rand': return ['number', 'decimal'];
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
class QueryUnaryExpression extends QueryExpression {
|
|
835
|
+
type;
|
|
836
|
+
expr;
|
|
837
|
+
constructor(type, expr) {
|
|
838
|
+
super();
|
|
839
|
+
this.type = type;
|
|
840
|
+
this.expr = expr;
|
|
841
|
+
}
|
|
842
|
+
simplify() {
|
|
843
|
+
return new QueryUnaryExpression(this.type, this.expr.simplify());
|
|
844
|
+
}
|
|
845
|
+
keyPaths() {
|
|
846
|
+
return this.expr.keyPaths();
|
|
847
|
+
}
|
|
848
|
+
mapKey(callback) {
|
|
849
|
+
return new QueryUnaryExpression(this.type, this.expr.mapKey(callback));
|
|
850
|
+
}
|
|
851
|
+
eval(value) {
|
|
852
|
+
switch (this.type) {
|
|
853
|
+
case '$abs': return MathUtils.abs(this.expr.eval(value));
|
|
854
|
+
case '$neg': return MathUtils.neg(this.expr.eval(value));
|
|
855
|
+
case '$sqrt': return MathUtils.sqrt(this.expr.eval(value));
|
|
856
|
+
case '$cbrt': return MathUtils.cbrt(this.expr.eval(value));
|
|
857
|
+
case '$ceil': return MathUtils.ceil(this.expr.eval(value));
|
|
858
|
+
case '$floor': return MathUtils.floor(this.expr.eval(value));
|
|
859
|
+
case '$round': return MathUtils.round(this.expr.eval(value));
|
|
860
|
+
case '$exp': return MathUtils.exp(this.expr.eval(value));
|
|
861
|
+
case '$ln': return MathUtils.ln(this.expr.eval(value));
|
|
862
|
+
case '$log2': return MathUtils.log2(this.expr.eval(value));
|
|
863
|
+
case '$log10': return MathUtils.log10(this.expr.eval(value));
|
|
864
|
+
case '$sin': return MathUtils.sin(this.expr.eval(value));
|
|
865
|
+
case '$cos': return MathUtils.cos(this.expr.eval(value));
|
|
866
|
+
case '$tan': return MathUtils.tan(this.expr.eval(value));
|
|
867
|
+
case '$asin': return MathUtils.asin(this.expr.eval(value));
|
|
868
|
+
case '$acos': return MathUtils.acos(this.expr.eval(value));
|
|
869
|
+
case '$atan': return MathUtils.atan(this.expr.eval(value));
|
|
870
|
+
case '$asinh': return MathUtils.asinh(this.expr.eval(value));
|
|
871
|
+
case '$acosh': return MathUtils.acosh(this.expr.eval(value));
|
|
872
|
+
case '$atanh': return MathUtils.atanh(this.expr.eval(value));
|
|
873
|
+
case '$sinh': return MathUtils.sinh(this.expr.eval(value));
|
|
874
|
+
case '$cosh': return MathUtils.cosh(this.expr.eval(value));
|
|
875
|
+
case '$tanh': return MathUtils.tanh(this.expr.eval(value));
|
|
876
|
+
case '$degrees': return MathUtils.degrees(this.expr.eval(value));
|
|
877
|
+
case '$radians': return MathUtils.radians(this.expr.eval(value));
|
|
878
|
+
case '$sign': return MathUtils.sign(this.expr.eval(value));
|
|
879
|
+
case '$size':
|
|
880
|
+
{
|
|
881
|
+
const v = this.expr.eval(value);
|
|
882
|
+
if (!_.isArray(v) && !_.isString(v))
|
|
883
|
+
throw Error('Invalid value');
|
|
884
|
+
return v.length;
|
|
885
|
+
}
|
|
886
|
+
case '$lower': return _.toLower(this.expr.eval(value));
|
|
887
|
+
case '$upper': return _.toUpper(this.expr.eval(value));
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
evalType(schema, className) {
|
|
891
|
+
switch (this.type) {
|
|
892
|
+
case '$abs': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
893
|
+
case '$neg': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
894
|
+
case '$sqrt': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
895
|
+
case '$cbrt': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
896
|
+
case '$ceil': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
897
|
+
case '$floor': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
898
|
+
case '$round': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
899
|
+
case '$exp': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
900
|
+
case '$ln': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
901
|
+
case '$log2': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
902
|
+
case '$log10': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
903
|
+
case '$sin': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
904
|
+
case '$cos': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
905
|
+
case '$tan': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
906
|
+
case '$asin': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
907
|
+
case '$acos': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
908
|
+
case '$atan': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
909
|
+
case '$asinh': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
910
|
+
case '$acosh': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
911
|
+
case '$atanh': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
912
|
+
case '$sinh': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
913
|
+
case '$cosh': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
914
|
+
case '$tanh': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
915
|
+
case '$degrees': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
916
|
+
case '$radians': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
917
|
+
case '$sign': return combineNumericTypes(this.expr.evalType(schema, className));
|
|
918
|
+
case '$size': return ['number'];
|
|
919
|
+
case '$lower': return ['string'];
|
|
920
|
+
case '$upper': return ['string'];
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
class QueryBinaryExpression extends QueryExpression {
|
|
925
|
+
type;
|
|
926
|
+
left;
|
|
927
|
+
right;
|
|
928
|
+
constructor(type, left, right) {
|
|
929
|
+
super();
|
|
930
|
+
this.type = type;
|
|
931
|
+
this.left = left;
|
|
932
|
+
this.right = right;
|
|
933
|
+
}
|
|
934
|
+
simplify() {
|
|
935
|
+
return new QueryBinaryExpression(this.type, this.left.simplify(), this.right.simplify());
|
|
936
|
+
}
|
|
937
|
+
keyPaths() {
|
|
938
|
+
return _.uniq([
|
|
939
|
+
...this.left.keyPaths(),
|
|
940
|
+
...this.right.keyPaths(),
|
|
941
|
+
]);
|
|
942
|
+
}
|
|
943
|
+
mapKey(callback) {
|
|
944
|
+
return new QueryBinaryExpression(this.type, this.left.mapKey(callback), this.right.mapKey(callback));
|
|
945
|
+
}
|
|
946
|
+
eval(value) {
|
|
947
|
+
const left = this.left.eval(value);
|
|
948
|
+
const right = this.right?.eval(value);
|
|
949
|
+
switch (this.type) {
|
|
950
|
+
case '$divide': return MathUtils.divide(left, right);
|
|
951
|
+
case '$subtract': return MathUtils.subtract(left, right);
|
|
952
|
+
case '$log': return MathUtils.log(left, right);
|
|
953
|
+
case '$pow': return MathUtils.pow(left, right);
|
|
954
|
+
case '$atan2': return MathUtils.atan2(left, right);
|
|
955
|
+
case '$trim':
|
|
956
|
+
if (!_.isString(left) || !_.isString(right))
|
|
957
|
+
throw Error('Invalid value');
|
|
958
|
+
return _.trim(left, right);
|
|
959
|
+
case '$ltrim':
|
|
960
|
+
if (!_.isString(left) || !_.isString(right))
|
|
961
|
+
throw Error('Invalid value');
|
|
962
|
+
return _.trimStart(left, right);
|
|
963
|
+
case '$rtrim':
|
|
964
|
+
if (!_.isString(left) || !_.isString(right))
|
|
965
|
+
throw Error('Invalid value');
|
|
966
|
+
return _.trimEnd(left, right);
|
|
967
|
+
case '$first':
|
|
968
|
+
if (!_.isArray(left) && !_.isString(left))
|
|
969
|
+
throw Error('Invalid value');
|
|
970
|
+
if (!_.isSafeInteger(right) || right <= 0)
|
|
971
|
+
throw Error('Invalid value');
|
|
972
|
+
return _.isString(left) ? left.slice(0, right) : _.take(left, right);
|
|
973
|
+
case '$last':
|
|
974
|
+
if (!_.isArray(left) && !_.isString(left))
|
|
975
|
+
throw Error('Invalid value');
|
|
976
|
+
if (!_.isSafeInteger(right) || right <= 0)
|
|
977
|
+
throw Error('Invalid value');
|
|
978
|
+
return _.isString(left) ? left.slice(-right) : _.takeRight(left, right);
|
|
979
|
+
case '$ldrop':
|
|
980
|
+
if (!_.isArray(left) && !_.isString(left))
|
|
981
|
+
throw Error('Invalid value');
|
|
982
|
+
if (!_.isSafeInteger(right) || right <= 0)
|
|
983
|
+
throw Error('Invalid value');
|
|
984
|
+
return _.isString(left) ? left.slice(right) : _.drop(left, right);
|
|
985
|
+
case '$rdrop':
|
|
986
|
+
if (!_.isArray(left) && !_.isString(left))
|
|
987
|
+
throw Error('Invalid value');
|
|
988
|
+
if (!_.isSafeInteger(right) || right <= 0)
|
|
989
|
+
throw Error('Invalid value');
|
|
990
|
+
return _.isString(left) ? left.slice(0, -right) : _.dropRight(left, right);
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
evalType(schema, className) {
|
|
994
|
+
switch (this.type) {
|
|
995
|
+
case '$divide':
|
|
996
|
+
case '$subtract':
|
|
997
|
+
case '$log':
|
|
998
|
+
case '$pow':
|
|
999
|
+
case '$atan2':
|
|
1000
|
+
return combineNumericTypes(this.left.evalType(schema, className), this.right.evalType(schema, className));
|
|
1001
|
+
case '$trim':
|
|
1002
|
+
case '$ltrim':
|
|
1003
|
+
case '$rtrim':
|
|
1004
|
+
return ['string'];
|
|
1005
|
+
case '$first':
|
|
1006
|
+
case '$last':
|
|
1007
|
+
case '$ldrop':
|
|
1008
|
+
case '$rdrop':
|
|
1009
|
+
return _.intersection(this.left.evalType(schema, className), ['string', 'string[]', 'array']);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
class QueryTernaryExpression extends QueryExpression {
|
|
1014
|
+
type;
|
|
1015
|
+
first;
|
|
1016
|
+
second;
|
|
1017
|
+
last;
|
|
1018
|
+
constructor(type, first, second, last) {
|
|
1019
|
+
super();
|
|
1020
|
+
this.type = type;
|
|
1021
|
+
this.first = first;
|
|
1022
|
+
this.second = second;
|
|
1023
|
+
this.last = last;
|
|
1024
|
+
}
|
|
1025
|
+
simplify() {
|
|
1026
|
+
return new QueryTernaryExpression(this.type, this.first.simplify(), this.second.simplify(), this.last.simplify());
|
|
1027
|
+
}
|
|
1028
|
+
keyPaths() {
|
|
1029
|
+
return _.uniq([
|
|
1030
|
+
...this.first.keyPaths(),
|
|
1031
|
+
...this.second.keyPaths(),
|
|
1032
|
+
...this.last.keyPaths(),
|
|
1033
|
+
]);
|
|
1034
|
+
}
|
|
1035
|
+
mapKey(callback) {
|
|
1036
|
+
return new QueryTernaryExpression(this.type, this.first.mapKey(callback), this.second.mapKey(callback), this.last.mapKey(callback));
|
|
1037
|
+
}
|
|
1038
|
+
eval(value) {
|
|
1039
|
+
const first = this.first.eval(value);
|
|
1040
|
+
const second = this.second.eval(value);
|
|
1041
|
+
const last = this.last.eval(value);
|
|
1042
|
+
switch (this.type) {
|
|
1043
|
+
case '$lpad':
|
|
1044
|
+
if (!_.isString(first) || !_.isSafeInteger(second) || !_.isString(last))
|
|
1045
|
+
throw Error('Invalid value');
|
|
1046
|
+
return _.padStart(first, second, last);
|
|
1047
|
+
case '$rpad':
|
|
1048
|
+
if (!_.isString(first) || !_.isSafeInteger(second) || !_.isString(last))
|
|
1049
|
+
throw Error('Invalid value');
|
|
1050
|
+
return _.padEnd(first, second, last);
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
evalType(schema, className) {
|
|
1054
|
+
switch (this.type) {
|
|
1055
|
+
case '$lpad':
|
|
1056
|
+
case '$rpad':
|
|
1057
|
+
return ['string'];
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
class QueryListExpression extends QueryExpression {
|
|
1062
|
+
type;
|
|
1063
|
+
exprs;
|
|
1064
|
+
constructor(type, exprs) {
|
|
1065
|
+
super();
|
|
1066
|
+
this.type = type;
|
|
1067
|
+
this.exprs = exprs;
|
|
1068
|
+
}
|
|
1069
|
+
simplify() {
|
|
1070
|
+
return new QueryListExpression(this.type, _.map(this.exprs, x => x.simplify()));
|
|
1071
|
+
}
|
|
1072
|
+
keyPaths() {
|
|
1073
|
+
return _.uniq(_.flatMap(this.exprs, x => x.keyPaths()));
|
|
1074
|
+
}
|
|
1075
|
+
mapKey(callback) {
|
|
1076
|
+
return new QueryListExpression(this.type, _.map(this.exprs, x => x.mapKey(callback)));
|
|
1077
|
+
}
|
|
1078
|
+
eval(value) {
|
|
1079
|
+
switch (this.type) {
|
|
1080
|
+
case '$add': return _.isEmpty(this.exprs) ? undefined : _.reduce(this.exprs, (a, b) => MathUtils.sum(a, b.eval(value)), 0);
|
|
1081
|
+
case '$multiply': return _.isEmpty(this.exprs) ? undefined : _.reduce(this.exprs, (a, b) => MathUtils.multiply(a, b.eval(value)), 1);
|
|
1082
|
+
case '$ifNull': return _.find(_.map(this.exprs, x => x.eval(value)), x => !_.isNil(x));
|
|
1083
|
+
case '$concat': return _.join(_.map(this.exprs, x => x.eval(value)), '');
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
evalType(schema, className) {
|
|
1087
|
+
switch (this.type) {
|
|
1088
|
+
case '$add': return combineNumericTypes(..._.map(this.exprs, x => x.evalType(schema, className)));
|
|
1089
|
+
case '$multiply': return combineNumericTypes(..._.map(this.exprs, x => x.evalType(schema, className)));
|
|
1090
|
+
case '$ifNull': return _.intersection(..._.map(this.exprs, x => x.evalType(schema, className)));
|
|
1091
|
+
case '$concat': return ['string'];
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
class QueryCondExpression extends QueryExpression {
|
|
1096
|
+
branch;
|
|
1097
|
+
default;
|
|
1098
|
+
constructor(branch, defaultCase) {
|
|
1099
|
+
super();
|
|
1100
|
+
this.branch = branch;
|
|
1101
|
+
this.default = defaultCase;
|
|
1102
|
+
}
|
|
1103
|
+
simplify() {
|
|
1104
|
+
return new QueryCondExpression(_.map(this.branch, ({ case: c, then: t }) => ({ case: c.simplify(), then: t.simplify() })), this.default.simplify());
|
|
1105
|
+
}
|
|
1106
|
+
keyPaths() {
|
|
1107
|
+
return _.uniq([
|
|
1108
|
+
..._.flatMap(this.branch, ({ case: c, then: t }) => [...c.keyPaths(), ...t.keyPaths()]),
|
|
1109
|
+
...this.default.keyPaths(),
|
|
1110
|
+
]);
|
|
1111
|
+
}
|
|
1112
|
+
mapKey(callback) {
|
|
1113
|
+
return new QueryCondExpression(_.map(this.branch, ({ case: c, then: t }) => ({ case: c.mapKey(callback), then: t.mapKey(callback) })), this.default.mapKey(callback));
|
|
1114
|
+
}
|
|
1115
|
+
eval(value) {
|
|
1116
|
+
for (const { case: c, then: t } of this.branch) {
|
|
1117
|
+
if (c.eval(value))
|
|
1118
|
+
return t.eval(value);
|
|
1119
|
+
}
|
|
1120
|
+
return this.default.eval(value);
|
|
1121
|
+
}
|
|
1122
|
+
evalType(schema, className) {
|
|
1123
|
+
return _.intersection(..._.map(this.branch, ({ then: t }) => t.evalType(schema, className)), this.default.evalType(schema, className));
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
433
1126
|
class QueryDistanceExpression extends QueryExpression {
|
|
434
1127
|
type;
|
|
435
1128
|
left;
|
|
@@ -488,7 +1181,15 @@ class QueryKeyExpression extends QueryExpression {
|
|
|
488
1181
|
}
|
|
489
1182
|
evalType(schema, className) {
|
|
490
1183
|
const { paths: [, ...subpath], dataType } = resolveColumn(schema, className, this.key);
|
|
491
|
-
|
|
1184
|
+
if (!_.isEmpty(subpath))
|
|
1185
|
+
return [];
|
|
1186
|
+
if (_.isString(dataType))
|
|
1187
|
+
return [dataType];
|
|
1188
|
+
if (isPrimitive(dataType))
|
|
1189
|
+
return [dataType.type];
|
|
1190
|
+
if (isVector(dataType))
|
|
1191
|
+
return [_.omit(dataType, 'default')];
|
|
1192
|
+
return [dataType];
|
|
492
1193
|
}
|
|
493
1194
|
}
|
|
494
1195
|
class QueryValueExpression extends QueryExpression {
|
|
@@ -510,9 +1211,9 @@ class QueryValueExpression extends QueryExpression {
|
|
|
510
1211
|
if (_.isString(this.value))
|
|
511
1212
|
return ['string'];
|
|
512
1213
|
if (_.isNumber(this.value))
|
|
513
|
-
return ['number'
|
|
1214
|
+
return ['number'];
|
|
514
1215
|
if (this.value instanceof Decimal)
|
|
515
|
-
return ['decimal'
|
|
1216
|
+
return ['decimal'];
|
|
516
1217
|
return [];
|
|
517
1218
|
}
|
|
518
1219
|
}
|
|
@@ -834,7 +1535,7 @@ class QueryExpressionSelector extends QuerySelector {
|
|
|
834
1535
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
835
1536
|
// THE SOFTWARE.
|
|
836
1537
|
//
|
|
837
|
-
const
|
|
1538
|
+
const TUnaryAccumulatorKeys = [
|
|
838
1539
|
'$max',
|
|
839
1540
|
'$min',
|
|
840
1541
|
'$most',
|
|
@@ -845,7 +1546,7 @@ const accumulatorExprKeys = [
|
|
|
845
1546
|
'$varPop',
|
|
846
1547
|
'$varSamp'
|
|
847
1548
|
];
|
|
848
|
-
const
|
|
1549
|
+
const TZeroParamAccumulatorKeys = [
|
|
849
1550
|
'$count'
|
|
850
1551
|
];
|
|
851
1552
|
|
|
@@ -876,11 +1577,11 @@ const accumulatorNoParamKeys = [
|
|
|
876
1577
|
class QueryAccumulator {
|
|
877
1578
|
static decode(query) {
|
|
878
1579
|
for (const [key, expr] of _.toPairs(query)) {
|
|
879
|
-
if (_.includes(
|
|
880
|
-
return new
|
|
1580
|
+
if (_.includes(TUnaryAccumulatorKeys, key)) {
|
|
1581
|
+
return new QueryUnaryAccumulator(key, QueryExpression.decode(expr ?? [], false));
|
|
881
1582
|
}
|
|
882
|
-
else if (_.includes(
|
|
883
|
-
return new
|
|
1583
|
+
else if (_.includes(TZeroParamAccumulatorKeys, key)) {
|
|
1584
|
+
return new QueryZeroParamAccumulator(key);
|
|
884
1585
|
}
|
|
885
1586
|
else if (key === '$percentile') {
|
|
886
1587
|
const { input, p, mode = 'discrete' } = expr ?? {};
|
|
@@ -909,7 +1610,7 @@ class QueryAccumulator {
|
|
|
909
1610
|
return;
|
|
910
1611
|
}
|
|
911
1612
|
}
|
|
912
|
-
class
|
|
1613
|
+
class QueryZeroParamAccumulator extends QueryAccumulator {
|
|
913
1614
|
type;
|
|
914
1615
|
constructor(type) {
|
|
915
1616
|
super();
|
|
@@ -930,7 +1631,7 @@ class QueryNoParamAccumulator extends QueryAccumulator {
|
|
|
930
1631
|
}
|
|
931
1632
|
}
|
|
932
1633
|
}
|
|
933
|
-
class
|
|
1634
|
+
class QueryUnaryAccumulator extends QueryAccumulator {
|
|
934
1635
|
type;
|
|
935
1636
|
expr;
|
|
936
1637
|
constructor(type, expr) {
|
|
@@ -939,13 +1640,13 @@ class QueryExprAccumulator extends QueryAccumulator {
|
|
|
939
1640
|
this.expr = expr;
|
|
940
1641
|
}
|
|
941
1642
|
simplify() {
|
|
942
|
-
return new
|
|
1643
|
+
return new QueryUnaryAccumulator(this.type, this.expr.simplify());
|
|
943
1644
|
}
|
|
944
1645
|
keyPaths() {
|
|
945
1646
|
return this.expr.keyPaths();
|
|
946
1647
|
}
|
|
947
1648
|
mapKey(callback) {
|
|
948
|
-
return new
|
|
1649
|
+
return new QueryUnaryAccumulator(this.type, this.expr.mapKey(callback));
|
|
949
1650
|
}
|
|
950
1651
|
evalType(schema, className) {
|
|
951
1652
|
const [dataType] = this.expr.evalType(schema, className);
|
|
@@ -1389,5 +2090,5 @@ class QueryValidator {
|
|
|
1389
2090
|
}
|
|
1390
2091
|
}
|
|
1391
2092
|
|
|
1392
|
-
export { FieldSelectorExpression as F, QueryValidator as Q, QueryExpression as a, resolveDataType as b, QuerySelector as c, QueryCoditionalSelector as d, QueryFieldSelector as e, QueryExpressionSelector as f,
|
|
1393
|
-
//# sourceMappingURL=validator-
|
|
2093
|
+
export { FieldSelectorExpression as F, QueryValidator as Q, QueryExpression as a, resolveDataType as b, QuerySelector as c, QueryCoditionalSelector as d, QueryFieldSelector as e, QueryExpressionSelector as f, QueryArrayExpression as g, QueryValueExpression as h, QueryKeyExpression as i, QueryCoditionalExpression as j, QueryComparisonExpression as k, QueryNotExpression as l, QueryDistanceExpression as m, QueryZeroParamExpression as n, QueryUnaryExpression as o, QueryBinaryExpression as p, QueryListExpression as q, resolveColumn as r, QueryTernaryExpression as s, QueryCondExpression as t, QueryZeroParamAccumulator as u, QueryUnaryAccumulator as v, QueryPercentileAccumulator as w };
|
|
2094
|
+
//# sourceMappingURL=validator-CEcBF4Cn.mjs.map
|