@milaboratories/pl-model-common 1.46.4 → 1.47.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 (178) hide show
  1. package/dist/columns/accessor_traversal.cjs +119 -0
  2. package/dist/columns/accessor_traversal.cjs.map +1 -0
  3. package/dist/columns/accessor_traversal.d.ts +52 -0
  4. package/dist/columns/accessor_traversal.d.ts.map +1 -0
  5. package/dist/columns/accessor_traversal.js +114 -0
  6. package/dist/columns/accessor_traversal.js.map +1 -0
  7. package/dist/columns/column_registry.cjs +40 -0
  8. package/dist/columns/column_registry.cjs.map +1 -0
  9. package/dist/columns/column_registry.d.ts +31 -0
  10. package/dist/columns/column_registry.d.ts.map +1 -0
  11. package/dist/columns/column_registry.js +40 -0
  12. package/dist/columns/column_registry.js.map +1 -0
  13. package/dist/columns/column_selector.cjs +49 -0
  14. package/dist/columns/column_selector.cjs.map +1 -0
  15. package/dist/columns/column_selector.d.ts +33 -0
  16. package/dist/columns/column_selector.d.ts.map +1 -0
  17. package/dist/columns/column_selector.js +47 -0
  18. package/dist/columns/column_selector.js.map +1 -0
  19. package/dist/columns/dedup.cjs +47 -0
  20. package/dist/columns/dedup.cjs.map +1 -0
  21. package/dist/columns/dedup.d.ts +27 -0
  22. package/dist/columns/dedup.d.ts.map +1 -0
  23. package/dist/columns/dedup.js +47 -0
  24. package/dist/columns/dedup.js.map +1 -0
  25. package/dist/columns/index.cjs +18 -0
  26. package/dist/columns/index.d.ts +8 -0
  27. package/dist/columns/index.js +6 -0
  28. package/dist/columns/providers.cjs +62 -0
  29. package/dist/columns/providers.cjs.map +1 -0
  30. package/dist/columns/providers.d.ts +39 -0
  31. package/dist/columns/providers.d.ts.map +1 -0
  32. package/dist/columns/providers.js +61 -0
  33. package/dist/columns/providers.js.map +1 -0
  34. package/dist/columns/types.d.ts +108 -0
  35. package/dist/columns/types.d.ts.map +1 -0
  36. package/dist/driver_kit.d.ts +1 -2
  37. package/dist/driver_kit.d.ts.map +1 -1
  38. package/dist/drivers/columns/columns_collection_driver.d.ts +124 -0
  39. package/dist/drivers/columns/columns_collection_driver.d.ts.map +1 -0
  40. package/dist/drivers/columns/discover_columns_options.cjs +28 -0
  41. package/dist/drivers/columns/discover_columns_options.cjs.map +1 -0
  42. package/dist/drivers/columns/discover_columns_options.d.ts +64 -0
  43. package/dist/drivers/columns/discover_columns_options.d.ts.map +1 -0
  44. package/dist/drivers/columns/discover_columns_options.js +28 -0
  45. package/dist/drivers/columns/discover_columns_options.js.map +1 -0
  46. package/dist/drivers/columns/index.d.ts +3 -0
  47. package/dist/drivers/index.cjs +32 -7
  48. package/dist/drivers/index.d.ts +12 -9
  49. package/dist/drivers/index.js +6 -4
  50. package/dist/drivers/pframe/driver.d.ts +1 -2
  51. package/dist/drivers/pframe/driver.d.ts.map +1 -1
  52. package/dist/drivers/pframe/index.cjs +30 -7
  53. package/dist/drivers/pframe/index.d.ts +9 -8
  54. package/dist/drivers/pframe/index.js +5 -4
  55. package/dist/drivers/pframe/query/index.d.ts +2 -2
  56. package/dist/drivers/pframe/query/query_common.d.ts +24 -1
  57. package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
  58. package/dist/drivers/pframe/query/query_spec.d.ts +25 -24
  59. package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
  60. package/dist/drivers/pframe/query/utils.cjs +18 -8
  61. package/dist/drivers/pframe/query/utils.cjs.map +1 -1
  62. package/dist/drivers/pframe/query/utils.d.ts +5 -1
  63. package/dist/drivers/pframe/query/utils.d.ts.map +1 -1
  64. package/dist/drivers/pframe/query/utils.js +18 -8
  65. package/dist/drivers/pframe/query/utils.js.map +1 -1
  66. package/dist/drivers/pframe/spec/anchored.d.ts +2 -2
  67. package/dist/drivers/pframe/spec/discovered_column.cjs +31 -15
  68. package/dist/drivers/pframe/spec/discovered_column.cjs.map +1 -1
  69. package/dist/drivers/pframe/spec/discovered_column.d.ts +23 -13
  70. package/dist/drivers/pframe/spec/discovered_column.d.ts.map +1 -1
  71. package/dist/drivers/pframe/spec/discovered_column.js +26 -12
  72. package/dist/drivers/pframe/spec/discovered_column.js.map +1 -1
  73. package/dist/drivers/pframe/spec/filtered_column.cjs +46 -0
  74. package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
  75. package/dist/drivers/pframe/spec/filtered_column.d.ts +39 -1
  76. package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -1
  77. package/dist/drivers/pframe/spec/filtered_column.js +41 -1
  78. package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
  79. package/dist/drivers/pframe/spec/ids.cjs +62 -10
  80. package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
  81. package/dist/drivers/pframe/spec/ids.d.ts +48 -15
  82. package/dist/drivers/pframe/spec/ids.d.ts.map +1 -1
  83. package/dist/drivers/pframe/spec/ids.js +60 -9
  84. package/dist/drivers/pframe/spec/ids.js.map +1 -1
  85. package/dist/drivers/pframe/spec/index.cjs +30 -7
  86. package/dist/drivers/pframe/spec/index.d.ts +6 -5
  87. package/dist/drivers/pframe/spec/index.js +5 -4
  88. package/dist/drivers/pframe/spec/native_id.cjs +1 -0
  89. package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
  90. package/dist/drivers/pframe/spec/native_id.js +1 -0
  91. package/dist/drivers/pframe/spec/native_id.js.map +1 -1
  92. package/dist/drivers/pframe/spec/overridden.cjs +212 -0
  93. package/dist/drivers/pframe/spec/overridden.cjs.map +1 -0
  94. package/dist/drivers/pframe/spec/overridden.d.ts +67 -0
  95. package/dist/drivers/pframe/spec/overridden.d.ts.map +1 -0
  96. package/dist/drivers/pframe/spec/overridden.js +202 -0
  97. package/dist/drivers/pframe/spec/overridden.js.map +1 -0
  98. package/dist/drivers/pframe/spec/selectors.cjs +1 -0
  99. package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
  100. package/dist/drivers/pframe/spec/selectors.d.ts +3 -0
  101. package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
  102. package/dist/drivers/pframe/spec/selectors.js +1 -0
  103. package/dist/drivers/pframe/spec/selectors.js.map +1 -1
  104. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  105. package/dist/drivers/pframe/spec/spec.d.ts +2 -3
  106. package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
  107. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  108. package/dist/drivers/pframe/spec_driver.d.ts +2 -2
  109. package/dist/drivers/pframe/spec_driver.d.ts.map +1 -1
  110. package/dist/drivers/pframe/table_calculate.cjs +2 -2
  111. package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
  112. package/dist/drivers/pframe/table_calculate.d.ts +6 -2
  113. package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
  114. package/dist/drivers/pframe/table_calculate.js +2 -2
  115. package/dist/drivers/pframe/table_calculate.js.map +1 -1
  116. package/dist/drivers/pframe/table_common.cjs.map +1 -1
  117. package/dist/drivers/pframe/table_common.d.ts +11 -4
  118. package/dist/drivers/pframe/table_common.d.ts.map +1 -1
  119. package/dist/drivers/pframe/table_common.js.map +1 -1
  120. package/dist/index.cjs +63 -10
  121. package/dist/index.d.ts +20 -11
  122. package/dist/index.js +15 -6
  123. package/dist/pool/index.cjs +18 -0
  124. package/dist/pool/index.d.ts +2 -2
  125. package/dist/pool/index.js +3 -0
  126. package/dist/pool/spec.cjs +59 -11
  127. package/dist/pool/spec.cjs.map +1 -1
  128. package/dist/pool/spec.d.ts +24 -9
  129. package/dist/pool/spec.d.ts.map +1 -1
  130. package/dist/pool/spec.js +50 -10
  131. package/dist/pool/spec.js.map +1 -1
  132. package/dist/services/index.d.ts +2 -2
  133. package/dist/services/service_declarations.cjs +22 -0
  134. package/dist/services/service_declarations.cjs.map +1 -1
  135. package/dist/services/service_declarations.d.ts +5 -3
  136. package/dist/services/service_declarations.d.ts.map +1 -1
  137. package/dist/services/service_declarations.js +22 -0
  138. package/dist/services/service_declarations.js.map +1 -1
  139. package/dist/services/service_registry.cjs.map +1 -1
  140. package/dist/services/service_registry.d.ts +3 -3
  141. package/dist/services/service_registry.d.ts.map +1 -1
  142. package/dist/services/service_registry.js.map +1 -1
  143. package/dist/services/service_types.cjs.map +1 -1
  144. package/dist/services/service_types.d.ts +25 -9
  145. package/dist/services/service_types.d.ts.map +1 -1
  146. package/dist/services/service_types.js.map +1 -1
  147. package/package.json +2 -1
  148. package/src/columns/accessor_traversal.ts +139 -0
  149. package/src/columns/column_registry.ts +41 -0
  150. package/src/columns/column_selector.ts +100 -0
  151. package/src/columns/dedup.ts +49 -0
  152. package/src/columns/index.ts +6 -0
  153. package/src/columns/providers.ts +74 -0
  154. package/src/columns/types.ts +116 -0
  155. package/src/drivers/columns/columns_collection_driver.ts +146 -0
  156. package/src/drivers/columns/discover_columns_options.ts +91 -0
  157. package/src/drivers/columns/index.ts +2 -0
  158. package/src/drivers/index.ts +1 -0
  159. package/src/drivers/pframe/index.ts +0 -1
  160. package/src/drivers/pframe/query/query_common.ts +24 -0
  161. package/src/drivers/pframe/query/query_spec.ts +38 -25
  162. package/src/drivers/pframe/query/utils.test.ts +6 -6
  163. package/src/drivers/pframe/query/utils.ts +27 -7
  164. package/src/drivers/pframe/spec/discovered_column.ts +43 -28
  165. package/src/drivers/pframe/spec/filtered_column.ts +66 -0
  166. package/src/drivers/pframe/spec/ids.ts +142 -17
  167. package/src/drivers/pframe/spec/index.ts +1 -0
  168. package/src/drivers/pframe/spec/overridden.ts +285 -0
  169. package/src/drivers/pframe/spec/selectors.ts +3 -0
  170. package/src/drivers/pframe/spec/spec.ts +7 -3
  171. package/src/drivers/pframe/spec_driver.ts +3 -3
  172. package/src/drivers/pframe/table_calculate.ts +13 -3
  173. package/src/drivers/pframe/table_common.ts +10 -3
  174. package/src/index.ts +1 -0
  175. package/src/pool/spec.ts +69 -23
  176. package/src/services/service_declarations.ts +31 -0
  177. package/src/services/service_registry.ts +8 -4
  178. package/src/services/service_types.ts +35 -9
@@ -1023,6 +1023,29 @@ interface QueryTransformColumns<Q, E, SO> {
1023
1023
  /** Derived columns to compute (at least one). */
1024
1024
  columns: [TransformColumnEntry<E, SO>, ...TransformColumnEntry<E, SO>[]];
1025
1025
  }
1026
+ /**
1027
+ * Spec-override query operation — client-side-only structural node.
1028
+ *
1029
+ * Overlays a {@link SpecOverrides} patch on top of the inner query's spec.
1030
+ * Carries no topological change — it is collapsed at the host boundary
1031
+ * (`resolvePColumn`) before the query reaches pframe-engine. The engine
1032
+ * never sees this node.
1033
+ *
1034
+ * Emitted by `ColumnOverriddenRecipe.getQuery()`; the only currently
1035
+ * supported shape is `specOverride{ input: <plain column ref>, override }`
1036
+ * (i.e. `Overridden<Lazy>`). More complex projections under Overridden are
1037
+ * a future engine work item.
1038
+ *
1039
+ * @template Q - Input query type
1040
+ * @template SO - Spec override type
1041
+ */
1042
+ interface QuerySpecOverride<Q, SO> {
1043
+ type: "specOverride";
1044
+ /** Input query whose spec is to be overridden. */
1045
+ input: Q;
1046
+ /** Spec override patch to overlay on the inner spec. */
1047
+ override: SO;
1048
+ }
1026
1049
  //#endregion
1027
- export { ColumnTypeSpec, ExprAxisRef, ExprCast, ExprColumnRef, ExprConditional, ExprConditionalCase, ExprConstant, ExprFillNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprRanking, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, NumericBinaryOperand, NumericComparisonOperand, NumericUnaryOperand, QueryAxisSelector, QueryColumn, QueryColumnSelector, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySelector, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, QueryTransformColumns, RankingKind, TransformColumnEntry, TransformColumnsMode };
1050
+ export { ColumnTypeSpec, ExprAxisRef, ExprCast, ExprColumnRef, ExprConditional, ExprConditionalCase, ExprConstant, ExprFillNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprRanking, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, NumericBinaryOperand, NumericComparisonOperand, NumericUnaryOperand, QueryAxisSelector, QueryColumn, QueryColumnSelector, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySelector, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySpecOverride, QuerySymmetricJoin, QueryTransformColumns, RankingKind, TransformColumnEntry, TransformColumnsMode };
1028
1051
  //# sourceMappingURL=query_common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query_common.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_common.ts"],"mappings":"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"}
1
+ {"version":3,"file":"query_common.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_common.ts"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { Domain, PColumnIdAndSpec } from "../spec/spec.js";
2
- import { ExprAxisRef, ExprCast, ExprColumnRef, ExprConditional, ExprConstant, ExprFillNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprRanking, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, QueryTransformColumns } from "./query_common.js";
2
+ import { SpecOverrides } from "../spec/overridden.js";
3
+ import { ColumnUniversalId } from "../spec/ids.js";
4
+ import { ExprAxisRef, ExprCast, ExprColumnRef, ExprConditional, ExprConstant, ExprFillNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprRanking, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySpecOverride, QuerySymmetricJoin, QueryTransformColumns } from "./query_common.js";
3
5
  import { SingleAxisSelector } from "../spec/selectors.js";
4
6
  import { PObjectId } from "../../../pool/spec.js";
5
7
  //#region src/drivers/pframe/query/query_spec.d.ts
@@ -13,41 +15,39 @@ import { PObjectId } from "../../../pool/spec.js";
13
15
  * qualifications: [{ axis: { name: 'sample' }, contextDomain: { ... } }]
14
16
  * }
15
17
  */
16
- type SpecQueryJoinEntry<C = PObjectId> = QueryJoinEntry<SpecQuery<C>> & {
17
- qualifications?: {
18
+ type SpecQueryJoinEntry<C = ColumnUniversalId> = QueryJoinEntry<SpecQuery<C>> & {
19
+ qualifications?: readonly {
18
20
  /** Axis to qualify. */axis: SingleAxisSelector; /** Additional domain constraints for this axis. */
19
21
  contextDomain: Domain;
20
22
  }[];
21
23
  };
22
24
  /** @see QueryColumn */
23
- type SpecQueryColumn<C = PObjectId> = QueryColumn<C>;
25
+ type SpecQueryColumn<C = ColumnUniversalId> = QueryColumn<C>;
24
26
  /** @see QueryInlineColumn */
25
27
  type SpecQueryInlineColumn = QueryInlineColumn<PColumnIdAndSpec>;
26
28
  /** @see QuerySparseToDenseColumn */
27
- type SpecQuerySparseToDenseColumn<C = PObjectId> = QuerySparseToDenseColumn<C, SingleAxisSelector, PColumnIdAndSpec>;
29
+ type SpecQuerySparseToDenseColumn<C = ColumnUniversalId> = QuerySparseToDenseColumn<C, SingleAxisSelector, PColumnIdAndSpec>;
28
30
  /** @see QuerySymmetricJoin */
29
- type SpecQuerySymmetricJoin<C = PObjectId> = QuerySymmetricJoin<SpecQueryJoinEntry<C>>;
31
+ type SpecQuerySymmetricJoin<C = ColumnUniversalId> = QuerySymmetricJoin<SpecQueryJoinEntry<C>>;
30
32
  /** @see QueryOuterJoin */
31
- type SpecQueryOuterJoin<C = PObjectId> = QueryOuterJoin<SpecQueryJoinEntry<C>>;
32
- /**
33
- * Linker side of a spec-layer linker-join.
34
- *
35
- * At the spec layer the linker is just a column reference — integration artifacts
36
- * (axes mapping, one-side indices) are derived during spec→data conversion.
37
- */
38
- type SpecQueryLinkerJoinLinker<C = PObjectId> = {
39
- /** Linker column reference. */column: C;
40
- };
33
+ type SpecQueryOuterJoin<C = ColumnUniversalId> = QueryOuterJoin<SpecQueryJoinEntry<C>>;
41
34
  /** @see QueryLinkerJoin */
42
- type SpecQueryLinkerJoin<C = PObjectId> = QueryLinkerJoin<SpecQueryLinkerJoinLinker<C>, SpecQueryJoinEntry<C>>;
35
+ type SpecQueryLinkerJoin<C = ColumnUniversalId> = QueryLinkerJoin<SpecQuery<C>, SpecQueryJoinEntry<C>>;
43
36
  /** @see QuerySliceAxes */
44
- type SpecQuerySliceAxes<C = PObjectId> = QuerySliceAxes<SpecQuery<C>, SingleAxisSelector>;
37
+ type SpecQuerySliceAxes<C = ColumnUniversalId> = QuerySliceAxes<SpecQuery<C>, SingleAxisSelector>;
45
38
  /** @see QuerySort */
46
- type SpecQuerySort<C = PObjectId> = QuerySort<SpecQuery<C>, SpecQueryExpression>;
39
+ type SpecQuerySort<C = ColumnUniversalId> = QuerySort<SpecQuery<C>, SpecQueryExpression>;
47
40
  /** @see QueryFilter */
48
- type SpecQueryFilter<C = PObjectId> = QueryFilter<SpecQuery<C>, SpecQueryBooleanExpression>;
41
+ type SpecQueryFilter<C = ColumnUniversalId> = QueryFilter<SpecQuery<C>, SpecQueryBooleanExpression>;
49
42
  /** @see QueryTransformColumns */
50
- type SpecQueryTransformColumns<C = PObjectId> = QueryTransformColumns<SpecQuery<C>, SpecQueryExpression, PColumnIdAndSpec>;
43
+ type SpecQueryTransformColumns<C = ColumnUniversalId> = QueryTransformColumns<SpecQuery<C>, SpecQueryExpression, PColumnIdAndSpec>;
44
+ /**
45
+ * Client-side spec-override node — collapsed at the host boundary, never
46
+ * sent to pframe-engine.
47
+ *
48
+ * @see QuerySpecOverride
49
+ */
50
+ type SpecQuerySpecOverride<C = ColumnUniversalId> = QuerySpecOverride<SpecQuery<C>, SpecOverrides>;
51
51
  /**
52
52
  * Union of all spec layer query types.
53
53
  *
@@ -62,14 +62,15 @@ type SpecQueryTransformColumns<C = PObjectId> = QueryTransformColumns<SpecQuery<
62
62
  * - Leaf nodes: column, inlineColumn, sparseToDenseColumn
63
63
  * - Join operations: innerJoin, fullJoin, outerJoin, linkerJoin
64
64
  * - Transformations: sliceAxes, sort, filter, transformColumns
65
+ * - Client-side overlays: specOverride (collapsed before reaching the engine)
65
66
  */
66
- type SpecQuery<C = PObjectId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQueryLinkerJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C> | SpecQueryTransformColumns<C>;
67
+ type SpecQuery<C = ColumnUniversalId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQueryLinkerJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C> | SpecQueryTransformColumns<C> | SpecQuerySpecOverride<C>;
67
68
  /** @see ExprAxisRef */
68
69
  type SpecExprAxisRef = ExprAxisRef<SingleAxisSelector>;
69
70
  /** @see ExprColumnRef */
70
- type SpecExprColumnRef = ExprColumnRef<PObjectId>;
71
+ type SpecExprColumnRef = ExprColumnRef<ColumnUniversalId>;
71
72
  type SpecQueryExpression = SpecExprColumnRef | SpecExprAxisRef | ExprConstant | ExprNumericBinary<SpecQueryExpression> | ExprNumericComparison<SpecQueryExpression> | ExprNumericUnary<SpecQueryExpression> | ExprStringEquals<SpecQueryExpression> | ExprStringContains<SpecQueryExpression> | ExprStringRegex<SpecQueryExpression> | ExprStringContainsFuzzy<SpecQueryExpression> | ExprIsNull<SpecQueryExpression> | ExprFillNull<SpecQueryExpression> | ExprLogicalUnary<SpecQueryExpression> | ExprLogicalVariadic<SpecQueryExpression> | ExprIsIn<SpecQueryExpression, string> | ExprIsIn<SpecQueryExpression, number> | ExprCast<SpecQueryExpression> | ExprConditional<SpecQueryExpression> | ExprRanking<SpecQueryExpression, SingleAxisSelector, PObjectId>;
72
73
  type SpecQueryBooleanExpression = InferBooleanExpressionUnion<SpecQueryExpression>;
73
74
  //#endregion
74
- export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryLinkerJoin, SpecQueryLinkerJoinLinker, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin, SpecQueryTransformColumns };
75
+ export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryLinkerJoin, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySpecOverride, SpecQuerySymmetricJoin, SpecQueryTransformColumns };
75
76
  //# sourceMappingURL=query_spec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query_spec.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_spec.ts"],"mappings":";;;;;;;;;;AA6CA;;;;;KAAY,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,SAAA,CAAU,CAAA;EACvE,cAAA;IAEQ,uBAAN,IAAA,EAAM,kBAAA,EAEe;IAArB,aAAA,EAAe,MAAA;EAAA;AAAA;;KAKP,eAAA,KAAoB,SAAA,IAAa,WAAA,CAAY,CAAA;;KAE7C,qBAAA,GAAwB,iBAAiB,CAAC,gBAAA;;KAE1C,4BAAA,KAAiC,SAAA,IAAa,wBAAA,CACxD,CAAA,EACA,kBAAA,EACA,gBAAA;;KAGU,sBAAA,KAA2B,SAAA,IAAa,kBAAA,CAAmB,kBAAA,CAAmB,CAAA;;KAE9E,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,kBAAA,CAAmB,CAAA;AAZlF;;;;;;AAAA,KAmBY,yBAAA,KAA8B,SAAA;EAnBc,+BAqBtD,MAAA,EAAQ,CAAC;AAAA;;KAGC,mBAAA,KAAwB,SAAA,IAAa,eAAA,CAC/C,yBAAA,CAA0B,CAAA,GAC1B,kBAAA,CAAmB,CAAA;;KAGT,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,SAAA,CAAU,CAAA,GAAI,kBAAA;AA3B7E;AAAA,KA6BY,aAAA,KAAkB,SAAA,IAAa,SAAA,CAAU,SAAA,CAAU,CAAA,GAAI,mBAAA;;KAEvD,eAAA,KAAoB,SAAA,IAAa,WAAA,CAAY,SAAA,CAAU,CAAA,GAAI,0BAAA;AA/BD;AAAA,KAiC1D,yBAAA,KAA8B,SAAA,IAAa,qBAAA,CACrD,SAAA,CAAU,CAAA,GACV,mBAAA,EACA,gBAAA;;;;;;;;;;;;;;;;KAkBU,SAAA,KAAc,SAAA,IACtB,eAAA,CAAgB,CAAA,IAChB,qBAAA,GACA,4BAAA,CAA6B,CAAA,IAC7B,sBAAA,CAAuB,CAAA,IACvB,kBAAA,CAAmB,CAAA,IACnB,mBAAA,CAAoB,CAAA,IACpB,kBAAA,CAAmB,CAAA,IACnB,aAAA,CAAc,CAAA,IACd,eAAA,CAAgB,CAAA,IAChB,yBAAA,CAA0B,CAAA;AA3DZ;AAAA,KA8DN,eAAA,GAAkB,WAAW,CAAC,kBAAA;;KAE9B,iBAAA,GAAoB,aAAa,CAAC,SAAA;AAAA,KAElC,mBAAA,GACR,iBAAA,GACA,eAAA,GACA,YAAA,GACA,iBAAA,CAAkB,mBAAA,IAClB,qBAAA,CAAsB,mBAAA,IACtB,gBAAA,CAAiB,mBAAA,IACjB,gBAAA,CAAiB,mBAAA,IACjB,kBAAA,CAAmB,mBAAA,IACnB,eAAA,CAAgB,mBAAA,IAChB,uBAAA,CAAwB,mBAAA,IACxB,UAAA,CAAW,mBAAA,IACX,YAAA,CAAa,mBAAA,IACb,gBAAA,CAAiB,mBAAA,IACjB,mBAAA,CAAoB,mBAAA,IACpB,QAAA,CAAS,mBAAA,YACT,QAAA,CAAS,mBAAA,YAET,QAAA,CAAS,mBAAA,IACT,eAAA,CAAgB,mBAAA,IAEhB,WAAA,CAAY,mBAAA,EAAqB,kBAAA,EAAoB,SAAA;AAAA,KAG7C,0BAAA,GAA6B,2BAA2B,CAAC,mBAAA"}
1
+ {"version":3,"file":"query_spec.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_spec.ts"],"mappings":";;;;;;;;;;;;AAgDA;;;;;KAAY,kBAAA,KAAuB,iBAAA,IAAqB,cAAA,CAAe,SAAA,CAAU,CAAA;EAC/E,cAAA;IAEQ,uBAAN,IAAA,EAAM,kBAAA,EAEe;IAArB,aAAA,EAAe,MAAA;EAAA;AAAA;;KAKP,eAAA,KAAoB,iBAAA,IAAqB,WAAA,CAAY,CAAA;;KAErD,qBAAA,GAAwB,iBAAiB,CAAC,gBAAA;;KAE1C,4BAAA,KAAiC,iBAAA,IAAqB,wBAAA,CAChE,CAAA,EACA,kBAAA,EACA,gBAAA;;KAGU,sBAAA,KAA2B,iBAAA,IAAqB,kBAAA,CAC1D,kBAAA,CAAmB,CAAA;;KAGT,kBAAA,KAAuB,iBAAA,IAAqB,cAAA,CAAe,kBAAA,CAAmB,CAAA;AAd1F;AAAA,KAgBY,mBAAA,KAAwB,iBAAA,IAAqB,eAAA,CACvD,SAAA,CAAU,CAAA,GACV,kBAAA,CAAmB,CAAA;;KAGT,kBAAA,KAAuB,iBAAA,IAAqB,cAAA,CACtD,SAAA,CAAU,CAAA,GACV,kBAAA;;KAGU,aAAA,KAAkB,iBAAA,IAAqB,SAAA,CAAU,SAAA,CAAU,CAAA,GAAI,mBAAA;;KAE/D,eAAA,KAAoB,iBAAA,IAAqB,WAAA,CACnD,SAAA,CAAU,CAAA,GACV,0BAAA;;KAGU,yBAAA,KAA8B,iBAAA,IAAqB,qBAAA,CAC7D,SAAA,CAAU,CAAA,GACV,mBAAA,EACA,gBAAA;;;;AApCgE;AAElE;;KA0CY,qBAAA,KAA0B,iBAAA,IAAqB,iBAAA,CACzD,SAAA,CAAU,CAAA,GACV,aAAA;;AA5CoE;AAEtE;;;;;;;;;;;;;;KA6DY,SAAA,KAAc,iBAAA,IACtB,eAAA,CAAgB,CAAA,IAChB,qBAAA,GACA,4BAAA,CAA6B,CAAA,IAC7B,sBAAA,CAAuB,CAAA,IACvB,kBAAA,CAAmB,CAAA,IACnB,mBAAA,CAAoB,CAAA,IACpB,kBAAA,CAAmB,CAAA,IACnB,aAAA,CAAc,CAAA,IACd,eAAA,CAAgB,CAAA,IAChB,yBAAA,CAA0B,CAAA,IAC1B,qBAAA,CAAsB,CAAA;;KAGd,eAAA,GAAkB,WAAW,CAAC,kBAAA;AAxExB;AAAA,KA0EN,iBAAA,GAAoB,aAAa,CAAC,iBAAA;AAAA,KAElC,mBAAA,GACR,iBAAA,GACA,eAAA,GACA,YAAA,GACA,iBAAA,CAAkB,mBAAA,IAClB,qBAAA,CAAsB,mBAAA,IACtB,gBAAA,CAAiB,mBAAA,IACjB,gBAAA,CAAiB,mBAAA,IACjB,kBAAA,CAAmB,mBAAA,IACnB,eAAA,CAAgB,mBAAA,IAChB,uBAAA,CAAwB,mBAAA,IACxB,UAAA,CAAW,mBAAA,IACX,YAAA,CAAa,mBAAA,IACb,gBAAA,CAAiB,mBAAA,IACjB,mBAAA,CAAoB,mBAAA,IACpB,QAAA,CAAS,mBAAA,YACT,QAAA,CAAS,mBAAA,YAET,QAAA,CAAS,mBAAA,IACT,eAAA,CAAgB,mBAAA,IAEhB,WAAA,CAAY,mBAAA,EAAqB,kBAAA,EAAoB,SAAA;AAAA,KAG7C,0BAAA,GAA6B,2BAA2B,CAAC,mBAAA"}
@@ -65,20 +65,23 @@ function traverseQuerySpec(query, visitor) {
65
65
  secondary: query.secondary.map(traverseEntry)
66
66
  };
67
67
  break;
68
- case "linkerJoin":
68
+ case "linkerJoin": {
69
+ const linker = "type" in query.linker ? query.linker : {
70
+ type: "column",
71
+ column: query.linker.column
72
+ };
69
73
  result = {
70
74
  ...query,
71
- linker: {
72
- ...query.linker,
73
- column: visitor.column(query.linker.column)
74
- },
75
+ linker: traverseQuerySpec(linker, visitor),
75
76
  secondary: query.secondary.map(traverseEntry)
76
77
  };
77
78
  break;
79
+ }
78
80
  case "filter":
79
81
  case "sort":
80
82
  case "sliceAxes":
81
83
  case "transformColumns":
84
+ case "specOverride":
82
85
  result = {
83
86
  ...query,
84
87
  input: traverseQuerySpec(query.input, visitor)
@@ -89,8 +92,8 @@ function traverseQuerySpec(query, visitor) {
89
92
  return visitor.node ? visitor.node(result) : result;
90
93
  }
91
94
  /** Recursively maps all column references in a SpecQuery tree. */
92
- function mapSpecQueryColumns(query, cb) {
93
- return traverseQuerySpec(query, { column: cb });
95
+ function mapSpecQueryColumns(query, visitor) {
96
+ return traverseQuerySpec(query, visitor);
94
97
  }
95
98
  /** Collects all column references from a SpecQuery tree. */
96
99
  function collectSpecQueryColumns(query) {
@@ -185,7 +188,8 @@ function cmpQuerySpec(lhs, rhs) {
185
188
  }
186
189
  case "linkerJoin": {
187
190
  const rhsLinker = rhs;
188
- if (lhs.linker.column !== rhsLinker.linker.column) return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;
191
+ const cmp = cmpQuerySpec(lhs.linker, rhsLinker.linker);
192
+ if (cmp !== 0) return cmp;
189
193
  if (lhs.secondary.length !== rhsLinker.secondary.length) return lhs.secondary.length - rhsLinker.secondary.length;
190
194
  for (let i = 0; i < lhs.secondary.length; i++) {
191
195
  const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);
@@ -196,6 +200,12 @@ function cmpQuerySpec(lhs, rhs) {
196
200
  case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
197
201
  case "sort": return cmpQuerySpec(lhs.input, rhs.input);
198
202
  case "filter": return cmpQuerySpec(lhs.input, rhs.input);
203
+ case "specOverride": {
204
+ const rhsSo = rhs;
205
+ const cmp = cmpQuerySpec(lhs.input, rhsSo.input);
206
+ if (cmp !== 0) return cmp;
207
+ return require_json.canonicalizeJson(lhs.override).localeCompare(require_json.canonicalizeJson(rhsSo.override));
208
+ }
199
209
  case "transformColumns": {
200
210
  const rhsTc = rhs;
201
211
  const cmp = cmpQuerySpec(lhs.input, rhsTc.input);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst BOOLEAN_TYPES = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n // \"isInPolygon\", -- disabled until the Rust executor wires it up\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return BOOLEAN_TYPES.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\":\n result = {\n ...query,\n linker: { ...query.linker, column: visitor.column(query.linker.column) },\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n case \"transformColumns\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return {\n ...node,\n // toSorted preserves array length but the type system widens\n // the non-empty tuple back to a plain array, so re-narrow.\n axes: node.axes.toSorted((a, b) =>\n canonicalizeJson(a).localeCompare(canonicalizeJson(b)),\n ) as typeof node.axes,\n };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => {\n // Preserve absence of `qualifications` (absent == `[]`) so canonical\n // output is stable across both input forms.\n if (entry.qualifications === undefined || entry.qualifications.length === 0) {\n return entry;\n }\n return {\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n },\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.columnId < (rhs as typeof lhs).spec.columnId\n ? -1\n : lhs.spec.columnId === (rhs as typeof lhs).spec.columnId\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n if (lhs.linker.column !== rhsLinker.linker.column) {\n return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;\n }\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"transformColumns\": {\n const rhsTc = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.input, rhsTc.input);\n if (cmp !== 0) return cmp;\n const modeCmp = lhs.mode.localeCompare(rhsTc.mode);\n if (modeCmp !== 0) return modeCmp;\n // Column entries are positional; compare by canonical JSON.\n return canonicalizeJson(lhs.columns).localeCompare(canonicalizeJson(rhsTc.columns));\n }\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n // Absent `qualifications` is equivalent to an empty list.\n const lhsQ = lhs.qualifications ?? [];\n const rhsQ = rhs.qualifications ?? [];\n if (lhsQ.length !== rhsQ.length) {\n return lhsQ.length - rhsQ.length;\n }\n for (let i = 0; i < lhsQ.length; i++) {\n const l = canonicalizeJson(lhsQ[i]);\n const r = canonicalizeJson(rhsQ[i]);\n if (l !== r) return l < r ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst BOOLEAN_TYPES = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n // \"isInPolygon\", -- disabled until the Rust executor wires it up\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return BOOLEAN_TYPES.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\": {\n // Back-compat: pre-#c7309fc8 blocks emit `linker` as `{ column }` without\n // a `type` — tag it as a `column` node so recursion handles it normally.\n const linker =\n \"type\" in query.linker\n ? query.linker\n : ({ type: \"column\", column: (query.linker as { column: C1 }).column } as SpecQuery<C1>);\n result = {\n ...query,\n linker: traverseQuerySpec(linker, visitor),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n }\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n case \"transformColumns\":\n case \"specOverride\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n return traverseQuerySpec(query, visitor);\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return {\n ...node,\n // toSorted preserves array length but the type system widens\n // the non-empty tuple back to a plain array, so re-narrow.\n axes: node.axes.toSorted((a, b) =>\n canonicalizeJson(a).localeCompare(canonicalizeJson(b)),\n ) as typeof node.axes,\n };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => {\n // Preserve absence of `qualifications` (absent == `[]`) so canonical\n // output is stable across both input forms.\n if (entry.qualifications === undefined || entry.qualifications.length === 0) {\n return entry;\n }\n return {\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n },\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.columnId < (rhs as typeof lhs).spec.columnId\n ? -1\n : lhs.spec.columnId === (rhs as typeof lhs).spec.columnId\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.linker, rhsLinker.linker);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"specOverride\": {\n const rhsSo = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.input, rhsSo.input);\n if (cmp !== 0) return cmp;\n return canonicalizeJson(lhs.override).localeCompare(canonicalizeJson(rhsSo.override));\n }\n case \"transformColumns\": {\n const rhsTc = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.input, rhsTc.input);\n if (cmp !== 0) return cmp;\n const modeCmp = lhs.mode.localeCompare(rhsTc.mode);\n if (modeCmp !== 0) return modeCmp;\n // Column entries are positional; compare by canonical JSON.\n return canonicalizeJson(lhs.columns).localeCompare(canonicalizeJson(rhsTc.columns));\n }\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n // Absent `qualifications` is equivalent to an empty list.\n const lhsQ = lhs.qualifications ?? [];\n const rhsQ = rhs.qualifications ?? [];\n if (lhsQ.length !== rhsQ.length) {\n return lhsQ.length - rhsQ.length;\n }\n for (let i = 0; i < lhsQ.length; i++) {\n const l = canonicalizeJson(lhsQ[i]);\n const r = canonicalizeJson(rhsQ[i]);\n if (l !== r) return l < r ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":";;;AASA,MAAM,gCAAgB,IAAI,IAAwC;CAChE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAEF,CAAC;AAED,SAAgB,oBAAoB,MAA+D;CACjG,OAAO,cAAc,IAEnB,KAAK,IACP;AACF;;;;;;;;;;;AAYA,SAAgB,kBACd,OACA,SAQe;CACf,MAAM,iBAAiB,UAA0D;EAC/E,MAAM,YAAoC;GACxC,GAAG;GACH,OAAO,kBAAkB,MAAM,OAAO,OAAO;EAC/C;EACA,OAAO,QAAQ,YAAY,QAAQ,UAAU,SAAS,IAAI;CAC5D;CAEA,IAAI;CACJ,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,SAAS;IAAE,MAAM;IAAU,QAAQ,QAAQ,OAAO,MAAM,MAAM;GAAE;GAChE;EACF,KAAK;GACH,SAAS;IAAE,GAAG;IAAO,QAAQ,QAAQ,OAAO,MAAM,MAAM;GAAE;GAC1D;EACF,KAAK;GACH,SAAS;GACT;EACF,KAAK;EACL,KAAK;GACH,SAAS;IAAE,GAAG;IAAO,SAAS,MAAM,QAAQ,IAAI,aAAa;GAAE;GAC/D;EACF,KAAK;GACH,SAAS;IACP,GAAG;IACH,SAAS,cAAc,MAAM,OAAO;IACpC,WAAW,MAAM,UAAU,IAAI,aAAa;GAC9C;GACA;EACF,KAAK,cAAc;GAGjB,MAAM,SACJ,UAAU,MAAM,SACZ,MAAM,SACL;IAAE,MAAM;IAAU,QAAS,MAAM,OAA0B;GAAO;GACzE,SAAS;IACP,GAAG;IACH,QAAQ,kBAAkB,QAAQ,OAAO;IACzC,WAAW,MAAM,UAAU,IAAI,aAAa;GAC9C;GACA;EACF;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACH,SAAS;IAAE,GAAG;IAAO,OAAO,kBAAkB,MAAM,OAAO,OAAO;GAAE;GACpE;EACF,SACE,aAAA,YAAY,KAAK;CACrB;CAEA,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,IAAI;AAC/C;;AAGA,SAAgB,oBACd,OACA,SAQe;CACf,OAAO,kBAAkB,OAAO,OAAO;AACzC;;AAGA,SAAgB,wBAA2B,OAA0B;CACnE,MAAM,SAAc,CAAC;CACrB,kBAAkB,OAAO,EACvB,SAAS,MAAS;EAChB,OAAO,KAAK,CAAC;EACb,OAAO;CACT,EACF,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,cAAc,OAA6B;CACzD,OAAO,kBAAkB,OAAO;EAC9B,SAAS,MAAM;EACf,OAAO,SAAS;GACd,QAAQ,KAAK,MAAb;IACE,KAAK,uBACH,OAAO;KACL,GAAG;KAGH,MAAM,KAAK,KAAK,UAAU,GAAG,MAC3BA,aAAAA,iBAAiB,CAAC,CAAC,CAAC,cAAcA,aAAAA,iBAAiB,CAAC,CAAC,CACvD;IACF;IACF,KAAK;IACL,KAAK,YAAY;KACf,MAAM,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,KAAK,qBAAqB;KAC3D,OAAO;MAAE,GAAG;MAAM,SAAS;KAAO;IACpC;IACA,KAAK,aAAa;KAChB,MAAM,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,KAAK,qBAAqB;KAC7D,OAAO;MAAE,GAAG;MAAM,WAAW;KAAO;IACtC;IACA,KAAK,cAAc;KACjB,MAAM,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,KAAK,qBAAqB;KAC7D,OAAO;MAAE,GAAG;MAAM,WAAW;KAAO;IACtC;IACA,KAAK,aACH,OAAO;KACL,GAAG;KACH,aAAa,KAAK,YAAY,UAAU,GAAG,MAAM;MAC/C,MAAM,KAAKA,aAAAA,iBAAiB,EAAE,YAAY;MAC1C,MAAM,KAAKA,aAAAA,iBAAiB,EAAE,YAAY;MAC1C,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI;KACxC,CAAC;IACH;IACF,SACE,OAAO;GACX;EACF;EACA,YAAY,UAAU;GAGpB,IAAI,MAAM,mBAAmB,KAAA,KAAa,MAAM,eAAe,WAAW,GACxE,OAAO;GAET,OAAO;IACL,GAAG;IACH,gBAAgB,MAAM,eAAe,UAAU,GAAG,MAAM;KACtD,MAAM,KAAKA,aAAAA,iBAAiB,EAAE,IAAI;KAClC,MAAM,KAAKA,aAAAA,iBAAiB,EAAE,IAAI;KAClC,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI;IACxC,CAAC;GACH;EACF;CACF,CAAC;AACH;AAEA,SAAS,aAAa,KAAgB,KAAwB;CAC5D,IAAI,IAAI,SAAS,IAAI,MACnB,OAAO,IAAI,OAAO,IAAI,OAAO,KAAK;CAEpC,QAAQ,IAAI,MAAZ;EACE,KAAK,UACH,OAAO,IAAI,SAAU,IAAmB,SACpC,KACA,IAAI,WAAY,IAAmB,SACjC,IACA;EACR,KAAK,gBACH,OAAO,IAAI,KAAK,WAAY,IAAmB,KAAK,WAChD,KACA,IAAI,KAAK,aAAc,IAAmB,KAAK,WAC7C,IACA;EACR,KAAK,uBACH,OAAO,IAAI,SAAU,IAAmB,SACpC,KACA,IAAI,WAAY,IAAmB,SACjC,IACA;EACR,KAAK;EACL,KAAK,YAAY;GACf,MAAM,UAAU;GAChB,IAAI,IAAI,QAAQ,WAAW,QAAQ,QAAQ,QACzC,OAAO,IAAI,QAAQ,SAAS,QAAQ,QAAQ;GAE9C,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;IAC3C,MAAM,MAAM,sBAAsB,IAAI,QAAQ,IAAI,QAAQ,QAAQ,EAAE;IACpE,IAAI,QAAQ,GAAG,OAAO;GACxB;GACA,OAAO;EACT;EACA,KAAK,aAAa;GAChB,MAAM,WAAW;GACjB,MAAM,MAAM,sBAAsB,IAAI,SAAS,SAAS,OAAO;GAC/D,IAAI,QAAQ,GAAG,OAAO;GACtB,IAAI,IAAI,UAAU,WAAW,SAAS,UAAU,QAC9C,OAAO,IAAI,UAAU,SAAS,SAAS,UAAU;GAEnD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK;IAC7C,MAAM,MAAM,sBAAsB,IAAI,UAAU,IAAI,SAAS,UAAU,EAAE;IACzE,IAAI,QAAQ,GAAG,OAAO;GACxB;GACA,OAAO;EACT;EACA,KAAK,cAAc;GACjB,MAAM,YAAY;GAClB,MAAM,MAAM,aAAa,IAAI,QAAQ,UAAU,MAAM;GACrD,IAAI,QAAQ,GAAG,OAAO;GACtB,IAAI,IAAI,UAAU,WAAW,UAAU,UAAU,QAC/C,OAAO,IAAI,UAAU,SAAS,UAAU,UAAU;GAEpD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK;IAC7C,MAAM,MAAM,sBAAsB,IAAI,UAAU,IAAI,UAAU,UAAU,EAAE;IAC1E,IAAI,QAAQ,GAAG,OAAO;GACxB;GACA,OAAO;EACT;EACA,KAAK,aACH,OAAO,aAAa,IAAI,OAAQ,IAAmB,KAAK;EAC1D,KAAK,QACH,OAAO,aAAa,IAAI,OAAQ,IAAmB,KAAK;EAC1D,KAAK,UACH,OAAO,aAAa,IAAI,OAAQ,IAAmB,KAAK;EAC1D,KAAK,gBAAgB;GACnB,MAAM,QAAQ;GACd,MAAM,MAAM,aAAa,IAAI,OAAO,MAAM,KAAK;GAC/C,IAAI,QAAQ,GAAG,OAAO;GACtB,OAAOA,aAAAA,iBAAiB,IAAI,QAAQ,CAAC,CAAC,cAAcA,aAAAA,iBAAiB,MAAM,QAAQ,CAAC;EACtF;EACA,KAAK,oBAAoB;GACvB,MAAM,QAAQ;GACd,MAAM,MAAM,aAAa,IAAI,OAAO,MAAM,KAAK;GAC/C,IAAI,QAAQ,GAAG,OAAO;GACtB,MAAM,UAAU,IAAI,KAAK,cAAc,MAAM,IAAI;GACjD,IAAI,YAAY,GAAG,OAAO;GAE1B,OAAOA,aAAAA,iBAAiB,IAAI,OAAO,CAAC,CAAC,cAAcA,aAAAA,iBAAiB,MAAM,OAAO,CAAC;EACpF;EACA,SACE,aAAA,YAAY,GAAG;CACnB;AACF;AAEA,SAAS,sBAAsB,KAAyB,KAAiC;CACvF,MAAM,MAAM,aAAa,IAAI,OAAO,IAAI,KAAK;CAC7C,IAAI,QAAQ,GAAG,OAAO;CAEtB,MAAM,OAAO,IAAI,kBAAkB,CAAC;CACpC,MAAM,OAAO,IAAI,kBAAkB,CAAC;CACpC,IAAI,KAAK,WAAW,KAAK,QACvB,OAAO,KAAK,SAAS,KAAK;CAE5B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,IAAIA,aAAAA,iBAAiB,KAAK,EAAE;EAClC,MAAM,IAAIA,aAAAA,iBAAiB,KAAK,EAAE;EAClC,IAAI,MAAM,GAAG,OAAO,IAAI,IAAI,KAAK;CACnC;CACA,OAAO;AACT"}
@@ -18,7 +18,11 @@ declare function traverseQuerySpec<C1, C2>(query: SpecQuery<C1>, visitor: {
18
18
  joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;
19
19
  }): SpecQuery<C2>;
20
20
  /** Recursively maps all column references in a SpecQuery tree. */
21
- declare function mapSpecQueryColumns<C1, C2>(query: SpecQuery<C1>, cb: (c: C1) => C2): SpecQuery<C2>;
21
+ declare function mapSpecQueryColumns<C1, C2>(query: SpecQuery<C1>, visitor: {
22
+ /** Transform column references in leaf nodes (column, sparseToDenseColumn). */column: (c: C1) => C2; /** Visit a node after its children have been traversed. */
23
+ node?: (node: SpecQuery<C2>) => SpecQuery<C2>; /** Visit a join entry after its inner query has been traversed. */
24
+ joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;
25
+ }): SpecQuery<C2>;
22
26
  /** Collects all column references from a SpecQuery tree. */
23
27
  declare function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[];
24
28
  declare function sortSpecQuery(query: SpecQuery): SpecQuery;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"mappings":";;;iBAuBgB,mBAAA,CAAoB,IAAA,EAAM,mBAAA,GAAsB,IAAA,IAAQ,0BAA0B;;AAAlG;;;;;;;;;iBAiBgB,iBAAA,SACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,OAAA;EAFc,+EAIZ,MAAA,GAAS,CAAA,EAAG,EAAA,KAAO,EAAA,EAJU;EAM7B,IAAA,IAAQ,IAAA,EAAM,SAAA,CAAU,EAAA,MAAQ,SAAA,CAAU,EAAA,GALrC;EAOL,SAAA,IAAa,KAAA,EAAO,kBAAA,CAAmB,EAAA,MAAQ,kBAAA,CAAmB,EAAA;AAAA,IAEnE,SAAA,CAAU,EAAA;;iBAoDG,mBAAA,SACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,EAAA,GAAK,CAAA,EAAG,EAAA,KAAO,EAAA,GACd,SAAA,CAAU,EAAA;;iBAKG,uBAAA,IAA2B,KAAA,EAAO,SAAA,CAAU,CAAA,IAAK,CAAA;AAAA,iBAWjD,aAAA,CAAc,KAAA,EAAO,SAAA,GAAY,SAAS"}
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"mappings":";;;iBAuBgB,mBAAA,CAAoB,IAAA,EAAM,mBAAA,GAAsB,IAAA,IAAQ,0BAA0B;;AAAlG;;;;;;;;;iBAiBgB,iBAAA,SACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,OAAA;EAFc,+EAIZ,MAAA,GAAS,CAAA,EAAG,EAAA,KAAO,EAAA,EAJU;EAM7B,IAAA,IAAQ,IAAA,EAAM,SAAA,CAAU,EAAA,MAAQ,SAAA,CAAU,EAAA,GALrC;EAOL,SAAA,IAAa,KAAA,EAAO,kBAAA,CAAmB,EAAA,MAAQ,kBAAA,CAAmB,EAAA;AAAA,IAEnE,SAAA,CAAU,EAAA;;iBA4DG,mBAAA,SACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,OAAA;EAlE4C,+EAoE1C,MAAA,GAAS,CAAA,EAAG,EAAA,KAAO,EAAA,EAlEoB;EAoEvC,IAAA,IAAQ,IAAA,EAAM,SAAA,CAAU,EAAA,MAAQ,SAAA,CAAU,EAAA,GApEwB;EAsElE,SAAA,IAAa,KAAA,EAAO,kBAAA,CAAmB,EAAA,MAAQ,kBAAA,CAAmB,EAAA;AAAA,IAEnE,SAAA,CAAU,EAAA;;iBAKG,uBAAA,IAA2B,KAAA,EAAO,SAAA,CAAU,CAAA,IAAK,CAAA;AAAA,iBAWjD,aAAA,CAAc,KAAA,EAAO,SAAA,GAAY,SAAS"}
@@ -65,20 +65,23 @@ function traverseQuerySpec(query, visitor) {
65
65
  secondary: query.secondary.map(traverseEntry)
66
66
  };
67
67
  break;
68
- case "linkerJoin":
68
+ case "linkerJoin": {
69
+ const linker = "type" in query.linker ? query.linker : {
70
+ type: "column",
71
+ column: query.linker.column
72
+ };
69
73
  result = {
70
74
  ...query,
71
- linker: {
72
- ...query.linker,
73
- column: visitor.column(query.linker.column)
74
- },
75
+ linker: traverseQuerySpec(linker, visitor),
75
76
  secondary: query.secondary.map(traverseEntry)
76
77
  };
77
78
  break;
79
+ }
78
80
  case "filter":
79
81
  case "sort":
80
82
  case "sliceAxes":
81
83
  case "transformColumns":
84
+ case "specOverride":
82
85
  result = {
83
86
  ...query,
84
87
  input: traverseQuerySpec(query.input, visitor)
@@ -89,8 +92,8 @@ function traverseQuerySpec(query, visitor) {
89
92
  return visitor.node ? visitor.node(result) : result;
90
93
  }
91
94
  /** Recursively maps all column references in a SpecQuery tree. */
92
- function mapSpecQueryColumns(query, cb) {
93
- return traverseQuerySpec(query, { column: cb });
95
+ function mapSpecQueryColumns(query, visitor) {
96
+ return traverseQuerySpec(query, visitor);
94
97
  }
95
98
  /** Collects all column references from a SpecQuery tree. */
96
99
  function collectSpecQueryColumns(query) {
@@ -185,7 +188,8 @@ function cmpQuerySpec(lhs, rhs) {
185
188
  }
186
189
  case "linkerJoin": {
187
190
  const rhsLinker = rhs;
188
- if (lhs.linker.column !== rhsLinker.linker.column) return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;
191
+ const cmp = cmpQuerySpec(lhs.linker, rhsLinker.linker);
192
+ if (cmp !== 0) return cmp;
189
193
  if (lhs.secondary.length !== rhsLinker.secondary.length) return lhs.secondary.length - rhsLinker.secondary.length;
190
194
  for (let i = 0; i < lhs.secondary.length; i++) {
191
195
  const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);
@@ -196,6 +200,12 @@ function cmpQuerySpec(lhs, rhs) {
196
200
  case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
197
201
  case "sort": return cmpQuerySpec(lhs.input, rhs.input);
198
202
  case "filter": return cmpQuerySpec(lhs.input, rhs.input);
203
+ case "specOverride": {
204
+ const rhsSo = rhs;
205
+ const cmp = cmpQuerySpec(lhs.input, rhsSo.input);
206
+ if (cmp !== 0) return cmp;
207
+ return canonicalizeJson(lhs.override).localeCompare(canonicalizeJson(rhsSo.override));
208
+ }
199
209
  case "transformColumns": {
200
210
  const rhsTc = rhs;
201
211
  const cmp = cmpQuerySpec(lhs.input, rhsTc.input);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst BOOLEAN_TYPES = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n // \"isInPolygon\", -- disabled until the Rust executor wires it up\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return BOOLEAN_TYPES.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\":\n result = {\n ...query,\n linker: { ...query.linker, column: visitor.column(query.linker.column) },\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n case \"transformColumns\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return {\n ...node,\n // toSorted preserves array length but the type system widens\n // the non-empty tuple back to a plain array, so re-narrow.\n axes: node.axes.toSorted((a, b) =>\n canonicalizeJson(a).localeCompare(canonicalizeJson(b)),\n ) as typeof node.axes,\n };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => {\n // Preserve absence of `qualifications` (absent == `[]`) so canonical\n // output is stable across both input forms.\n if (entry.qualifications === undefined || entry.qualifications.length === 0) {\n return entry;\n }\n return {\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n },\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.columnId < (rhs as typeof lhs).spec.columnId\n ? -1\n : lhs.spec.columnId === (rhs as typeof lhs).spec.columnId\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n if (lhs.linker.column !== rhsLinker.linker.column) {\n return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;\n }\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"transformColumns\": {\n const rhsTc = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.input, rhsTc.input);\n if (cmp !== 0) return cmp;\n const modeCmp = lhs.mode.localeCompare(rhsTc.mode);\n if (modeCmp !== 0) return modeCmp;\n // Column entries are positional; compare by canonical JSON.\n return canonicalizeJson(lhs.columns).localeCompare(canonicalizeJson(rhsTc.columns));\n }\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n // Absent `qualifications` is equivalent to an empty list.\n const lhsQ = lhs.qualifications ?? [];\n const rhsQ = rhs.qualifications ?? [];\n if (lhsQ.length !== rhsQ.length) {\n return lhsQ.length - rhsQ.length;\n }\n for (let i = 0; i < lhsQ.length; i++) {\n const l = canonicalizeJson(lhsQ[i]);\n const r = canonicalizeJson(rhsQ[i]);\n if (l !== r) return l < r ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst BOOLEAN_TYPES = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n // \"isInPolygon\", -- disabled until the Rust executor wires it up\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return BOOLEAN_TYPES.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\": {\n // Back-compat: pre-#c7309fc8 blocks emit `linker` as `{ column }` without\n // a `type` — tag it as a `column` node so recursion handles it normally.\n const linker =\n \"type\" in query.linker\n ? query.linker\n : ({ type: \"column\", column: (query.linker as { column: C1 }).column } as SpecQuery<C1>);\n result = {\n ...query,\n linker: traverseQuerySpec(linker, visitor),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n }\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n case \"transformColumns\":\n case \"specOverride\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n return traverseQuerySpec(query, visitor);\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return {\n ...node,\n // toSorted preserves array length but the type system widens\n // the non-empty tuple back to a plain array, so re-narrow.\n axes: node.axes.toSorted((a, b) =>\n canonicalizeJson(a).localeCompare(canonicalizeJson(b)),\n ) as typeof node.axes,\n };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => {\n // Preserve absence of `qualifications` (absent == `[]`) so canonical\n // output is stable across both input forms.\n if (entry.qualifications === undefined || entry.qualifications.length === 0) {\n return entry;\n }\n return {\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n },\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.columnId < (rhs as typeof lhs).spec.columnId\n ? -1\n : lhs.spec.columnId === (rhs as typeof lhs).spec.columnId\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.linker, rhsLinker.linker);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"specOverride\": {\n const rhsSo = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.input, rhsSo.input);\n if (cmp !== 0) return cmp;\n return canonicalizeJson(lhs.override).localeCompare(canonicalizeJson(rhsSo.override));\n }\n case \"transformColumns\": {\n const rhsTc = rhs as typeof lhs;\n const cmp = cmpQuerySpec(lhs.input, rhsTc.input);\n if (cmp !== 0) return cmp;\n const modeCmp = lhs.mode.localeCompare(rhsTc.mode);\n if (modeCmp !== 0) return modeCmp;\n // Column entries are positional; compare by canonical JSON.\n return canonicalizeJson(lhs.columns).localeCompare(canonicalizeJson(rhsTc.columns));\n }\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n // Absent `qualifications` is equivalent to an empty list.\n const lhsQ = lhs.qualifications ?? [];\n const rhsQ = rhs.qualifications ?? [];\n if (lhsQ.length !== rhsQ.length) {\n return lhsQ.length - rhsQ.length;\n }\n for (let i = 0; i < lhsQ.length; i++) {\n const l = canonicalizeJson(lhsQ[i]);\n const r = canonicalizeJson(rhsQ[i]);\n if (l !== r) return l < r ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { AxisFilter } from "./filtered_column.js";
2
- import { SUniversalPColumnId, UniversalPColumnId } from "./ids.js";
3
1
  import { PColumnSpec } from "./spec.js";
2
+ import { SUniversalPColumnId, UniversalPColumnId } from "./ids.js";
3
+ import { AxisFilter } from "./filtered_column.js";
4
4
  import { AnchoredPColumnId, AnchoredPColumnSelector, PColumnSelector } from "./selectors.js";
5
5
 
6
6
  //#region src/drivers/pframe/spec/anchored.d.ts
@@ -1,36 +1,52 @@
1
1
  const require_json = require("../../../json.cjs");
2
2
  let _milaboratories_helpers = require("@milaboratories/helpers");
3
3
  //#region src/drivers/pframe/spec/discovered_column.ts
4
- function isDiscoveredPColumn(obj) {
5
- return typeof obj === "object" && obj !== null && "path" in obj && "column" in obj && "columnQualifications" in obj && "queriesQualifications" in obj;
4
+ function isColumnDiscoveredKey(obj) {
5
+ return typeof obj === "object" && obj !== null && "__isDiscovered" in obj;
6
6
  }
7
- function distillDiscoveredPColumn(props) {
7
+ function isColumnDiscoveredId(str) {
8
+ if (typeof str !== "string") return false;
9
+ return isColumnDiscoveredKey(require_json.parseJsonSafely(str));
10
+ }
11
+ function distillColumnDiscoveredKey(props) {
8
12
  return {
13
+ __isDiscovered: true,
9
14
  column: props.column,
10
15
  path: Array.isArray(props.path) && props.path.length > 0 ? props.path : void 0,
11
16
  columnQualifications: Array.isArray(props.columnQualifications) && props.columnQualifications.length > 0 ? props.columnQualifications : void 0,
12
17
  queriesQualifications: props.queriesQualifications && Object.keys(props.queriesQualifications).length > 0 ? props.queriesQualifications : void 0
13
18
  };
14
19
  }
15
- function createDiscoveredPColumnId(props) {
16
- return stringifyDiscoveredPColumnId(props);
20
+ function createColumnDiscoveredId(props) {
21
+ return stringifyColumnDiscoveredId(props);
22
+ }
23
+ function createColumnDiscoveredKey(props) {
24
+ return distillColumnDiscoveredKey({
25
+ __isDiscovered: true,
26
+ ...props
27
+ });
17
28
  }
18
- function parseDiscoveredPColumnId(id) {
29
+ function parseColumnDiscoveredId(id) {
19
30
  try {
20
31
  const parsed = JSON.parse(id);
21
- return isDiscoveredPColumn(parsed) ? parsed : (0, _milaboratories_helpers.throwError)("Parsed object is not a valid DiscoveredPColumn");
32
+ return isColumnDiscoveredKey(parsed) ? parsed : (0, _milaboratories_helpers.throwError)("Parsed object is not a valid DiscoveredPColumn");
22
33
  } catch {
23
- throw new Error("Invalid DiscoveredPColumnId: not a valid JSON or does not conform to DiscoveredPColumn structure");
34
+ throw new Error("Invalid ColumnDiscoveredId: not a valid JSON or does not conform to DiscoveredPColumn structure");
24
35
  }
25
36
  }
26
- function stringifyDiscoveredPColumnId(id) {
27
- return require_json.canonicalizeJson(distillDiscoveredPColumn(id));
37
+ function stringifyColumnDiscoveredId(id) {
38
+ return require_json.canonicalizeJson(distillColumnDiscoveredKey({
39
+ __isDiscovered: true,
40
+ ...id
41
+ }));
28
42
  }
29
43
  //#endregion
30
- exports.createDiscoveredPColumnId = createDiscoveredPColumnId;
31
- exports.distillDiscoveredPColumn = distillDiscoveredPColumn;
32
- exports.isDiscoveredPColumn = isDiscoveredPColumn;
33
- exports.parseDiscoveredPColumnId = parseDiscoveredPColumnId;
34
- exports.stringifyDiscoveredPColumnId = stringifyDiscoveredPColumnId;
44
+ exports.createColumnDiscoveredId = createColumnDiscoveredId;
45
+ exports.createColumnDiscoveredKey = createColumnDiscoveredKey;
46
+ exports.distillColumnDiscoveredKey = distillColumnDiscoveredKey;
47
+ exports.isColumnDiscoveredId = isColumnDiscoveredId;
48
+ exports.isColumnDiscoveredKey = isColumnDiscoveredKey;
49
+ exports.parseColumnDiscoveredId = parseColumnDiscoveredId;
50
+ exports.stringifyColumnDiscoveredId = stringifyColumnDiscoveredId;
35
51
 
36
52
  //# sourceMappingURL=discovered_column.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovered_column.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/spec/discovered_column.ts"],"sourcesContent":["import { Branded, throwError } from \"@milaboratories/helpers\";\nimport { PObjectId } from \"../../../pool\";\nimport { AxisQualification } from \"./selectors\";\nimport { canonicalizeJson } from \"../../../json\";\n\nexport type DiscoveredPColumn = {\n column: PObjectId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n};\n\nexport type DiscoveredPColumnId = Branded<PObjectId, \"DiscoveredPColumnId\">; // CanonicalizedJson<DiscoveredPColumn>;\n\ntype PathItem = {\n type: \"linker\";\n column: PObjectId;\n};\n\nexport function isDiscoveredPColumn(obj: unknown): obj is DiscoveredPColumn {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"path\" in obj &&\n \"column\" in obj &&\n \"columnQualifications\" in obj &&\n \"queriesQualifications\" in obj\n );\n}\n\nexport function distillDiscoveredPColumn(props: DiscoveredPColumn): DiscoveredPColumn {\n return {\n column: props.column,\n path: Array.isArray(props.path) && props.path.length > 0 ? props.path : undefined,\n columnQualifications:\n Array.isArray(props.columnQualifications) && props.columnQualifications.length > 0\n ? props.columnQualifications\n : undefined,\n queriesQualifications:\n props.queriesQualifications && Object.keys(props.queriesQualifications).length > 0\n ? props.queriesQualifications\n : undefined,\n };\n}\n\nexport function createDiscoveredPColumnId(props: {\n column: PObjectId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}): DiscoveredPColumnId {\n return stringifyDiscoveredPColumnId(props);\n}\n\nexport function parseDiscoveredPColumnId(id: DiscoveredPColumnId): DiscoveredPColumn {\n try {\n const parsed = JSON.parse(id);\n return isDiscoveredPColumn(parsed)\n ? parsed\n : throwError(\"Parsed object is not a valid DiscoveredPColumn\");\n } catch {\n throw new Error(\n \"Invalid DiscoveredPColumnId: not a valid JSON or does not conform to DiscoveredPColumn structure\",\n );\n }\n}\n\nexport function stringifyDiscoveredPColumnId(id: DiscoveredPColumn) {\n return canonicalizeJson<DiscoveredPColumn>(\n distillDiscoveredPColumn(id),\n ) as string as DiscoveredPColumnId;\n}\n"],"mappings":";;;AAmBA,SAAgB,oBAAoB,KAAwC;CAC1E,OACE,OAAO,QAAQ,YACf,QAAQ,QACR,UAAU,OACV,YAAY,OACZ,0BAA0B,OAC1B,2BAA2B;AAE/B;AAEA,SAAgB,yBAAyB,OAA6C;CACpF,OAAO;EACL,QAAQ,MAAM;EACd,MAAM,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,IAAI,MAAM,OAAO,KAAA;EACxE,sBACE,MAAM,QAAQ,MAAM,oBAAoB,KAAK,MAAM,qBAAqB,SAAS,IAC7E,MAAM,uBACN,KAAA;EACN,uBACE,MAAM,yBAAyB,OAAO,KAAK,MAAM,qBAAqB,CAAC,CAAC,SAAS,IAC7E,MAAM,wBACN,KAAA;CACR;AACF;AAEA,SAAgB,0BAA0B,OAKlB;CACtB,OAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAgB,yBAAyB,IAA4C;CACnF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,EAAE;EAC5B,OAAO,oBAAoB,MAAM,IAC7B,UAAA,GAAA,wBAAA,WAAA,CACW,gDAAgD;CACjE,QAAQ;EACN,MAAM,IAAI,MACR,kGACF;CACF;AACF;AAEA,SAAgB,6BAA6B,IAAuB;CAClE,OAAOA,aAAAA,iBACL,yBAAyB,EAAE,CAC7B;AACF"}
1
+ {"version":3,"file":"discovered_column.cjs","names":["parseJsonSafely","canonicalizeJson"],"sources":["../../../../src/drivers/pframe/spec/discovered_column.ts"],"sourcesContent":["import { type Branded, throwError } from \"@milaboratories/helpers\";\nimport { type CanonicalizedJson, canonicalizeJson, parseJsonSafely } from \"../../../json\";\nimport { PObjectId } from \"../../../pool\";\nimport { AxisQualification } from \"./selectors\";\nimport { ColumnUniversalId } from \"./ids\";\n\nexport interface ColumnDiscoveredKey {\n __isDiscovered: true;\n column: ColumnUniversalId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}\n\nexport type ColumnDiscoveredId = Branded<\n CanonicalizedJson<ColumnDiscoveredKey>,\n \"ColumnDiscoveredId\"\n>;\n\ntype PathItem = {\n type: \"linker\";\n column: ColumnUniversalId;\n};\n\nexport function isColumnDiscoveredKey(obj: unknown): obj is ColumnDiscoveredKey {\n return typeof obj === \"object\" && obj !== null && \"__isDiscovered\" in obj;\n}\n\nexport function isColumnDiscoveredId(str: unknown): str is ColumnDiscoveredId {\n if (typeof str !== \"string\") return false;\n return isColumnDiscoveredKey(parseJsonSafely(str));\n}\n\nexport function distillColumnDiscoveredKey(props: ColumnDiscoveredKey): ColumnDiscoveredKey {\n return {\n __isDiscovered: true,\n column: props.column,\n path: Array.isArray(props.path) && props.path.length > 0 ? props.path : undefined,\n columnQualifications:\n Array.isArray(props.columnQualifications) && props.columnQualifications.length > 0\n ? props.columnQualifications\n : undefined,\n queriesQualifications:\n props.queriesQualifications && Object.keys(props.queriesQualifications).length > 0\n ? props.queriesQualifications\n : undefined,\n };\n}\n\nexport function createColumnDiscoveredId(props: {\n column: ColumnUniversalId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}): ColumnDiscoveredId {\n return stringifyColumnDiscoveredId(props);\n}\n\nexport function createColumnDiscoveredKey(props: {\n column: ColumnUniversalId;\n path?: PathItem[];\n columnQualifications?: AxisQualification[];\n queriesQualifications?: Record<PObjectId, AxisQualification[]>;\n}): ColumnDiscoveredKey {\n return distillColumnDiscoveredKey({ __isDiscovered: true, ...props });\n}\n\nexport function parseColumnDiscoveredId(id: ColumnDiscoveredId): ColumnDiscoveredKey {\n try {\n const parsed = JSON.parse(id);\n return isColumnDiscoveredKey(parsed)\n ? parsed\n : throwError(\"Parsed object is not a valid DiscoveredPColumn\");\n } catch {\n throw new Error(\n \"Invalid ColumnDiscoveredId: not a valid JSON or does not conform to DiscoveredPColumn structure\",\n );\n }\n}\n\nexport function stringifyColumnDiscoveredId(\n id: Omit<ColumnDiscoveredKey, \"__isDiscovered\">,\n): ColumnDiscoveredId {\n return canonicalizeJson<ColumnDiscoveredKey>(\n distillColumnDiscoveredKey({ __isDiscovered: true, ...id }),\n ) as ColumnDiscoveredId;\n}\n"],"mappings":";;;AAwBA,SAAgB,sBAAsB,KAA0C;CAC9E,OAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,oBAAoB;AACxE;AAEA,SAAgB,qBAAqB,KAAyC;CAC5E,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,OAAO,sBAAsBA,aAAAA,gBAAgB,GAAG,CAAC;AACnD;AAEA,SAAgB,2BAA2B,OAAiD;CAC1F,OAAO;EACL,gBAAgB;EAChB,QAAQ,MAAM;EACd,MAAM,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,IAAI,MAAM,OAAO,KAAA;EACxE,sBACE,MAAM,QAAQ,MAAM,oBAAoB,KAAK,MAAM,qBAAqB,SAAS,IAC7E,MAAM,uBACN,KAAA;EACN,uBACE,MAAM,yBAAyB,OAAO,KAAK,MAAM,qBAAqB,CAAC,CAAC,SAAS,IAC7E,MAAM,wBACN,KAAA;CACR;AACF;AAEA,SAAgB,yBAAyB,OAKlB;CACrB,OAAO,4BAA4B,KAAK;AAC1C;AAEA,SAAgB,0BAA0B,OAKlB;CACtB,OAAO,2BAA2B;EAAE,gBAAgB;EAAM,GAAG;CAAM,CAAC;AACtE;AAEA,SAAgB,wBAAwB,IAA6C;CACnF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,EAAE;EAC5B,OAAO,sBAAsB,MAAM,IAC/B,UAAA,GAAA,wBAAA,WAAA,CACW,gDAAgD;CACjE,QAAQ;EACN,MAAM,IAAI,MACR,iGACF;CACF;AACF;AAEA,SAAgB,4BACd,IACoB;CACpB,OAAOC,aAAAA,iBACL,2BAA2B;EAAE,gBAAgB;EAAM,GAAG;CAAG,CAAC,CAC5D;AACF"}
@@ -1,29 +1,39 @@
1
+ import { CanonicalizedJson } from "../../../json.js";
2
+ import { ColumnUniversalId } from "./ids.js";
1
3
  import { AxisQualification } from "./selectors.js";
2
4
  import { PObjectId } from "../../../pool/spec.js";
3
5
  import { Branded } from "@milaboratories/helpers";
4
6
 
5
7
  //#region src/drivers/pframe/spec/discovered_column.d.ts
6
- type DiscoveredPColumn = {
7
- column: PObjectId;
8
+ interface ColumnDiscoveredKey {
9
+ __isDiscovered: true;
10
+ column: ColumnUniversalId;
8
11
  path?: PathItem[];
9
12
  columnQualifications?: AxisQualification[];
10
13
  queriesQualifications?: Record<PObjectId, AxisQualification[]>;
11
- };
12
- type DiscoveredPColumnId = Branded<PObjectId, "DiscoveredPColumnId">;
14
+ }
15
+ type ColumnDiscoveredId = Branded<CanonicalizedJson<ColumnDiscoveredKey>, "ColumnDiscoveredId">;
13
16
  type PathItem = {
14
17
  type: "linker";
15
- column: PObjectId;
18
+ column: ColumnUniversalId;
16
19
  };
17
- declare function isDiscoveredPColumn(obj: unknown): obj is DiscoveredPColumn;
18
- declare function distillDiscoveredPColumn(props: DiscoveredPColumn): DiscoveredPColumn;
19
- declare function createDiscoveredPColumnId(props: {
20
- column: PObjectId;
20
+ declare function isColumnDiscoveredKey(obj: unknown): obj is ColumnDiscoveredKey;
21
+ declare function isColumnDiscoveredId(str: unknown): str is ColumnDiscoveredId;
22
+ declare function distillColumnDiscoveredKey(props: ColumnDiscoveredKey): ColumnDiscoveredKey;
23
+ declare function createColumnDiscoveredId(props: {
24
+ column: ColumnUniversalId;
25
+ path?: PathItem[];
26
+ columnQualifications?: AxisQualification[];
27
+ queriesQualifications?: Record<PObjectId, AxisQualification[]>;
28
+ }): ColumnDiscoveredId;
29
+ declare function createColumnDiscoveredKey(props: {
30
+ column: ColumnUniversalId;
21
31
  path?: PathItem[];
22
32
  columnQualifications?: AxisQualification[];
23
33
  queriesQualifications?: Record<PObjectId, AxisQualification[]>;
24
- }): DiscoveredPColumnId;
25
- declare function parseDiscoveredPColumnId(id: DiscoveredPColumnId): DiscoveredPColumn;
26
- declare function stringifyDiscoveredPColumnId(id: DiscoveredPColumn): DiscoveredPColumnId;
34
+ }): ColumnDiscoveredKey;
35
+ declare function parseColumnDiscoveredId(id: ColumnDiscoveredId): ColumnDiscoveredKey;
36
+ declare function stringifyColumnDiscoveredId(id: Omit<ColumnDiscoveredKey, "__isDiscovered">): ColumnDiscoveredId;
27
37
  //#endregion
28
- export { DiscoveredPColumn, DiscoveredPColumnId, createDiscoveredPColumnId, distillDiscoveredPColumn, isDiscoveredPColumn, parseDiscoveredPColumnId, stringifyDiscoveredPColumnId };
38
+ export { ColumnDiscoveredId, ColumnDiscoveredKey, createColumnDiscoveredId, createColumnDiscoveredKey, distillColumnDiscoveredKey, isColumnDiscoveredId, isColumnDiscoveredKey, parseColumnDiscoveredId, stringifyColumnDiscoveredId };
29
39
  //# sourceMappingURL=discovered_column.d.ts.map