js.documents 14.4.56 → 14.4.57
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/codecs/read.cjs +2 -2
- package/dist/codecs/read.js +1 -1
- package/dist/composition-plan-CfvhXeOC.cjs +627 -0
- package/dist/composition-plan-DU9nPPN7.d.cts +102 -0
- package/dist/composition-plan-f0zaExUW.js +508 -0
- package/dist/composition-plan-l6QPO4FX.d.ts +102 -0
- package/dist/convert/composition-plan.cjs +7 -0
- package/dist/convert/composition-plan.d.cts +2 -0
- package/dist/convert/composition-plan.d.ts +2 -0
- package/dist/convert/composition-plan.js +2 -0
- package/dist/convert/composition-to-pdf.cjs +12 -12
- package/dist/convert/composition-to-pdf.d.cts +1 -1
- package/dist/convert/composition-to-pdf.d.ts +1 -1
- package/dist/convert/composition-to-pdf.js +2 -2
- package/dist/convert/composition.cjs +16 -511
- package/dist/convert/composition.d.cts +2 -85
- package/dist/convert/composition.d.ts +2 -85
- package/dist/convert/composition.js +2 -502
- package/dist/convert/convert.cjs +2 -2
- package/dist/convert/convert.js +1 -1
- package/dist/convert/from-package.cjs +3 -3
- package/dist/convert/from-package.js +2 -2
- package/dist/convert/from-pdf.cjs +18 -18
- package/dist/convert/from-pdf.js +2 -2
- package/dist/convert/local.cjs +3 -3
- package/dist/convert/local.js +1 -1
- package/dist/edit/odp/slide.cjs +4 -4
- package/dist/edit/odp/slide.d.cts +1 -1
- package/dist/edit/odp/slide.d.ts +1 -1
- package/dist/edit/odp/slide.js +1 -1
- package/dist/edit/odt/content.d.cts +1 -1
- package/dist/edit/odt/content.d.ts +1 -1
- package/dist/edit/odt/editor.cjs +4 -4
- package/dist/edit/odt/editor.d.cts +1 -1
- package/dist/edit/odt/editor.d.ts +1 -1
- package/dist/edit/odt/editor.js +1 -1
- package/dist/edit/odt/table-grid.cjs +23 -0
- package/dist/edit/odt/table-grid.d.cts +54 -0
- package/dist/edit/odt/table-grid.d.ts +54 -0
- package/dist/edit/odt/table-grid.js +2 -0
- package/dist/edit/odt/table.cjs +12 -653
- package/dist/edit/odt/table.d.cts +2 -2
- package/dist/edit/odt/table.d.ts +2 -2
- package/dist/edit/odt/table.js +2 -647
- package/dist/{evaluate-BbOsgdmN.d.cts → evaluate-BSEUxiUK.d.cts} +3 -1
- package/dist/evaluate-CEzsBx3w.cjs +564 -0
- package/dist/{evaluate-C7fmk69X.d.ts → evaluate-D8fG2ZeB.d.ts} +3 -1
- package/dist/evaluate-IK-3aMv5.js +445 -0
- package/dist/evaluate-columns-CyqKHkIW.d.cts +41 -0
- package/dist/evaluate-columns-cOo8fOfT.d.ts +41 -0
- package/dist/index.cjs +24 -24
- package/dist/index.d.cts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/index.js +8 -8
- package/dist/latex/lint.cjs +2 -2
- package/dist/latex/lint.js +1 -1
- package/dist/latex/lower-fold.cjs +6 -0
- package/dist/latex/lower-fold.d.cts +17 -0
- package/dist/latex/lower-fold.d.ts +17 -0
- package/dist/latex/lower-fold.js +2 -0
- package/dist/latex/lower.cjs +11 -617
- package/dist/latex/lower.d.cts +18 -1
- package/dist/latex/lower.d.ts +18 -1
- package/dist/latex/lower.js +2 -616
- package/dist/latex/symbols.d.cts +1 -15
- package/dist/latex/symbols.d.ts +1 -15
- package/dist/latex/temml.d.cts +1 -24
- package/dist/latex/temml.d.ts +1 -24
- package/dist/layout/engine.cjs +2 -2
- package/dist/layout/engine.js +1 -1
- package/dist/layout/reconstruct-lines.cjs +315 -0
- package/dist/layout/reconstruct-lines.d.cts +2 -0
- package/dist/layout/reconstruct-lines.d.ts +2 -0
- package/dist/layout/reconstruct-lines.js +297 -0
- package/dist/layout/reconstruct-presentations-prod.cjs +9 -0
- package/dist/layout/reconstruct-presentations-prod.d.cts +26 -0
- package/dist/layout/reconstruct-presentations-prod.d.ts +26 -0
- package/dist/layout/reconstruct-presentations-prod.js +2 -0
- package/dist/layout/reconstruct-tables.cjs +5 -0
- package/dist/layout/reconstruct-tables.d.cts +22 -0
- package/dist/layout/reconstruct-tables.d.ts +22 -0
- package/dist/layout/reconstruct-tables.js +2 -0
- package/dist/layout/reconstruct.cjs +11 -1545
- package/dist/layout/reconstruct.d.cts +2 -14
- package/dist/layout/reconstruct.d.ts +2 -14
- package/dist/layout/reconstruct.js +2 -1542
- package/dist/layout/shared.cjs +2 -2
- package/dist/layout/shared.js +1 -1
- package/dist/layout/sheets-render.cjs +19 -0
- package/dist/layout/sheets-render.d.cts +41 -0
- package/dist/layout/sheets-render.d.ts +41 -0
- package/dist/layout/sheets-render.js +2 -0
- package/dist/layout/sheets.cjs +10 -544
- package/dist/layout/sheets.d.cts +13 -2
- package/dist/layout/sheets.d.ts +13 -2
- package/dist/layout/sheets.js +2 -543
- package/dist/layout/slides.cjs +2 -2
- package/dist/layout/slides.js +1 -1
- package/dist/layout-DIJzJk4x.js +526 -0
- package/dist/layout-iuiyl_Fk.cjs +621 -0
- package/dist/layout-types-oSbHvZid.d.cts +13 -0
- package/dist/layout-types-oSbHvZid.d.ts +13 -0
- package/dist/lower-DCs3rWI7.js +618 -0
- package/dist/lower-DzOb13w4.cjs +701 -0
- package/dist/markdown/math.cjs +2 -2
- package/dist/markdown/math.js +1 -1
- package/dist/mathml/layout-stretch.cjs +16 -0
- package/dist/mathml/layout-stretch.d.cts +24 -0
- package/dist/mathml/layout-stretch.d.ts +24 -0
- package/dist/mathml/layout-stretch.js +2 -0
- package/dist/mathml/layout-types.d.cts +1 -12
- package/dist/mathml/layout-types.d.ts +1 -12
- package/dist/mathml/layout.cjs +3 -525
- package/dist/mathml/layout.d.cts +2 -2
- package/dist/mathml/layout.d.ts +2 -2
- package/dist/mathml/layout.js +1 -523
- package/dist/odb/formula/evaluate.d.cts +1 -1
- package/dist/odb/formula/evaluate.d.ts +1 -1
- package/dist/odb/report/render.d.cts +1 -1
- package/dist/odb/report/render.d.ts +1 -1
- package/dist/odb/report/source.cjs +2 -2
- package/dist/odb/report/source.d.cts +1 -1
- package/dist/odb/report/source.d.ts +1 -1
- package/dist/odb/report/source.js +1 -1
- package/dist/odb/sql/evaluate-columns.cjs +122 -0
- package/dist/odb/sql/evaluate-columns.d.cts +2 -0
- package/dist/odb/sql/evaluate-columns.d.ts +2 -0
- package/dist/odb/sql/evaluate-columns.js +114 -0
- package/dist/odb/sql/evaluate-predicates.cjs +16 -0
- package/dist/odb/sql/evaluate-predicates.d.cts +23 -0
- package/dist/odb/sql/evaluate-predicates.d.ts +23 -0
- package/dist/odb/sql/evaluate-predicates.js +2 -0
- package/dist/odb/sql/evaluate.cjs +7 -556
- package/dist/odb/sql/evaluate.d.cts +2 -2
- package/dist/odb/sql/evaluate.d.ts +2 -2
- package/dist/odb/sql/evaluate.js +2 -552
- package/dist/read-BSH--XB4.js +682 -0
- package/dist/read-CahCZMwG.cjs +759 -0
- package/dist/reconstruct-BKOCAedo.d.ts +29 -0
- package/dist/reconstruct-D4TEteZ6.d.cts +29 -0
- package/dist/reconstruct-lines-B7t66ICm.d.cts +33 -0
- package/dist/reconstruct-lines-B7t66ICm.d.ts +33 -0
- package/dist/reconstruct-presentations-prod-B5fkPiRZ.js +1256 -0
- package/dist/reconstruct-presentations-prod-X315aBmI.cjs +1375 -0
- package/dist/sheets-BQCpNXsE.cjs +700 -0
- package/dist/sheets-DWDvGN-g.js +545 -0
- package/dist/svg/read-geometry.cjs +10 -0
- package/dist/svg/read-geometry.d.cts +24 -0
- package/dist/svg/read-geometry.d.ts +24 -0
- package/dist/svg/read-geometry.js +2 -0
- package/dist/svg/read.cjs +6 -680
- package/dist/svg/read.d.cts +17 -2
- package/dist/svg/read.d.ts +17 -2
- package/dist/svg/read.js +2 -679
- package/dist/symbols-BlzXfLEe.d.cts +16 -0
- package/dist/symbols-CKm2r4D0.d.ts +16 -0
- package/dist/table-B5gSMY7w.js +649 -0
- package/dist/{table-DrE6jEWv.d.cts → table-BK_Ao-Y6.d.cts} +9 -1
- package/dist/{table-B5htMG3g.d.ts → table-CxY85YUj.d.ts} +9 -1
- package/dist/table-DqUIOSPV.cjs +840 -0
- package/dist/temml-1-I9N9DD.d.cts +25 -0
- package/dist/temml-1-I9N9DD.d.ts +25 -0
- package/package.json +1 -1
package/dist/odb/sql/evaluate.js
CHANGED
|
@@ -1,552 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
//#region src/odb/sql/evaluate.ts
|
|
4
|
-
function sqlFailure(sql) {
|
|
5
|
-
return (message) => new HsqldbSqlEvaluationError(message, sql);
|
|
6
|
-
}
|
|
7
|
-
function compareValues(left, right, sql) {
|
|
8
|
-
return compareCellValues(left, right, sqlFailure(sql));
|
|
9
|
-
}
|
|
10
|
-
function truthOfComparison(ordering, operator) {
|
|
11
|
-
switch (operator) {
|
|
12
|
-
case "=": return ordering === 0 ? "true" : "false";
|
|
13
|
-
case "<>": return ordering === 0 ? "false" : "true";
|
|
14
|
-
case "<": return ordering < 0 ? "true" : "false";
|
|
15
|
-
case ">": return ordering > 0 ? "true" : "false";
|
|
16
|
-
case "<=": return ordering <= 0 ? "true" : "false";
|
|
17
|
-
case ">=": return ordering >= 0 ? "true" : "false";
|
|
18
|
-
}
|
|
19
|
-
return assertNeverOperator(operator);
|
|
20
|
-
}
|
|
21
|
-
function notTruth(truth) {
|
|
22
|
-
if (truth === "true") return "false";
|
|
23
|
-
return truth === "false" ? "true" : "unknown";
|
|
24
|
-
}
|
|
25
|
-
function andTruth(left, right) {
|
|
26
|
-
if (left === "false" || right === "false") return "false";
|
|
27
|
-
return left === "true" && right === "true" ? "true" : "unknown";
|
|
28
|
-
}
|
|
29
|
-
function orTruth(left, right) {
|
|
30
|
-
if (left === "true" || right === "true") return "true";
|
|
31
|
-
return left === "false" && right === "false" ? "false" : "unknown";
|
|
32
|
-
}
|
|
33
|
-
function literalToValue(literal) {
|
|
34
|
-
switch (literal.kind) {
|
|
35
|
-
case "number": return {
|
|
36
|
-
kind: "number",
|
|
37
|
-
value: literal.value
|
|
38
|
-
};
|
|
39
|
-
case "string": return {
|
|
40
|
-
kind: "string",
|
|
41
|
-
value: literal.value
|
|
42
|
-
};
|
|
43
|
-
case "boolean": return {
|
|
44
|
-
kind: "boolean",
|
|
45
|
-
value: literal.value
|
|
46
|
-
};
|
|
47
|
-
case "null": return CELL_NULL;
|
|
48
|
-
}
|
|
49
|
-
return assertNeverLiteralKind(literal);
|
|
50
|
-
}
|
|
51
|
-
function likePatternToRegExp(pattern) {
|
|
52
|
-
let source = "^";
|
|
53
|
-
for (const character of pattern) if (character === "%") source += "[\\s\\S]*";
|
|
54
|
-
else if (character === "_") source += "[\\s\\S]";
|
|
55
|
-
else source += character.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
56
|
-
return new RegExp(`${source}$`);
|
|
57
|
-
}
|
|
58
|
-
function tryResolveName(candidates, ref, what, sql) {
|
|
59
|
-
const exact = candidates.find((candidate) => candidate === ref.name);
|
|
60
|
-
if (exact !== void 0) return exact;
|
|
61
|
-
if (!ref.quoted) {
|
|
62
|
-
const folded = candidates.filter((candidate) => candidate.toUpperCase() === ref.name);
|
|
63
|
-
if (folded.length > 1) throw new HsqldbSqlEvaluationError(`${what} "${ref.name}" is ambiguous—it matches ${folded.join(", ")} case-insensitively`, sql);
|
|
64
|
-
return folded[0];
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
function resolveName(candidates, ref, what, sql) {
|
|
68
|
-
const found = tryResolveName(candidates, ref, what, sql);
|
|
69
|
-
if (found !== void 0) return found;
|
|
70
|
-
throw new HsqldbSqlEvaluationError(`${what} "${ref.name}" not found—available: ${candidates.length === 0 ? "(none)" : candidates.join(", ")}`, sql);
|
|
71
|
-
}
|
|
72
|
-
function resolveTable(tables, ref, sql) {
|
|
73
|
-
const resolvedName = resolveName(tables.map((table) => table.tableName), ref, "table", sql);
|
|
74
|
-
const table = tables.find((candidate) => candidate.tableName === resolvedName);
|
|
75
|
-
if (table === void 0) throw new HsqldbSqlEvaluationError(`table "${resolvedName}" not found`, sql);
|
|
76
|
-
return table;
|
|
77
|
-
}
|
|
78
|
-
function columnAt(columns, index, sql) {
|
|
79
|
-
const column = columns[index];
|
|
80
|
-
if (column === void 0) throw new HsqldbSqlEvaluationError(`column index ${String(index)} is outside the joined column list`, sql);
|
|
81
|
-
return column;
|
|
82
|
-
}
|
|
83
|
-
function valueAtIndex(row, index, sql) {
|
|
84
|
-
const value = row[index];
|
|
85
|
-
if (value === void 0) throw new HsqldbSqlEvaluationError(`malformed joined row: it carries ${String(row.length)} values but index ${String(index)} was expected`, sql);
|
|
86
|
-
return value;
|
|
87
|
-
}
|
|
88
|
-
function tryResolveColumnIndex(columns, candidateIndices, ref, sql) {
|
|
89
|
-
let firstExact;
|
|
90
|
-
let exactCount = 0;
|
|
91
|
-
for (const index of candidateIndices) if (columns[index]?.columnName === ref.name) {
|
|
92
|
-
exactCount += 1;
|
|
93
|
-
firstExact ??= index;
|
|
94
|
-
}
|
|
95
|
-
if (exactCount > 1) throw new HsqldbSqlEvaluationError(`column "${ref.name}" is ambiguous—it matches more than one joined column named "${ref.name}"`, sql);
|
|
96
|
-
if (firstExact !== void 0) return firstExact;
|
|
97
|
-
if (!ref.quoted) {
|
|
98
|
-
let firstFolded;
|
|
99
|
-
const foldedNames = [];
|
|
100
|
-
for (const index of candidateIndices) {
|
|
101
|
-
const name = columns[index]?.columnName;
|
|
102
|
-
if (name?.toUpperCase() !== ref.name) continue;
|
|
103
|
-
foldedNames.push(name);
|
|
104
|
-
firstFolded ??= index;
|
|
105
|
-
}
|
|
106
|
-
if (foldedNames.length > 1) throw new HsqldbSqlEvaluationError(`column "${ref.name}" is ambiguous—it matches ${foldedNames.join(", ")} case-insensitively`, sql);
|
|
107
|
-
return firstFolded;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
function resolveColumnIndex(columns, candidateIndices, ref, sql) {
|
|
111
|
-
const index = tryResolveColumnIndex(columns, candidateIndices, ref, sql);
|
|
112
|
-
if (index !== void 0) return index;
|
|
113
|
-
throw new HsqldbSqlEvaluationError(`column "${ref.name}" not found—available: ${candidateIndices.length === 0 ? "(none)" : candidateIndices.map((candidate) => columns[candidate]?.columnName ?? "?").join(", ")}`, sql);
|
|
114
|
-
}
|
|
115
|
-
var ColumnResolver = class {
|
|
116
|
-
sql;
|
|
117
|
-
outer;
|
|
118
|
-
cache = /* @__PURE__ */ new Map();
|
|
119
|
-
columns;
|
|
120
|
-
qualifierNames;
|
|
121
|
-
constructor(columns, sql, outer) {
|
|
122
|
-
this.sql = sql;
|
|
123
|
-
this.outer = outer;
|
|
124
|
-
this.columns = columns;
|
|
125
|
-
this.qualifierNames = [...new Set(columns.flatMap((column) => column.qualifiers))];
|
|
126
|
-
}
|
|
127
|
-
get columnCount() {
|
|
128
|
-
return this.columns.length;
|
|
129
|
-
}
|
|
130
|
-
nameAt(index) {
|
|
131
|
-
return columnAt(this.columns, index, this.sql).columnName;
|
|
132
|
-
}
|
|
133
|
-
indexOf(ref) {
|
|
134
|
-
const cached = this.cache.get(ref);
|
|
135
|
-
if (cached !== void 0) return cached;
|
|
136
|
-
const qualifierName = ref.qualifier === void 0 ? void 0 : resolveName(this.qualifierNames, ref.qualifier, "table qualifier", this.sql);
|
|
137
|
-
const index = resolveColumnIndex(this.columns, this.candidateIndicesFor(qualifierName), ref.column, this.sql);
|
|
138
|
-
this.cache.set(ref, index);
|
|
139
|
-
return index;
|
|
140
|
-
}
|
|
141
|
-
tryLocalIndexOf(ref) {
|
|
142
|
-
const cached = this.cache.get(ref);
|
|
143
|
-
if (cached !== void 0) return cached;
|
|
144
|
-
let qualifierName;
|
|
145
|
-
if (ref.qualifier !== void 0) {
|
|
146
|
-
qualifierName = tryResolveName(this.qualifierNames, ref.qualifier, "table qualifier", this.sql);
|
|
147
|
-
if (qualifierName === void 0) return;
|
|
148
|
-
}
|
|
149
|
-
const index = tryResolveColumnIndex(this.columns, this.candidateIndicesFor(qualifierName), ref.column, this.sql);
|
|
150
|
-
if (index === void 0) return;
|
|
151
|
-
this.cache.set(ref, index);
|
|
152
|
-
return index;
|
|
153
|
-
}
|
|
154
|
-
candidateIndicesFor(qualifierName) {
|
|
155
|
-
if (qualifierName === void 0) return this.columns.map((_column, index) => index);
|
|
156
|
-
return this.columns.map((column, index) => column.qualifiers.includes(qualifierName) ? index : -1).filter((index) => index >= 0);
|
|
157
|
-
}
|
|
158
|
-
valueAt(index, row) {
|
|
159
|
-
return valueAtIndex(row, index, this.sql);
|
|
160
|
-
}
|
|
161
|
-
valueOf(ref, row) {
|
|
162
|
-
const localIndex = this.tryLocalIndexOf(ref);
|
|
163
|
-
if (localIndex !== void 0) return this.valueAt(localIndex, row);
|
|
164
|
-
if (this.outer !== void 0) return this.outer.resolver.valueOf(ref, this.outer.row);
|
|
165
|
-
return this.valueAt(this.indexOf(ref), row);
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
function operandValue(operand, row, resolver) {
|
|
169
|
-
return operand.kind === "literal" ? literalToValue(operand.literal) : resolver.valueOf(operand.column, row);
|
|
170
|
-
}
|
|
171
|
-
function evaluateLike(value, pattern, sql) {
|
|
172
|
-
const key = cellComparisonKey(value);
|
|
173
|
-
if (key === void 0) return "unknown";
|
|
174
|
-
if (key.valueClass !== "text") throw new HsqldbSqlEvaluationError(`LIKE requires a text value, but its left operand is a ${key.valueClass} value`, sql);
|
|
175
|
-
return likePatternToRegExp(pattern).test(key.text) ? "true" : "false";
|
|
176
|
-
}
|
|
177
|
-
function evaluateIn(value, values, sql) {
|
|
178
|
-
if (value.kind === "empty") return "unknown";
|
|
179
|
-
let sawNull = false;
|
|
180
|
-
for (const literal of values) {
|
|
181
|
-
const candidate = literalToValue(literal);
|
|
182
|
-
if (candidate.kind === "empty") {
|
|
183
|
-
sawNull = true;
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
if (compareValues(value, candidate, sql) === 0) return "true";
|
|
187
|
-
}
|
|
188
|
-
return sawNull ? "unknown" : "false";
|
|
189
|
-
}
|
|
190
|
-
function evaluatePredicate(predicate, row, resolver, tables, sql) {
|
|
191
|
-
switch (predicate.kind) {
|
|
192
|
-
case "comparison": {
|
|
193
|
-
const left = operandValue(predicate.left, row, resolver);
|
|
194
|
-
const right = operandValue(predicate.right, row, resolver);
|
|
195
|
-
if (left.kind === "empty" || right.kind === "empty") return "unknown";
|
|
196
|
-
return truthOfComparison(compareValues(left, right, sql), predicate.operator);
|
|
197
|
-
}
|
|
198
|
-
case "isNull": {
|
|
199
|
-
const isNull = operandValue(predicate.operand, row, resolver).kind === "empty";
|
|
200
|
-
return (predicate.negated ? !isNull : isNull) ? "true" : "false";
|
|
201
|
-
}
|
|
202
|
-
case "like": {
|
|
203
|
-
const truth = evaluateLike(operandValue(predicate.operand, row, resolver), predicate.pattern, sql);
|
|
204
|
-
return predicate.negated ? notTruth(truth) : truth;
|
|
205
|
-
}
|
|
206
|
-
case "in": {
|
|
207
|
-
const truth = evaluateIn(operandValue(predicate.operand, row, resolver), predicate.values, sql);
|
|
208
|
-
return predicate.negated ? notTruth(truth) : truth;
|
|
209
|
-
}
|
|
210
|
-
case "inSubquery": {
|
|
211
|
-
const truth = evaluateInSubquery(operandValue(predicate.operand, row, resolver), predicate.query, tables, resolver, row, sql);
|
|
212
|
-
return predicate.negated ? notTruth(truth) : truth;
|
|
213
|
-
}
|
|
214
|
-
case "between": {
|
|
215
|
-
const value = operandValue(predicate.operand, row, resolver);
|
|
216
|
-
const lower = operandValue(predicate.lower, row, resolver);
|
|
217
|
-
const upper = operandValue(predicate.upper, row, resolver);
|
|
218
|
-
if (value.kind === "empty" || lower.kind === "empty" || upper.kind === "empty") return "unknown";
|
|
219
|
-
const truth = andTruth(truthOfComparison(compareValues(value, lower, sql), ">="), truthOfComparison(compareValues(value, upper, sql), "<="));
|
|
220
|
-
return predicate.negated ? notTruth(truth) : truth;
|
|
221
|
-
}
|
|
222
|
-
case "exists": return evaluateExists(predicate.query, tables, resolver, row);
|
|
223
|
-
case "not": return notTruth(evaluatePredicate(predicate.predicate, row, resolver, tables, sql));
|
|
224
|
-
case "and": return andTruth(evaluatePredicate(predicate.left, row, resolver, tables, sql), evaluatePredicate(predicate.right, row, resolver, tables, sql));
|
|
225
|
-
case "or": return orTruth(evaluatePredicate(predicate.left, row, resolver, tables, sql), evaluatePredicate(predicate.right, row, resolver, tables, sql));
|
|
226
|
-
}
|
|
227
|
-
return assertNeverPredicateKind(predicate);
|
|
228
|
-
}
|
|
229
|
-
function evaluateInSubquery(value, query, tables, outerResolver, outerRow, sql) {
|
|
230
|
-
if (value.kind === "empty") return "unknown";
|
|
231
|
-
const result = evaluateSelectInScope(query, tables, {
|
|
232
|
-
resolver: outerResolver,
|
|
233
|
-
row: outerRow
|
|
234
|
-
});
|
|
235
|
-
if (result.columns.length !== 1) throw new HsqldbSqlEvaluationError(`IN (SELECT ...) requires the subquery to produce exactly one column, but it produced ${String(result.columns.length)} (${result.columns.length === 0 ? "none" : result.columns.join(", ")})`, sql);
|
|
236
|
-
let sawNull = false;
|
|
237
|
-
for (const candidateRow of result.rows) {
|
|
238
|
-
const candidate = candidateRow[0];
|
|
239
|
-
if (candidate === void 0) throw new HsqldbSqlEvaluationError("malformed subquery row: it declares one column but carries none", sql);
|
|
240
|
-
if (candidate.kind === "empty") {
|
|
241
|
-
sawNull = true;
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
if (compareValues(value, candidate, sql) === 0) return "true";
|
|
245
|
-
}
|
|
246
|
-
return sawNull ? "unknown" : "false";
|
|
247
|
-
}
|
|
248
|
-
function evaluateExists(query, tables, outerResolver, outerRow) {
|
|
249
|
-
return evaluateSelectInScope(query, tables, {
|
|
250
|
-
resolver: outerResolver,
|
|
251
|
-
row: outerRow
|
|
252
|
-
}).rows.length > 0 ? "true" : "false";
|
|
253
|
-
}
|
|
254
|
-
function aggregateOverValues(aggregate, values, sql) {
|
|
255
|
-
return aggregateCellValues(aggregate, values, sqlFailure(sql));
|
|
256
|
-
}
|
|
257
|
-
function compareForSort(left, right, sql) {
|
|
258
|
-
const leftNull = left.kind === "empty";
|
|
259
|
-
const rightNull = right.kind === "empty";
|
|
260
|
-
if (leftNull || rightNull) {
|
|
261
|
-
if (leftNull && rightNull) return 0;
|
|
262
|
-
return leftNull ? 1 : -1;
|
|
263
|
-
}
|
|
264
|
-
return compareValues(left, right, sql);
|
|
265
|
-
}
|
|
266
|
-
function sortRows(rows, directions, sql) {
|
|
267
|
-
return [...rows].sort((left, right) => {
|
|
268
|
-
for (const [index, direction] of directions.entries()) {
|
|
269
|
-
const leftKey = left.sortKeys[index];
|
|
270
|
-
const rightKey = right.sortKeys[index];
|
|
271
|
-
if (leftKey === void 0 || rightKey === void 0) throw new HsqldbSqlEvaluationError("an ORDER BY term has no sort key on this row", sql);
|
|
272
|
-
const ordering = compareForSort(leftKey, rightKey, sql);
|
|
273
|
-
if (ordering !== 0) return direction === "asc" ? ordering : -ordering;
|
|
274
|
-
}
|
|
275
|
-
return 0;
|
|
276
|
-
}).map((row) => row.output);
|
|
277
|
-
}
|
|
278
|
-
function groupKeyOf(values) {
|
|
279
|
-
return values.map((value) => {
|
|
280
|
-
switch (value.kind) {
|
|
281
|
-
case "empty": return "null";
|
|
282
|
-
case "boolean": return `boolean:${String(value.value)}`;
|
|
283
|
-
case "number":
|
|
284
|
-
case "percentage":
|
|
285
|
-
case "currency": return `numeric:${String(value.value)}`;
|
|
286
|
-
case "date":
|
|
287
|
-
case "time":
|
|
288
|
-
case "dateTime":
|
|
289
|
-
case "string":
|
|
290
|
-
case "error": return `text:${value.value}`;
|
|
291
|
-
}
|
|
292
|
-
return assertNeverValueKind(value);
|
|
293
|
-
}).join("\0");
|
|
294
|
-
}
|
|
295
|
-
function planSelectList(statement, resolver) {
|
|
296
|
-
const plan = [];
|
|
297
|
-
for (const item of statement.items) switch (item.kind) {
|
|
298
|
-
case "star":
|
|
299
|
-
for (let index = 0; index < resolver.columnCount; index += 1) plan.push({
|
|
300
|
-
kind: "column",
|
|
301
|
-
index,
|
|
302
|
-
text: resolver.nameAt(index)
|
|
303
|
-
});
|
|
304
|
-
break;
|
|
305
|
-
case "column":
|
|
306
|
-
plan.push({
|
|
307
|
-
kind: "column",
|
|
308
|
-
index: resolver.indexOf(item.column),
|
|
309
|
-
text: item.column.text
|
|
310
|
-
});
|
|
311
|
-
break;
|
|
312
|
-
case "aggregate": plan.push({
|
|
313
|
-
kind: "aggregate",
|
|
314
|
-
aggregate: item.aggregate,
|
|
315
|
-
argumentIndex: item.argument.kind === "star" ? void 0 : resolver.indexOf(item.argument.column),
|
|
316
|
-
outputName: item.outputName
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
return plan;
|
|
320
|
-
}
|
|
321
|
-
function planColumnNames(plan, resolver) {
|
|
322
|
-
return plan.map((item) => item.kind === "column" ? resolver.nameAt(item.index) : item.outputName);
|
|
323
|
-
}
|
|
324
|
-
function evaluateUngrouped(statement, plan, matching, resolver) {
|
|
325
|
-
const projection = plan.map((item) => {
|
|
326
|
-
if (item.kind !== "column") throw new HsqldbSqlEvaluationError(`${item.outputName} is an aggregate, so every other select-list item must be grouped`, statement.sql);
|
|
327
|
-
return item.index;
|
|
328
|
-
});
|
|
329
|
-
const orderIndices = statement.orderBy.map((term) => resolver.indexOf(term.column));
|
|
330
|
-
const sortable = matching.map((row) => ({
|
|
331
|
-
output: projection.map((index) => resolver.valueAt(index, row)),
|
|
332
|
-
sortKeys: orderIndices.map((index) => resolver.valueAt(index, row))
|
|
333
|
-
}));
|
|
334
|
-
return {
|
|
335
|
-
columns: planColumnNames(plan, resolver),
|
|
336
|
-
rows: sortRows(sortable, statement.orderBy.map((term) => term.direction), statement.sql)
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
function partitionIntoGroups(rows, groupIndices, resolver) {
|
|
340
|
-
const groups = /* @__PURE__ */ new Map();
|
|
341
|
-
for (const row of rows) {
|
|
342
|
-
const keyValues = groupIndices.map((index) => resolver.valueAt(index, row));
|
|
343
|
-
const key = groupKeyOf(keyValues);
|
|
344
|
-
const existing = groups.get(key);
|
|
345
|
-
if (existing === void 0) groups.set(key, {
|
|
346
|
-
keyValues,
|
|
347
|
-
rows: [row]
|
|
348
|
-
});
|
|
349
|
-
else existing.rows.push(row);
|
|
350
|
-
}
|
|
351
|
-
return [...groups.values()];
|
|
352
|
-
}
|
|
353
|
-
function evaluateGrouped(statement, plan, matching, resolver) {
|
|
354
|
-
const groupIndices = statement.groupBy.map((ref) => resolver.indexOf(ref));
|
|
355
|
-
for (const item of plan) if (item.kind === "column" && !groupIndices.includes(item.index)) throw new HsqldbSqlEvaluationError(`column "${item.text}" is neither grouped nor aggregated—add it to GROUP BY or wrap it in an aggregate`, statement.sql);
|
|
356
|
-
const groups = groupIndices.length === 0 ? [{
|
|
357
|
-
keyValues: [],
|
|
358
|
-
rows: [...matching]
|
|
359
|
-
}] : partitionIntoGroups(matching, groupIndices, resolver);
|
|
360
|
-
const orderPositions = statement.orderBy.map((term) => {
|
|
361
|
-
const position = groupIndices.indexOf(resolver.indexOf(term.column));
|
|
362
|
-
if (position < 0) throw new HsqldbSqlEvaluationError(`ORDER BY column "${term.column.text}" is not a GROUP BY column—a grouped result has no single value for it`, statement.sql);
|
|
363
|
-
return position;
|
|
364
|
-
});
|
|
365
|
-
const sortable = groups.map((group) => ({
|
|
366
|
-
output: plan.map((item) => {
|
|
367
|
-
if (item.kind === "aggregate") {
|
|
368
|
-
const argumentIndex = item.argumentIndex;
|
|
369
|
-
if (argumentIndex === void 0) return {
|
|
370
|
-
kind: "number",
|
|
371
|
-
value: group.rows.length
|
|
372
|
-
};
|
|
373
|
-
return aggregateOverValues(item.aggregate, group.rows.map((row) => resolver.valueAt(argumentIndex, row)), statement.sql);
|
|
374
|
-
}
|
|
375
|
-
const keyValue = group.keyValues[groupIndices.indexOf(item.index)];
|
|
376
|
-
if (keyValue === void 0) throw new HsqldbSqlEvaluationError(`grouped column "${item.text}" has no value on this group`, statement.sql);
|
|
377
|
-
return keyValue;
|
|
378
|
-
}),
|
|
379
|
-
sortKeys: orderPositions.map((position) => {
|
|
380
|
-
const keyValue = group.keyValues[position];
|
|
381
|
-
if (keyValue === void 0) throw new HsqldbSqlEvaluationError("an ORDER BY term resolved to a GROUP BY column with no value on this group", statement.sql);
|
|
382
|
-
return keyValue;
|
|
383
|
-
})
|
|
384
|
-
}));
|
|
385
|
-
return {
|
|
386
|
-
columns: planColumnNames(plan, resolver),
|
|
387
|
-
rows: sortRows(sortable, statement.orderBy.map((term) => term.direction), statement.sql)
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
function tableColumns(qualifier, table) {
|
|
391
|
-
return table.columns.map((column) => ({
|
|
392
|
-
qualifiers: [qualifier],
|
|
393
|
-
columnName: column.name
|
|
394
|
-
}));
|
|
395
|
-
}
|
|
396
|
-
function nullRow(count) {
|
|
397
|
-
return new Array(count).fill(CELL_NULL);
|
|
398
|
-
}
|
|
399
|
-
function computeNaturalSharedPairs(leftColumns, rightColumns, sql) {
|
|
400
|
-
const rightIndexByName = /* @__PURE__ */ new Map();
|
|
401
|
-
const ambiguousRightNames = /* @__PURE__ */ new Set();
|
|
402
|
-
rightColumns.forEach((column, index) => {
|
|
403
|
-
if (rightIndexByName.has(column.columnName)) ambiguousRightNames.add(column.columnName);
|
|
404
|
-
else rightIndexByName.set(column.columnName, index);
|
|
405
|
-
});
|
|
406
|
-
const pairs = [];
|
|
407
|
-
const seenNames = /* @__PURE__ */ new Set();
|
|
408
|
-
leftColumns.forEach((leftColumn, leftIndex) => {
|
|
409
|
-
const rightIndex = rightIndexByName.get(leftColumn.columnName);
|
|
410
|
-
if (rightIndex === void 0) return;
|
|
411
|
-
if (ambiguousRightNames.has(leftColumn.columnName) || seenNames.has(leftColumn.columnName)) throw new HsqldbSqlEvaluationError(`NATURAL JOIN cannot determine a unique match for column "${leftColumn.columnName}"—more than one column shares that name on one side of the join`, sql);
|
|
412
|
-
seenNames.add(leftColumn.columnName);
|
|
413
|
-
pairs.push({
|
|
414
|
-
leftIndex,
|
|
415
|
-
rightIndex,
|
|
416
|
-
columnName: leftColumn.columnName
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
return pairs;
|
|
420
|
-
}
|
|
421
|
-
function evaluateSharedColumnMatch(combined, pairs, leftColumnCount, sql) {
|
|
422
|
-
return pairs.every((pair) => {
|
|
423
|
-
const left = valueAtIndex(combined, pair.leftIndex, sql);
|
|
424
|
-
const right = valueAtIndex(combined, leftColumnCount + pair.rightIndex, sql);
|
|
425
|
-
return left.kind !== "empty" && right.kind !== "empty" && compareValues(left, right, sql) === 0;
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
function mergeSharedColumns(rawColumns, rows, sharedPairs, leftColumnCount, sql) {
|
|
429
|
-
const sharedLeftIndices = new Set(sharedPairs.map((pair) => pair.leftIndex));
|
|
430
|
-
const sharedRightIndices = new Set(sharedPairs.map((pair) => leftColumnCount + pair.rightIndex));
|
|
431
|
-
const remainingIndices = rawColumns.map((_column, index) => index).filter((index) => !sharedLeftIndices.has(index) && !sharedRightIndices.has(index));
|
|
432
|
-
return {
|
|
433
|
-
columns: [...sharedPairs.map((pair) => {
|
|
434
|
-
const leftColumn = columnAt(rawColumns, pair.leftIndex, sql);
|
|
435
|
-
const rightColumn = columnAt(rawColumns, leftColumnCount + pair.rightIndex, sql);
|
|
436
|
-
return {
|
|
437
|
-
qualifiers: [.../* @__PURE__ */ new Set([...leftColumn.qualifiers, ...rightColumn.qualifiers])],
|
|
438
|
-
columnName: leftColumn.columnName
|
|
439
|
-
};
|
|
440
|
-
}), ...remainingIndices.map((index) => columnAt(rawColumns, index, sql))],
|
|
441
|
-
rows: rows.map((row) => {
|
|
442
|
-
const mergedValues = sharedPairs.map((pair) => {
|
|
443
|
-
const leftValue = valueAtIndex(row, pair.leftIndex, sql);
|
|
444
|
-
const rightValue = valueAtIndex(row, leftColumnCount + pair.rightIndex, sql);
|
|
445
|
-
return leftValue.kind !== "empty" ? leftValue : rightValue;
|
|
446
|
-
});
|
|
447
|
-
const remainingValues = remainingIndices.map((index) => valueAtIndex(row, index, sql));
|
|
448
|
-
return [...mergedValues, ...remainingValues];
|
|
449
|
-
})
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
function applyJoinClause(left, join, tables, sql, outer) {
|
|
453
|
-
const rightTable = resolveTable(tables, join.table, sql);
|
|
454
|
-
const rightColumns = tableColumns(join.alias !== void 0 ? join.alias.name : rightTable.tableName, rightTable);
|
|
455
|
-
const leftColumnCount = left.columns.length;
|
|
456
|
-
const rawColumns = [...left.columns, ...rightColumns];
|
|
457
|
-
let onPredicate;
|
|
458
|
-
let sharedPairs = [];
|
|
459
|
-
if (join.condition.kind === "on") onPredicate = join.condition.predicate;
|
|
460
|
-
else if (join.condition.kind === "using") {
|
|
461
|
-
const allLeftIndices = left.columns.map((_column, index) => index);
|
|
462
|
-
const allRightIndices = rightColumns.map((_column, index) => index);
|
|
463
|
-
sharedPairs = join.condition.columns.map((ref) => {
|
|
464
|
-
const leftIndex = resolveColumnIndex(left.columns, allLeftIndices, ref, sql);
|
|
465
|
-
return {
|
|
466
|
-
leftIndex,
|
|
467
|
-
rightIndex: resolveColumnIndex(rightColumns, allRightIndices, ref, sql),
|
|
468
|
-
columnName: columnAt(left.columns, leftIndex, sql).columnName
|
|
469
|
-
};
|
|
470
|
-
});
|
|
471
|
-
} else if (join.condition.kind === "natural") {
|
|
472
|
-
sharedPairs = computeNaturalSharedPairs(left.columns, rightColumns, sql);
|
|
473
|
-
if (sharedPairs.length === 0) throw new HsqldbSqlEvaluationError("NATURAL JOIN found no columns shared between the joined tables", sql);
|
|
474
|
-
}
|
|
475
|
-
const rawResolver = new ColumnResolver(rawColumns, sql, outer);
|
|
476
|
-
const matchedLeft = /* @__PURE__ */ new Set();
|
|
477
|
-
const matchedRight = /* @__PURE__ */ new Set();
|
|
478
|
-
const paired = [];
|
|
479
|
-
left.rows.forEach((leftRow, leftIndex) => {
|
|
480
|
-
rightTable.rows.forEach((rightRow, rightIndex) => {
|
|
481
|
-
const combined = [...leftRow, ...rightRow];
|
|
482
|
-
if (onPredicate !== void 0 ? evaluatePredicate(onPredicate, combined, rawResolver, tables, sql) === "true" : sharedPairs.length > 0 ? evaluateSharedColumnMatch(combined, sharedPairs, leftColumnCount, sql) : true) {
|
|
483
|
-
paired.push(combined);
|
|
484
|
-
matchedLeft.add(leftIndex);
|
|
485
|
-
matchedRight.add(rightIndex);
|
|
486
|
-
}
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
if (join.joinKind === "left" || join.joinKind === "full") left.rows.forEach((leftRow, leftIndex) => {
|
|
490
|
-
if (!matchedLeft.has(leftIndex)) paired.push([...leftRow, ...nullRow(rightColumns.length)]);
|
|
491
|
-
});
|
|
492
|
-
if (join.joinKind === "right" || join.joinKind === "full") rightTable.rows.forEach((rightRow, rightIndex) => {
|
|
493
|
-
if (!matchedRight.has(rightIndex)) paired.push([...nullRow(leftColumnCount), ...rightRow]);
|
|
494
|
-
});
|
|
495
|
-
if (join.condition.kind === "using" || join.condition.kind === "natural") return mergeSharedColumns(rawColumns, paired, sharedPairs, leftColumnCount, sql);
|
|
496
|
-
return {
|
|
497
|
-
columns: rawColumns,
|
|
498
|
-
rows: paired
|
|
499
|
-
};
|
|
500
|
-
}
|
|
501
|
-
function resolveFromSource(source, tables, sql) {
|
|
502
|
-
if (source.kind === "table") {
|
|
503
|
-
const table = resolveTable(tables, source.table, sql);
|
|
504
|
-
return {
|
|
505
|
-
columns: tableColumns(source.alias !== void 0 ? source.alias.name : table.tableName, table),
|
|
506
|
-
rows: table.rows
|
|
507
|
-
};
|
|
508
|
-
}
|
|
509
|
-
const result = evaluateSelectInScope(source.query, tables, void 0);
|
|
510
|
-
return {
|
|
511
|
-
columns: result.columns.map((name) => ({
|
|
512
|
-
qualifiers: [source.alias.name],
|
|
513
|
-
columnName: name
|
|
514
|
-
})),
|
|
515
|
-
rows: result.rows
|
|
516
|
-
};
|
|
517
|
-
}
|
|
518
|
-
function joinTables(from, tables, sql, outer) {
|
|
519
|
-
let result = resolveFromSource(from.source, tables, sql);
|
|
520
|
-
for (const join of from.joins) result = applyJoinClause(result, join, tables, sql, outer);
|
|
521
|
-
return result;
|
|
522
|
-
}
|
|
523
|
-
function evaluateSelect(statement, tables) {
|
|
524
|
-
return evaluateSelectInScope(statement, tables, void 0);
|
|
525
|
-
}
|
|
526
|
-
function evaluateSelectInScope(statement, tables, outer) {
|
|
527
|
-
const { columns, rows } = joinTables(statement.from, tables, statement.sql, outer);
|
|
528
|
-
const resolver = new ColumnResolver(columns, statement.sql, outer);
|
|
529
|
-
const plan = planSelectList(statement, resolver);
|
|
530
|
-
const where = statement.where;
|
|
531
|
-
const matching = where === void 0 ? rows : rows.filter((row) => evaluatePredicate(where, row, resolver, tables, statement.sql) === "true");
|
|
532
|
-
const hasAggregate = plan.some((item) => item.kind === "aggregate");
|
|
533
|
-
if (statement.groupBy.length > 0 || hasAggregate) {
|
|
534
|
-
if (statement.groupBy.length > 0 && statement.items.some((item) => item.kind === "star")) throw new HsqldbSqlEvaluationError("SELECT * is not valid with GROUP BY—name the grouped columns and the aggregates explicitly", statement.sql);
|
|
535
|
-
return evaluateGrouped(statement, plan, matching, resolver);
|
|
536
|
-
}
|
|
537
|
-
return evaluateUngrouped(statement, plan, matching, resolver);
|
|
538
|
-
}
|
|
539
|
-
function assertNeverOperator(value) {
|
|
540
|
-
throw new Error(`documents.js: unhandled operator ${JSON.stringify(value)}`);
|
|
541
|
-
}
|
|
542
|
-
function assertNeverLiteralKind(value) {
|
|
543
|
-
throw new Error(`documents.js: unhandled literal ${JSON.stringify(value)}`);
|
|
544
|
-
}
|
|
545
|
-
function assertNeverPredicateKind(value) {
|
|
546
|
-
throw new Error(`documents.js: unhandled predicate ${JSON.stringify(value)}`);
|
|
547
|
-
}
|
|
548
|
-
function assertNeverValueKind(value) {
|
|
549
|
-
throw new Error(`documents.js: unhandled value ${JSON.stringify(value)}`);
|
|
550
|
-
}
|
|
551
|
-
//#endregion
|
|
552
|
-
export { assertNeverLiteralKind, assertNeverOperator, assertNeverPredicateKind, assertNeverValueKind, evaluateSelect };
|
|
1
|
+
import { a as evaluateSelect, i as assertNeverValueKind, n as assertNeverOperator, o as evaluateSelectInScope, r as assertNeverPredicateKind, t as assertNeverLiteralKind } from "../../evaluate-IK-3aMv5.js";
|
|
2
|
+
export { assertNeverLiteralKind, assertNeverOperator, assertNeverPredicateKind, assertNeverValueKind, evaluateSelect, evaluateSelectInScope };
|