@minnowdb/core 0.1.1 → 0.2.1
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/README.md +12 -9
- package/dist/engine/client.d.ts +10 -1
- package/dist/engine/client.d.ts.map +1 -1
- package/dist/engine/client.js +30 -5
- package/dist/engine/client.js.map +1 -1
- package/dist/engine/database.d.ts +55 -6
- package/dist/engine/database.d.ts.map +1 -1
- package/dist/engine/database.js +2689 -898
- package/dist/engine/database.js.map +1 -1
- package/dist/engine/live.d.ts +6 -2
- package/dist/engine/live.d.ts.map +1 -1
- package/dist/engine/live.js +35 -11
- package/dist/engine/live.js.map +1 -1
- package/dist/engine/query-cache.d.ts +13 -1
- package/dist/engine/query-cache.d.ts.map +1 -1
- package/dist/engine/query-cache.js +34 -5
- package/dist/engine/query-cache.js.map +1 -1
- package/dist/engine/query.d.ts +13 -1
- package/dist/engine/query.d.ts.map +1 -1
- package/dist/engine/query.js +73 -46
- package/dist/engine/query.js.map +1 -1
- package/dist/engine/result-wire.d.ts +68 -0
- package/dist/engine/result-wire.d.ts.map +1 -0
- package/dist/engine/result-wire.js +264 -0
- package/dist/engine/result-wire.js.map +1 -0
- package/dist/engine/sort-keys.d.ts +50 -12
- package/dist/engine/sort-keys.d.ts.map +1 -1
- package/dist/engine/sort-keys.js +371 -25
- package/dist/engine/sort-keys.js.map +1 -1
- package/dist/engine/vector.d.ts +11 -0
- package/dist/engine/vector.d.ts.map +1 -1
- package/dist/engine/vector.js +99 -203
- package/dist/engine/vector.js.map +1 -1
- package/dist/engine/worker-host.d.ts +17 -1
- package/dist/engine/worker-host.d.ts.map +1 -1
- package/dist/engine/worker-host.js +87 -13
- package/dist/engine/worker-host.js.map +1 -1
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +13 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/indexeddb.d.ts +5 -1
- package/dist/storage/indexeddb.d.ts.map +1 -1
- package/dist/storage/indexeddb.js +484 -402
- package/dist/storage/indexeddb.js.map +1 -1
- package/dist/storage/memory.d.ts +24 -21
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +124 -1199
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/opfs/files.d.ts +64 -0
- package/dist/storage/opfs/files.d.ts.map +1 -0
- package/dist/storage/opfs/files.js +243 -0
- package/dist/storage/opfs/files.js.map +1 -0
- package/dist/storage/opfs/index.d.ts +3 -0
- package/dist/storage/opfs/index.d.ts.map +1 -0
- package/dist/storage/opfs/index.js +3 -0
- package/dist/storage/opfs/index.js.map +1 -0
- package/dist/storage/opfs/leader.d.ts +130 -0
- package/dist/storage/opfs/leader.d.ts.map +1 -0
- package/dist/storage/opfs/leader.js +1104 -0
- package/dist/storage/opfs/leader.js.map +1 -0
- package/dist/storage/opfs/rpc.d.ts +70 -0
- package/dist/storage/opfs/rpc.d.ts.map +1 -0
- package/dist/storage/opfs/rpc.js +58 -0
- package/dist/storage/opfs/rpc.js.map +1 -0
- package/dist/storage/opfs/store.d.ts +154 -0
- package/dist/storage/opfs/store.d.ts.map +1 -0
- package/dist/storage/opfs/store.js +958 -0
- package/dist/storage/opfs/store.js.map +1 -0
- package/dist/storage/toolkit/extents.d.ts +69 -0
- package/dist/storage/toolkit/extents.d.ts.map +1 -0
- package/dist/storage/toolkit/extents.js +175 -0
- package/dist/storage/toolkit/extents.js.map +1 -0
- package/dist/storage/toolkit/index.d.ts +30 -0
- package/dist/storage/toolkit/index.d.ts.map +1 -0
- package/dist/storage/toolkit/index.js +5 -0
- package/dist/storage/toolkit/index.js.map +1 -0
- package/dist/storage/toolkit/record-core.d.ts +252 -0
- package/dist/storage/toolkit/record-core.d.ts.map +1 -0
- package/dist/storage/toolkit/record-core.js +1670 -0
- package/dist/storage/toolkit/record-core.js.map +1 -0
- package/dist/storage/toolkit/sync-file.d.ts +29 -0
- package/dist/storage/toolkit/sync-file.d.ts.map +1 -0
- package/dist/storage/toolkit/sync-file.js +2 -0
- package/dist/storage/toolkit/sync-file.js.map +1 -0
- package/dist/storage/toolkit/wal.d.ts +22 -0
- package/dist/storage/toolkit/wal.d.ts.map +1 -0
- package/dist/storage/toolkit/wal.js +79 -0
- package/dist/storage/toolkit/wal.js.map +1 -0
- package/dist/storage/toolkit/wire.d.ts +25 -0
- package/dist/storage/toolkit/wire.d.ts.map +1 -0
- package/dist/storage/toolkit/wire.js +100 -0
- package/dist/storage/toolkit/wire.js.map +1 -0
- package/dist/storage/types.d.ts +343 -59
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +112 -11
- package/dist/storage/types.js.map +1 -1
- package/dist/testing/block-store-conformance.d.ts +51 -0
- package/dist/testing/block-store-conformance.d.ts.map +1 -0
- package/dist/testing/block-store-conformance.js +745 -0
- package/dist/testing/block-store-conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/opfs-shim.d.ts +35 -0
- package/dist/testing/opfs-shim.d.ts.map +1 -0
- package/dist/testing/opfs-shim.js +295 -0
- package/dist/testing/opfs-shim.js.map +1 -0
- package/dist/transactions/index.d.ts +42 -1
- package/dist/transactions/index.d.ts.map +1 -1
- package/dist/transactions/index.js +219 -13
- package/dist/transactions/index.js.map +1 -1
- package/dist/worker-protocol/index.d.ts +2 -2
- package/dist/worker-protocol/index.d.ts.map +1 -1
- package/dist/worker-protocol/index.js +2 -1
- package/dist/worker-protocol/index.js.map +1 -1
- package/package.json +10 -2
- package/sql-feature-matrix.json +8 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { QueryResult, QueryRow, QueryValue } from "./query.js";
|
|
2
|
+
/**
|
|
3
|
+
* The shape a query result takes on the worker channel. A result is rows of objects at the
|
|
4
|
+
* public API on both sides, but row objects are the slowest thing structured clone can be
|
|
5
|
+
* handed: every row is a fresh object with its own property names. Pivoted into one array per
|
|
6
|
+
* column — numbers, booleans, and datetimes in typed arrays whose buffers are transferred, and
|
|
7
|
+
* strings as one flat text with offsets — the same 20,000-row result crosses in a fraction of the
|
|
8
|
+
* time, and the receiving side rebuilds the rows column by column in tight loops.
|
|
9
|
+
*
|
|
10
|
+
* Every value round-trips exactly: NaN, -0, and Infinity survive in a Float64Array, datetimes
|
|
11
|
+
* travel as epoch milliseconds (an invalid Date's NaN included), nulls in a typed column live in
|
|
12
|
+
* a byte mask, and a column name like `__proto__` comes back as the own property the engine
|
|
13
|
+
* defined — never as a prototype assignment.
|
|
14
|
+
*/
|
|
15
|
+
export type WireResultColumn = {
|
|
16
|
+
kind: "number";
|
|
17
|
+
values: Float64Array;
|
|
18
|
+
nulls?: Uint8Array;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "boolean";
|
|
21
|
+
values: Uint8Array;
|
|
22
|
+
nulls?: Uint8Array;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "datetime";
|
|
25
|
+
values: Float64Array;
|
|
26
|
+
nulls?: Uint8Array;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Every string in the column joined into one flat text, with `offsets[i]..offsets[i + 1]`
|
|
30
|
+
* delimiting row i. Structured clone copies one string instead of walking thousands, and the
|
|
31
|
+
* receiver slices rows back out of it — far cheaper on the main thread than an array of
|
|
32
|
+
* separate strings, which is the form the engine's decoded values would otherwise take.
|
|
33
|
+
*/
|
|
34
|
+
| {
|
|
35
|
+
kind: "string";
|
|
36
|
+
text: string;
|
|
37
|
+
offsets: Uint32Array;
|
|
38
|
+
nulls?: Uint8Array;
|
|
39
|
+
}
|
|
40
|
+
/** A column holding more than one type, which SQL allows (`SELECT CASE … END`). */
|
|
41
|
+
| {
|
|
42
|
+
kind: "mixed";
|
|
43
|
+
values: QueryValue[];
|
|
44
|
+
}
|
|
45
|
+
/** Every value null; nothing to carry beyond the row count. */
|
|
46
|
+
| {
|
|
47
|
+
kind: "null";
|
|
48
|
+
};
|
|
49
|
+
export interface WireQueryResult {
|
|
50
|
+
readonly kind: "columnar-result";
|
|
51
|
+
readonly columns: string[];
|
|
52
|
+
readonly rowCount: number;
|
|
53
|
+
readonly values: WireResultColumn[];
|
|
54
|
+
}
|
|
55
|
+
export interface EncodedQueryResult {
|
|
56
|
+
payload: WireQueryResult;
|
|
57
|
+
/** The typed-array buffers, freshly allocated here, so postMessage may transfer them. */
|
|
58
|
+
transfer: ArrayBuffer[];
|
|
59
|
+
}
|
|
60
|
+
export declare function encodeQueryResult(result: QueryResult): EncodedQueryResult;
|
|
61
|
+
/**
|
|
62
|
+
* Encodes a bare row array (`run()` returns rows without a column list). Every row of one result
|
|
63
|
+
* carries the same keys in the same order, so the first row names the columns.
|
|
64
|
+
*/
|
|
65
|
+
export declare function encodeQueryRows(rows: readonly QueryRow[]): EncodedQueryResult;
|
|
66
|
+
export declare function decodeQueryResult(payload: unknown): QueryResult;
|
|
67
|
+
export declare function isWireQueryResult(value: unknown): value is WireQueryResult;
|
|
68
|
+
//# sourceMappingURL=result-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-wire.d.ts","sourceRoot":"","sources":["../../src/engine/result-wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAE;AAChE;;;;;GAKG;GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAE;AAC5E,mFAAmF;GACjF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE;AACzC,+DAA+D;GAC7D;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,CAAC;IACzB,yFAAyF;IACzF,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,CAEzE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,kBAAkB,CAG7E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAe/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAS1E"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
export function encodeQueryResult(result) {
|
|
2
|
+
return encodeRows(result.columns, result.rows);
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Encodes a bare row array (`run()` returns rows without a column list). Every row of one result
|
|
6
|
+
* carries the same keys in the same order, so the first row names the columns.
|
|
7
|
+
*/
|
|
8
|
+
export function encodeQueryRows(rows) {
|
|
9
|
+
const first = rows[0];
|
|
10
|
+
return encodeRows(first === undefined ? [] : Object.keys(first), rows);
|
|
11
|
+
}
|
|
12
|
+
export function decodeQueryResult(payload) {
|
|
13
|
+
if (!isWireQueryResult(payload)) {
|
|
14
|
+
throw new TypeError("Expected a columnar query result frame");
|
|
15
|
+
}
|
|
16
|
+
const columns = [...payload.columns];
|
|
17
|
+
const rows = [];
|
|
18
|
+
for (let index = 0; index < payload.rowCount; index += 1)
|
|
19
|
+
rows.push({});
|
|
20
|
+
// Column by column: each fill loop stores one property name into every row, which the engine
|
|
21
|
+
// runs noticeably faster than visiting every column of each row in turn.
|
|
22
|
+
for (const [position, name] of columns.entries()) {
|
|
23
|
+
const column = payload.values[position];
|
|
24
|
+
if (column === undefined)
|
|
25
|
+
throw new TypeError("Columnar result frame is missing a column");
|
|
26
|
+
fillColumn(rows, name, column);
|
|
27
|
+
}
|
|
28
|
+
return { columns, rows };
|
|
29
|
+
}
|
|
30
|
+
export function isWireQueryResult(value) {
|
|
31
|
+
return (typeof value === "object" &&
|
|
32
|
+
value !== null &&
|
|
33
|
+
value.kind === "columnar-result" &&
|
|
34
|
+
Array.isArray(value.columns) &&
|
|
35
|
+
Array.isArray(value.values) &&
|
|
36
|
+
typeof value.rowCount === "number");
|
|
37
|
+
}
|
|
38
|
+
function encodeRows(columns, rows) {
|
|
39
|
+
const transfer = [];
|
|
40
|
+
const values = columns.map((name) => {
|
|
41
|
+
const column = encodeColumn(name, rows);
|
|
42
|
+
if (column.kind === "number" || column.kind === "boolean" || column.kind === "datetime") {
|
|
43
|
+
transfer.push(column.values.buffer);
|
|
44
|
+
if (column.nulls !== undefined)
|
|
45
|
+
transfer.push(column.nulls.buffer);
|
|
46
|
+
}
|
|
47
|
+
else if (column.kind === "string") {
|
|
48
|
+
transfer.push(column.offsets.buffer);
|
|
49
|
+
if (column.nulls !== undefined)
|
|
50
|
+
transfer.push(column.nulls.buffer);
|
|
51
|
+
}
|
|
52
|
+
return column;
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
payload: { kind: "columnar-result", columns: [...columns], rowCount: rows.length, values },
|
|
56
|
+
transfer,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The first non-null value picks the column's typed form; a later value of another type demotes
|
|
61
|
+
* the whole column to the mixed form, which is rare enough to restart from scratch rather than
|
|
62
|
+
* to plan for.
|
|
63
|
+
*/
|
|
64
|
+
function encodeColumn(name, rows) {
|
|
65
|
+
const rowCount = rows.length;
|
|
66
|
+
let start = 0;
|
|
67
|
+
while (start < rowCount && (rows[start]?.[name] ?? null) === null)
|
|
68
|
+
start += 1;
|
|
69
|
+
const first = rows[start]?.[name] ?? null;
|
|
70
|
+
if (first === null)
|
|
71
|
+
return { kind: "null" };
|
|
72
|
+
if (typeof first === "number") {
|
|
73
|
+
const values = new Float64Array(rowCount);
|
|
74
|
+
let nulls = start === 0 ? undefined : nullMask(rowCount, start);
|
|
75
|
+
for (let index = start; index < rowCount; index += 1) {
|
|
76
|
+
const value = rows[index]?.[name] ?? null;
|
|
77
|
+
if (value === null) {
|
|
78
|
+
nulls ??= new Uint8Array(rowCount);
|
|
79
|
+
nulls[index] = 1;
|
|
80
|
+
}
|
|
81
|
+
else if (typeof value === "number") {
|
|
82
|
+
values[index] = value;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return encodeMixed(name, rows);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return nulls === undefined ? { kind: "number", values } : { kind: "number", values, nulls };
|
|
89
|
+
}
|
|
90
|
+
if (typeof first === "boolean") {
|
|
91
|
+
const values = new Uint8Array(rowCount);
|
|
92
|
+
let nulls = start === 0 ? undefined : nullMask(rowCount, start);
|
|
93
|
+
for (let index = start; index < rowCount; index += 1) {
|
|
94
|
+
const value = rows[index]?.[name] ?? null;
|
|
95
|
+
if (value === null) {
|
|
96
|
+
nulls ??= new Uint8Array(rowCount);
|
|
97
|
+
nulls[index] = 1;
|
|
98
|
+
}
|
|
99
|
+
else if (typeof value === "boolean") {
|
|
100
|
+
values[index] = value ? 1 : 0;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
return encodeMixed(name, rows);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return nulls === undefined ? { kind: "boolean", values } : { kind: "boolean", values, nulls };
|
|
107
|
+
}
|
|
108
|
+
if (first instanceof Date) {
|
|
109
|
+
const values = new Float64Array(rowCount);
|
|
110
|
+
let nulls = start === 0 ? undefined : nullMask(rowCount, start);
|
|
111
|
+
for (let index = start; index < rowCount; index += 1) {
|
|
112
|
+
const value = rows[index]?.[name] ?? null;
|
|
113
|
+
if (value === null) {
|
|
114
|
+
nulls ??= new Uint8Array(rowCount);
|
|
115
|
+
nulls[index] = 1;
|
|
116
|
+
}
|
|
117
|
+
else if (value instanceof Date) {
|
|
118
|
+
values[index] = value.getTime();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
return encodeMixed(name, rows);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return nulls === undefined ? { kind: "datetime", values } : { kind: "datetime", values, nulls };
|
|
125
|
+
}
|
|
126
|
+
if (typeof first === "string") {
|
|
127
|
+
const offsets = new Uint32Array(rowCount + 1);
|
|
128
|
+
let nulls = start === 0 ? undefined : nullMask(rowCount, start);
|
|
129
|
+
const parts = [];
|
|
130
|
+
let length = 0;
|
|
131
|
+
for (let index = start; index < rowCount; index += 1) {
|
|
132
|
+
const value = rows[index]?.[name] ?? null;
|
|
133
|
+
if (value === null) {
|
|
134
|
+
nulls ??= new Uint8Array(rowCount);
|
|
135
|
+
nulls[index] = 1;
|
|
136
|
+
}
|
|
137
|
+
else if (typeof value === "string") {
|
|
138
|
+
parts.push(value);
|
|
139
|
+
length += value.length;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
return encodeMixed(name, rows);
|
|
143
|
+
}
|
|
144
|
+
offsets[index + 1] = length;
|
|
145
|
+
}
|
|
146
|
+
const text = parts.join("");
|
|
147
|
+
return nulls === undefined
|
|
148
|
+
? { kind: "string", text, offsets }
|
|
149
|
+
: { kind: "string", text, offsets, nulls };
|
|
150
|
+
}
|
|
151
|
+
return encodeMixed(name, rows);
|
|
152
|
+
}
|
|
153
|
+
function encodeMixed(name, rows) {
|
|
154
|
+
return { kind: "mixed", values: rows.map((row) => row[name] ?? null) };
|
|
155
|
+
}
|
|
156
|
+
/** A null mask whose first `nullCount` rows are already null. */
|
|
157
|
+
function nullMask(rowCount, nullCount) {
|
|
158
|
+
const nulls = new Uint8Array(rowCount);
|
|
159
|
+
nulls.fill(1, 0, nullCount);
|
|
160
|
+
return nulls;
|
|
161
|
+
}
|
|
162
|
+
/** Stores one decoded column into every row under `name`. */
|
|
163
|
+
function fillColumn(rows, name, column) {
|
|
164
|
+
if (name === "__proto__") {
|
|
165
|
+
// Assignment through `row["__proto__"]` would set the prototype; this column goes through
|
|
166
|
+
// Object.defineProperty, which is what the engine itself does for the name.
|
|
167
|
+
const values = decodeColumnValues(column, rows.length);
|
|
168
|
+
let index = 0;
|
|
169
|
+
for (const row of rows) {
|
|
170
|
+
Object.defineProperty(row, name, {
|
|
171
|
+
value: values[index] ?? null,
|
|
172
|
+
enumerable: true,
|
|
173
|
+
configurable: true,
|
|
174
|
+
writable: true,
|
|
175
|
+
});
|
|
176
|
+
index += 1;
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
let index = 0;
|
|
181
|
+
switch (column.kind) {
|
|
182
|
+
case "number": {
|
|
183
|
+
const { values, nulls } = column;
|
|
184
|
+
if (nulls === undefined) {
|
|
185
|
+
for (const row of rows) {
|
|
186
|
+
row[name] = values[index] ?? 0;
|
|
187
|
+
index += 1;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
for (const row of rows) {
|
|
192
|
+
row[name] = nulls[index] === 1 ? null : (values[index] ?? 0);
|
|
193
|
+
index += 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
case "boolean": {
|
|
199
|
+
const { values, nulls } = column;
|
|
200
|
+
for (const row of rows) {
|
|
201
|
+
row[name] = nulls?.[index] === 1 ? null : values[index] === 1;
|
|
202
|
+
index += 1;
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
case "datetime": {
|
|
207
|
+
const { values, nulls } = column;
|
|
208
|
+
for (const row of rows) {
|
|
209
|
+
row[name] = nulls?.[index] === 1 ? null : new Date(values[index] ?? 0);
|
|
210
|
+
index += 1;
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
case "string": {
|
|
215
|
+
const { text, offsets, nulls } = column;
|
|
216
|
+
for (const row of rows) {
|
|
217
|
+
row[name] =
|
|
218
|
+
nulls?.[index] === 1 ? null : text.slice(offsets[index] ?? 0, offsets[index + 1] ?? 0);
|
|
219
|
+
index += 1;
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
case "mixed": {
|
|
224
|
+
const { values } = column;
|
|
225
|
+
for (const row of rows) {
|
|
226
|
+
row[name] = values[index] ?? null;
|
|
227
|
+
index += 1;
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
case "null":
|
|
232
|
+
for (const row of rows)
|
|
233
|
+
row[name] = null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/** One column back into plain values, for the one name that cannot be assigned through. */
|
|
237
|
+
function decodeColumnValues(column, rowCount) {
|
|
238
|
+
const values = [];
|
|
239
|
+
for (let index = 0; index < rowCount; index += 1) {
|
|
240
|
+
switch (column.kind) {
|
|
241
|
+
case "number":
|
|
242
|
+
values.push(column.nulls?.[index] === 1 ? null : (column.values[index] ?? 0));
|
|
243
|
+
break;
|
|
244
|
+
case "boolean":
|
|
245
|
+
values.push(column.nulls?.[index] === 1 ? null : column.values[index] === 1);
|
|
246
|
+
break;
|
|
247
|
+
case "datetime":
|
|
248
|
+
values.push(column.nulls?.[index] === 1 ? null : new Date(column.values[index] ?? 0));
|
|
249
|
+
break;
|
|
250
|
+
case "string":
|
|
251
|
+
values.push(column.nulls?.[index] === 1
|
|
252
|
+
? null
|
|
253
|
+
: column.text.slice(column.offsets[index] ?? 0, column.offsets[index + 1] ?? 0));
|
|
254
|
+
break;
|
|
255
|
+
case "mixed":
|
|
256
|
+
values.push(column.values[index] ?? null);
|
|
257
|
+
break;
|
|
258
|
+
case "null":
|
|
259
|
+
values.push(null);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return values;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=result-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-wire.js","sourceRoot":"","sources":["../../src/engine/result-wire.ts"],"names":[],"mappings":"AA6CA,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,6FAA6F;IAC7F,yEAAyE;IACzE,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QAC3F,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA4B,CAAC,IAAI,KAAK,iBAAiB;QACxD,KAAK,CAAC,OAAO,CAAE,KAA+B,CAAC,OAAO,CAAC;QACvD,KAAK,CAAC,OAAO,CAAE,KAA8B,CAAC,MAAM,CAAC;QACrD,OAAQ,KAAgC,CAAC,QAAQ,KAAK,QAAQ,CAC/D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,OAA0B,EAAE,IAAyB;IACvE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxF,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAqB,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAqB,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;QAC1F,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,IAAyB;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,KAAK,IAAI,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,KAAK,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,KAAK,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,KAAK,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,KAAK,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,KAAK,KAAK,SAAS;YACxB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;YACnC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAyB;IAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,iEAAiE;AACjE,SAAS,QAAQ,CAAC,QAAgB,EAAE,SAAiB;IACnD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,SAAS,UAAU,CAAC,IAAgB,EAAE,IAAY,EAAE,MAAwB;IAC1E,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,0FAA0F;QAC1F,4EAA4E;QAC5E,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI;gBAC5B,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/B,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7D,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9D,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvE,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC;oBACP,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzF,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;gBAClC,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM;YACT,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,SAAS,kBAAkB,CAAC,MAAwB,EAAE,QAAgB;IACpE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ;gBACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9E,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7E,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtF,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;oBACzB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAClF,CAAC;gBACF,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Order-by keys prepared for
|
|
2
|
+
* Order-by keys prepared for sorting, and the sort that runs over them.
|
|
3
3
|
*
|
|
4
4
|
* Sorting is comparison-bound: a merge over n rows performs O(n log n) of them, so what one
|
|
5
5
|
* comparison costs decides what the sort costs. Reading a value out of a row by name and then
|
|
6
|
-
* dispatching on its type at every step is most of that cost, and
|
|
6
|
+
* dispatching on its type at every step is most of that cost, and all of it is avoidable —
|
|
7
7
|
* the values are known before the sort starts, and a term's type does not vary row to row.
|
|
8
8
|
*
|
|
9
|
-
* Each term is extracted once into its own column. A term whose values are all numbers —
|
|
10
|
-
* includes every datetime, since extraction unboxes them to epoch milliseconds —
|
|
11
|
-
* Float64Array beside a null mask
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
9
|
+
* Each term is extracted once into its own column. A term whose values are all numbers —
|
|
10
|
+
* which includes every datetime, since extraction unboxes them to epoch milliseconds — or all
|
|
11
|
+
* booleans is stored in a Float64Array beside a null mask. A string term is stored the same
|
|
12
|
+
* way, as the rank of each string among the sorted distinct values: the dictionary a string
|
|
13
|
+
* vector already carries is exactly that set, and comparing two ranks orders the two strings.
|
|
14
|
+
* Only a term that mixes types keeps its values and the generic comparison.
|
|
15
|
+
*
|
|
16
|
+
* With the keys unboxed, the sort itself stops comparing. `sortKeyIndexes` radix-sorts the
|
|
17
|
+
* leading key's float bits, recognizes input that already arrives in order, and only falls back
|
|
18
|
+
* to a comparison merge for the terms it cannot encode. Ties on one term are broken by the
|
|
19
|
+
* next, so what a multi-term sort pays for its later terms is proportional to how many rows tie
|
|
20
|
+
* on the earlier ones.
|
|
15
21
|
*/
|
|
16
22
|
export interface SortKeyColumn {
|
|
17
23
|
/**
|
|
@@ -19,18 +25,50 @@ export interface SortKeyColumn {
|
|
|
19
25
|
* SQLite. Direction and an explicit NULLS FIRST/LAST stay with the caller: a placement is
|
|
20
26
|
* absolute, while direction negates the value comparison.
|
|
21
27
|
*
|
|
22
|
-
* Specialized when the column is built, so
|
|
28
|
+
* Specialized when the column is built, so a comparison that runs millions of times is a
|
|
23
29
|
* closure over one representation rather than a branch on which representation it holds.
|
|
24
30
|
*/
|
|
25
31
|
readonly compare: (left: number, right: number) => number;
|
|
26
32
|
readonly isNull: (index: number) => boolean;
|
|
33
|
+
/**
|
|
34
|
+
* The unboxed keys, when the column has them: numbers, epoch milliseconds, 0/1 for booleans,
|
|
35
|
+
* or string ranks. Both arrays are present or neither is. Equal numbers mean equal keys and
|
|
36
|
+
* their order is the order `compare` reports, so a sort can work on these alone.
|
|
37
|
+
*/
|
|
38
|
+
readonly numbers: Float64Array | undefined;
|
|
39
|
+
readonly nulls: Uint8Array | undefined;
|
|
40
|
+
}
|
|
41
|
+
/** One ORDER BY term as the sort sees it: its keys, its direction, and its NULL placement. */
|
|
42
|
+
export interface SortKeyTerm {
|
|
43
|
+
readonly column: SortKeyColumn;
|
|
44
|
+
readonly descending: boolean;
|
|
45
|
+
readonly nulls: "first" | "last" | undefined;
|
|
27
46
|
}
|
|
28
47
|
/** Unwraps a datetime to the number the comparisons use; every other value passes through. */
|
|
29
48
|
export declare function comparableSortValue(value: unknown): unknown;
|
|
30
49
|
/**
|
|
31
|
-
* Extracts one term's values into a comparison-ready column. `valueAt` is called
|
|
32
|
-
*
|
|
33
|
-
*
|
|
50
|
+
* Extracts one term's values into a comparison-ready column. `valueAt` is called once per row,
|
|
51
|
+
* so a caller that reads through a row object or a vector pays that cost once rather than once
|
|
52
|
+
* per comparison. A term that mixes types cannot be unboxed; it is read a second time into the
|
|
53
|
+
* generic column, whose comparison reports the type error the way it always has.
|
|
54
|
+
*
|
|
55
|
+
* Strings are always ranked, whatever their cardinality. Measured at 200k rows, ranking wins by
|
|
56
|
+
* ten times when six strings repeat and still by three times when nearly every string is
|
|
57
|
+
* distinct: the distinct set sorts with the engine's own string sort, the rows then sort as
|
|
58
|
+
* numbers, and neither pays the per-comparison dispatch the generic path does.
|
|
34
59
|
*/
|
|
35
60
|
export declare function buildSortKeyColumn(count: number, valueAt: (index: number) => unknown): SortKeyColumn;
|
|
61
|
+
/**
|
|
62
|
+
* A stable sort of `count` rows by the given terms, returned as the permutation of row indexes
|
|
63
|
+
* in sorted order. Equal rows keep their input order, which is what makes ORDER BY
|
|
64
|
+
* deterministic and what lets a bounded top-N decide ties by arrival.
|
|
65
|
+
*
|
|
66
|
+
* Each term is sorted in turn: the first over every row, then each later term only within the
|
|
67
|
+
* runs of rows the earlier terms left tied. A term with unboxed keys is encoded once into
|
|
68
|
+
* 64-bit integers whose unsigned order is the term's order — direction and NULL placement
|
|
69
|
+
* folded in — and large ranges are radix-sorted on those bits while small ones merge. A term
|
|
70
|
+
* without unboxed keys merges under the generic comparison. Both kernels check for input that
|
|
71
|
+
* is already in order before doing anything else, since a scan often arrives sorted.
|
|
72
|
+
*/
|
|
73
|
+
export declare function sortKeyIndexes(count: number, terms: readonly SortKeyTerm[]): Uint32Array;
|
|
36
74
|
//# sourceMappingURL=sort-keys.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-keys.d.ts","sourceRoot":"","sources":["../../src/engine/sort-keys.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"sort-keys.d.ts","sourceRoot":"","sources":["../../src/engine/sort-keys.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1D,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;CACxC;AAED,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAClC,aAAa,CA4Df;AAqBD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CAQxF"}
|