corebasic 1.0.205 → 1.0.208

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.
@@ -0,0 +1,653 @@
1
+ import { describe, test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import {reduceRanges, extractBounds} from "../index.js";
5
+
6
+
7
+
8
+ // -----------------------------------------------------------------------------
9
+ // reduceRanges()
10
+ // -----------------------------------------------------------------------------
11
+ describe("reduceRanges()", () => {
12
+
13
+ test("reduceRanges: empty", () => {
14
+ assert.deepEqual(reduceRanges([]), []);
15
+ });
16
+
17
+ test("reduceRanges: primitive passthrough", () => {
18
+ assert.deepEqual(
19
+ reduceRanges([1, "A", true]),
20
+ [1, "A", true]
21
+ );
22
+ });
23
+
24
+ test("reduceRanges: null passthrough", () => {
25
+ assert.deepEqual(
26
+ reduceRanges([null]),
27
+ [null]
28
+ );
29
+ });
30
+
31
+ test("reduceRanges: array passthrough", () => {
32
+ assert.deepEqual(
33
+ reduceRanges([[1,2]]),
34
+ [[1,2]]
35
+ );
36
+ });
37
+
38
+ test("reduceRanges: unknown object passthrough", () => {
39
+ assert.deepEqual(
40
+ reduceRanges([
41
+ {$regex: "abc"}
42
+ ]),
43
+ [
44
+ {$regex: "abc"}
45
+ ]
46
+ );
47
+ });
48
+
49
+ test("reduceRanges: single $gt", () => {
50
+ assert.deepEqual(
51
+ reduceRanges([
52
+ {$gt: 5}
53
+ ]),
54
+ [
55
+ {$gt: 5}
56
+ ]
57
+ );
58
+ });
59
+
60
+ test("reduceRanges: single $gte", () => {
61
+ assert.deepEqual(
62
+ reduceRanges([
63
+ {$gte: 5}
64
+ ]),
65
+ [
66
+ {$gte: 5}
67
+ ]
68
+ );
69
+ });
70
+
71
+ test("reduceRanges: single $lt", () => {
72
+ assert.deepEqual(
73
+ reduceRanges([
74
+ {$lt: 10}
75
+ ]),
76
+ [
77
+ {$lt: 10}
78
+ ]
79
+ );
80
+ });
81
+
82
+ test("reduceRanges: single $lte", () => {
83
+ assert.deepEqual(
84
+ reduceRanges([
85
+ {$lte: 10}
86
+ ]),
87
+ [
88
+ {$lte: 10}
89
+ ]
90
+ );
91
+ });
92
+
93
+ test("reduceRanges: wider $gt kept", () => {
94
+ assert.deepEqual(
95
+ reduceRanges([
96
+ {$gt: 5},
97
+ {$gt: 10}
98
+ ]),
99
+ [
100
+ {$gt: 5}
101
+ ]
102
+ );
103
+ });
104
+
105
+ test("reduceRanges: wider $gte kept", () => {
106
+ assert.deepEqual(
107
+ reduceRanges([
108
+ {$gte: 5},
109
+ {$gte: 10}
110
+ ]),
111
+ [
112
+ {$gte: 5}
113
+ ]
114
+ );
115
+ });
116
+
117
+ test("reduceRanges: wider $lt kept", () => {
118
+ assert.deepEqual(
119
+ reduceRanges([
120
+ {$lt: 20},
121
+ {$lt: 10}
122
+ ]),
123
+ [
124
+ {$lt: 20}
125
+ ]
126
+ );
127
+ });
128
+
129
+ test("reduceRanges: wider $lte kept", () => {
130
+ assert.deepEqual(
131
+ reduceRanges([
132
+ {$lte: 20},
133
+ {$lte: 10}
134
+ ]),
135
+ [
136
+ {$lte: 20}
137
+ ]
138
+ );
139
+ });
140
+
141
+ test("reduceRanges: gt + gte", () => {
142
+ assert.deepEqual(
143
+ reduceRanges([
144
+ {$gt: 5},
145
+ {$gte: 10}
146
+ ]),
147
+ [
148
+ {$gt: 5}
149
+ ]
150
+ );
151
+ });
152
+
153
+ test("reduceRanges: gte + gt", () => {
154
+ assert.deepEqual(
155
+ reduceRanges([
156
+ {$gte: 5},
157
+ {$gt: 10}
158
+ ]),
159
+ [
160
+ {$gte: 5}
161
+ ]
162
+ );
163
+ });
164
+
165
+ test("reduceRanges: gt == gte", () => {
166
+ assert.deepEqual(
167
+ reduceRanges([
168
+ {$gt: 5},
169
+ {$gte: 5}
170
+ ]),
171
+ [
172
+ {$gte: 5}
173
+ ]
174
+ );
175
+ });
176
+
177
+ test("reduceRanges: lt + lte", () => {
178
+ assert.deepEqual(
179
+ reduceRanges([
180
+ {$lt: 20},
181
+ {$lte: 10}
182
+ ]),
183
+ [
184
+ {$lt: 20}
185
+ ]
186
+ );
187
+ });
188
+
189
+ test("reduceRanges: lte + lt", () => {
190
+ assert.deepEqual(
191
+ reduceRanges([
192
+ {$lte: 20},
193
+ {$lt: 10}
194
+ ]),
195
+ [
196
+ {$lte: 20}
197
+ ]
198
+ );
199
+ });
200
+
201
+ test("reduceRanges: lt == lte", () => {
202
+ assert.deepEqual(
203
+ reduceRanges([
204
+ {$lt: 20},
205
+ {$lte: 20}
206
+ ]),
207
+ [
208
+ {$lte: 20}
209
+ ]
210
+ );
211
+ });
212
+
213
+ test("reduceRanges: lower + upper", () => {
214
+ assert.deepEqual(
215
+ reduceRanges([
216
+ {$gt: 5},
217
+ {$lt: 20}
218
+ ]),
219
+ [
220
+ {$gt: 5},
221
+ {$lt: 20}
222
+ ]
223
+ );
224
+ });
225
+
226
+ test("reduceRanges: mixed objects preserved", () => {
227
+ assert.deepEqual(
228
+ reduceRanges([
229
+ {$gt: 5},
230
+ {$regex: "abc"},
231
+ {$lt: 20}
232
+ ]),
233
+ [
234
+ {$regex: "abc"},
235
+ {$gt: 5},
236
+ {$lt: 20}
237
+ ]
238
+ );
239
+ });
240
+
241
+ test("reduceRanges: duplicate gt", () => {
242
+ assert.deepEqual(
243
+ reduceRanges([
244
+ {$gt: 5},
245
+ {$gt: 5}
246
+ ]),
247
+ [
248
+ {$gt: 5}
249
+ ]
250
+ );
251
+ });
252
+
253
+ test("reduceRanges: duplicate lt", () => {
254
+ assert.deepEqual(
255
+ reduceRanges([
256
+ {$lt: 10},
257
+ {$lt: 10}
258
+ ]),
259
+ [
260
+ {$lt: 10}
261
+ ]
262
+ );
263
+ });
264
+
265
+ test("reduceRanges: negative values", () => {
266
+ assert.deepEqual(
267
+ reduceRanges([
268
+ {$gt: -10},
269
+ {$lt: -1}
270
+ ]),
271
+ [
272
+ {$gt: -10},
273
+ {$lt: -1}
274
+ ]
275
+ );
276
+ });
277
+
278
+ test("reduceRanges: zero", () => {
279
+ assert.deepEqual(
280
+ reduceRanges([
281
+ {$gte: 0},
282
+ {$lte: 0}
283
+ ]),
284
+ [
285
+ {$gte: 0},
286
+ {$lte: 0}
287
+ ]
288
+ );
289
+ });
290
+
291
+ test("reduceRanges: idempotent", () => {
292
+ const input = [
293
+ {$gt: 5},
294
+ {$gt: 10},
295
+ {$lt: 20},
296
+ {$lt: 10},
297
+ {$regex: "abc"}
298
+ ];
299
+
300
+ assert.deepEqual(
301
+ reduceRanges(reduceRanges(input)),
302
+ reduceRanges(input)
303
+ );
304
+ });
305
+
306
+
307
+
308
+
309
+
310
+ test("reduceRanges: widens lower bounds conservatively", () => {
311
+ assert.deepEqual(
312
+ reduceRanges([
313
+ {$gte: 10},
314
+ {$gte: 20}
315
+ ]),
316
+ [
317
+ {$gte: 10}
318
+ ]
319
+ );
320
+ });
321
+
322
+
323
+ test("reduceRanges: widens upper bounds conservatively", () => {
324
+ assert.deepEqual(
325
+ reduceRanges([
326
+ {$lte: 50},
327
+ {$lte: 100}
328
+ ]),
329
+ [
330
+ {$lte: 100}
331
+ ]
332
+ );
333
+ });
334
+
335
+
336
+ test("reduceRanges: prefers inclusive bound when values match as lower bound", () => {
337
+ assert.deepEqual(
338
+ reduceRanges([
339
+ {$gt: 10},
340
+ {$gte: 10}
341
+ ]),
342
+ [
343
+ {$gte: 10}
344
+ ]
345
+ );
346
+ });
347
+
348
+ test("reduceRanges: prefers inclusive bound when values match as upper bound", () => {
349
+ assert.deepEqual(
350
+ reduceRanges([
351
+ {$lt: 10},
352
+ {$lte: 10}
353
+ ]),
354
+ [
355
+ {$lte: 10}
356
+ ]
357
+ );
358
+ });
359
+
360
+
361
+ test("reduceRanges: keeps widest lower bound", () => {
362
+ assert.deepEqual(
363
+ reduceRanges([
364
+ {$gt: 20},
365
+ {$gte: 10}
366
+ ]),
367
+ [
368
+ {$gte: 10}
369
+ ]
370
+ );
371
+ });
372
+
373
+ test("reduceRanges: keeps widest upper bound", () => {
374
+ assert.deepEqual(
375
+ reduceRanges([
376
+ {$lt: 50},
377
+ {$lte: 100}
378
+ ]),
379
+ [
380
+ {$lte: 100}
381
+ ]
382
+ );
383
+ });
384
+
385
+
386
+
387
+ test("reduceRanges: preserves non-range values", () => {
388
+ assert.deepEqual(
389
+ reduceRanges([
390
+ {$gte: 10},
391
+ "hello",
392
+ {$exists: true}
393
+ ]),
394
+ [
395
+ "hello",
396
+ {$exists: true},
397
+ {$gte: 10}
398
+ ]
399
+ );
400
+ });
401
+
402
+ });
403
+
404
+ // -----------------------------------------------------------------------------
405
+ // extractBounds()
406
+ // -----------------------------------------------------------------------------
407
+
408
+ describe("extractBounds()", () => {
409
+
410
+ test("extractBounds: empty", () => {
411
+ assert.deepEqual(
412
+ extractBounds([]),
413
+ {
414
+ values: [],
415
+ from: null,
416
+ to: null,
417
+ fromOp: null,
418
+ toOp: null,
419
+ }
420
+ );
421
+ });
422
+
423
+ test("extractBounds: primitives", () => {
424
+ assert.deepEqual(
425
+ extractBounds([
426
+ 1,
427
+ "A"
428
+ ]),
429
+ {
430
+ values: [
431
+ 1,
432
+ "A"
433
+ ],
434
+ from: null,
435
+ to: null,
436
+ fromOp: null,
437
+ toOp: null,
438
+ }
439
+ );
440
+ });
441
+
442
+ test("extractBounds: single gt", () => {
443
+ assert.deepEqual(
444
+ extractBounds([
445
+ {$gt: 5}
446
+ ]),
447
+ {
448
+ values: [],
449
+ from: 5,
450
+ to: null,
451
+ fromOp: "$gt",
452
+ toOp: null,
453
+ }
454
+ );
455
+ });
456
+
457
+ test("extractBounds: single gte", () => {
458
+ assert.deepEqual(
459
+ extractBounds([
460
+ {$gte: 5}
461
+ ]),
462
+ {
463
+ values: [],
464
+ from: 5,
465
+ to: null,
466
+ fromOp: "$gte",
467
+ toOp: null,
468
+ }
469
+ );
470
+ });
471
+
472
+ test("extractBounds: single lt", () => {
473
+ assert.deepEqual(
474
+ extractBounds([
475
+ {$lt: 10}
476
+ ]),
477
+ {
478
+ values: [],
479
+ from: null,
480
+ to: 10,
481
+ fromOp: null,
482
+ toOp: "$lt",
483
+ }
484
+ );
485
+ });
486
+
487
+ test("extractBounds: single lte", () => {
488
+ assert.deepEqual(
489
+ extractBounds([
490
+ {$lte: 10}
491
+ ]),
492
+ {
493
+ values: [],
494
+ from: null,
495
+ to: 10,
496
+ fromOp: null,
497
+ toOp: "$lte",
498
+ }
499
+ );
500
+ });
501
+
502
+ test("extractBounds: lower + upper", () => {
503
+ assert.deepEqual(
504
+ extractBounds([
505
+ {$gt: 5},
506
+ {$lt: 20}
507
+ ]),
508
+ {
509
+ values: [],
510
+ from: 5,
511
+ to: 20,
512
+ fromOp: "$gt",
513
+ toOp: "$lt",
514
+ }
515
+ );
516
+ });
517
+
518
+ test("extractBounds: unknown object preserved", () => {
519
+ assert.deepEqual(
520
+ extractBounds([
521
+ {$regex: "abc"}
522
+ ]),
523
+ {
524
+ values: [
525
+ {$regex: "abc"}
526
+ ],
527
+ from: null,
528
+ to: null,
529
+ fromOp: null,
530
+ toOp: null,
531
+ }
532
+ );
533
+ });
534
+
535
+ test("extractBounds: primitive + bounds", () => {
536
+ assert.deepEqual(
537
+ extractBounds([
538
+ "Sales",
539
+ {$gt: 5},
540
+ {$lt: 20}
541
+ ]),
542
+ {
543
+ values: [
544
+ "Sales"
545
+ ],
546
+ from: 5,
547
+ to: 20,
548
+ fromOp: "$gt",
549
+ toOp: "$lt",
550
+ }
551
+ );
552
+ });
553
+
554
+ test("extractBounds(reduceRanges()) planner pipeline", () => {
555
+ assert.deepEqual(
556
+ extractBounds(
557
+ reduceRanges([
558
+ {$gt: 5},
559
+ {$gt: 10},
560
+ {$lt: 20},
561
+ {$lt: 10}
562
+ ])
563
+ ),
564
+ {
565
+ values: [],
566
+ from: 5,
567
+ to: 20,
568
+ fromOp: "$gt",
569
+ toOp: "$lt",
570
+ }
571
+ );
572
+ });
573
+
574
+ test("extractBounds(reduceRanges()) inclusive", () => {
575
+ assert.deepEqual(
576
+ extractBounds(
577
+ reduceRanges([
578
+ {$gt: 5},
579
+ {$gte: 5},
580
+ {$lt: 20},
581
+ {$lte: 20}
582
+ ])
583
+ ),
584
+ {
585
+ values: [],
586
+ from: 5,
587
+ to: 20,
588
+ fromOp: "$gte",
589
+ toOp: "$lte",
590
+ }
591
+ );
592
+ });
593
+
594
+ test("extractBounds(reduceRanges()) inclusive 2", () => {
595
+ assert.deepEqual(
596
+ extractBounds(
597
+ reduceRanges([
598
+ {$gte: 5},
599
+ {$gt: 5},
600
+ {$lte: 20},
601
+ {$lt: 20},
602
+ ])
603
+ ),
604
+ {
605
+ values: [],
606
+ from: 5,
607
+ to: 20,
608
+ fromOp: "$gte",
609
+ toOp: "$lte",
610
+ }
611
+ );
612
+ });
613
+
614
+ test("extractBounds(reduceRanges()) inclusive 3", () => {
615
+ assert.deepEqual(
616
+ extractBounds(
617
+ reduceRanges([
618
+ {$gt: 4},
619
+ {$gte: 5},
620
+ {$lt: 21},
621
+ {$lte: 20}
622
+ ])
623
+ ),
624
+ {
625
+ values: [],
626
+ from: 4,
627
+ to: 21,
628
+ fromOp: "$gt",
629
+ toOp: "$lt",
630
+ }
631
+ );
632
+ });
633
+ test("extractBounds(reduceRanges()) inclusive 4", () => {
634
+ assert.deepEqual(
635
+ extractBounds(
636
+ reduceRanges([
637
+ {$gt: 5},
638
+ {$gte: 4},
639
+ {$lt: 20},
640
+ {$lte: 21}
641
+ ])
642
+ ),
643
+ {
644
+ values: [],
645
+ from: 4,
646
+ to: 21,
647
+ fromOp: "$gte",
648
+ toOp: "$lte",
649
+ }
650
+ );
651
+ });
652
+
653
+ });