@milaboratories/pl-model-common 1.24.8 → 1.24.10

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.
@@ -20,107 +20,109 @@ function isBooleanExpression(expr) {
20
20
  // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime
21
21
  expr.type);
22
22
  }
23
- /** Collects all column references from a SpecQuery tree. */
24
- function collectQueryColumns(query) {
25
- const result = [];
26
- collectQueryColumnsImpl(query, result);
27
- return result;
28
- }
29
- function collectQueryColumnsImpl(query, result) {
23
+ /**
24
+ * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.
25
+ *
26
+ * Traversal order:
27
+ * 1. Recurse into child queries
28
+ * 2. Apply `column` to transform column references in leaf nodes
29
+ * 3. Apply `joinEntry` to each join entry (with inner query already traversed)
30
+ * 4. Assemble node with transformed children
31
+ * 5. Apply `node` to the assembled node
32
+ */
33
+ function traverseQuerySpec(query, visitor) {
34
+ const traverseEntry = (entry) => {
35
+ const traversed = {
36
+ ...entry,
37
+ entry: traverseQuerySpec(entry.entry, visitor),
38
+ };
39
+ return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;
40
+ };
41
+ let result;
30
42
  switch (query.type) {
31
43
  case "column":
32
- result.push(query.column);
44
+ result = { type: "column", column: visitor.column(query.column) };
33
45
  break;
34
46
  case "sparseToDenseColumn":
35
- result.push(query.column);
47
+ result = { ...query, column: visitor.column(query.column) };
36
48
  break;
37
49
  case "inlineColumn":
50
+ result = query;
38
51
  break;
39
52
  case "innerJoin":
40
53
  case "fullJoin":
41
- for (const e of query.entries)
42
- collectQueryColumnsImpl(e.entry, result);
54
+ result = { ...query, entries: query.entries.map(traverseEntry) };
43
55
  break;
44
56
  case "outerJoin":
45
- collectQueryColumnsImpl(query.primary.entry, result);
46
- for (const e of query.secondary)
47
- collectQueryColumnsImpl(e.entry, result);
57
+ result = {
58
+ ...query,
59
+ primary: traverseEntry(query.primary),
60
+ secondary: query.secondary.map(traverseEntry),
61
+ };
48
62
  break;
49
63
  case "filter":
50
64
  case "sort":
51
65
  case "sliceAxes":
52
- collectQueryColumnsImpl(query.input, result);
66
+ result = { ...query, input: traverseQuerySpec(query.input, visitor) };
53
67
  break;
54
68
  default:
55
69
  util.assertNever(query);
56
70
  }
71
+ return visitor.node ? visitor.node(result) : result;
57
72
  }
58
- function sortQuerySpec(query) {
59
- switch (query.type) {
60
- case "column":
61
- case "inlineColumn":
62
- return query;
63
- case "sparseToDenseColumn": {
64
- const sortedAxesIndices = query.axesIndices.toSorted((lhs, rhs) => lhs - rhs);
65
- return {
66
- ...query,
67
- axesIndices: sortedAxesIndices,
68
- };
69
- }
70
- case "innerJoin":
71
- case "fullJoin": {
72
- const sortedEntries = query.entries.map(sortQueryJoinEntrySpec);
73
- sortedEntries.sort(cmpQueryJoinEntrySpec);
74
- return {
75
- ...query,
76
- entries: sortedEntries,
77
- };
78
- }
79
- case "outerJoin": {
80
- const sortedSecondary = query.secondary.map(sortQueryJoinEntrySpec);
81
- sortedSecondary.sort(cmpQueryJoinEntrySpec);
82
- return {
83
- ...query,
84
- primary: sortQueryJoinEntrySpec(query.primary),
85
- secondary: sortedSecondary,
86
- };
87
- }
88
- case "sliceAxes": {
89
- const sortedAxisFilters = query.axisFilters.toSorted((lhs, rhs) => {
90
- const lhsKey = json.canonicalizeJson(lhs.axisSelector);
91
- const rhsKey = json.canonicalizeJson(rhs.axisSelector);
92
- return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;
93
- });
94
- return {
95
- ...query,
96
- input: sortQuerySpec(query.input),
97
- axisFilters: sortedAxisFilters,
98
- };
99
- }
100
- case "sort":
101
- return {
102
- ...query,
103
- input: sortQuerySpec(query.input),
104
- };
105
- case "filter":
106
- return {
107
- ...query,
108
- input: sortQuerySpec(query.input),
109
- };
110
- default:
111
- util.assertNever(query);
112
- }
73
+ /** Recursively maps all column references in a SpecQuery tree. */
74
+ function mapSpecQueryColumns(query, cb) {
75
+ return traverseQuerySpec(query, { column: cb });
76
+ }
77
+ /** Collects all column references from a SpecQuery tree. */
78
+ function collectSpecQueryColumns(query) {
79
+ const result = [];
80
+ traverseQuerySpec(query, {
81
+ column: (c) => {
82
+ result.push(c);
83
+ return c;
84
+ },
85
+ });
86
+ return result;
113
87
  }
114
- function sortQueryJoinEntrySpec(entry) {
115
- const sortedQualifications = entry.qualifications.toSorted((lhs, rhs) => {
116
- const lhsKey = json.canonicalizeJson(lhs.axis);
117
- const rhsKey = json.canonicalizeJson(rhs.axis);
118
- return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;
88
+ function sortSpecQuery(query) {
89
+ return traverseQuerySpec(query, {
90
+ column: (c) => c,
91
+ node: (node) => {
92
+ switch (node.type) {
93
+ case "sparseToDenseColumn":
94
+ return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };
95
+ case "innerJoin":
96
+ case "fullJoin": {
97
+ const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);
98
+ return { ...node, entries: sorted };
99
+ }
100
+ case "outerJoin": {
101
+ const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
102
+ return { ...node, secondary: sorted };
103
+ }
104
+ case "sliceAxes":
105
+ return {
106
+ ...node,
107
+ axisFilters: node.axisFilters.toSorted((a, b) => {
108
+ const ak = json.canonicalizeJson(a.axisSelector);
109
+ const bk = json.canonicalizeJson(b.axisSelector);
110
+ return ak < bk ? -1 : ak === bk ? 0 : 1;
111
+ }),
112
+ };
113
+ default:
114
+ return node;
115
+ }
116
+ },
117
+ joinEntry: (entry) => ({
118
+ ...entry,
119
+ qualifications: entry.qualifications.toSorted((a, b) => {
120
+ const ak = json.canonicalizeJson(a.axis);
121
+ const bk = json.canonicalizeJson(b.axis);
122
+ return ak < bk ? -1 : ak === bk ? 0 : 1;
123
+ }),
124
+ }),
119
125
  });
120
- return {
121
- entry: sortQuerySpec(entry.entry),
122
- qualifications: sortedQualifications,
123
- };
124
126
  }
125
127
  function cmpQuerySpec(lhs, rhs) {
126
128
  if (lhs.type !== rhs.type) {
@@ -199,7 +201,9 @@ function cmpQueryJoinEntrySpec(lhs, rhs) {
199
201
  return 0;
200
202
  }
201
203
 
202
- exports.collectQueryColumns = collectQueryColumns;
204
+ exports.collectSpecQueryColumns = collectSpecQueryColumns;
203
205
  exports.isBooleanExpression = isBooleanExpression;
204
- exports.sortQuerySpec = sortQuerySpec;
206
+ exports.mapSpecQueryColumns = mapSpecQueryColumns;
207
+ exports.sortSpecQuery = sortSpecQuery;
208
+ exports.traverseQuerySpec = traverseQuerySpec;
205
209
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","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 booleanTypesSet = 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]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.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/** Collects all column references from a SpecQuery tree. */\nexport function collectQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n collectQueryColumnsImpl(query, result);\n return result;\n}\n\nfunction collectQueryColumnsImpl<C>(query: SpecQuery<C>, result: C[]): void {\n switch (query.type) {\n case \"column\":\n result.push(query.column);\n break;\n case \"sparseToDenseColumn\":\n result.push(query.column);\n break;\n case \"inlineColumn\":\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n for (const e of query.entries) collectQueryColumnsImpl(e.entry, result);\n break;\n case \"outerJoin\":\n collectQueryColumnsImpl(query.primary.entry, result);\n for (const e of query.secondary) collectQueryColumnsImpl(e.entry, result);\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n collectQueryColumnsImpl(query.input, result);\n break;\n default:\n assertNever(query);\n }\n}\n\nexport function sortQuerySpec(query: SpecQuery): SpecQuery {\n switch (query.type) {\n case \"column\":\n case \"inlineColumn\":\n return query;\n case \"sparseToDenseColumn\": {\n const sortedAxesIndices = query.axesIndices.toSorted((lhs, rhs) => lhs - rhs);\n return {\n ...query,\n axesIndices: sortedAxesIndices,\n };\n }\n case \"innerJoin\":\n case \"fullJoin\": {\n const sortedEntries = query.entries.map(sortQueryJoinEntrySpec);\n sortedEntries.sort(cmpQueryJoinEntrySpec);\n return {\n ...query,\n entries: sortedEntries,\n };\n }\n case \"outerJoin\": {\n const sortedSecondary = query.secondary.map(sortQueryJoinEntrySpec);\n sortedSecondary.sort(cmpQueryJoinEntrySpec);\n return {\n ...query,\n primary: sortQueryJoinEntrySpec(query.primary),\n secondary: sortedSecondary,\n };\n }\n case \"sliceAxes\": {\n const sortedAxisFilters = query.axisFilters.toSorted((lhs, rhs) => {\n const lhsKey = canonicalizeJson(lhs.axisSelector);\n const rhsKey = canonicalizeJson(rhs.axisSelector);\n return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;\n });\n return {\n ...query,\n input: sortQuerySpec(query.input),\n axisFilters: sortedAxisFilters,\n };\n }\n case \"sort\":\n return {\n ...query,\n input: sortQuerySpec(query.input),\n };\n case \"filter\":\n return {\n ...query,\n input: sortQuerySpec(query.input),\n };\n default:\n assertNever(query);\n }\n}\n\nfunction sortQueryJoinEntrySpec(entry: SpecQueryJoinEntry): SpecQueryJoinEntry {\n const sortedQualifications = entry.qualifications.toSorted((lhs, rhs) => {\n const lhsKey = canonicalizeJson(lhs.axis);\n const rhsKey = canonicalizeJson(rhs.axis);\n return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;\n });\n return {\n entry: sortQuerySpec(entry.entry),\n qualifications: sortedQualifications,\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.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\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 \"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 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 if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"names":["assertNever","canonicalizeJson"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","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 booleanTypesSet = 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]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.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 \"filter\":\n case \"sort\":\n case \"sliceAxes\":\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 { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\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 \"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 ...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\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.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\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 \"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 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 if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"names":["assertNever","canonicalizeJson"],"mappings":"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"}
@@ -1,6 +1,26 @@
1
- import type { SpecQueryBooleanExpression, SpecQueryExpression, SpecQuery } from "./query_spec";
1
+ import type { SpecQueryBooleanExpression, SpecQueryExpression, SpecQuery, SpecQueryJoinEntry } from "./query_spec";
2
2
  export declare function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression;
3
+ /**
4
+ * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.
5
+ *
6
+ * Traversal order:
7
+ * 1. Recurse into child queries
8
+ * 2. Apply `column` to transform column references in leaf nodes
9
+ * 3. Apply `joinEntry` to each join entry (with inner query already traversed)
10
+ * 4. Assemble node with transformed children
11
+ * 5. Apply `node` to the assembled node
12
+ */
13
+ export declare function traverseQuerySpec<C1, C2>(query: SpecQuery<C1>, visitor: {
14
+ /** Transform column references in leaf nodes (column, sparseToDenseColumn). */
15
+ column: (c: C1) => C2;
16
+ /** Visit a node after its children have been traversed. */
17
+ node?: (node: SpecQuery<C2>) => SpecQuery<C2>;
18
+ /** Visit a join entry after its inner query has been traversed. */
19
+ joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;
20
+ }): SpecQuery<C2>;
21
+ /** Recursively maps all column references in a SpecQuery tree. */
22
+ export declare function mapSpecQueryColumns<C1, C2>(query: SpecQuery<C1>, cb: (c: C1) => C2): SpecQuery<C2>;
3
23
  /** Collects all column references from a SpecQuery tree. */
4
- export declare function collectQueryColumns<C>(query: SpecQuery<C>): C[];
5
- export declare function sortQuerySpec(query: SpecQuery): SpecQuery;
24
+ export declare function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[];
25
+ export declare function sortSpecQuery(query: SpecQuery): SpecQuery;
6
26
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/query/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,SAAS,EAEV,MAAM,cAAc,CAAC;AAetB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,0BAA0B,CAKjG;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAI/D;AA8BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAuDzD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/query/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,SAAS,EACT,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAetB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,0BAA0B,CAKjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EACtC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,OAAO,EAAE;IACP,+EAA+E;IAC/E,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;IACtB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9C,mEAAmE;IACnE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,CAAC,KAAK,kBAAkB,CAAC,EAAE,CAAC,CAAC;CACvE,GACA,SAAS,CAAC,EAAE,CAAC,CAyCf;AAED,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EACxC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EACpB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,GAChB,SAAS,CAAC,EAAE,CAAC,CAEf;AAED,4DAA4D;AAC5D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CASnE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAsCzD"}
@@ -18,107 +18,109 @@ function isBooleanExpression(expr) {
18
18
  // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime
19
19
  expr.type);
20
20
  }
21
- /** Collects all column references from a SpecQuery tree. */
22
- function collectQueryColumns(query) {
23
- const result = [];
24
- collectQueryColumnsImpl(query, result);
25
- return result;
26
- }
27
- function collectQueryColumnsImpl(query, result) {
21
+ /**
22
+ * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.
23
+ *
24
+ * Traversal order:
25
+ * 1. Recurse into child queries
26
+ * 2. Apply `column` to transform column references in leaf nodes
27
+ * 3. Apply `joinEntry` to each join entry (with inner query already traversed)
28
+ * 4. Assemble node with transformed children
29
+ * 5. Apply `node` to the assembled node
30
+ */
31
+ function traverseQuerySpec(query, visitor) {
32
+ const traverseEntry = (entry) => {
33
+ const traversed = {
34
+ ...entry,
35
+ entry: traverseQuerySpec(entry.entry, visitor),
36
+ };
37
+ return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;
38
+ };
39
+ let result;
28
40
  switch (query.type) {
29
41
  case "column":
30
- result.push(query.column);
42
+ result = { type: "column", column: visitor.column(query.column) };
31
43
  break;
32
44
  case "sparseToDenseColumn":
33
- result.push(query.column);
45
+ result = { ...query, column: visitor.column(query.column) };
34
46
  break;
35
47
  case "inlineColumn":
48
+ result = query;
36
49
  break;
37
50
  case "innerJoin":
38
51
  case "fullJoin":
39
- for (const e of query.entries)
40
- collectQueryColumnsImpl(e.entry, result);
52
+ result = { ...query, entries: query.entries.map(traverseEntry) };
41
53
  break;
42
54
  case "outerJoin":
43
- collectQueryColumnsImpl(query.primary.entry, result);
44
- for (const e of query.secondary)
45
- collectQueryColumnsImpl(e.entry, result);
55
+ result = {
56
+ ...query,
57
+ primary: traverseEntry(query.primary),
58
+ secondary: query.secondary.map(traverseEntry),
59
+ };
46
60
  break;
47
61
  case "filter":
48
62
  case "sort":
49
63
  case "sliceAxes":
50
- collectQueryColumnsImpl(query.input, result);
64
+ result = { ...query, input: traverseQuerySpec(query.input, visitor) };
51
65
  break;
52
66
  default:
53
67
  assertNever(query);
54
68
  }
69
+ return visitor.node ? visitor.node(result) : result;
55
70
  }
56
- function sortQuerySpec(query) {
57
- switch (query.type) {
58
- case "column":
59
- case "inlineColumn":
60
- return query;
61
- case "sparseToDenseColumn": {
62
- const sortedAxesIndices = query.axesIndices.toSorted((lhs, rhs) => lhs - rhs);
63
- return {
64
- ...query,
65
- axesIndices: sortedAxesIndices,
66
- };
67
- }
68
- case "innerJoin":
69
- case "fullJoin": {
70
- const sortedEntries = query.entries.map(sortQueryJoinEntrySpec);
71
- sortedEntries.sort(cmpQueryJoinEntrySpec);
72
- return {
73
- ...query,
74
- entries: sortedEntries,
75
- };
76
- }
77
- case "outerJoin": {
78
- const sortedSecondary = query.secondary.map(sortQueryJoinEntrySpec);
79
- sortedSecondary.sort(cmpQueryJoinEntrySpec);
80
- return {
81
- ...query,
82
- primary: sortQueryJoinEntrySpec(query.primary),
83
- secondary: sortedSecondary,
84
- };
85
- }
86
- case "sliceAxes": {
87
- const sortedAxisFilters = query.axisFilters.toSorted((lhs, rhs) => {
88
- const lhsKey = canonicalizeJson(lhs.axisSelector);
89
- const rhsKey = canonicalizeJson(rhs.axisSelector);
90
- return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;
91
- });
92
- return {
93
- ...query,
94
- input: sortQuerySpec(query.input),
95
- axisFilters: sortedAxisFilters,
96
- };
97
- }
98
- case "sort":
99
- return {
100
- ...query,
101
- input: sortQuerySpec(query.input),
102
- };
103
- case "filter":
104
- return {
105
- ...query,
106
- input: sortQuerySpec(query.input),
107
- };
108
- default:
109
- assertNever(query);
110
- }
71
+ /** Recursively maps all column references in a SpecQuery tree. */
72
+ function mapSpecQueryColumns(query, cb) {
73
+ return traverseQuerySpec(query, { column: cb });
74
+ }
75
+ /** Collects all column references from a SpecQuery tree. */
76
+ function collectSpecQueryColumns(query) {
77
+ const result = [];
78
+ traverseQuerySpec(query, {
79
+ column: (c) => {
80
+ result.push(c);
81
+ return c;
82
+ },
83
+ });
84
+ return result;
111
85
  }
112
- function sortQueryJoinEntrySpec(entry) {
113
- const sortedQualifications = entry.qualifications.toSorted((lhs, rhs) => {
114
- const lhsKey = canonicalizeJson(lhs.axis);
115
- const rhsKey = canonicalizeJson(rhs.axis);
116
- return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;
86
+ function sortSpecQuery(query) {
87
+ return traverseQuerySpec(query, {
88
+ column: (c) => c,
89
+ node: (node) => {
90
+ switch (node.type) {
91
+ case "sparseToDenseColumn":
92
+ return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };
93
+ case "innerJoin":
94
+ case "fullJoin": {
95
+ const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);
96
+ return { ...node, entries: sorted };
97
+ }
98
+ case "outerJoin": {
99
+ const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
100
+ return { ...node, secondary: sorted };
101
+ }
102
+ case "sliceAxes":
103
+ return {
104
+ ...node,
105
+ axisFilters: node.axisFilters.toSorted((a, b) => {
106
+ const ak = canonicalizeJson(a.axisSelector);
107
+ const bk = canonicalizeJson(b.axisSelector);
108
+ return ak < bk ? -1 : ak === bk ? 0 : 1;
109
+ }),
110
+ };
111
+ default:
112
+ return node;
113
+ }
114
+ },
115
+ joinEntry: (entry) => ({
116
+ ...entry,
117
+ qualifications: entry.qualifications.toSorted((a, b) => {
118
+ const ak = canonicalizeJson(a.axis);
119
+ const bk = canonicalizeJson(b.axis);
120
+ return ak < bk ? -1 : ak === bk ? 0 : 1;
121
+ }),
122
+ }),
117
123
  });
118
- return {
119
- entry: sortQuerySpec(entry.entry),
120
- qualifications: sortedQualifications,
121
- };
122
124
  }
123
125
  function cmpQuerySpec(lhs, rhs) {
124
126
  if (lhs.type !== rhs.type) {
@@ -197,5 +199,5 @@ function cmpQueryJoinEntrySpec(lhs, rhs) {
197
199
  return 0;
198
200
  }
199
201
 
200
- export { collectQueryColumns, isBooleanExpression, sortQuerySpec };
202
+ export { collectSpecQueryColumns, isBooleanExpression, mapSpecQueryColumns, sortSpecQuery, traverseQuerySpec };
201
203
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","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 booleanTypesSet = 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]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.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/** Collects all column references from a SpecQuery tree. */\nexport function collectQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n collectQueryColumnsImpl(query, result);\n return result;\n}\n\nfunction collectQueryColumnsImpl<C>(query: SpecQuery<C>, result: C[]): void {\n switch (query.type) {\n case \"column\":\n result.push(query.column);\n break;\n case \"sparseToDenseColumn\":\n result.push(query.column);\n break;\n case \"inlineColumn\":\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n for (const e of query.entries) collectQueryColumnsImpl(e.entry, result);\n break;\n case \"outerJoin\":\n collectQueryColumnsImpl(query.primary.entry, result);\n for (const e of query.secondary) collectQueryColumnsImpl(e.entry, result);\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n collectQueryColumnsImpl(query.input, result);\n break;\n default:\n assertNever(query);\n }\n}\n\nexport function sortQuerySpec(query: SpecQuery): SpecQuery {\n switch (query.type) {\n case \"column\":\n case \"inlineColumn\":\n return query;\n case \"sparseToDenseColumn\": {\n const sortedAxesIndices = query.axesIndices.toSorted((lhs, rhs) => lhs - rhs);\n return {\n ...query,\n axesIndices: sortedAxesIndices,\n };\n }\n case \"innerJoin\":\n case \"fullJoin\": {\n const sortedEntries = query.entries.map(sortQueryJoinEntrySpec);\n sortedEntries.sort(cmpQueryJoinEntrySpec);\n return {\n ...query,\n entries: sortedEntries,\n };\n }\n case \"outerJoin\": {\n const sortedSecondary = query.secondary.map(sortQueryJoinEntrySpec);\n sortedSecondary.sort(cmpQueryJoinEntrySpec);\n return {\n ...query,\n primary: sortQueryJoinEntrySpec(query.primary),\n secondary: sortedSecondary,\n };\n }\n case \"sliceAxes\": {\n const sortedAxisFilters = query.axisFilters.toSorted((lhs, rhs) => {\n const lhsKey = canonicalizeJson(lhs.axisSelector);\n const rhsKey = canonicalizeJson(rhs.axisSelector);\n return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;\n });\n return {\n ...query,\n input: sortQuerySpec(query.input),\n axisFilters: sortedAxisFilters,\n };\n }\n case \"sort\":\n return {\n ...query,\n input: sortQuerySpec(query.input),\n };\n case \"filter\":\n return {\n ...query,\n input: sortQuerySpec(query.input),\n };\n default:\n assertNever(query);\n }\n}\n\nfunction sortQueryJoinEntrySpec(entry: SpecQueryJoinEntry): SpecQueryJoinEntry {\n const sortedQualifications = entry.qualifications.toSorted((lhs, rhs) => {\n const lhsKey = canonicalizeJson(lhs.axis);\n const rhsKey = canonicalizeJson(rhs.axis);\n return lhsKey < rhsKey ? -1 : lhsKey === rhsKey ? 0 : 1;\n });\n return {\n entry: sortQuerySpec(entry.entry),\n qualifications: sortedQualifications,\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.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\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 \"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 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 if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","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 booleanTypesSet = 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]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.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 \"filter\":\n case \"sort\":\n case \"sliceAxes\":\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 { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\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 \"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 ...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\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.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\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 \"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 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 if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"names":[],"mappings":"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"}
@@ -44,6 +44,9 @@ const Domain = {
44
44
  Alphabet: "pl7.app/alphabet",
45
45
  BlockId: "pl7.app/blockId",
46
46
  VDJ: {
47
+ Clustering: {
48
+ BlockId: "pl7.app/vdj/clustering/blockId",
49
+ },
47
50
  ScClonotypeChain: {
48
51
  Index: "pl7.app/vdj/scClonotypeChain/index",
49
52
  },
@@ -85,13 +88,19 @@ const Annotation = {
85
88
  HideDataFromUi: "pl7.app/hideDataFromUi",
86
89
  HideDataFromGraphs: "pl7.app/hideDataFromGraphs",
87
90
  IsDiscreteFilter: "pl7.app/isDiscreteFilter",
91
+ IsAnchor: "pl7.app/isAnchor",
88
92
  IsLinkerColumn: "pl7.app/isLinkerColumn",
93
+ IsScore: "pl7.app/isScore",
89
94
  IsSubset: "pl7.app/isSubset",
90
95
  Label: "pl7.app/label",
91
96
  Max: "pl7.app/max",
92
97
  Min: "pl7.app/min",
93
98
  MultipliesBy: "pl7.app/multipliesBy",
94
99
  Parents: "pl7.app/parents",
100
+ Score: {
101
+ DefaultCutoff: "pl7.app/score/defaultCutoff",
102
+ RankingOrder: "pl7.app/score/rankingOrder",
103
+ },
95
104
  Sequence: {
96
105
  Annotation: {
97
106
  Mapping: "pl7.app/sequence/annotation/mapping",
@@ -106,6 +115,7 @@ const Annotation = {
106
115
  Trace: "pl7.app/trace",
107
116
  VDJ: {
108
117
  IsAssemblingFeature: "pl7.app/vdj/isAssemblingFeature",
118
+ IsMainSequence: "pl7.app/vdj/isMainSequence",
109
119
  },
110
120
  };
111
121
  const ValueTypeSchema = zod.z.enum(["Int", "Long", "Float", "Double", "String"]);
@@ -322,15 +332,20 @@ const PColumnName = {
322
332
  RowSelection: "pl7.app/table/row-selection",
323
333
  },
324
334
  VDJ: {
335
+ LeadSelection: "pl7.app/vdj/lead-selection",
336
+ RankingOrder: "pl7.app/vdj/ranking-order",
325
337
  Sequence: "pl7.app/vdj/sequence",
326
338
  },
327
339
  };
328
340
  /// Well-known axis names
329
341
  const PAxisName = {
342
+ SampleId: "pl7.app/sampleId",
330
343
  VDJ: {
331
344
  Assay: {
332
345
  SequenceId: "pl7.app/vdj/assay/sequenceId",
333
346
  },
347
+ ClusterId: "pl7.app/vdj/clusterId",
348
+ ClonotypeKey: "pl7.app/vdj/clonotypeKey",
334
349
  ScClonotypeKey: "pl7.app/vdj/scClonotypeKey",
335
350
  },
336
351
  };