@minnowdb/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +32 -18
  2. package/dist/engine/client.d.ts +9 -1
  3. package/dist/engine/client.d.ts.map +1 -1
  4. package/dist/engine/client.js +29 -5
  5. package/dist/engine/client.js.map +1 -1
  6. package/dist/engine/database.d.ts +51 -6
  7. package/dist/engine/database.d.ts.map +1 -1
  8. package/dist/engine/database.js +2597 -865
  9. package/dist/engine/database.js.map +1 -1
  10. package/dist/engine/live.d.ts.map +1 -1
  11. package/dist/engine/live.js +35 -11
  12. package/dist/engine/live.js.map +1 -1
  13. package/dist/engine/query-cache.d.ts +13 -1
  14. package/dist/engine/query-cache.d.ts.map +1 -1
  15. package/dist/engine/query-cache.js +34 -5
  16. package/dist/engine/query-cache.js.map +1 -1
  17. package/dist/engine/query.d.ts +11 -1
  18. package/dist/engine/query.d.ts.map +1 -1
  19. package/dist/engine/query.js +49 -41
  20. package/dist/engine/query.js.map +1 -1
  21. package/dist/engine/result-wire.d.ts +68 -0
  22. package/dist/engine/result-wire.d.ts.map +1 -0
  23. package/dist/engine/result-wire.js +264 -0
  24. package/dist/engine/result-wire.js.map +1 -0
  25. package/dist/engine/sort-keys.d.ts +50 -12
  26. package/dist/engine/sort-keys.d.ts.map +1 -1
  27. package/dist/engine/sort-keys.js +371 -25
  28. package/dist/engine/sort-keys.js.map +1 -1
  29. package/dist/engine/vector.d.ts +11 -0
  30. package/dist/engine/vector.d.ts.map +1 -1
  31. package/dist/engine/vector.js +99 -203
  32. package/dist/engine/vector.js.map +1 -1
  33. package/dist/engine/worker-host.d.ts +17 -1
  34. package/dist/engine/worker-host.d.ts.map +1 -1
  35. package/dist/engine/worker-host.js +83 -13
  36. package/dist/engine/worker-host.js.map +1 -1
  37. package/dist/storage/index.d.ts +13 -0
  38. package/dist/storage/index.d.ts.map +1 -1
  39. package/dist/storage/index.js +13 -0
  40. package/dist/storage/index.js.map +1 -1
  41. package/dist/storage/indexeddb.d.ts +5 -1
  42. package/dist/storage/indexeddb.d.ts.map +1 -1
  43. package/dist/storage/indexeddb.js +484 -402
  44. package/dist/storage/indexeddb.js.map +1 -1
  45. package/dist/storage/memory.d.ts +24 -21
  46. package/dist/storage/memory.d.ts.map +1 -1
  47. package/dist/storage/memory.js +124 -1199
  48. package/dist/storage/memory.js.map +1 -1
  49. package/dist/storage/opfs/files.d.ts +64 -0
  50. package/dist/storage/opfs/files.d.ts.map +1 -0
  51. package/dist/storage/opfs/files.js +243 -0
  52. package/dist/storage/opfs/files.js.map +1 -0
  53. package/dist/storage/opfs/index.d.ts +3 -0
  54. package/dist/storage/opfs/index.d.ts.map +1 -0
  55. package/dist/storage/opfs/index.js +3 -0
  56. package/dist/storage/opfs/index.js.map +1 -0
  57. package/dist/storage/opfs/leader.d.ts +130 -0
  58. package/dist/storage/opfs/leader.d.ts.map +1 -0
  59. package/dist/storage/opfs/leader.js +1104 -0
  60. package/dist/storage/opfs/leader.js.map +1 -0
  61. package/dist/storage/opfs/rpc.d.ts +70 -0
  62. package/dist/storage/opfs/rpc.d.ts.map +1 -0
  63. package/dist/storage/opfs/rpc.js +58 -0
  64. package/dist/storage/opfs/rpc.js.map +1 -0
  65. package/dist/storage/opfs/store.d.ts +154 -0
  66. package/dist/storage/opfs/store.d.ts.map +1 -0
  67. package/dist/storage/opfs/store.js +958 -0
  68. package/dist/storage/opfs/store.js.map +1 -0
  69. package/dist/storage/toolkit/extents.d.ts +69 -0
  70. package/dist/storage/toolkit/extents.d.ts.map +1 -0
  71. package/dist/storage/toolkit/extents.js +175 -0
  72. package/dist/storage/toolkit/extents.js.map +1 -0
  73. package/dist/storage/toolkit/index.d.ts +30 -0
  74. package/dist/storage/toolkit/index.d.ts.map +1 -0
  75. package/dist/storage/toolkit/index.js +5 -0
  76. package/dist/storage/toolkit/index.js.map +1 -0
  77. package/dist/storage/toolkit/record-core.d.ts +252 -0
  78. package/dist/storage/toolkit/record-core.d.ts.map +1 -0
  79. package/dist/storage/toolkit/record-core.js +1670 -0
  80. package/dist/storage/toolkit/record-core.js.map +1 -0
  81. package/dist/storage/toolkit/sync-file.d.ts +29 -0
  82. package/dist/storage/toolkit/sync-file.d.ts.map +1 -0
  83. package/dist/storage/toolkit/sync-file.js +2 -0
  84. package/dist/storage/toolkit/sync-file.js.map +1 -0
  85. package/dist/storage/toolkit/wal.d.ts +22 -0
  86. package/dist/storage/toolkit/wal.d.ts.map +1 -0
  87. package/dist/storage/toolkit/wal.js +79 -0
  88. package/dist/storage/toolkit/wal.js.map +1 -0
  89. package/dist/storage/toolkit/wire.d.ts +25 -0
  90. package/dist/storage/toolkit/wire.d.ts.map +1 -0
  91. package/dist/storage/toolkit/wire.js +100 -0
  92. package/dist/storage/toolkit/wire.js.map +1 -0
  93. package/dist/storage/types.d.ts +343 -59
  94. package/dist/storage/types.d.ts.map +1 -1
  95. package/dist/storage/types.js +112 -11
  96. package/dist/storage/types.js.map +1 -1
  97. package/dist/testing/block-store-conformance.d.ts +51 -0
  98. package/dist/testing/block-store-conformance.d.ts.map +1 -0
  99. package/dist/testing/block-store-conformance.js +745 -0
  100. package/dist/testing/block-store-conformance.js.map +1 -0
  101. package/dist/testing/index.d.ts +3 -0
  102. package/dist/testing/index.d.ts.map +1 -1
  103. package/dist/testing/index.js +5 -0
  104. package/dist/testing/index.js.map +1 -1
  105. package/dist/testing/opfs-shim.d.ts +35 -0
  106. package/dist/testing/opfs-shim.d.ts.map +1 -0
  107. package/dist/testing/opfs-shim.js +295 -0
  108. package/dist/testing/opfs-shim.js.map +1 -0
  109. package/dist/transactions/index.d.ts +42 -1
  110. package/dist/transactions/index.d.ts.map +1 -1
  111. package/dist/transactions/index.js +219 -13
  112. package/dist/transactions/index.js.map +1 -1
  113. package/dist/worker-protocol/index.d.ts +2 -2
  114. package/dist/worker-protocol/index.d.ts.map +1 -1
  115. package/dist/worker-protocol/index.js +2 -1
  116. package/dist/worker-protocol/index.js.map +1 -1
  117. package/package.json +10 -2
  118. package/dist/engine/dsl/db.d.ts +0 -137
  119. package/dist/engine/dsl/db.d.ts.map +0 -1
  120. package/dist/engine/dsl/db.js +0 -161
  121. package/dist/engine/dsl/db.js.map +0 -1
  122. package/dist/engine/dsl/expression.d.ts +0 -172
  123. package/dist/engine/dsl/expression.d.ts.map +0 -1
  124. package/dist/engine/dsl/expression.js +0 -397
  125. package/dist/engine/dsl/expression.js.map +0 -1
  126. package/dist/engine/dsl/index.d.ts +0 -8
  127. package/dist/engine/dsl/index.d.ts.map +0 -1
  128. package/dist/engine/dsl/index.js +0 -7
  129. package/dist/engine/dsl/index.js.map +0 -1
  130. package/dist/engine/dsl/live-query.d.ts +0 -45
  131. package/dist/engine/dsl/live-query.d.ts.map +0 -1
  132. package/dist/engine/dsl/live-query.js +0 -116
  133. package/dist/engine/dsl/live-query.js.map +0 -1
  134. package/dist/engine/dsl/mutations.d.ts +0 -123
  135. package/dist/engine/dsl/mutations.d.ts.map +0 -1
  136. package/dist/engine/dsl/mutations.js +0 -241
  137. package/dist/engine/dsl/mutations.js.map +0 -1
  138. package/dist/engine/dsl/select-query-builder.d.ts +0 -148
  139. package/dist/engine/dsl/select-query-builder.d.ts.map +0 -1
  140. package/dist/engine/dsl/select-query-builder.js +0 -377
  141. package/dist/engine/dsl/select-query-builder.js.map +0 -1
  142. package/dist/engine/dsl/sql-tag.d.ts +0 -46
  143. package/dist/engine/dsl/sql-tag.d.ts.map +0 -1
  144. package/dist/engine/dsl/sql-tag.js +0 -85
  145. package/dist/engine/dsl/sql-tag.js.map +0 -1
  146. package/dist/engine/dsl/types.d.ts +0 -133
  147. package/dist/engine/dsl/types.d.ts.map +0 -1
  148. package/dist/engine/dsl/types.js +0 -9
  149. package/dist/engine/dsl/types.js.map +0 -1
@@ -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":"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"}
@@ -1,17 +1,23 @@
1
1
  /**
2
- * Order-by keys prepared for comparison.
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 both of it is avoidable —
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 — which
10
- * includes every datetime, since extraction unboxes them to epoch milliseconds — is stored in a
11
- * Float64Array beside a null mask, and comparing it is two typed reads and a subtraction. Any
12
- * other term keeps its values and the generic comparison. The specialized form costs the same
13
- * eight bytes per key a reference did, plus one byte of mask, so this buys speed with locality
14
- * rather than with memory.
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 the comparison a sort runs millions of times is a
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 exactly once
32
- * per row, so a caller that reads through a row object or a vector pays that cost once rather
33
- * than once per comparison.
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;;;;;;;;;;;;;;GAcG;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;CAC7C;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAClC,aAAa,CA0Cf"}
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"}