@minnowdb/core 0.0.1 → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +27 -1
- package/dist/block-format/block.d.ts +46 -0
- package/dist/block-format/block.d.ts.map +1 -0
- package/dist/block-format/block.js +244 -0
- package/dist/block-format/block.js.map +1 -0
- package/dist/block-format/checksum.d.ts +7 -0
- package/dist/block-format/checksum.d.ts.map +1 -0
- package/dist/block-format/checksum.js +56 -0
- package/dist/block-format/checksum.js.map +1 -0
- package/dist/block-format/codecs.d.ts +24 -0
- package/dist/block-format/codecs.d.ts.map +1 -0
- package/dist/block-format/codecs.js +102 -0
- package/dist/block-format/codecs.js.map +1 -0
- package/dist/block-format/column.d.ts +8 -0
- package/dist/block-format/column.d.ts.map +1 -0
- package/dist/block-format/column.js +166 -0
- package/dist/block-format/column.js.map +1 -0
- package/dist/block-format/index.d.ts +7 -0
- package/dist/block-format/index.d.ts.map +1 -0
- package/dist/block-format/index.js +7 -0
- package/dist/block-format/index.js.map +1 -0
- package/dist/block-format/physical.d.ts +20 -0
- package/dist/block-format/physical.d.ts.map +1 -0
- package/dist/block-format/physical.js +439 -0
- package/dist/block-format/physical.js.map +1 -0
- package/dist/block-format/types.d.ts +93 -0
- package/dist/block-format/types.d.ts.map +1 -0
- package/dist/block-format/types.js +2 -0
- package/dist/block-format/types.js.map +1 -0
- package/dist/engine/artifact-cache.d.ts +22 -0
- package/dist/engine/artifact-cache.d.ts.map +1 -0
- package/dist/engine/artifact-cache.js +68 -0
- package/dist/engine/artifact-cache.js.map +1 -0
- package/dist/engine/batch.d.ts +28 -0
- package/dist/engine/batch.d.ts.map +1 -0
- package/dist/engine/batch.js +38 -0
- package/dist/engine/batch.js.map +1 -0
- package/dist/engine/buffered-writer.d.ts +43 -0
- package/dist/engine/buffered-writer.d.ts.map +1 -0
- package/dist/engine/buffered-writer.js +158 -0
- package/dist/engine/buffered-writer.js.map +1 -0
- package/dist/engine/catalog.d.ts +82 -0
- package/dist/engine/catalog.d.ts.map +1 -0
- package/dist/engine/catalog.js +47 -0
- package/dist/engine/catalog.js.map +1 -0
- package/dist/engine/client.d.ts +211 -0
- package/dist/engine/client.d.ts.map +1 -0
- package/dist/engine/client.js +538 -0
- package/dist/engine/client.js.map +1 -0
- package/dist/engine/coordinator.d.ts +17 -0
- package/dist/engine/coordinator.d.ts.map +1 -0
- package/dist/engine/coordinator.js +60 -0
- package/dist/engine/coordinator.js.map +1 -0
- package/dist/engine/database.d.ts +661 -0
- package/dist/engine/database.d.ts.map +1 -0
- package/dist/engine/database.js +10313 -0
- package/dist/engine/database.js.map +1 -0
- package/dist/engine/defaults.d.ts +33 -0
- package/dist/engine/defaults.d.ts.map +1 -0
- package/dist/engine/defaults.js +87 -0
- package/dist/engine/defaults.js.map +1 -0
- package/dist/engine/dsl/db.d.ts +137 -0
- package/dist/engine/dsl/db.d.ts.map +1 -0
- package/dist/engine/dsl/db.js +161 -0
- package/dist/engine/dsl/db.js.map +1 -0
- package/dist/engine/dsl/expression.d.ts +172 -0
- package/dist/engine/dsl/expression.d.ts.map +1 -0
- package/dist/engine/dsl/expression.js +397 -0
- package/dist/engine/dsl/expression.js.map +1 -0
- package/dist/engine/dsl/index.d.ts +8 -0
- package/dist/engine/dsl/index.d.ts.map +1 -0
- package/dist/engine/dsl/index.js +7 -0
- package/dist/engine/dsl/index.js.map +1 -0
- package/dist/engine/dsl/live-query.d.ts +45 -0
- package/dist/engine/dsl/live-query.d.ts.map +1 -0
- package/dist/engine/dsl/live-query.js +116 -0
- package/dist/engine/dsl/live-query.js.map +1 -0
- package/dist/engine/dsl/mutations.d.ts +123 -0
- package/dist/engine/dsl/mutations.d.ts.map +1 -0
- package/dist/engine/dsl/mutations.js +241 -0
- package/dist/engine/dsl/mutations.js.map +1 -0
- package/dist/engine/dsl/select-query-builder.d.ts +148 -0
- package/dist/engine/dsl/select-query-builder.d.ts.map +1 -0
- package/dist/engine/dsl/select-query-builder.js +377 -0
- package/dist/engine/dsl/select-query-builder.js.map +1 -0
- package/dist/engine/dsl/sql-tag.d.ts +46 -0
- package/dist/engine/dsl/sql-tag.d.ts.map +1 -0
- package/dist/engine/dsl/sql-tag.js +85 -0
- package/dist/engine/dsl/sql-tag.js.map +1 -0
- package/dist/engine/dsl/types.d.ts +133 -0
- package/dist/engine/dsl/types.d.ts.map +1 -0
- package/dist/engine/dsl/types.js +9 -0
- package/dist/engine/dsl/types.js.map +1 -0
- package/dist/engine/errors.d.ts +55 -0
- package/dist/engine/errors.d.ts.map +1 -0
- package/dist/engine/errors.js +81 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/fts.d.ts +93 -0
- package/dist/engine/fts.d.ts.map +1 -0
- package/dist/engine/fts.js +273 -0
- package/dist/engine/fts.js.map +1 -0
- package/dist/engine/group-index.d.ts +32 -0
- package/dist/engine/group-index.d.ts.map +1 -0
- package/dist/engine/group-index.js +366 -0
- package/dist/engine/group-index.js.map +1 -0
- package/dist/engine/index.d.ts +13 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +12 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/join-index.d.ts +12 -0
- package/dist/engine/join-index.d.ts.map +1 -0
- package/dist/engine/join-index.js +217 -0
- package/dist/engine/join-index.js.map +1 -0
- package/dist/engine/live.d.ts +86 -0
- package/dist/engine/live.d.ts.map +1 -0
- package/dist/engine/live.js +289 -0
- package/dist/engine/live.js.map +1 -0
- package/dist/engine/memory.d.ts +37 -0
- package/dist/engine/memory.d.ts.map +1 -0
- package/dist/engine/memory.js +119 -0
- package/dist/engine/memory.js.map +1 -0
- package/dist/engine/optimizer.d.ts +20 -0
- package/dist/engine/optimizer.d.ts.map +1 -0
- package/dist/engine/optimizer.js +1170 -0
- package/dist/engine/optimizer.js.map +1 -0
- package/dist/engine/query-cache.d.ts +10 -0
- package/dist/engine/query-cache.d.ts.map +1 -0
- package/dist/engine/query-cache.js +58 -0
- package/dist/engine/query-cache.js.map +1 -0
- package/dist/engine/query.d.ts +844 -0
- package/dist/engine/query.d.ts.map +1 -0
- package/dist/engine/query.js +7450 -0
- package/dist/engine/query.js.map +1 -0
- package/dist/engine/schema-wire.d.ts +92 -0
- package/dist/engine/schema-wire.d.ts.map +1 -0
- package/dist/engine/schema-wire.js +115 -0
- package/dist/engine/schema-wire.js.map +1 -0
- package/dist/engine/schema.d.ts +394 -0
- package/dist/engine/schema.d.ts.map +1 -0
- package/dist/engine/schema.js +709 -0
- package/dist/engine/schema.js.map +1 -0
- package/dist/engine/sort-keys.d.ts +36 -0
- package/dist/engine/sort-keys.d.ts.map +1 -0
- package/dist/engine/sort-keys.js +60 -0
- package/dist/engine/sort-keys.js.map +1 -0
- package/dist/engine/sql-json.d.ts +30 -0
- package/dist/engine/sql-json.d.ts.map +1 -0
- package/dist/engine/sql-json.js +120 -0
- package/dist/engine/sql-json.js.map +1 -0
- package/dist/engine/sql-semantics.d.ts +31 -0
- package/dist/engine/sql-semantics.d.ts.map +1 -0
- package/dist/engine/sql-semantics.js +121 -0
- package/dist/engine/sql-semantics.js.map +1 -0
- package/dist/engine/vector.d.ts +87 -0
- package/dist/engine/vector.d.ts.map +1 -0
- package/dist/engine/vector.js +4227 -0
- package/dist/engine/vector.js.map +1 -0
- package/dist/engine/worker-host.d.ts +48 -0
- package/dist/engine/worker-host.d.ts.map +1 -0
- package/dist/engine/worker-host.js +501 -0
- package/dist/engine/worker-host.js.map +1 -0
- package/dist/engine/worker.d.ts +2 -0
- package/dist/engine/worker.d.ts.map +1 -0
- package/dist/engine/worker.js +14 -0
- package/dist/engine/worker.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/plan/index.d.ts +17 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +17 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/storage/fixture-shape.d.ts +42 -0
- package/dist/storage/fixture-shape.d.ts.map +1 -0
- package/dist/storage/fixture-shape.js +146 -0
- package/dist/storage/fixture-shape.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +139 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +3161 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/memory.d.ts +121 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +1455 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/snapshot.d.ts +108 -0
- package/dist/storage/snapshot.d.ts.map +1 -0
- package/dist/storage/snapshot.js +276 -0
- package/dist/storage/snapshot.js.map +1 -0
- package/dist/storage/types.d.ts +895 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +1549 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/index.d.ts +76 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +233 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/seeds.d.ts +11 -0
- package/dist/testing/seeds.d.ts.map +1 -0
- package/dist/testing/seeds.js +50 -0
- package/dist/testing/seeds.js.map +1 -0
- package/dist/transactions/index.d.ts +148 -0
- package/dist/transactions/index.d.ts.map +1 -0
- package/dist/transactions/index.js +662 -0
- package/dist/transactions/index.js.map +1 -0
- package/dist/worker-protocol/index.d.ts +84 -0
- package/dist/worker-protocol/index.d.ts.map +1 -0
- package/dist/worker-protocol/index.js +117 -0
- package/dist/worker-protocol/index.js.map +1 -0
- package/package.json +66 -16
- package/sql-feature-matrix.json +1275 -0
- package/index.d.ts +0 -1
- package/index.js +0 -1
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
export const MAX_PHYSICAL_COLUMN_BYTE_LENGTH = 64 * 1024 * 1024;
|
|
2
|
+
const MAX_DATETIME_MILLISECONDS = 8_640_000_000_000_000;
|
|
3
|
+
export function physicalBitmapByteLength(rowCount) {
|
|
4
|
+
assertRowCount(rowCount);
|
|
5
|
+
return Math.ceil(rowCount / 8);
|
|
6
|
+
}
|
|
7
|
+
/** Returns the exact encoded byte length for a version-zero physical column. */
|
|
8
|
+
export function physicalColumnByteLength(type, rowCount, stringContentByteLength = 0) {
|
|
9
|
+
assertLogicalType(type);
|
|
10
|
+
const validityByteLength = physicalBitmapByteLength(rowCount);
|
|
11
|
+
assertNonnegativeSafeInteger(stringContentByteLength, "string content byte length");
|
|
12
|
+
let byteLength;
|
|
13
|
+
switch (type) {
|
|
14
|
+
case "boolean":
|
|
15
|
+
if (stringContentByteLength !== 0)
|
|
16
|
+
throw new RangeError("Boolean columns have no string content");
|
|
17
|
+
byteLength = checkedAdd(validityByteLength, validityByteLength, "physical column");
|
|
18
|
+
break;
|
|
19
|
+
case "number":
|
|
20
|
+
case "datetime":
|
|
21
|
+
if (stringContentByteLength !== 0)
|
|
22
|
+
throw new RangeError(`${type} columns have no string content`);
|
|
23
|
+
byteLength = checkedAdd(validityByteLength, checkedMultiply(rowCount, 8, "physical column"), "physical column");
|
|
24
|
+
break;
|
|
25
|
+
case "string":
|
|
26
|
+
byteLength = checkedAdd(validityByteLength, checkedAdd(checkedMultiply(checkedAdd(rowCount, 1, "string offsets"), 4, "string offsets"), stringContentByteLength, "physical column"), "physical column");
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
assertPhysicalByteLength(byteLength);
|
|
30
|
+
return byteLength;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validates a physical payload without copying its bytes or materializing row
|
|
34
|
+
* values. The returned object retains the input `bytes` reference.
|
|
35
|
+
*/
|
|
36
|
+
export function validatePhysicalColumn(input) {
|
|
37
|
+
assertLogicalType(input.type);
|
|
38
|
+
assertRowCount(input.rowCount);
|
|
39
|
+
assertPhysicalByteLength(input.bytes.byteLength);
|
|
40
|
+
const validityByteLength = physicalBitmapByteLength(input.rowCount);
|
|
41
|
+
if (input.bytes.byteLength < validityByteLength)
|
|
42
|
+
throw new Error("Truncated validity bitmap");
|
|
43
|
+
const validity = input.bytes.subarray(0, validityByteLength);
|
|
44
|
+
assertZeroPaddingBits(validity, input.rowCount, "validity bitmap");
|
|
45
|
+
const nullCount = input.rowCount - countSetBits(validity, input.rowCount);
|
|
46
|
+
let metadata = {};
|
|
47
|
+
switch (input.type) {
|
|
48
|
+
case "boolean": {
|
|
49
|
+
const expectedLength = physicalColumnByteLength(input.type, input.rowCount);
|
|
50
|
+
if (input.bytes.byteLength !== expectedLength)
|
|
51
|
+
throw new Error("Invalid boolean payload");
|
|
52
|
+
const values = input.bytes.subarray(validityByteLength);
|
|
53
|
+
assertZeroPaddingBits(values, input.rowCount, "boolean bitmap");
|
|
54
|
+
for (let index = 0; index < values.byteLength; index += 1) {
|
|
55
|
+
const valueByte = values[index] ?? 0;
|
|
56
|
+
const validityByte = validity[index] ?? 0;
|
|
57
|
+
if ((valueByte & ~validityByte) !== 0) {
|
|
58
|
+
throw new Error("Boolean value is set for a null row");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "number":
|
|
64
|
+
case "datetime": {
|
|
65
|
+
const expectedLength = physicalColumnByteLength(input.type, input.rowCount);
|
|
66
|
+
if (input.bytes.byteLength !== expectedLength)
|
|
67
|
+
throw new Error(`Invalid ${input.type} payload`);
|
|
68
|
+
let min = Number.POSITIVE_INFINITY;
|
|
69
|
+
let max = Number.NEGATIVE_INFINITY;
|
|
70
|
+
if (nullCount === 0 && PLATFORM_LITTLE_ENDIAN) {
|
|
71
|
+
// Every slot is a live value, so validate through a typed float view — realigned through
|
|
72
|
+
// the reusable scratch when the validity prefix leaves the payload off an 8-byte boundary.
|
|
73
|
+
const typedValues = alignedFloat64View(input.bytes, validityByteLength, input.rowCount);
|
|
74
|
+
for (let index = 0; index < input.rowCount; index += 1) {
|
|
75
|
+
const value = typedValues[index] ?? Number.NaN;
|
|
76
|
+
if (!Number.isFinite(value)) {
|
|
77
|
+
throw new Error(`Invalid ${input.type} physical value`);
|
|
78
|
+
}
|
|
79
|
+
if (input.type === "datetime" &&
|
|
80
|
+
(!Number.isInteger(value) || Math.abs(value) > MAX_DATETIME_MILLISECONDS)) {
|
|
81
|
+
throw new Error("Invalid datetime physical value");
|
|
82
|
+
}
|
|
83
|
+
if (value < min)
|
|
84
|
+
min = value;
|
|
85
|
+
if (value > max)
|
|
86
|
+
max = value;
|
|
87
|
+
}
|
|
88
|
+
metadata = zoneMapMetadata(min, max);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
const values = new DataView(input.bytes.buffer, input.bytes.byteOffset + validityByteLength, input.rowCount * 8);
|
|
92
|
+
for (let index = 0; index < input.rowCount; index += 1) {
|
|
93
|
+
if (!hasBit(validity, index)) {
|
|
94
|
+
assertZeroFixedWidthNullSlot(input.bytes, validityByteLength + index * 8, input.type);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const value = values.getFloat64(index * 8, true);
|
|
98
|
+
if (!Number.isFinite(value)) {
|
|
99
|
+
throw new Error(`Invalid ${input.type} physical value`);
|
|
100
|
+
}
|
|
101
|
+
if (input.type === "datetime" &&
|
|
102
|
+
(!Number.isInteger(value) || Math.abs(value) > MAX_DATETIME_MILLISECONDS)) {
|
|
103
|
+
throw new Error("Invalid datetime physical value");
|
|
104
|
+
}
|
|
105
|
+
min = Math.min(min, value);
|
|
106
|
+
max = Math.max(max, value);
|
|
107
|
+
}
|
|
108
|
+
metadata = zoneMapMetadata(min, max);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case "string": {
|
|
112
|
+
const offsetsByteLength = checkedMultiply(checkedAdd(input.rowCount, 1, "string offsets"), 4, "string offsets");
|
|
113
|
+
if (input.bytes.byteLength < validityByteLength + offsetsByteLength) {
|
|
114
|
+
throw new Error("Invalid string offsets");
|
|
115
|
+
}
|
|
116
|
+
const offsets = new DataView(input.bytes.buffer, input.bytes.byteOffset + validityByteLength, offsetsByteLength);
|
|
117
|
+
const content = input.bytes.subarray(validityByteLength + offsetsByteLength);
|
|
118
|
+
let previous = offsets.getUint32(0, true);
|
|
119
|
+
if (previous !== 0)
|
|
120
|
+
throw new Error("Invalid first string offset");
|
|
121
|
+
for (let index = 0; index < input.rowCount; index += 1) {
|
|
122
|
+
const current = offsets.getUint32((index + 1) * 4, true);
|
|
123
|
+
if (current < previous || current > content.byteLength) {
|
|
124
|
+
throw new Error("Invalid string offset");
|
|
125
|
+
}
|
|
126
|
+
if (hasBit(validity, index)) {
|
|
127
|
+
assertValidUtf8(content, previous, current);
|
|
128
|
+
}
|
|
129
|
+
else if (current !== previous) {
|
|
130
|
+
throw new Error("Null strings must have empty content");
|
|
131
|
+
}
|
|
132
|
+
previous = current;
|
|
133
|
+
}
|
|
134
|
+
if (previous !== content.byteLength)
|
|
135
|
+
throw new Error("Unreferenced string bytes");
|
|
136
|
+
physicalColumnByteLength(input.type, input.rowCount, content.byteLength);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
type: input.type,
|
|
142
|
+
rowCount: input.rowCount,
|
|
143
|
+
nullCount,
|
|
144
|
+
bytes: input.bytes,
|
|
145
|
+
metadata,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Computes exact sizing and metadata for concatenated half-open row ranges.
|
|
150
|
+
* No output byte buffer is allocated.
|
|
151
|
+
*/
|
|
152
|
+
export function measurePhysicalColumnRanges(type, ranges) {
|
|
153
|
+
return preparePhysicalColumn(type, ranges).measurement;
|
|
154
|
+
}
|
|
155
|
+
/** Allocates exactly `measurement.encodedByteLength` bytes and fills them. */
|
|
156
|
+
export function buildPhysicalColumnFromRanges(type, ranges) {
|
|
157
|
+
const prepared = preparePhysicalColumn(type, ranges);
|
|
158
|
+
const { measurement } = prepared;
|
|
159
|
+
const output = new Uint8Array(measurement.encodedByteLength);
|
|
160
|
+
const outputValidity = output.subarray(0, measurement.validityByteLength);
|
|
161
|
+
let outputRow = 0;
|
|
162
|
+
for (const range of prepared.ranges) {
|
|
163
|
+
const sourceValidityLength = physicalBitmapByteLength(range.column.rowCount);
|
|
164
|
+
const sourceValidity = range.column.bytes.subarray(0, sourceValidityLength);
|
|
165
|
+
for (let sourceRow = range.start; sourceRow < range.end; sourceRow += 1) {
|
|
166
|
+
if (hasBit(sourceValidity, sourceRow))
|
|
167
|
+
setBit(outputValidity, outputRow);
|
|
168
|
+
outputRow += 1;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
switch (type) {
|
|
172
|
+
case "boolean": {
|
|
173
|
+
const outputValues = output.subarray(measurement.validityByteLength);
|
|
174
|
+
outputRow = 0;
|
|
175
|
+
for (const range of prepared.ranges) {
|
|
176
|
+
const sourceBitmapLength = physicalBitmapByteLength(range.column.rowCount);
|
|
177
|
+
const sourceValues = range.column.bytes.subarray(sourceBitmapLength);
|
|
178
|
+
for (let sourceRow = range.start; sourceRow < range.end; sourceRow += 1) {
|
|
179
|
+
if (hasBit(sourceValues, sourceRow))
|
|
180
|
+
setBit(outputValues, outputRow);
|
|
181
|
+
outputRow += 1;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case "number":
|
|
187
|
+
case "datetime": {
|
|
188
|
+
let outputValueOffset = measurement.validityByteLength;
|
|
189
|
+
for (const range of prepared.ranges) {
|
|
190
|
+
const sourceValidityLength = physicalBitmapByteLength(range.column.rowCount);
|
|
191
|
+
const start = sourceValidityLength + range.start * 8;
|
|
192
|
+
const end = sourceValidityLength + range.end * 8;
|
|
193
|
+
const sourceValues = range.column.bytes.subarray(start, end);
|
|
194
|
+
output.set(sourceValues, outputValueOffset);
|
|
195
|
+
outputValueOffset += sourceValues.byteLength;
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case "string": {
|
|
200
|
+
const outputOffsetsByteLength = (measurement.rowCount + 1) * 4;
|
|
201
|
+
const outputOffsets = new DataView(output.buffer, output.byteOffset + measurement.validityByteLength, outputOffsetsByteLength);
|
|
202
|
+
const outputContentOffset = measurement.validityByteLength + outputOffsetsByteLength;
|
|
203
|
+
let contentByteLength = 0;
|
|
204
|
+
outputRow = 0;
|
|
205
|
+
outputOffsets.setUint32(0, 0, true);
|
|
206
|
+
for (const range of prepared.ranges) {
|
|
207
|
+
const sourceValidityLength = physicalBitmapByteLength(range.column.rowCount);
|
|
208
|
+
const sourceOffsetsByteLength = (range.column.rowCount + 1) * 4;
|
|
209
|
+
const sourceOffsets = new DataView(range.column.bytes.buffer, range.column.bytes.byteOffset + sourceValidityLength, sourceOffsetsByteLength);
|
|
210
|
+
const sourceContent = range.column.bytes.subarray(sourceValidityLength + sourceOffsetsByteLength);
|
|
211
|
+
const sourceContentStart = sourceOffsets.getUint32(range.start * 4, true);
|
|
212
|
+
const sourceContentEnd = sourceOffsets.getUint32(range.end * 4, true);
|
|
213
|
+
output.set(sourceContent.subarray(sourceContentStart, sourceContentEnd), outputContentOffset + contentByteLength);
|
|
214
|
+
for (let sourceRow = range.start; sourceRow < range.end; sourceRow += 1) {
|
|
215
|
+
const sourceEnd = sourceOffsets.getUint32((sourceRow + 1) * 4, true);
|
|
216
|
+
outputRow += 1;
|
|
217
|
+
outputOffsets.setUint32(outputRow * 4, contentByteLength + sourceEnd - sourceContentStart, true);
|
|
218
|
+
}
|
|
219
|
+
contentByteLength += sourceContentEnd - sourceContentStart;
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
type,
|
|
226
|
+
rowCount: measurement.rowCount,
|
|
227
|
+
nullCount: measurement.nullCount,
|
|
228
|
+
bytes: output,
|
|
229
|
+
metadata: measurement.metadata,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
export function slicePhysicalColumn(column, start, end) {
|
|
233
|
+
return buildPhysicalColumnFromRanges(column.type, [{ column, start, end }]);
|
|
234
|
+
}
|
|
235
|
+
export function concatenatePhysicalColumns(type, columns) {
|
|
236
|
+
return buildPhysicalColumnFromRanges(type, columns.map((column) => ({ column, start: 0, end: column.rowCount })));
|
|
237
|
+
}
|
|
238
|
+
function preparePhysicalColumn(type, ranges) {
|
|
239
|
+
const preparedRanges = [];
|
|
240
|
+
let rowCount = 0;
|
|
241
|
+
let nullCount = 0;
|
|
242
|
+
let stringContentByteLength = 0;
|
|
243
|
+
let min = Number.POSITIVE_INFINITY;
|
|
244
|
+
let max = Number.NEGATIVE_INFINITY;
|
|
245
|
+
for (const range of ranges) {
|
|
246
|
+
if (range.column.type !== type) {
|
|
247
|
+
throw new TypeError(`Cannot append ${range.column.type} physical rows to a ${type} column`);
|
|
248
|
+
}
|
|
249
|
+
const column = validatePhysicalColumn(range.column);
|
|
250
|
+
assertRangeBoundary(range.start, "range start");
|
|
251
|
+
assertRangeBoundary(range.end, "range end");
|
|
252
|
+
if (range.start > range.end || range.end > column.rowCount) {
|
|
253
|
+
throw new RangeError("Physical row range is out of bounds");
|
|
254
|
+
}
|
|
255
|
+
const rangeRowCount = range.end - range.start;
|
|
256
|
+
rowCount = checkedAdd(rowCount, rangeRowCount, "row count");
|
|
257
|
+
if (rowCount > 0xffffffff)
|
|
258
|
+
throw new RangeError("Too many rows in one physical column");
|
|
259
|
+
const sourceValidityLength = physicalBitmapByteLength(column.rowCount);
|
|
260
|
+
const sourceValidity = column.bytes.subarray(0, sourceValidityLength);
|
|
261
|
+
if (type === "string") {
|
|
262
|
+
const sourceOffsets = new DataView(column.bytes.buffer, column.bytes.byteOffset + sourceValidityLength, (column.rowCount + 1) * 4);
|
|
263
|
+
const contentStart = sourceOffsets.getUint32(range.start * 4, true);
|
|
264
|
+
const contentEnd = sourceOffsets.getUint32(range.end * 4, true);
|
|
265
|
+
stringContentByteLength = checkedAdd(stringContentByteLength, contentEnd - contentStart, "string content byte length");
|
|
266
|
+
}
|
|
267
|
+
const sourceValues = type === "number" || type === "datetime"
|
|
268
|
+
? new DataView(column.bytes.buffer, column.bytes.byteOffset + sourceValidityLength, column.rowCount * 8)
|
|
269
|
+
: undefined;
|
|
270
|
+
for (let sourceRow = range.start; sourceRow < range.end; sourceRow += 1) {
|
|
271
|
+
if (!hasBit(sourceValidity, sourceRow)) {
|
|
272
|
+
nullCount += 1;
|
|
273
|
+
}
|
|
274
|
+
else if (sourceValues !== undefined) {
|
|
275
|
+
const value = sourceValues.getFloat64(sourceRow * 8, true);
|
|
276
|
+
min = Math.min(min, value);
|
|
277
|
+
max = Math.max(max, value);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
preparedRanges.push({ column, start: range.start, end: range.end });
|
|
281
|
+
}
|
|
282
|
+
const validityByteLength = physicalBitmapByteLength(rowCount);
|
|
283
|
+
const encodedByteLength = physicalColumnByteLength(type, rowCount, stringContentByteLength);
|
|
284
|
+
const valueByteLength = encodedByteLength - validityByteLength;
|
|
285
|
+
return {
|
|
286
|
+
ranges: preparedRanges,
|
|
287
|
+
measurement: {
|
|
288
|
+
type,
|
|
289
|
+
rowCount,
|
|
290
|
+
nullCount,
|
|
291
|
+
validityByteLength,
|
|
292
|
+
valueByteLength,
|
|
293
|
+
stringContentByteLength,
|
|
294
|
+
encodedByteLength,
|
|
295
|
+
metadata: type === "number" || type === "datetime" ? zoneMapMetadata(min, max) : {},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function zoneMapMetadata(min, max) {
|
|
300
|
+
return min === Number.POSITIVE_INFINITY ? {} : { zoneMap: { min, max } };
|
|
301
|
+
}
|
|
302
|
+
const PLATFORM_LITTLE_ENDIAN = new Uint8Array(Float64Array.of(1).buffer)[7] === 0x3f;
|
|
303
|
+
let float64AlignmentScratch = new ArrayBuffer(0);
|
|
304
|
+
/**
|
|
305
|
+
* Returns a Float64Array over `rowCount` values starting at `byteOffset` within `bytes`,
|
|
306
|
+
* realigning through a reusable scratch copy when the source is not 8-byte aligned.
|
|
307
|
+
*/
|
|
308
|
+
function alignedFloat64View(bytes, byteOffset, rowCount) {
|
|
309
|
+
const start = bytes.byteOffset + byteOffset;
|
|
310
|
+
if (start % Float64Array.BYTES_PER_ELEMENT === 0) {
|
|
311
|
+
return new Float64Array(bytes.buffer, start, rowCount);
|
|
312
|
+
}
|
|
313
|
+
const byteLength = rowCount * Float64Array.BYTES_PER_ELEMENT;
|
|
314
|
+
if (float64AlignmentScratch.byteLength < byteLength) {
|
|
315
|
+
float64AlignmentScratch = new ArrayBuffer(byteLength);
|
|
316
|
+
}
|
|
317
|
+
new Uint8Array(float64AlignmentScratch, 0, byteLength).set(new Uint8Array(bytes.buffer, start, byteLength));
|
|
318
|
+
return new Float64Array(float64AlignmentScratch, 0, rowCount);
|
|
319
|
+
}
|
|
320
|
+
const POPCOUNT = new Uint8Array(256);
|
|
321
|
+
for (let value = 0; value < 256; value += 1) {
|
|
322
|
+
POPCOUNT[value] = (POPCOUNT[value >> 1] ?? 0) + (value & 1);
|
|
323
|
+
}
|
|
324
|
+
function countSetBits(bytes, rowCount) {
|
|
325
|
+
// Padding bits past rowCount are validated to be zero, so whole bytes count via table lookup.
|
|
326
|
+
const wholeBytes = rowCount >>> 3;
|
|
327
|
+
let count = 0;
|
|
328
|
+
for (let index = 0; index < wholeBytes; index += 1) {
|
|
329
|
+
count += POPCOUNT[bytes[index] ?? 0] ?? 0;
|
|
330
|
+
}
|
|
331
|
+
for (let index = wholeBytes * 8; index < rowCount; index += 1) {
|
|
332
|
+
if (hasBit(bytes, index))
|
|
333
|
+
count += 1;
|
|
334
|
+
}
|
|
335
|
+
return count;
|
|
336
|
+
}
|
|
337
|
+
function setBit(bitmap, index) {
|
|
338
|
+
const byteOffset = index >>> 3;
|
|
339
|
+
bitmap[byteOffset] = (bitmap[byteOffset] ?? 0) | (1 << (index & 7));
|
|
340
|
+
}
|
|
341
|
+
function hasBit(bitmap, index) {
|
|
342
|
+
return ((bitmap[index >>> 3] ?? 0) & (1 << (index & 7))) !== 0;
|
|
343
|
+
}
|
|
344
|
+
function assertZeroPaddingBits(bitmap, rowCount, name) {
|
|
345
|
+
const usedBits = rowCount & 7;
|
|
346
|
+
if (usedBits === 0 || bitmap.byteLength === 0)
|
|
347
|
+
return;
|
|
348
|
+
const finalByte = bitmap[bitmap.byteLength - 1] ?? 0;
|
|
349
|
+
const usedMask = (1 << usedBits) - 1;
|
|
350
|
+
if ((finalByte & ~usedMask) !== 0)
|
|
351
|
+
throw new Error(`Non-zero padding in ${name}`);
|
|
352
|
+
}
|
|
353
|
+
function assertZeroFixedWidthNullSlot(bytes, offset, type) {
|
|
354
|
+
for (let index = offset; index < offset + 8; index += 1) {
|
|
355
|
+
if (bytes[index] !== 0)
|
|
356
|
+
throw new Error(`${type} value bytes are set for a null row`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function assertValidUtf8(bytes, start, end) {
|
|
360
|
+
let index = start;
|
|
361
|
+
while (index < end) {
|
|
362
|
+
const first = bytes[index] ?? 0;
|
|
363
|
+
if (first <= 0x7f) {
|
|
364
|
+
index += 1;
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (first >= 0xc2 && first <= 0xdf) {
|
|
368
|
+
assertContinuation(bytes, index + 1, end);
|
|
369
|
+
index += 2;
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (first >= 0xe0 && first <= 0xef) {
|
|
373
|
+
const second = continuation(bytes, index + 1, end);
|
|
374
|
+
if ((first === 0xe0 && second < 0xa0) || (first === 0xed && second > 0x9f)) {
|
|
375
|
+
throw new Error("Invalid UTF-8 string payload");
|
|
376
|
+
}
|
|
377
|
+
assertContinuation(bytes, index + 2, end);
|
|
378
|
+
index += 3;
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
if (first >= 0xf0 && first <= 0xf4) {
|
|
382
|
+
const second = continuation(bytes, index + 1, end);
|
|
383
|
+
if ((first === 0xf0 && second < 0x90) || (first === 0xf4 && second > 0x8f)) {
|
|
384
|
+
throw new Error("Invalid UTF-8 string payload");
|
|
385
|
+
}
|
|
386
|
+
assertContinuation(bytes, index + 2, end);
|
|
387
|
+
assertContinuation(bytes, index + 3, end);
|
|
388
|
+
index += 4;
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
throw new Error("Invalid UTF-8 string payload");
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function continuation(bytes, index, end) {
|
|
395
|
+
if (index >= end)
|
|
396
|
+
throw new Error("Invalid UTF-8 string payload");
|
|
397
|
+
const byte = bytes[index] ?? 0;
|
|
398
|
+
if (byte < 0x80 || byte > 0xbf)
|
|
399
|
+
throw new Error("Invalid UTF-8 string payload");
|
|
400
|
+
return byte;
|
|
401
|
+
}
|
|
402
|
+
function assertContinuation(bytes, index, end) {
|
|
403
|
+
continuation(bytes, index, end);
|
|
404
|
+
}
|
|
405
|
+
function assertRowCount(rowCount) {
|
|
406
|
+
assertNonnegativeSafeInteger(rowCount, "row count");
|
|
407
|
+
if (rowCount > 0xffffffff)
|
|
408
|
+
throw new RangeError("Too many rows in one physical column");
|
|
409
|
+
}
|
|
410
|
+
function assertLogicalType(type) {
|
|
411
|
+
if (type !== "boolean" && type !== "number" && type !== "string" && type !== "datetime") {
|
|
412
|
+
throw new TypeError(`Unknown logical type: ${String(type)}`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function assertRangeBoundary(value, name) {
|
|
416
|
+
assertNonnegativeSafeInteger(value, name);
|
|
417
|
+
}
|
|
418
|
+
function assertNonnegativeSafeInteger(value, name) {
|
|
419
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
420
|
+
throw new RangeError(`Invalid ${name}`);
|
|
421
|
+
}
|
|
422
|
+
function assertPhysicalByteLength(byteLength) {
|
|
423
|
+
assertNonnegativeSafeInteger(byteLength, "physical column byte length");
|
|
424
|
+
if (byteLength > MAX_PHYSICAL_COLUMN_BYTE_LENGTH) {
|
|
425
|
+
throw new RangeError("Physical column exceeds maximum byte length");
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function checkedAdd(left, right, name) {
|
|
429
|
+
if (left > Number.MAX_SAFE_INTEGER - right)
|
|
430
|
+
throw new RangeError(`Invalid ${name} length`);
|
|
431
|
+
return left + right;
|
|
432
|
+
}
|
|
433
|
+
function checkedMultiply(left, right, name) {
|
|
434
|
+
if (left !== 0 && right > Math.floor(Number.MAX_SAFE_INTEGER / left)) {
|
|
435
|
+
throw new RangeError(`Invalid ${name} length`);
|
|
436
|
+
}
|
|
437
|
+
return left * right;
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=physical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physical.js","sourceRoot":"","sources":["../../src/block-format/physical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export declare const logicalTypes: readonly ["boolean", "number", "string", "datetime"];
|
|
2
|
+
export type LogicalType = (typeof logicalTypes)[number];
|
|
3
|
+
export type Compression = "raw" | "gzip";
|
|
4
|
+
export interface ColumnValues {
|
|
5
|
+
boolean: boolean;
|
|
6
|
+
number: number;
|
|
7
|
+
string: string;
|
|
8
|
+
datetime: Date;
|
|
9
|
+
}
|
|
10
|
+
type ColumnInputByType = {
|
|
11
|
+
[Type in LogicalType]: {
|
|
12
|
+
type: Type;
|
|
13
|
+
values: ReadonlyArray<ColumnValues[Type] | null>;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
type DecodedColumnByType = {
|
|
17
|
+
[Type in LogicalType]: {
|
|
18
|
+
type: Type;
|
|
19
|
+
values: Array<ColumnValues[Type] | null>;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export type ColumnInput<T extends LogicalType = LogicalType> = ColumnInputByType[T];
|
|
23
|
+
export type DecodedColumn<T extends LogicalType = LogicalType> = DecodedColumnByType[T];
|
|
24
|
+
export interface ZoneMap {
|
|
25
|
+
min: number;
|
|
26
|
+
max: number;
|
|
27
|
+
}
|
|
28
|
+
export interface BlockMetadata {
|
|
29
|
+
zoneMap?: ZoneMap;
|
|
30
|
+
}
|
|
31
|
+
export interface BlockDescription {
|
|
32
|
+
formatVersion: number;
|
|
33
|
+
type: LogicalType;
|
|
34
|
+
compression: Compression;
|
|
35
|
+
rowCount: number;
|
|
36
|
+
nullCount: number;
|
|
37
|
+
encodedLength: number;
|
|
38
|
+
storedLength: number;
|
|
39
|
+
checksum: number;
|
|
40
|
+
metadata: BlockMetadata;
|
|
41
|
+
}
|
|
42
|
+
export interface DecodedBlock<T extends LogicalType = LogicalType> {
|
|
43
|
+
description: BlockDescription & {
|
|
44
|
+
type: T;
|
|
45
|
+
};
|
|
46
|
+
column: DecodedColumn<T>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* An uncompressed physical column payload. `bytes` uses the version-zero
|
|
50
|
+
* column encoding documented in `docs/BLOCK_FORMAT.md`.
|
|
51
|
+
*/
|
|
52
|
+
export interface PhysicalColumnPayload<T extends LogicalType = LogicalType> {
|
|
53
|
+
type: T;
|
|
54
|
+
rowCount: number;
|
|
55
|
+
bytes: Uint8Array;
|
|
56
|
+
}
|
|
57
|
+
/** A physical payload whose structure and values have been checked. */
|
|
58
|
+
export interface ValidatedPhysicalColumn<T extends LogicalType = LogicalType> extends PhysicalColumnPayload<T> {
|
|
59
|
+
nullCount: number;
|
|
60
|
+
metadata: BlockMetadata;
|
|
61
|
+
}
|
|
62
|
+
/** A half-open row range to append to a new physical column. */
|
|
63
|
+
export interface PhysicalColumnRange<T extends LogicalType = LogicalType> {
|
|
64
|
+
column: PhysicalColumnPayload<T>;
|
|
65
|
+
start: number;
|
|
66
|
+
end: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Exact output sizing and canonical metadata for a set of physical row
|
|
70
|
+
* ranges. Measuring does not allocate the output byte buffer.
|
|
71
|
+
*/
|
|
72
|
+
export interface PhysicalColumnMeasurement<T extends LogicalType = LogicalType> {
|
|
73
|
+
type: T;
|
|
74
|
+
rowCount: number;
|
|
75
|
+
nullCount: number;
|
|
76
|
+
/** Bytes occupied by the leading validity bitmap. */
|
|
77
|
+
validityByteLength: number;
|
|
78
|
+
/** All bytes after the validity bitmap, including string offsets and content. */
|
|
79
|
+
valueByteLength: number;
|
|
80
|
+
/** UTF-8 content bytes for strings; zero for every fixed-width type. */
|
|
81
|
+
stringContentByteLength: number;
|
|
82
|
+
/** The exact output allocation: validity plus value bytes. */
|
|
83
|
+
encodedByteLength: number;
|
|
84
|
+
metadata: BlockMetadata;
|
|
85
|
+
}
|
|
86
|
+
export interface DecodedPhysicalBlock<T extends LogicalType = LogicalType> {
|
|
87
|
+
description: BlockDescription & {
|
|
88
|
+
type: T;
|
|
89
|
+
};
|
|
90
|
+
column: ValidatedPhysicalColumn<T>;
|
|
91
|
+
}
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/block-format/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/block-format/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Snapshot of the byte-bounded artifact cache's lifetime counters. */
|
|
2
|
+
export interface ArtifactCacheStats {
|
|
3
|
+
limitBytes: number;
|
|
4
|
+
usedBytes: number;
|
|
5
|
+
entries: number;
|
|
6
|
+
hits: number;
|
|
7
|
+
misses: number;
|
|
8
|
+
evictions: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Byte-bounded LRU for decoded blocks, vectors, derived results, and memoized query results.
|
|
12
|
+
* Payloads are immutable by convention; callers own the byte estimates for their artifact type.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ArtifactCache {
|
|
15
|
+
#private;
|
|
16
|
+
constructor(limitBytes: number);
|
|
17
|
+
get enabled(): boolean;
|
|
18
|
+
get(key: string): unknown;
|
|
19
|
+
put(key: string, payload: unknown, bytes: number): void;
|
|
20
|
+
stats(): ArtifactCacheStats;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=artifact-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-cache.d.ts","sourceRoot":"","sources":["../../src/engine/artifact-cache.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAa;;gBAQZ,UAAU,EAAE,MAAM;IAO9B,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAazB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAqBvD,KAAK,IAAI,kBAAkB;CAU5B"}
|