@milaboratories/pl-model-common 1.24.6 → 1.24.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/drivers/pframe/filter_spec.d.ts +125 -0
- package/dist/drivers/pframe/filter_spec.d.ts.map +1 -0
- package/dist/drivers/pframe/index.d.ts +1 -0
- package/dist/drivers/pframe/index.d.ts.map +1 -1
- package/dist/drivers/pframe/query/index.d.ts +1 -0
- package/dist/drivers/pframe/query/index.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_common.d.ts +60 -8
- package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_data.d.ts +15 -15
- package/dist/drivers/pframe/query/query_data.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_spec.d.ts +19 -15
- package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
- package/dist/drivers/pframe/query/utils.cjs +205 -0
- package/dist/drivers/pframe/query/utils.cjs.map +1 -0
- package/dist/drivers/pframe/query/utils.d.ts +6 -0
- package/dist/drivers/pframe/query/utils.d.ts.map +1 -0
- package/dist/drivers/pframe/query/utils.js +201 -0
- package/dist/drivers/pframe/query/utils.js.map +1 -0
- package/dist/drivers/pframe/table_calculate.cjs +153 -0
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +12 -1
- package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
- package/dist/drivers/pframe/table_calculate.js +150 -1
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/flags/block_flags.cjs +5 -1
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts +2 -1
- package/dist/flags/block_flags.d.ts.map +1 -1
- package/dist/flags/block_flags.js +5 -1
- package/dist/flags/block_flags.js.map +1 -1
- package/dist/index.cjs +8 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/drivers/pframe/filter_spec.ts +54 -0
- package/src/drivers/pframe/index.ts +1 -0
- package/src/drivers/pframe/query/index.ts +1 -0
- package/src/drivers/pframe/query/query_common.ts +60 -8
- package/src/drivers/pframe/query/query_data.ts +40 -34
- package/src/drivers/pframe/query/query_spec.ts +50 -34
- package/src/drivers/pframe/query/utils.ts +205 -0
- package/src/drivers/pframe/table_calculate.ts +163 -1
- package/src/flags/block_flags.ts +6 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var json = require('../../../json.cjs');
|
|
4
|
+
var util = require('../../../util.cjs');
|
|
5
|
+
|
|
6
|
+
const booleanTypesSet = new Set([
|
|
7
|
+
"numericComparison",
|
|
8
|
+
"stringEquals",
|
|
9
|
+
"stringContains",
|
|
10
|
+
"stringContainsFuzzy",
|
|
11
|
+
"stringRegex",
|
|
12
|
+
"isNull",
|
|
13
|
+
"not",
|
|
14
|
+
"and",
|
|
15
|
+
"or",
|
|
16
|
+
"isIn",
|
|
17
|
+
]);
|
|
18
|
+
function isBooleanExpression(expr) {
|
|
19
|
+
return booleanTypesSet.has(
|
|
20
|
+
// @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime
|
|
21
|
+
expr.type);
|
|
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) {
|
|
30
|
+
switch (query.type) {
|
|
31
|
+
case "column":
|
|
32
|
+
result.push(query.column);
|
|
33
|
+
break;
|
|
34
|
+
case "sparseToDenseColumn":
|
|
35
|
+
result.push(query.column);
|
|
36
|
+
break;
|
|
37
|
+
case "inlineColumn":
|
|
38
|
+
break;
|
|
39
|
+
case "innerJoin":
|
|
40
|
+
case "fullJoin":
|
|
41
|
+
for (const e of query.entries)
|
|
42
|
+
collectQueryColumnsImpl(e.entry, result);
|
|
43
|
+
break;
|
|
44
|
+
case "outerJoin":
|
|
45
|
+
collectQueryColumnsImpl(query.primary.entry, result);
|
|
46
|
+
for (const e of query.secondary)
|
|
47
|
+
collectQueryColumnsImpl(e.entry, result);
|
|
48
|
+
break;
|
|
49
|
+
case "filter":
|
|
50
|
+
case "sort":
|
|
51
|
+
case "sliceAxes":
|
|
52
|
+
collectQueryColumnsImpl(query.input, result);
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
util.assertNever(query);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
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
|
+
}
|
|
113
|
+
}
|
|
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;
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
entry: sortQuerySpec(entry.entry),
|
|
122
|
+
qualifications: sortedQualifications,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function cmpQuerySpec(lhs, rhs) {
|
|
126
|
+
if (lhs.type !== rhs.type) {
|
|
127
|
+
return lhs.type < rhs.type ? -1 : 1;
|
|
128
|
+
}
|
|
129
|
+
switch (lhs.type) {
|
|
130
|
+
case "column":
|
|
131
|
+
return lhs.column < rhs.column
|
|
132
|
+
? -1
|
|
133
|
+
: lhs.column === rhs.column
|
|
134
|
+
? 0
|
|
135
|
+
: 1;
|
|
136
|
+
case "inlineColumn":
|
|
137
|
+
return lhs.spec.id < rhs.spec.id
|
|
138
|
+
? -1
|
|
139
|
+
: lhs.spec.id === rhs.spec.id
|
|
140
|
+
? 0
|
|
141
|
+
: 1;
|
|
142
|
+
case "sparseToDenseColumn":
|
|
143
|
+
return lhs.column < rhs.column
|
|
144
|
+
? -1
|
|
145
|
+
: lhs.column === rhs.column
|
|
146
|
+
? 0
|
|
147
|
+
: 1;
|
|
148
|
+
case "innerJoin":
|
|
149
|
+
case "fullJoin": {
|
|
150
|
+
const rhsJoin = rhs;
|
|
151
|
+
if (lhs.entries.length !== rhsJoin.entries.length) {
|
|
152
|
+
return lhs.entries.length - rhsJoin.entries.length;
|
|
153
|
+
}
|
|
154
|
+
for (let i = 0; i < lhs.entries.length; i++) {
|
|
155
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);
|
|
156
|
+
if (cmp !== 0)
|
|
157
|
+
return cmp;
|
|
158
|
+
}
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
161
|
+
case "outerJoin": {
|
|
162
|
+
const rhsOuter = rhs;
|
|
163
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);
|
|
164
|
+
if (cmp !== 0)
|
|
165
|
+
return cmp;
|
|
166
|
+
if (lhs.secondary.length !== rhsOuter.secondary.length) {
|
|
167
|
+
return lhs.secondary.length - rhsOuter.secondary.length;
|
|
168
|
+
}
|
|
169
|
+
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
170
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);
|
|
171
|
+
if (cmp !== 0)
|
|
172
|
+
return cmp;
|
|
173
|
+
}
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
case "sliceAxes":
|
|
177
|
+
return cmpQuerySpec(lhs.input, rhs.input);
|
|
178
|
+
case "sort":
|
|
179
|
+
return cmpQuerySpec(lhs.input, rhs.input);
|
|
180
|
+
case "filter":
|
|
181
|
+
return cmpQuerySpec(lhs.input, rhs.input);
|
|
182
|
+
default:
|
|
183
|
+
util.assertNever(lhs);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function cmpQueryJoinEntrySpec(lhs, rhs) {
|
|
187
|
+
const cmp = cmpQuerySpec(lhs.entry, rhs.entry);
|
|
188
|
+
if (cmp !== 0)
|
|
189
|
+
return cmp;
|
|
190
|
+
if (lhs.qualifications.length !== rhs.qualifications.length) {
|
|
191
|
+
return lhs.qualifications.length - rhs.qualifications.length;
|
|
192
|
+
}
|
|
193
|
+
for (let i = 0; i < lhs.qualifications.length; i++) {
|
|
194
|
+
const lhsQ = json.canonicalizeJson(lhs.qualifications[i]);
|
|
195
|
+
const rhsQ = json.canonicalizeJson(rhs.qualifications[i]);
|
|
196
|
+
if (lhsQ !== rhsQ)
|
|
197
|
+
return lhsQ < rhsQ ? -1 : 1;
|
|
198
|
+
}
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
exports.collectQueryColumns = collectQueryColumns;
|
|
203
|
+
exports.isBooleanExpression = isBooleanExpression;
|
|
204
|
+
exports.sortQuerySpec = sortQuerySpec;
|
|
205
|
+
//# sourceMappingURL=utils.cjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SpecQueryBooleanExpression, SpecQueryExpression, SpecQuery } from "./query_spec";
|
|
2
|
+
export declare function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression;
|
|
3
|
+
/** 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;
|
|
6
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { canonicalizeJson } from '../../../json.js';
|
|
2
|
+
import { assertNever } from '../../../util.js';
|
|
3
|
+
|
|
4
|
+
const booleanTypesSet = new Set([
|
|
5
|
+
"numericComparison",
|
|
6
|
+
"stringEquals",
|
|
7
|
+
"stringContains",
|
|
8
|
+
"stringContainsFuzzy",
|
|
9
|
+
"stringRegex",
|
|
10
|
+
"isNull",
|
|
11
|
+
"not",
|
|
12
|
+
"and",
|
|
13
|
+
"or",
|
|
14
|
+
"isIn",
|
|
15
|
+
]);
|
|
16
|
+
function isBooleanExpression(expr) {
|
|
17
|
+
return booleanTypesSet.has(
|
|
18
|
+
// @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime
|
|
19
|
+
expr.type);
|
|
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) {
|
|
28
|
+
switch (query.type) {
|
|
29
|
+
case "column":
|
|
30
|
+
result.push(query.column);
|
|
31
|
+
break;
|
|
32
|
+
case "sparseToDenseColumn":
|
|
33
|
+
result.push(query.column);
|
|
34
|
+
break;
|
|
35
|
+
case "inlineColumn":
|
|
36
|
+
break;
|
|
37
|
+
case "innerJoin":
|
|
38
|
+
case "fullJoin":
|
|
39
|
+
for (const e of query.entries)
|
|
40
|
+
collectQueryColumnsImpl(e.entry, result);
|
|
41
|
+
break;
|
|
42
|
+
case "outerJoin":
|
|
43
|
+
collectQueryColumnsImpl(query.primary.entry, result);
|
|
44
|
+
for (const e of query.secondary)
|
|
45
|
+
collectQueryColumnsImpl(e.entry, result);
|
|
46
|
+
break;
|
|
47
|
+
case "filter":
|
|
48
|
+
case "sort":
|
|
49
|
+
case "sliceAxes":
|
|
50
|
+
collectQueryColumnsImpl(query.input, result);
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
assertNever(query);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
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
|
+
}
|
|
111
|
+
}
|
|
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;
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
entry: sortQuerySpec(entry.entry),
|
|
120
|
+
qualifications: sortedQualifications,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function cmpQuerySpec(lhs, rhs) {
|
|
124
|
+
if (lhs.type !== rhs.type) {
|
|
125
|
+
return lhs.type < rhs.type ? -1 : 1;
|
|
126
|
+
}
|
|
127
|
+
switch (lhs.type) {
|
|
128
|
+
case "column":
|
|
129
|
+
return lhs.column < rhs.column
|
|
130
|
+
? -1
|
|
131
|
+
: lhs.column === rhs.column
|
|
132
|
+
? 0
|
|
133
|
+
: 1;
|
|
134
|
+
case "inlineColumn":
|
|
135
|
+
return lhs.spec.id < rhs.spec.id
|
|
136
|
+
? -1
|
|
137
|
+
: lhs.spec.id === rhs.spec.id
|
|
138
|
+
? 0
|
|
139
|
+
: 1;
|
|
140
|
+
case "sparseToDenseColumn":
|
|
141
|
+
return lhs.column < rhs.column
|
|
142
|
+
? -1
|
|
143
|
+
: lhs.column === rhs.column
|
|
144
|
+
? 0
|
|
145
|
+
: 1;
|
|
146
|
+
case "innerJoin":
|
|
147
|
+
case "fullJoin": {
|
|
148
|
+
const rhsJoin = rhs;
|
|
149
|
+
if (lhs.entries.length !== rhsJoin.entries.length) {
|
|
150
|
+
return lhs.entries.length - rhsJoin.entries.length;
|
|
151
|
+
}
|
|
152
|
+
for (let i = 0; i < lhs.entries.length; i++) {
|
|
153
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);
|
|
154
|
+
if (cmp !== 0)
|
|
155
|
+
return cmp;
|
|
156
|
+
}
|
|
157
|
+
return 0;
|
|
158
|
+
}
|
|
159
|
+
case "outerJoin": {
|
|
160
|
+
const rhsOuter = rhs;
|
|
161
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);
|
|
162
|
+
if (cmp !== 0)
|
|
163
|
+
return cmp;
|
|
164
|
+
if (lhs.secondary.length !== rhsOuter.secondary.length) {
|
|
165
|
+
return lhs.secondary.length - rhsOuter.secondary.length;
|
|
166
|
+
}
|
|
167
|
+
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
168
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);
|
|
169
|
+
if (cmp !== 0)
|
|
170
|
+
return cmp;
|
|
171
|
+
}
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
case "sliceAxes":
|
|
175
|
+
return cmpQuerySpec(lhs.input, rhs.input);
|
|
176
|
+
case "sort":
|
|
177
|
+
return cmpQuerySpec(lhs.input, rhs.input);
|
|
178
|
+
case "filter":
|
|
179
|
+
return cmpQuerySpec(lhs.input, rhs.input);
|
|
180
|
+
default:
|
|
181
|
+
assertNever(lhs);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function cmpQueryJoinEntrySpec(lhs, rhs) {
|
|
185
|
+
const cmp = cmpQuerySpec(lhs.entry, rhs.entry);
|
|
186
|
+
if (cmp !== 0)
|
|
187
|
+
return cmp;
|
|
188
|
+
if (lhs.qualifications.length !== rhs.qualifications.length) {
|
|
189
|
+
return lhs.qualifications.length - rhs.qualifications.length;
|
|
190
|
+
}
|
|
191
|
+
for (let i = 0; i < lhs.qualifications.length; i++) {
|
|
192
|
+
const lhsQ = canonicalizeJson(lhs.qualifications[i]);
|
|
193
|
+
const rhsQ = canonicalizeJson(rhs.qualifications[i]);
|
|
194
|
+
if (lhsQ !== rhsQ)
|
|
195
|
+
return lhsQ < rhsQ ? -1 : 1;
|
|
196
|
+
}
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export { collectQueryColumns, isBooleanExpression, sortQuerySpec };
|
|
201
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +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,10 +1,75 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var util = require('../../util.cjs');
|
|
4
|
+
var spec = require('./spec/spec.cjs');
|
|
5
|
+
var json = require('../../json.cjs');
|
|
4
6
|
|
|
5
7
|
function mapPTableDef(def, cb) {
|
|
6
8
|
return { ...def, src: mapJoinEntry(def.src, cb) };
|
|
7
9
|
}
|
|
10
|
+
function sortPTableDef(def) {
|
|
11
|
+
function sortFilters(filters) {
|
|
12
|
+
return filters.toSorted((lhs, rhs) => {
|
|
13
|
+
if (lhs.column.type === "axis" && rhs.column.type === "axis") {
|
|
14
|
+
const lhsId = json.canonicalizeJson(spec.getAxisId(lhs.column.id));
|
|
15
|
+
const rhsId = json.canonicalizeJson(spec.getAxisId(rhs.column.id));
|
|
16
|
+
return lhsId < rhsId ? -1 : 1;
|
|
17
|
+
}
|
|
18
|
+
else if (lhs.column.type === "column" && rhs.column.type === "column") {
|
|
19
|
+
return lhs.column.id < rhs.column.id ? -1 : 1;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return lhs.column.type === "axis" ? -1 : 1;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
src: sortJoinEntry(def.src),
|
|
28
|
+
partitionFilters: sortFilters(def.partitionFilters),
|
|
29
|
+
filters: sortFilters(def.filters),
|
|
30
|
+
sorting: def.sorting,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function mapPTableDefV2(def, cb) {
|
|
34
|
+
return { query: mapQuerySpec(def.query, cb) };
|
|
35
|
+
}
|
|
36
|
+
/** Recursively maps all column references in a SpecQuery tree. */
|
|
37
|
+
function mapQuerySpec(query, cb) {
|
|
38
|
+
switch (query.type) {
|
|
39
|
+
case "column":
|
|
40
|
+
return { type: "column", column: cb(query.column) };
|
|
41
|
+
case "sparseToDenseColumn":
|
|
42
|
+
return { ...query, column: cb(query.column) };
|
|
43
|
+
case "inlineColumn":
|
|
44
|
+
return query;
|
|
45
|
+
case "innerJoin":
|
|
46
|
+
case "fullJoin":
|
|
47
|
+
return {
|
|
48
|
+
...query,
|
|
49
|
+
entries: query.entries.map((e) => mapQueryJoinEntrySpec(e, cb)),
|
|
50
|
+
};
|
|
51
|
+
case "outerJoin":
|
|
52
|
+
return {
|
|
53
|
+
...query,
|
|
54
|
+
primary: mapQueryJoinEntrySpec(query.primary, cb),
|
|
55
|
+
secondary: query.secondary.map((e) => mapQueryJoinEntrySpec(e, cb)),
|
|
56
|
+
};
|
|
57
|
+
case "filter":
|
|
58
|
+
return { ...query, input: mapQuerySpec(query.input, cb) };
|
|
59
|
+
case "sort":
|
|
60
|
+
return { ...query, input: mapQuerySpec(query.input, cb) };
|
|
61
|
+
case "sliceAxes":
|
|
62
|
+
return { ...query, input: mapQuerySpec(query.input, cb) };
|
|
63
|
+
default:
|
|
64
|
+
util.assertNever(query);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function mapQueryJoinEntrySpec(entry, cb) {
|
|
68
|
+
return {
|
|
69
|
+
...entry,
|
|
70
|
+
entry: mapQuerySpec(entry.entry, cb),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
8
73
|
function mapJoinEntry(entry, cb) {
|
|
9
74
|
switch (entry.type) {
|
|
10
75
|
case "column":
|
|
@@ -44,7 +109,95 @@ function mapJoinEntry(entry, cb) {
|
|
|
44
109
|
util.assertNever(entry);
|
|
45
110
|
}
|
|
46
111
|
}
|
|
112
|
+
function cmpJoinEntries(lhs, rhs) {
|
|
113
|
+
if (lhs.type !== rhs.type) {
|
|
114
|
+
return lhs.type < rhs.type ? -1 : 1;
|
|
115
|
+
}
|
|
116
|
+
const type = lhs.type;
|
|
117
|
+
switch (type) {
|
|
118
|
+
case "column":
|
|
119
|
+
return lhs.column < rhs.column ? -1 : 1;
|
|
120
|
+
case "slicedColumn":
|
|
121
|
+
case "artificialColumn":
|
|
122
|
+
return lhs.newId < rhs.newId ? -1 : 1;
|
|
123
|
+
case "inlineColumn": {
|
|
124
|
+
return lhs.column.id < rhs.column.id ? -1 : 1;
|
|
125
|
+
}
|
|
126
|
+
case "inner":
|
|
127
|
+
case "full": {
|
|
128
|
+
const rhsInner = rhs;
|
|
129
|
+
if (lhs.entries.length !== rhsInner.entries.length) {
|
|
130
|
+
return lhs.entries.length - rhsInner.entries.length;
|
|
131
|
+
}
|
|
132
|
+
for (let i = 0; i < lhs.entries.length; i++) {
|
|
133
|
+
const cmp = cmpJoinEntries(lhs.entries[i], rhsInner.entries[i]);
|
|
134
|
+
if (cmp !== 0) {
|
|
135
|
+
return cmp;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
case "outer": {
|
|
141
|
+
const rhsOuter = rhs;
|
|
142
|
+
const cmp = cmpJoinEntries(lhs.primary, rhsOuter.primary);
|
|
143
|
+
if (cmp !== 0) {
|
|
144
|
+
return cmp;
|
|
145
|
+
}
|
|
146
|
+
if (lhs.secondary.length !== rhsOuter.secondary.length) {
|
|
147
|
+
return lhs.secondary.length - rhsOuter.secondary.length;
|
|
148
|
+
}
|
|
149
|
+
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
150
|
+
const cmp = cmpJoinEntries(lhs.secondary[i], rhsOuter.secondary[i]);
|
|
151
|
+
if (cmp !== 0) {
|
|
152
|
+
return cmp;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
default:
|
|
158
|
+
util.assertNever(type);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function sortJoinEntry(entry) {
|
|
162
|
+
switch (entry.type) {
|
|
163
|
+
case "column":
|
|
164
|
+
case "slicedColumn":
|
|
165
|
+
case "inlineColumn":
|
|
166
|
+
return entry;
|
|
167
|
+
case "artificialColumn": {
|
|
168
|
+
const sortedAxesIndices = entry.axesIndices.toSorted((lhs, rhs) => lhs - rhs);
|
|
169
|
+
return {
|
|
170
|
+
...entry,
|
|
171
|
+
axesIndices: sortedAxesIndices,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
case "inner":
|
|
175
|
+
case "full": {
|
|
176
|
+
const sortedEntries = entry.entries.map(sortJoinEntry);
|
|
177
|
+
sortedEntries.sort(cmpJoinEntries);
|
|
178
|
+
return {
|
|
179
|
+
...entry,
|
|
180
|
+
entries: sortedEntries,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
case "outer": {
|
|
184
|
+
const sortedSecondary = entry.secondary.map(sortJoinEntry);
|
|
185
|
+
sortedSecondary.sort(cmpJoinEntries);
|
|
186
|
+
return {
|
|
187
|
+
...entry,
|
|
188
|
+
primary: sortJoinEntry(entry.primary),
|
|
189
|
+
secondary: sortedSecondary,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
default:
|
|
193
|
+
util.assertNever(entry);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
47
196
|
|
|
48
197
|
exports.mapJoinEntry = mapJoinEntry;
|
|
49
198
|
exports.mapPTableDef = mapPTableDef;
|
|
199
|
+
exports.mapPTableDefV2 = mapPTableDefV2;
|
|
200
|
+
exports.mapQuerySpec = mapQuerySpec;
|
|
201
|
+
exports.sortJoinEntry = sortJoinEntry;
|
|
202
|
+
exports.sortPTableDef = sortPTableDef;
|
|
50
203
|
//# sourceMappingURL=table_calculate.cjs.map
|