@tanstack/db 0.4.19 → 0.5.0

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.
Files changed (153) hide show
  1. package/dist/cjs/collection/change-events.cjs +10 -12
  2. package/dist/cjs/collection/change-events.cjs.map +1 -1
  3. package/dist/cjs/collection/change-events.d.cts +1 -8
  4. package/dist/cjs/collection/index.cjs +19 -1
  5. package/dist/cjs/collection/index.cjs.map +1 -1
  6. package/dist/cjs/collection/index.d.cts +7 -5
  7. package/dist/cjs/collection/sync.cjs +7 -1
  8. package/dist/cjs/collection/sync.cjs.map +1 -1
  9. package/dist/cjs/errors.cjs +9 -4
  10. package/dist/cjs/errors.cjs.map +1 -1
  11. package/dist/cjs/errors.d.cts +4 -1
  12. package/dist/cjs/index.cjs +21 -3
  13. package/dist/cjs/index.cjs.map +1 -1
  14. package/dist/cjs/index.d.cts +2 -0
  15. package/dist/cjs/indexes/auto-index.cjs +7 -3
  16. package/dist/cjs/indexes/auto-index.cjs.map +1 -1
  17. package/dist/cjs/local-storage.cjs.map +1 -1
  18. package/dist/cjs/local-storage.d.cts +2 -2
  19. package/dist/cjs/query/builder/functions.cjs +34 -0
  20. package/dist/cjs/query/builder/functions.cjs.map +1 -1
  21. package/dist/cjs/query/builder/functions.d.cts +5 -0
  22. package/dist/cjs/query/builder/index.cjs +2 -2
  23. package/dist/cjs/query/builder/index.cjs.map +1 -1
  24. package/dist/cjs/query/builder/types.d.cts +18 -24
  25. package/dist/cjs/query/compiler/evaluators.cjs +57 -4
  26. package/dist/cjs/query/compiler/evaluators.cjs.map +1 -1
  27. package/dist/cjs/query/compiler/evaluators.d.cts +13 -0
  28. package/dist/cjs/query/compiler/expressions.cjs +4 -1
  29. package/dist/cjs/query/compiler/expressions.cjs.map +1 -1
  30. package/dist/cjs/query/compiler/group-by.cjs +3 -3
  31. package/dist/cjs/query/compiler/group-by.cjs.map +1 -1
  32. package/dist/cjs/query/compiler/index.cjs +2 -2
  33. package/dist/cjs/query/compiler/index.cjs.map +1 -1
  34. package/dist/cjs/query/compiler/order-by.cjs +18 -6
  35. package/dist/cjs/query/compiler/order-by.cjs.map +1 -1
  36. package/dist/cjs/query/compiler/order-by.d.cts +7 -1
  37. package/dist/cjs/query/expression-helpers.cjs +217 -0
  38. package/dist/cjs/query/expression-helpers.cjs.map +1 -0
  39. package/dist/cjs/query/expression-helpers.d.cts +216 -0
  40. package/dist/cjs/query/index.d.cts +2 -0
  41. package/dist/cjs/query/live/collection-config-builder.cjs +34 -2
  42. package/dist/cjs/query/live/collection-config-builder.cjs.map +1 -1
  43. package/dist/cjs/query/live/collection-config-builder.d.cts +7 -1
  44. package/dist/cjs/query/live/collection-registry.cjs +2 -1
  45. package/dist/cjs/query/live/collection-registry.cjs.map +1 -1
  46. package/dist/cjs/query/live/collection-registry.d.cts +1 -1
  47. package/dist/cjs/query/live/internal.cjs +5 -0
  48. package/dist/cjs/query/live/internal.cjs.map +1 -0
  49. package/dist/cjs/query/live/internal.d.cts +13 -0
  50. package/dist/cjs/query/live/types.d.cts +6 -1
  51. package/dist/cjs/query/predicate-utils.cjs +816 -0
  52. package/dist/cjs/query/predicate-utils.cjs.map +1 -0
  53. package/dist/cjs/query/predicate-utils.d.cts +116 -0
  54. package/dist/cjs/query/subset-dedupe.cjs +111 -0
  55. package/dist/cjs/query/subset-dedupe.cjs.map +1 -0
  56. package/dist/cjs/query/subset-dedupe.d.cts +66 -0
  57. package/dist/cjs/types.d.cts +31 -2
  58. package/dist/cjs/utils/comparison.cjs +30 -0
  59. package/dist/cjs/utils/comparison.cjs.map +1 -1
  60. package/dist/cjs/utils/comparison.d.cts +7 -1
  61. package/dist/cjs/utils/index-optimization.cjs +26 -22
  62. package/dist/cjs/utils/index-optimization.cjs.map +1 -1
  63. package/dist/cjs/utils/index-optimization.d.cts +5 -4
  64. package/dist/esm/collection/change-events.d.ts +1 -8
  65. package/dist/esm/collection/change-events.js +7 -9
  66. package/dist/esm/collection/change-events.js.map +1 -1
  67. package/dist/esm/collection/index.d.ts +7 -5
  68. package/dist/esm/collection/index.js +19 -1
  69. package/dist/esm/collection/index.js.map +1 -1
  70. package/dist/esm/collection/sync.js +7 -1
  71. package/dist/esm/collection/sync.js.map +1 -1
  72. package/dist/esm/errors.d.ts +4 -1
  73. package/dist/esm/errors.js +9 -4
  74. package/dist/esm/errors.js.map +1 -1
  75. package/dist/esm/index.d.ts +2 -0
  76. package/dist/esm/index.js +19 -1
  77. package/dist/esm/index.js.map +1 -1
  78. package/dist/esm/indexes/auto-index.js +7 -3
  79. package/dist/esm/indexes/auto-index.js.map +1 -1
  80. package/dist/esm/local-storage.d.ts +2 -2
  81. package/dist/esm/local-storage.js.map +1 -1
  82. package/dist/esm/query/builder/functions.d.ts +5 -0
  83. package/dist/esm/query/builder/functions.js +34 -0
  84. package/dist/esm/query/builder/functions.js.map +1 -1
  85. package/dist/esm/query/builder/index.js +2 -2
  86. package/dist/esm/query/builder/index.js.map +1 -1
  87. package/dist/esm/query/builder/types.d.ts +18 -24
  88. package/dist/esm/query/compiler/evaluators.d.ts +13 -0
  89. package/dist/esm/query/compiler/evaluators.js +59 -6
  90. package/dist/esm/query/compiler/evaluators.js.map +1 -1
  91. package/dist/esm/query/compiler/expressions.js +4 -1
  92. package/dist/esm/query/compiler/expressions.js.map +1 -1
  93. package/dist/esm/query/compiler/group-by.js +4 -4
  94. package/dist/esm/query/compiler/group-by.js.map +1 -1
  95. package/dist/esm/query/compiler/index.js +3 -3
  96. package/dist/esm/query/compiler/index.js.map +1 -1
  97. package/dist/esm/query/compiler/order-by.d.ts +7 -1
  98. package/dist/esm/query/compiler/order-by.js +18 -6
  99. package/dist/esm/query/compiler/order-by.js.map +1 -1
  100. package/dist/esm/query/expression-helpers.d.ts +216 -0
  101. package/dist/esm/query/expression-helpers.js +217 -0
  102. package/dist/esm/query/expression-helpers.js.map +1 -0
  103. package/dist/esm/query/index.d.ts +2 -0
  104. package/dist/esm/query/live/collection-config-builder.d.ts +7 -1
  105. package/dist/esm/query/live/collection-config-builder.js +34 -2
  106. package/dist/esm/query/live/collection-config-builder.js.map +1 -1
  107. package/dist/esm/query/live/collection-registry.d.ts +1 -1
  108. package/dist/esm/query/live/collection-registry.js +2 -1
  109. package/dist/esm/query/live/collection-registry.js.map +1 -1
  110. package/dist/esm/query/live/internal.d.ts +13 -0
  111. package/dist/esm/query/live/internal.js +5 -0
  112. package/dist/esm/query/live/internal.js.map +1 -0
  113. package/dist/esm/query/live/types.d.ts +6 -1
  114. package/dist/esm/query/predicate-utils.d.ts +116 -0
  115. package/dist/esm/query/predicate-utils.js +816 -0
  116. package/dist/esm/query/predicate-utils.js.map +1 -0
  117. package/dist/esm/query/subset-dedupe.d.ts +66 -0
  118. package/dist/esm/query/subset-dedupe.js +111 -0
  119. package/dist/esm/query/subset-dedupe.js.map +1 -0
  120. package/dist/esm/types.d.ts +31 -2
  121. package/dist/esm/utils/comparison.d.ts +7 -1
  122. package/dist/esm/utils/comparison.js +30 -0
  123. package/dist/esm/utils/comparison.js.map +1 -1
  124. package/dist/esm/utils/index-optimization.d.ts +5 -4
  125. package/dist/esm/utils/index-optimization.js +26 -22
  126. package/dist/esm/utils/index-optimization.js.map +1 -1
  127. package/package.json +2 -2
  128. package/src/collection/change-events.ts +14 -24
  129. package/src/collection/index.ts +34 -6
  130. package/src/collection/sync.ts +9 -1
  131. package/src/errors.ts +20 -4
  132. package/src/index.ts +4 -0
  133. package/src/indexes/auto-index.ts +8 -4
  134. package/src/local-storage.ts +11 -3
  135. package/src/query/builder/functions.ts +39 -0
  136. package/src/query/builder/index.ts +2 -2
  137. package/src/query/builder/types.ts +19 -27
  138. package/src/query/compiler/evaluators.ts +103 -5
  139. package/src/query/compiler/expressions.ts +3 -0
  140. package/src/query/compiler/group-by.ts +4 -4
  141. package/src/query/compiler/index.ts +3 -3
  142. package/src/query/compiler/order-by.ts +33 -7
  143. package/src/query/expression-helpers.ts +522 -0
  144. package/src/query/index.ts +12 -0
  145. package/src/query/live/collection-config-builder.ts +54 -2
  146. package/src/query/live/collection-registry.ts +3 -2
  147. package/src/query/live/internal.ts +15 -0
  148. package/src/query/live/types.ts +11 -1
  149. package/src/query/predicate-utils.ts +1415 -0
  150. package/src/query/subset-dedupe.ts +243 -0
  151. package/src/types.ts +41 -2
  152. package/src/utils/comparison.ts +70 -1
  153. package/src/utils/index-optimization.ts +77 -63
@@ -0,0 +1,816 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const ir = require("./ir.cjs");
4
+ function isWhereSubset(subset, superset) {
5
+ if (subset === void 0 && superset === void 0) {
6
+ return true;
7
+ }
8
+ if (subset === void 0 && superset !== void 0) {
9
+ return false;
10
+ }
11
+ if (superset === void 0 && subset !== void 0) {
12
+ return true;
13
+ }
14
+ return isWhereSubsetInternal(subset, superset);
15
+ }
16
+ function makeDisjunction(preds) {
17
+ if (preds.length === 0) {
18
+ return new ir.Value(false);
19
+ }
20
+ if (preds.length === 1) {
21
+ return preds[0];
22
+ }
23
+ return new ir.Func(`or`, preds);
24
+ }
25
+ function convertInToOr(inField) {
26
+ const equalities = inField.values.map(
27
+ (value) => new ir.Func(`eq`, [inField.ref, new ir.Value(value)])
28
+ );
29
+ return makeDisjunction(equalities);
30
+ }
31
+ function isWhereSubsetInternal(subset, superset) {
32
+ if (subset.type === `val` && subset.value === false) {
33
+ return true;
34
+ }
35
+ if (areExpressionsEqual(subset, superset)) {
36
+ return true;
37
+ }
38
+ if (superset.type === `func` && superset.name === `and`) {
39
+ return superset.args.every(
40
+ (arg) => isWhereSubsetInternal(subset, arg)
41
+ );
42
+ }
43
+ if (subset.type === `func` && subset.name === `and`) {
44
+ return subset.args.some(
45
+ (arg) => isWhereSubsetInternal(arg, superset)
46
+ );
47
+ }
48
+ if (subset.type === `func` && subset.name === `in`) {
49
+ const inField = extractInField(subset);
50
+ if (inField) {
51
+ return isWhereSubsetInternal(convertInToOr(inField), superset);
52
+ }
53
+ }
54
+ if (superset.type === `func` && superset.name === `in`) {
55
+ const inField = extractInField(superset);
56
+ if (inField) {
57
+ return isWhereSubsetInternal(subset, convertInToOr(inField));
58
+ }
59
+ }
60
+ if (subset.type === `func` && subset.name === `or`) {
61
+ return subset.args.every(
62
+ (arg) => isWhereSubsetInternal(arg, superset)
63
+ );
64
+ }
65
+ if (superset.type === `func` && superset.name === `or`) {
66
+ return superset.args.some(
67
+ (arg) => isWhereSubsetInternal(subset, arg)
68
+ );
69
+ }
70
+ if (subset.type === `func` && superset.type === `func`) {
71
+ const subsetFunc = subset;
72
+ const supersetFunc = superset;
73
+ const subsetField = extractComparisonField(subsetFunc);
74
+ const supersetField = extractComparisonField(supersetFunc);
75
+ if (subsetField && supersetField && areRefsEqual(subsetField.ref, supersetField.ref)) {
76
+ return isComparisonSubset(
77
+ subsetFunc,
78
+ subsetField.value,
79
+ supersetFunc,
80
+ supersetField.value
81
+ );
82
+ }
83
+ }
84
+ return false;
85
+ }
86
+ function combineWherePredicates(predicates, operation, simplifyFn) {
87
+ const emptyValue = operation === `and` ? true : false;
88
+ const identityValue = operation === `and` ? true : false;
89
+ if (predicates.length === 0) {
90
+ return { type: `val`, value: emptyValue };
91
+ }
92
+ if (predicates.length === 1) {
93
+ return predicates[0];
94
+ }
95
+ const flatPredicates = [];
96
+ for (const pred of predicates) {
97
+ if (pred.type === `func` && pred.name === operation) {
98
+ flatPredicates.push(...pred.args);
99
+ } else {
100
+ flatPredicates.push(pred);
101
+ }
102
+ }
103
+ const grouped = groupPredicatesByField(flatPredicates);
104
+ const simplified = [];
105
+ for (const [field, preds] of grouped.entries()) {
106
+ if (field === null) {
107
+ simplified.push(...preds);
108
+ } else {
109
+ const result = simplifyFn(preds);
110
+ if (result) {
111
+ simplified.push(result);
112
+ }
113
+ }
114
+ }
115
+ if (simplified.length === 0) {
116
+ return { type: `val`, value: identityValue };
117
+ }
118
+ if (simplified.length === 1) {
119
+ return simplified[0];
120
+ }
121
+ return {
122
+ type: `func`,
123
+ name: operation,
124
+ args: simplified
125
+ };
126
+ }
127
+ function unionWherePredicates(predicates) {
128
+ return combineWherePredicates(predicates, `or`, unionSameFieldPredicates);
129
+ }
130
+ function minusWherePredicates(fromPredicate, subtractPredicate) {
131
+ if (subtractPredicate === void 0) {
132
+ return fromPredicate ?? { type: `val`, value: true };
133
+ }
134
+ if (fromPredicate === void 0) {
135
+ return {
136
+ type: `func`,
137
+ name: `not`,
138
+ args: [subtractPredicate]
139
+ };
140
+ }
141
+ if (isWhereSubset(fromPredicate, subtractPredicate)) {
142
+ return { type: `val`, value: false };
143
+ }
144
+ const commonConditions = findCommonConditions(
145
+ fromPredicate,
146
+ subtractPredicate
147
+ );
148
+ if (commonConditions.length > 0) {
149
+ const fromWithoutCommon = removeConditions(fromPredicate, commonConditions);
150
+ const subtractWithoutCommon = removeConditions(
151
+ subtractPredicate,
152
+ commonConditions
153
+ );
154
+ const simplifiedDifference = minusWherePredicates(
155
+ fromWithoutCommon,
156
+ subtractWithoutCommon
157
+ );
158
+ if (simplifiedDifference !== null) {
159
+ return combineConditions([...commonConditions, simplifiedDifference]);
160
+ }
161
+ }
162
+ if (fromPredicate.type === `func` && subtractPredicate.type === `func`) {
163
+ const result = minusSameFieldPredicates(fromPredicate, subtractPredicate);
164
+ if (result !== null) {
165
+ return result;
166
+ }
167
+ }
168
+ return null;
169
+ }
170
+ function minusSameFieldPredicates(fromPred, subtractPred) {
171
+ const fromField = extractComparisonField(fromPred) || extractEqualityField(fromPred) || extractInField(fromPred);
172
+ const subtractField = extractComparisonField(subtractPred) || extractEqualityField(subtractPred) || extractInField(subtractPred);
173
+ if (!fromField || !subtractField || !areRefsEqual(fromField.ref, subtractField.ref)) {
174
+ return null;
175
+ }
176
+ if (fromPred.name === `in` && subtractPred.name === `in`) {
177
+ const fromInField = fromField;
178
+ const subtractInField = subtractField;
179
+ const remainingValues = fromInField.values.filter(
180
+ (v) => !arrayIncludesWithSet(
181
+ subtractInField.values,
182
+ v,
183
+ subtractInField.primitiveSet ?? null,
184
+ subtractInField.areAllPrimitives
185
+ )
186
+ );
187
+ if (remainingValues.length === 0) {
188
+ return { type: `val`, value: false };
189
+ }
190
+ if (remainingValues.length === 1) {
191
+ return {
192
+ type: `func`,
193
+ name: `eq`,
194
+ args: [fromField.ref, { type: `val`, value: remainingValues[0] }]
195
+ };
196
+ }
197
+ return {
198
+ type: `func`,
199
+ name: `in`,
200
+ args: [fromField.ref, { type: `val`, value: remainingValues }]
201
+ };
202
+ }
203
+ if (fromPred.name === `in` && subtractPred.name === `eq`) {
204
+ const fromInField = fromField;
205
+ const subtractValue = subtractField.value;
206
+ const remainingValues = fromInField.values.filter(
207
+ (v) => !areValuesEqual(v, subtractValue)
208
+ );
209
+ if (remainingValues.length === 0) {
210
+ return { type: `val`, value: false };
211
+ }
212
+ if (remainingValues.length === 1) {
213
+ return {
214
+ type: `func`,
215
+ name: `eq`,
216
+ args: [fromField.ref, { type: `val`, value: remainingValues[0] }]
217
+ };
218
+ }
219
+ return {
220
+ type: `func`,
221
+ name: `in`,
222
+ args: [fromField.ref, { type: `val`, value: remainingValues }]
223
+ };
224
+ }
225
+ if (fromPred.name === `eq` && subtractPred.name === `eq`) {
226
+ const fromValue = fromField.value;
227
+ const subtractValue = subtractField.value;
228
+ if (areValuesEqual(fromValue, subtractValue)) {
229
+ return { type: `val`, value: false };
230
+ }
231
+ return fromPred;
232
+ }
233
+ const fromComp = extractComparisonField(fromPred);
234
+ const subtractComp = extractComparisonField(subtractPred);
235
+ if (fromComp && subtractComp && areRefsEqual(fromComp.ref, subtractComp.ref)) {
236
+ const result = minusRangePredicates(
237
+ fromPred,
238
+ fromComp.value,
239
+ subtractPred,
240
+ subtractComp.value
241
+ );
242
+ return result;
243
+ }
244
+ return null;
245
+ }
246
+ function minusRangePredicates(fromFunc, fromValue, subtractFunc, subtractValue) {
247
+ const fromOp = fromFunc.name;
248
+ const subtractOp = subtractFunc.name;
249
+ const ref = (extractComparisonField(fromFunc) || extractEqualityField(fromFunc)).ref;
250
+ if (fromOp === `gt` && subtractOp === `gt`) {
251
+ if (fromValue < subtractValue) {
252
+ return {
253
+ type: `func`,
254
+ name: `and`,
255
+ args: [
256
+ fromFunc,
257
+ {
258
+ type: `func`,
259
+ name: `lte`,
260
+ args: [ref, { type: `val`, value: subtractValue }]
261
+ }
262
+ ]
263
+ };
264
+ }
265
+ return fromFunc;
266
+ }
267
+ if (fromOp === `gte` && subtractOp === `gte`) {
268
+ if (fromValue < subtractValue) {
269
+ return {
270
+ type: `func`,
271
+ name: `and`,
272
+ args: [
273
+ fromFunc,
274
+ {
275
+ type: `func`,
276
+ name: `lt`,
277
+ args: [ref, { type: `val`, value: subtractValue }]
278
+ }
279
+ ]
280
+ };
281
+ }
282
+ return fromFunc;
283
+ }
284
+ if (fromOp === `gt` && subtractOp === `gte`) {
285
+ if (fromValue < subtractValue) {
286
+ return {
287
+ type: `func`,
288
+ name: `and`,
289
+ args: [
290
+ fromFunc,
291
+ {
292
+ type: `func`,
293
+ name: `lt`,
294
+ args: [ref, { type: `val`, value: subtractValue }]
295
+ }
296
+ ]
297
+ };
298
+ }
299
+ return fromFunc;
300
+ }
301
+ if (fromOp === `gte` && subtractOp === `gt`) {
302
+ if (fromValue <= subtractValue) {
303
+ return {
304
+ type: `func`,
305
+ name: `and`,
306
+ args: [
307
+ fromFunc,
308
+ {
309
+ type: `func`,
310
+ name: `lte`,
311
+ args: [ref, { type: `val`, value: subtractValue }]
312
+ }
313
+ ]
314
+ };
315
+ }
316
+ return fromFunc;
317
+ }
318
+ if (fromOp === `lt` && subtractOp === `lt`) {
319
+ if (fromValue > subtractValue) {
320
+ return {
321
+ type: `func`,
322
+ name: `and`,
323
+ args: [
324
+ {
325
+ type: `func`,
326
+ name: `gte`,
327
+ args: [ref, { type: `val`, value: subtractValue }]
328
+ },
329
+ fromFunc
330
+ ]
331
+ };
332
+ }
333
+ return fromFunc;
334
+ }
335
+ if (fromOp === `lte` && subtractOp === `lte`) {
336
+ if (fromValue > subtractValue) {
337
+ return {
338
+ type: `func`,
339
+ name: `and`,
340
+ args: [
341
+ {
342
+ type: `func`,
343
+ name: `gt`,
344
+ args: [ref, { type: `val`, value: subtractValue }]
345
+ },
346
+ fromFunc
347
+ ]
348
+ };
349
+ }
350
+ return fromFunc;
351
+ }
352
+ if (fromOp === `lt` && subtractOp === `lte`) {
353
+ if (fromValue > subtractValue) {
354
+ return {
355
+ type: `func`,
356
+ name: `and`,
357
+ args: [
358
+ {
359
+ type: `func`,
360
+ name: `gt`,
361
+ args: [ref, { type: `val`, value: subtractValue }]
362
+ },
363
+ fromFunc
364
+ ]
365
+ };
366
+ }
367
+ return fromFunc;
368
+ }
369
+ if (fromOp === `lte` && subtractOp === `lt`) {
370
+ if (fromValue >= subtractValue) {
371
+ return {
372
+ type: `func`,
373
+ name: `and`,
374
+ args: [
375
+ {
376
+ type: `func`,
377
+ name: `gte`,
378
+ args: [ref, { type: `val`, value: subtractValue }]
379
+ },
380
+ fromFunc
381
+ ]
382
+ };
383
+ }
384
+ return fromFunc;
385
+ }
386
+ return null;
387
+ }
388
+ function isOrderBySubset(subset, superset) {
389
+ if (!subset || subset.length === 0) {
390
+ return true;
391
+ }
392
+ if (!superset || superset.length === 0) {
393
+ return false;
394
+ }
395
+ if (subset.length > superset.length) {
396
+ return false;
397
+ }
398
+ for (let i = 0; i < subset.length; i++) {
399
+ const subClause = subset[i];
400
+ const superClause = superset[i];
401
+ if (!areExpressionsEqual(subClause.expression, superClause.expression)) {
402
+ return false;
403
+ }
404
+ if (!areCompareOptionsEqual(
405
+ subClause.compareOptions,
406
+ superClause.compareOptions
407
+ )) {
408
+ return false;
409
+ }
410
+ }
411
+ return true;
412
+ }
413
+ function isLimitSubset(subset, superset) {
414
+ if (superset === void 0) {
415
+ return true;
416
+ }
417
+ if (subset === void 0) {
418
+ return false;
419
+ }
420
+ return subset <= superset;
421
+ }
422
+ function isPredicateSubset(subset, superset) {
423
+ return isWhereSubset(subset.where, superset.where) && isOrderBySubset(subset.orderBy, superset.orderBy) && isLimitSubset(subset.limit, superset.limit);
424
+ }
425
+ function findCommonConditions(predicate1, predicate2) {
426
+ const conditions1 = extractAllConditions(predicate1);
427
+ const conditions2 = extractAllConditions(predicate2);
428
+ const common = [];
429
+ for (const cond1 of conditions1) {
430
+ for (const cond2 of conditions2) {
431
+ if (areExpressionsEqual(cond1, cond2)) {
432
+ if (!common.some((c) => areExpressionsEqual(c, cond1))) {
433
+ common.push(cond1);
434
+ }
435
+ break;
436
+ }
437
+ }
438
+ }
439
+ return common;
440
+ }
441
+ function extractAllConditions(predicate) {
442
+ if (predicate.type === `func` && predicate.name === `and`) {
443
+ const conditions = [];
444
+ for (const arg of predicate.args) {
445
+ conditions.push(...extractAllConditions(arg));
446
+ }
447
+ return conditions;
448
+ }
449
+ return [predicate];
450
+ }
451
+ function removeConditions(predicate, conditionsToRemove) {
452
+ if (predicate.type === `func` && predicate.name === `and`) {
453
+ const remainingArgs = predicate.args.filter(
454
+ (arg) => !conditionsToRemove.some(
455
+ (cond) => areExpressionsEqual(arg, cond)
456
+ )
457
+ );
458
+ if (remainingArgs.length === 0) {
459
+ return void 0;
460
+ } else if (remainingArgs.length === 1) {
461
+ return remainingArgs[0];
462
+ } else {
463
+ return {
464
+ type: `func`,
465
+ name: `and`,
466
+ args: remainingArgs
467
+ };
468
+ }
469
+ }
470
+ return predicate;
471
+ }
472
+ function combineConditions(conditions) {
473
+ if (conditions.length === 0) {
474
+ return { type: `val`, value: true };
475
+ } else if (conditions.length === 1) {
476
+ return conditions[0];
477
+ } else {
478
+ const flattenedConditions = [];
479
+ for (const condition of conditions) {
480
+ if (condition.type === `func` && condition.name === `and`) {
481
+ flattenedConditions.push(...condition.args);
482
+ } else {
483
+ flattenedConditions.push(condition);
484
+ }
485
+ }
486
+ if (flattenedConditions.length === 1) {
487
+ return flattenedConditions[0];
488
+ } else {
489
+ return {
490
+ type: `func`,
491
+ name: `and`,
492
+ args: flattenedConditions
493
+ };
494
+ }
495
+ }
496
+ }
497
+ function findPredicateWithOperator(predicates, operator, value) {
498
+ return predicates.find((p) => {
499
+ if (p.type === `func`) {
500
+ const f = p;
501
+ const field = extractComparisonField(f);
502
+ return f.name === operator && field && areValuesEqual(field.value, value);
503
+ }
504
+ return false;
505
+ });
506
+ }
507
+ function areExpressionsEqual(a, b) {
508
+ if (a.type !== b.type) {
509
+ return false;
510
+ }
511
+ if (a.type === `val` && b.type === `val`) {
512
+ return areValuesEqual(a.value, b.value);
513
+ }
514
+ if (a.type === `ref` && b.type === `ref`) {
515
+ return areRefsEqual(a, b);
516
+ }
517
+ if (a.type === `func` && b.type === `func`) {
518
+ const aFunc = a;
519
+ const bFunc = b;
520
+ if (aFunc.name !== bFunc.name) {
521
+ return false;
522
+ }
523
+ if (aFunc.args.length !== bFunc.args.length) {
524
+ return false;
525
+ }
526
+ return aFunc.args.every(
527
+ (arg, i) => areExpressionsEqual(arg, bFunc.args[i])
528
+ );
529
+ }
530
+ return false;
531
+ }
532
+ function areValuesEqual(a, b) {
533
+ if (a === b) {
534
+ return true;
535
+ }
536
+ if (typeof a === `number` && typeof b === `number` && isNaN(a) && isNaN(b)) {
537
+ return true;
538
+ }
539
+ if (a instanceof Date && b instanceof Date) {
540
+ return a.getTime() === b.getTime();
541
+ }
542
+ if (typeof a === `object` && typeof b === `object` && a !== null && b !== null) {
543
+ return a === b;
544
+ }
545
+ return false;
546
+ }
547
+ function areRefsEqual(a, b) {
548
+ if (a.path.length !== b.path.length) {
549
+ return false;
550
+ }
551
+ return a.path.every((segment, i) => segment === b.path[i]);
552
+ }
553
+ function isPrimitive(value) {
554
+ return value === null || value === void 0 || typeof value === `string` || typeof value === `number` || typeof value === `boolean`;
555
+ }
556
+ function areAllPrimitives(values) {
557
+ return values.every(isPrimitive);
558
+ }
559
+ function arrayIncludesWithSet(array, value, primitiveSet, arrayIsAllPrimitives) {
560
+ if (primitiveSet) {
561
+ if (arrayIsAllPrimitives || isPrimitive(value)) {
562
+ return primitiveSet.has(value);
563
+ }
564
+ return false;
565
+ }
566
+ return array.some((v) => areValuesEqual(v, value));
567
+ }
568
+ function maxValue(a, b) {
569
+ if (a instanceof Date && b instanceof Date) {
570
+ return a.getTime() > b.getTime() ? a : b;
571
+ }
572
+ return Math.max(a, b);
573
+ }
574
+ function minValue(a, b) {
575
+ if (a instanceof Date && b instanceof Date) {
576
+ return a.getTime() < b.getTime() ? a : b;
577
+ }
578
+ return Math.min(a, b);
579
+ }
580
+ function areCompareOptionsEqual(a, b) {
581
+ return a.direction === b.direction;
582
+ }
583
+ function extractComparisonField(func) {
584
+ if ([`eq`, `gt`, `gte`, `lt`, `lte`].includes(func.name)) {
585
+ const firstArg = func.args[0];
586
+ const secondArg = func.args[1];
587
+ if (firstArg?.type === `ref` && secondArg?.type === `val`) {
588
+ return {
589
+ ref: firstArg,
590
+ value: secondArg.value
591
+ };
592
+ }
593
+ }
594
+ return null;
595
+ }
596
+ function extractEqualityField(func) {
597
+ if (func.name === `eq`) {
598
+ const firstArg = func.args[0];
599
+ const secondArg = func.args[1];
600
+ if (firstArg?.type === `ref` && secondArg?.type === `val`) {
601
+ return {
602
+ ref: firstArg,
603
+ value: secondArg.value
604
+ };
605
+ }
606
+ }
607
+ return null;
608
+ }
609
+ function extractInField(func) {
610
+ if (func.name === `in`) {
611
+ const firstArg = func.args[0];
612
+ const secondArg = func.args[1];
613
+ if (firstArg?.type === `ref` && secondArg?.type === `val` && Array.isArray(secondArg.value)) {
614
+ let values = secondArg.value;
615
+ const allPrimitives = areAllPrimitives(values);
616
+ let primitiveSet = null;
617
+ if (allPrimitives && values.length > 10) {
618
+ primitiveSet = new Set(values);
619
+ if (primitiveSet.size < values.length) {
620
+ values = Array.from(primitiveSet);
621
+ }
622
+ }
623
+ return {
624
+ ref: firstArg,
625
+ values,
626
+ areAllPrimitives: allPrimitives,
627
+ primitiveSet
628
+ };
629
+ }
630
+ }
631
+ return null;
632
+ }
633
+ function isComparisonSubset(subsetFunc, subsetValue, supersetFunc, supersetValue) {
634
+ const subOp = subsetFunc.name;
635
+ const superOp = supersetFunc.name;
636
+ if (subOp === superOp) {
637
+ if (subOp === `eq`) {
638
+ if (isPrimitive(subsetValue) && isPrimitive(supersetValue)) {
639
+ return subsetValue === supersetValue;
640
+ }
641
+ return areValuesEqual(subsetValue, supersetValue);
642
+ } else if (subOp === `gt`) {
643
+ return subsetValue >= supersetValue;
644
+ } else if (subOp === `gte`) {
645
+ return subsetValue >= supersetValue;
646
+ } else if (subOp === `lt`) {
647
+ return subsetValue <= supersetValue;
648
+ } else if (subOp === `lte`) {
649
+ return subsetValue <= supersetValue;
650
+ }
651
+ }
652
+ if (subOp === `eq` && superOp === `gt`) {
653
+ return subsetValue > supersetValue;
654
+ }
655
+ if (subOp === `eq` && superOp === `gte`) {
656
+ return subsetValue >= supersetValue;
657
+ }
658
+ if (subOp === `eq` && superOp === `lt`) {
659
+ return subsetValue < supersetValue;
660
+ }
661
+ if (subOp === `eq` && superOp === `lte`) {
662
+ return subsetValue <= supersetValue;
663
+ }
664
+ if (subOp === `gt` && superOp === `gte`) {
665
+ return subsetValue >= supersetValue;
666
+ }
667
+ if (subOp === `gte` && superOp === `gt`) {
668
+ return subsetValue > supersetValue;
669
+ }
670
+ if (subOp === `lt` && superOp === `lte`) {
671
+ return subsetValue <= supersetValue;
672
+ }
673
+ if (subOp === `lte` && superOp === `lt`) {
674
+ return subsetValue < supersetValue;
675
+ }
676
+ return false;
677
+ }
678
+ function groupPredicatesByField(predicates) {
679
+ const groups = /* @__PURE__ */ new Map();
680
+ for (const pred of predicates) {
681
+ let fieldKey = null;
682
+ if (pred.type === `func`) {
683
+ const func = pred;
684
+ const field = extractComparisonField(func) || extractEqualityField(func) || extractInField(func);
685
+ if (field) {
686
+ fieldKey = field.ref.path.join(`.`);
687
+ }
688
+ }
689
+ const group = groups.get(fieldKey) || [];
690
+ group.push(pred);
691
+ groups.set(fieldKey, group);
692
+ }
693
+ return groups;
694
+ }
695
+ function unionSameFieldPredicates(predicates) {
696
+ if (predicates.length === 1) {
697
+ return predicates[0];
698
+ }
699
+ let maxGt = null;
700
+ let maxGte = null;
701
+ let minLt = null;
702
+ let minLte = null;
703
+ const eqValues = /* @__PURE__ */ new Set();
704
+ const inValues = /* @__PURE__ */ new Set();
705
+ const otherPredicates = [];
706
+ for (const pred of predicates) {
707
+ if (pred.type === `func`) {
708
+ const func = pred;
709
+ const field = extractComparisonField(func);
710
+ if (field) {
711
+ const value = field.value;
712
+ if (func.name === `gt`) {
713
+ maxGt = maxGt === null ? value : minValue(maxGt, value);
714
+ } else if (func.name === `gte`) {
715
+ maxGte = maxGte === null ? value : minValue(maxGte, value);
716
+ } else if (func.name === `lt`) {
717
+ minLt = minLt === null ? value : maxValue(minLt, value);
718
+ } else if (func.name === `lte`) {
719
+ minLte = minLte === null ? value : maxValue(minLte, value);
720
+ } else if (func.name === `eq`) {
721
+ eqValues.add(value);
722
+ } else {
723
+ otherPredicates.push(pred);
724
+ }
725
+ } else {
726
+ const inField = extractInField(func);
727
+ if (inField) {
728
+ for (const val of inField.values) {
729
+ inValues.add(val);
730
+ }
731
+ } else {
732
+ otherPredicates.push(pred);
733
+ }
734
+ }
735
+ } else {
736
+ otherPredicates.push(pred);
737
+ }
738
+ }
739
+ if (eqValues.size > 1 || eqValues.size > 0 && inValues.size > 0) {
740
+ const allValues = [...eqValues, ...inValues];
741
+ const ref = predicates.find((p) => {
742
+ if (p.type === `func`) {
743
+ const field = extractComparisonField(p) || extractInField(p);
744
+ return field !== null;
745
+ }
746
+ return false;
747
+ });
748
+ if (ref && ref.type === `func`) {
749
+ const field = extractComparisonField(ref) || extractInField(ref);
750
+ if (field) {
751
+ return {
752
+ type: `func`,
753
+ name: `in`,
754
+ args: [
755
+ field.ref,
756
+ { type: `val`, value: allValues }
757
+ ]
758
+ };
759
+ }
760
+ }
761
+ }
762
+ const result = [];
763
+ if (maxGt !== null && maxGte !== null) {
764
+ const pred = maxGte <= maxGt ? findPredicateWithOperator(predicates, `gte`, maxGte) : findPredicateWithOperator(predicates, `gt`, maxGt);
765
+ if (pred) result.push(pred);
766
+ } else if (maxGt !== null) {
767
+ const pred = findPredicateWithOperator(predicates, `gt`, maxGt);
768
+ if (pred) result.push(pred);
769
+ } else if (maxGte !== null) {
770
+ const pred = findPredicateWithOperator(predicates, `gte`, maxGte);
771
+ if (pred) result.push(pred);
772
+ }
773
+ if (minLt !== null && minLte !== null) {
774
+ const pred = minLte >= minLt ? findPredicateWithOperator(predicates, `lte`, minLte) : findPredicateWithOperator(predicates, `lt`, minLt);
775
+ if (pred) result.push(pred);
776
+ } else if (minLt !== null) {
777
+ const pred = findPredicateWithOperator(predicates, `lt`, minLt);
778
+ if (pred) result.push(pred);
779
+ } else if (minLte !== null) {
780
+ const pred = findPredicateWithOperator(predicates, `lte`, minLte);
781
+ if (pred) result.push(pred);
782
+ }
783
+ if (eqValues.size === 1 && inValues.size === 0) {
784
+ const pred = findPredicateWithOperator(predicates, `eq`, [...eqValues][0]);
785
+ if (pred) result.push(pred);
786
+ }
787
+ if (eqValues.size === 0 && inValues.size > 0) {
788
+ result.push(
789
+ predicates.find((p) => {
790
+ if (p.type === `func`) {
791
+ return p.name === `in`;
792
+ }
793
+ return false;
794
+ })
795
+ );
796
+ }
797
+ result.push(...otherPredicates);
798
+ if (result.length === 0) {
799
+ return { type: `val`, value: true };
800
+ }
801
+ if (result.length === 1) {
802
+ return result[0];
803
+ }
804
+ return {
805
+ type: `func`,
806
+ name: `or`,
807
+ args: result
808
+ };
809
+ }
810
+ exports.isLimitSubset = isLimitSubset;
811
+ exports.isOrderBySubset = isOrderBySubset;
812
+ exports.isPredicateSubset = isPredicateSubset;
813
+ exports.isWhereSubset = isWhereSubset;
814
+ exports.minusWherePredicates = minusWherePredicates;
815
+ exports.unionWherePredicates = unionWherePredicates;
816
+ //# sourceMappingURL=predicate-utils.cjs.map