@maplibre/mlt 1.1.0 → 1.1.2
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.txt +231 -0
- package/dist/decoding/decodingUtils.js +2 -2
- package/dist/decoding/decodingUtils.js.map +1 -1
- package/dist/decoding/decodingUtils.spec.js +2 -2
- package/dist/decoding/decodingUtils.spec.js.map +1 -1
- package/dist/decoding/fsstDecoder.js.map +1 -1
- package/dist/decoding/fsstDecoder.spec.js +14 -10
- package/dist/decoding/fsstDecoder.spec.js.map +1 -1
- package/dist/decoding/geometryDecoder.js +40 -200
- package/dist/decoding/geometryDecoder.js.map +1 -1
- package/dist/decoding/geometryDecoder.spec.js.map +1 -1
- package/dist/decoding/geometryScaling.js.map +1 -1
- package/dist/decoding/intWrapper.js.map +1 -1
- package/dist/decoding/integerDecodingUtils.d.ts +1 -1
- package/dist/decoding/integerDecodingUtils.js.map +1 -1
- package/dist/decoding/integerDecodingUtils.spec.js.map +1 -1
- package/dist/decoding/integerStreamDecoder.d.ts +13 -22
- package/dist/decoding/integerStreamDecoder.js +234 -237
- package/dist/decoding/integerStreamDecoder.js.map +1 -1
- package/dist/decoding/integerStreamDecoder.spec.js +77 -39
- package/dist/decoding/integerStreamDecoder.spec.js.map +1 -1
- package/dist/decoding/propertyDecoder.js +21 -21
- package/dist/decoding/propertyDecoder.js.map +1 -1
- package/dist/decoding/propertyDecoder.spec.js +162 -199
- package/dist/decoding/propertyDecoder.spec.js.map +1 -1
- package/dist/decoding/stringDecoder.d.ts +2 -10
- package/dist/decoding/stringDecoder.js +150 -157
- package/dist/decoding/stringDecoder.js.map +1 -1
- package/dist/decoding/stringDecoder.spec.js +59 -60
- package/dist/decoding/stringDecoder.spec.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata/tile/dictionaryType.js.map +1 -1
- package/dist/metadata/tile/lengthType.js.map +1 -1
- package/dist/metadata/tile/logicalLevelTechnique.js.map +1 -1
- package/dist/metadata/tile/logicalStreamType.js.map +1 -1
- package/dist/metadata/tile/offsetType.js.map +1 -1
- package/dist/metadata/tile/physicalLevelTechnique.js.map +1 -1
- package/dist/metadata/tile/physicalStreamType.js.map +1 -1
- package/dist/metadata/tile/scalarType.js.map +1 -1
- package/dist/metadata/tile/streamMetadataDecoder.d.ts +28 -4
- package/dist/metadata/tile/streamMetadataDecoder.js +81 -15
- package/dist/metadata/tile/streamMetadataDecoder.js.map +1 -1
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js +4 -4
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js.map +1 -1
- package/dist/metadata/tileset/tilesetMetadata.js.map +1 -1
- package/dist/metadata/tileset/typeMap.d.ts +21 -29
- package/dist/metadata/tileset/typeMap.js +167 -169
- package/dist/metadata/tileset/typeMap.js.map +1 -1
- package/dist/mltDecoder.js +20 -18
- package/dist/mltDecoder.js.map +1 -1
- package/dist/mltDecoder.spec.js.map +1 -1
- package/dist/mltMetadata.js.map +1 -1
- package/dist/vector/constant/intConstVector.js.map +1 -1
- package/dist/vector/constant/longConstVector.js.map +1 -1
- package/dist/vector/dictionary/stringDictionaryVector.js.map +1 -1
- package/dist/vector/featureTable.js.map +1 -1
- package/dist/vector/filter/flatSelectionVector.d.ts +27 -0
- package/dist/vector/filter/flatSelectionVector.js +54 -0
- package/dist/vector/filter/flatSelectionVector.js.map +1 -0
- package/dist/vector/filter/flatSelectionVector.spec.d.ts +1 -0
- package/dist/vector/filter/flatSelectionVector.spec.js +51 -0
- package/dist/vector/filter/flatSelectionVector.spec.js.map +1 -0
- package/dist/vector/filter/selectionVector.d.ts +8 -0
- package/dist/vector/filter/selectionVector.js +2 -0
- package/dist/vector/filter/selectionVector.js.map +1 -0
- package/dist/vector/filter/selectionVectorUtil.spec.d.ts +1 -0
- package/dist/vector/filter/selectionVectorUtil.spec.js +154 -0
- package/dist/vector/filter/selectionVectorUtil.spec.js.map +1 -0
- package/dist/vector/filter/selectionVectorUtils.d.ts +16 -0
- package/dist/vector/filter/selectionVectorUtils.js +37 -0
- package/dist/vector/filter/selectionVectorUtils.js.map +1 -0
- package/dist/vector/filter/sequenceSelectionVector.d.ts +26 -0
- package/dist/vector/filter/sequenceSelectionVector.js +67 -0
- package/dist/vector/filter/sequenceSelectionVector.js.map +1 -0
- package/dist/vector/filter/sequenceSelectionVector.spec.d.ts +1 -0
- package/dist/vector/filter/sequenceSelectionVector.spec.js +115 -0
- package/dist/vector/filter/sequenceSelectionVector.spec.js.map +1 -0
- package/dist/vector/fixedSizeVector.js.map +1 -1
- package/dist/vector/flat/bitVector.js.map +1 -1
- package/dist/vector/flat/booleanFlatVector.js.map +1 -1
- package/dist/vector/flat/doubleFlatVector.js.map +1 -1
- package/dist/vector/flat/floatFlatVector.js.map +1 -1
- package/dist/vector/flat/floatFlatVector.spec.js.map +1 -1
- package/dist/vector/flat/intFlatVector.js.map +1 -1
- package/dist/vector/flat/intFlatVector.spec.js.map +1 -1
- package/dist/vector/flat/longFlatVector.js.map +1 -1
- package/dist/vector/flat/longFlatVector.spec.js.map +1 -1
- package/dist/vector/flat/stringFlatVector.js.map +1 -1
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.js.map +1 -1
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js.map +1 -1
- package/dist/vector/geometry/constGeometryVector.d.ts +2 -2
- package/dist/vector/geometry/constGeometryVector.js +6 -6
- package/dist/vector/geometry/constGeometryVector.js.map +1 -1
- package/dist/vector/geometry/constGpuVector.d.ts +1 -1
- package/dist/vector/geometry/constGpuVector.js +3 -24
- package/dist/vector/geometry/constGpuVector.js.map +1 -1
- package/dist/vector/geometry/flatGeometryVector.d.ts +2 -2
- package/dist/vector/geometry/flatGeometryVector.js +7 -7
- package/dist/vector/geometry/flatGeometryVector.js.map +1 -1
- package/dist/vector/geometry/flatGpuVector.d.ts +1 -1
- package/dist/vector/geometry/flatGpuVector.js +3 -22
- package/dist/vector/geometry/flatGpuVector.js.map +1 -1
- package/dist/vector/geometry/geometryType.js.map +1 -1
- package/dist/vector/geometry/geometryVector.js +2 -2
- package/dist/vector/geometry/geometryVector.js.map +1 -1
- package/dist/vector/geometry/geometryVectorConverter.js +4 -4
- package/dist/vector/geometry/geometryVectorConverter.js.map +1 -1
- package/dist/vector/geometry/gpuVector.js.map +1 -1
- package/dist/vector/geometry/topologyVector.js.map +1 -1
- package/dist/vector/geometry/vertexBufferType.js.map +1 -1
- package/dist/vector/geometry/zOrderCurve.d.ts +4 -17
- package/dist/vector/geometry/zOrderCurve.js +10 -35
- package/dist/vector/geometry/zOrderCurve.js.map +1 -1
- package/dist/vector/geometry/zOrderCurve.spec.js +15 -10
- package/dist/vector/geometry/zOrderCurve.spec.js.map +1 -1
- package/dist/vector/intVector.js.map +1 -1
- package/dist/vector/sequence/intSequenceVector.js.map +1 -1
- package/dist/vector/sequence/longSequenceVector.js.map +1 -1
- package/dist/vector/sequence/longSequenceVektor.spec.js.map +1 -1
- package/dist/vector/sequence/sequenceVector.js.map +1 -1
- package/dist/vector/variableSizeVector.js.map +1 -1
- package/dist/vector/vector.js.map +1 -1
- package/dist/vector/vectorType.js.map +1 -1
- package/package.json +5 -5
- package/dist/metadata/tile/mortonEncodedStreamMetadata.d.ts +0 -15
- package/dist/metadata/tile/mortonEncodedStreamMetadata.js +0 -27
- package/dist/metadata/tile/mortonEncodedStreamMetadata.js.map +0 -1
- package/dist/metadata/tile/rleEncodedStreamMetadata.d.ts +0 -24
- package/dist/metadata/tile/rleEncodedStreamMetadata.js +0 -38
- package/dist/metadata/tile/rleEncodedStreamMetadata.js.map +0 -1
- package/dist/metadata/tile/streamMetadata.d.ts +0 -29
- package/dist/metadata/tile/streamMetadata.js +0 -82
- package/dist/metadata/tile/streamMetadata.js.map +0 -1
- package/dist/vector/geometry/spaceFillingCurve.d.ts +0 -22
- package/dist/vector/geometry/spaceFillingCurve.js +0 -31
- package/dist/vector/geometry/spaceFillingCurve.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from
|
|
2
|
-
import
|
|
3
|
-
import IntegerStreamDecoder from "./integerStreamDecoder";
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import * as StreamMetadataDecoder from "../metadata/tile/streamMetadataDecoder";
|
|
3
|
+
import * as IntegerStreamDecoder from "./integerStreamDecoder";
|
|
4
4
|
import { decodePropertyColumn } from "./propertyDecoder";
|
|
5
5
|
import { ScalarType } from "../metadata/tile/scalarType";
|
|
6
6
|
import IntWrapper from "./intWrapper";
|
|
@@ -11,8 +11,8 @@ import { LongSequenceVector } from "../vector/sequence/longSequenceVector";
|
|
|
11
11
|
import { IntConstVector } from "../vector/constant/intConstVector";
|
|
12
12
|
import { LongConstVector } from "../vector/constant/longConstVector";
|
|
13
13
|
import { VectorType } from "../vector/vectorType";
|
|
14
|
-
import
|
|
15
|
-
import * as decodingUtils from
|
|
14
|
+
import * as StringDecoder from "./stringDecoder";
|
|
15
|
+
import * as decodingUtils from "./decodingUtils";
|
|
16
16
|
import { BooleanFlatVector } from "../vector/flat/booleanFlatVector";
|
|
17
17
|
import { FloatFlatVector } from "../vector/flat/floatFlatVector";
|
|
18
18
|
import { DoubleFlatVector } from "../vector/flat/doubleFlatVector";
|
|
@@ -21,22 +21,22 @@ const TEST_DATA = {
|
|
|
21
21
|
BYTE_LENGTH: 12,
|
|
22
22
|
NUM_VALUES: 3,
|
|
23
23
|
NULLABILITY_BYTE_LENGTH: 1,
|
|
24
|
-
BUFFER_SIZE: 100
|
|
24
|
+
BUFFER_SIZE: 100,
|
|
25
25
|
};
|
|
26
26
|
// Helper: Create column with specific configuration
|
|
27
27
|
function createColumn(scalarType, nullable = false) {
|
|
28
28
|
return {
|
|
29
|
-
name:
|
|
29
|
+
name: "age",
|
|
30
30
|
nullable,
|
|
31
31
|
columnScope: null,
|
|
32
|
-
type:
|
|
32
|
+
type: "scalarType",
|
|
33
33
|
scalarType: {
|
|
34
34
|
longID: false,
|
|
35
35
|
physicalType: scalarType,
|
|
36
36
|
logicalType: null,
|
|
37
|
-
type:
|
|
37
|
+
type: "physicalType",
|
|
38
38
|
},
|
|
39
|
-
complexType: null
|
|
39
|
+
complexType: null,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
// Helper: Setup stream metadata mock
|
|
@@ -62,81 +62,65 @@ function mockRleStreamMetadata(byteLength = TEST_DATA.BYTE_LENGTH, numValues = T
|
|
|
62
62
|
}
|
|
63
63
|
// Helper: Mock integer decoders (INT_32 or INT_64)
|
|
64
64
|
function mockIntegerDecoder(scalarType) {
|
|
65
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
66
|
-
.mockReturnValue(VectorType.FLAT);
|
|
65
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
67
66
|
if (scalarType === ScalarType.INT_64 || scalarType === ScalarType.UINT_64) {
|
|
68
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
69
|
-
.mockReturnValue(new BigInt64Array([100n, 200n, 300n]));
|
|
67
|
+
vi.spyOn(IntegerStreamDecoder, "decodeLongStream").mockReturnValue(new BigInt64Array([100n, 200n, 300n]));
|
|
70
68
|
}
|
|
71
69
|
else {
|
|
72
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
73
|
-
.mockReturnValue(new Int32Array([100, 200, 300]));
|
|
70
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(new Int32Array([100, 200, 300]));
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
73
|
// Helper: Mock integer sequence decoders
|
|
77
74
|
function mockIntegerSequenceDecoder(scalarType) {
|
|
78
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
79
|
-
.mockReturnValue(VectorType.SEQUENCE);
|
|
75
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.SEQUENCE);
|
|
80
76
|
if (scalarType === ScalarType.INT_64 || scalarType === ScalarType.UINT_64) {
|
|
81
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
82
|
-
.mockReturnValue([10n, 20n]);
|
|
77
|
+
vi.spyOn(IntegerStreamDecoder, "decodeSequenceLongStream").mockReturnValue([10n, 20n]);
|
|
83
78
|
}
|
|
84
79
|
else {
|
|
85
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
86
|
-
.mockReturnValue([10, 20]);
|
|
80
|
+
vi.spyOn(IntegerStreamDecoder, "decodeSequenceIntStream").mockReturnValue([10, 20]);
|
|
87
81
|
}
|
|
88
82
|
}
|
|
89
83
|
// Helper: Mock integer const decoders
|
|
90
84
|
function mockIntegerConstDecoder(scalarType) {
|
|
91
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
92
|
-
.mockReturnValue(VectorType.CONST);
|
|
85
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.CONST);
|
|
93
86
|
if (scalarType === ScalarType.INT_64 || scalarType === ScalarType.UINT_64) {
|
|
94
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
95
|
-
.mockReturnValue(42n);
|
|
87
|
+
vi.spyOn(IntegerStreamDecoder, "decodeConstLongStream").mockReturnValue(42n);
|
|
96
88
|
}
|
|
97
89
|
else {
|
|
98
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
99
|
-
.mockReturnValue(42);
|
|
90
|
+
vi.spyOn(IntegerStreamDecoder, "decodeConstIntStream").mockReturnValue(42);
|
|
100
91
|
}
|
|
101
92
|
}
|
|
102
93
|
// Helper: Mock float decoders (FLOAT or DOUBLE)
|
|
103
94
|
function mockFloatDecoder(scalarType) {
|
|
104
95
|
if (scalarType === ScalarType.FLOAT) {
|
|
105
|
-
vi.spyOn(decodingUtils,
|
|
106
|
-
.mockReturnValue(new Float32Array([100.5, 200.5, 300.5]));
|
|
96
|
+
vi.spyOn(decodingUtils, "decodeFloatsLE").mockReturnValue(new Float32Array([100.5, 200.5, 300.5]));
|
|
107
97
|
}
|
|
108
98
|
else if (scalarType === ScalarType.DOUBLE) {
|
|
109
|
-
vi.spyOn(decodingUtils,
|
|
110
|
-
.mockReturnValue(new Float64Array([100.5, 200.5, 300.5]));
|
|
99
|
+
vi.spyOn(decodingUtils, "decodeDoublesLE").mockReturnValue(new Float64Array([100.5, 200.5, 300.5]));
|
|
111
100
|
}
|
|
112
101
|
}
|
|
113
102
|
// Helper: Mock nullable float decoders
|
|
114
103
|
function mockNullableFloatDecoder(scalarType) {
|
|
115
104
|
if (scalarType === ScalarType.FLOAT) {
|
|
116
|
-
vi.spyOn(decodingUtils,
|
|
117
|
-
.mockReturnValue(new Float32Array([100.5, 200.5, 300.5]));
|
|
105
|
+
vi.spyOn(decodingUtils, "decodeNullableFloatsLE").mockReturnValue(new Float32Array([100.5, 200.5, 300.5]));
|
|
118
106
|
}
|
|
119
107
|
else if (scalarType === ScalarType.DOUBLE) {
|
|
120
|
-
vi.spyOn(decodingUtils,
|
|
121
|
-
.mockReturnValue(new Float64Array([100.5, 200.5, 300.5]));
|
|
108
|
+
vi.spyOn(decodingUtils, "decodeNullableDoublesLE").mockReturnValue(new Float64Array([100.5, 200.5, 300.5]));
|
|
122
109
|
}
|
|
123
110
|
}
|
|
124
111
|
// Helper: Mock nullable integer decoders
|
|
125
112
|
function mockNullableIntegerDecoder(scalarType) {
|
|
126
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
127
|
-
.mockReturnValue(VectorType.FLAT);
|
|
113
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
128
114
|
if (scalarType === ScalarType.INT_64 || scalarType === ScalarType.UINT_64) {
|
|
129
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
130
|
-
.mockReturnValue(new BigInt64Array([100n, 200n, 300n]));
|
|
115
|
+
vi.spyOn(IntegerStreamDecoder, "decodeNullableLongStream").mockReturnValue(new BigInt64Array([100n, 200n, 300n]));
|
|
131
116
|
}
|
|
132
117
|
else {
|
|
133
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
134
|
-
.mockReturnValue(new Int32Array([100, 200, 300]));
|
|
118
|
+
vi.spyOn(IntegerStreamDecoder, "decodeNullableIntStream").mockReturnValue(new Int32Array([100, 200, 300]));
|
|
135
119
|
}
|
|
136
120
|
}
|
|
137
121
|
// Helper: Setup nullable column with separate nullability stream
|
|
138
122
|
function setupNullableStreamMocks() {
|
|
139
|
-
const metadataSpy = vi.spyOn(StreamMetadataDecoder,
|
|
123
|
+
const metadataSpy = vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata");
|
|
140
124
|
// First call: nullability stream
|
|
141
125
|
metadataSpy.mockReturnValueOnce({
|
|
142
126
|
byteLength: TEST_DATA.NULLABILITY_BYTE_LENGTH,
|
|
@@ -148,29 +132,28 @@ function setupNullableStreamMocks() {
|
|
|
148
132
|
// Subsequent calls: data stream
|
|
149
133
|
metadataSpy.mockReturnValue(mockStreamMetadata());
|
|
150
134
|
// Mock the nullability bitmap decoding
|
|
151
|
-
vi.spyOn(decodingUtils,
|
|
152
|
-
.mockReturnValue(new Uint8Array([0b00000111]));
|
|
135
|
+
vi.spyOn(decodingUtils, "decodeBooleanRle").mockReturnValue(new Uint8Array([0b00000111]));
|
|
153
136
|
}
|
|
154
|
-
describe(
|
|
137
|
+
describe("decodePropertyColumn", () => {
|
|
155
138
|
afterEach(() => vi.restoreAllMocks());
|
|
156
|
-
describe(
|
|
139
|
+
describe("Number Columns - Non-Nullable - Signed Types", () => {
|
|
157
140
|
const numberTypes = [
|
|
158
141
|
{
|
|
159
142
|
scalarType: ScalarType.INT_32,
|
|
160
143
|
vectorClass: IntFlatVector,
|
|
161
144
|
mockFn: mockIntegerDecoder,
|
|
162
|
-
testName:
|
|
145
|
+
testName: "INT_32",
|
|
163
146
|
},
|
|
164
147
|
{
|
|
165
148
|
scalarType: ScalarType.INT_64,
|
|
166
149
|
vectorClass: LongFlatVector,
|
|
167
150
|
mockFn: mockIntegerDecoder,
|
|
168
|
-
testName:
|
|
169
|
-
}
|
|
151
|
+
testName: "INT_64",
|
|
152
|
+
},
|
|
170
153
|
];
|
|
171
|
-
it.each(numberTypes)(
|
|
154
|
+
it.each(numberTypes)("should decode $testName column", ({ scalarType, vectorClass, mockFn }) => {
|
|
172
155
|
// Arrange
|
|
173
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
156
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
174
157
|
mockFn(scalarType);
|
|
175
158
|
const column = createColumn(scalarType, false);
|
|
176
159
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -179,28 +162,28 @@ describe('decodePropertyColumn', () => {
|
|
|
179
162
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
180
163
|
// Assert
|
|
181
164
|
expect(result).toBeInstanceOf(vectorClass);
|
|
182
|
-
expect(result._name).toBe(
|
|
165
|
+
expect(result._name).toBe("age");
|
|
183
166
|
expect(result.dataBuffer).toHaveLength(TEST_DATA.NUM_VALUES);
|
|
184
167
|
});
|
|
185
168
|
});
|
|
186
|
-
describe(
|
|
169
|
+
describe("Number Columns - Non-Nullable - Unsigned Types", () => {
|
|
187
170
|
const numberTypes = [
|
|
188
171
|
{
|
|
189
172
|
scalarType: ScalarType.UINT_32,
|
|
190
173
|
vectorClass: IntFlatVector,
|
|
191
174
|
mockFn: mockIntegerDecoder,
|
|
192
|
-
testName:
|
|
175
|
+
testName: "UINT_32",
|
|
193
176
|
},
|
|
194
177
|
{
|
|
195
178
|
scalarType: ScalarType.UINT_64,
|
|
196
179
|
vectorClass: LongFlatVector,
|
|
197
180
|
mockFn: mockIntegerDecoder,
|
|
198
|
-
testName:
|
|
199
|
-
}
|
|
181
|
+
testName: "UINT_64",
|
|
182
|
+
},
|
|
200
183
|
];
|
|
201
|
-
it.each(numberTypes)(
|
|
184
|
+
it.each(numberTypes)("should decode $testName column", ({ scalarType, vectorClass, mockFn }) => {
|
|
202
185
|
// Arrange
|
|
203
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
186
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
204
187
|
mockFn(scalarType);
|
|
205
188
|
const column = createColumn(scalarType, false);
|
|
206
189
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -209,16 +192,16 @@ describe('decodePropertyColumn', () => {
|
|
|
209
192
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
210
193
|
// Assert
|
|
211
194
|
expect(result).toBeInstanceOf(vectorClass);
|
|
212
|
-
expect(result._name).toBe(
|
|
195
|
+
expect(result._name).toBe("age");
|
|
213
196
|
expect(result.dataBuffer).toHaveLength(TEST_DATA.NUM_VALUES);
|
|
214
197
|
});
|
|
215
198
|
});
|
|
216
|
-
describe(
|
|
199
|
+
describe("Number Columns - Nullable - Signed Types", () => {
|
|
217
200
|
const numberTypes = [
|
|
218
|
-
{ scalarType: ScalarType.INT_32, mockFn: mockNullableIntegerDecoder, testName:
|
|
219
|
-
{ scalarType: ScalarType.INT_64, mockFn: mockNullableIntegerDecoder, testName:
|
|
201
|
+
{ scalarType: ScalarType.INT_32, mockFn: mockNullableIntegerDecoder, testName: "INT_32" },
|
|
202
|
+
{ scalarType: ScalarType.INT_64, mockFn: mockNullableIntegerDecoder, testName: "INT_64" },
|
|
220
203
|
];
|
|
221
|
-
it.each(numberTypes)(
|
|
204
|
+
it.each(numberTypes)("should decode nullable $testName column with null mask", ({ scalarType, mockFn }) => {
|
|
222
205
|
// Arrange
|
|
223
206
|
setupNullableStreamMocks();
|
|
224
207
|
mockFn(scalarType);
|
|
@@ -229,15 +212,15 @@ describe('decodePropertyColumn', () => {
|
|
|
229
212
|
const result = decodePropertyColumn(data, offset, column, 2, TEST_DATA.NUM_VALUES);
|
|
230
213
|
// Assert
|
|
231
214
|
expect(result).toBeDefined();
|
|
232
|
-
expect(result._name).toBe(
|
|
215
|
+
expect(result._name).toBe("age");
|
|
233
216
|
});
|
|
234
217
|
});
|
|
235
|
-
describe(
|
|
218
|
+
describe("Number Columns - Nullable - Unsigned Types", () => {
|
|
236
219
|
const numberTypes = [
|
|
237
|
-
{ scalarType: ScalarType.UINT_32, mockFn: mockNullableIntegerDecoder, testName:
|
|
238
|
-
{ scalarType: ScalarType.UINT_64, mockFn: mockNullableIntegerDecoder, testName:
|
|
220
|
+
{ scalarType: ScalarType.UINT_32, mockFn: mockNullableIntegerDecoder, testName: "UINT_32" },
|
|
221
|
+
{ scalarType: ScalarType.UINT_64, mockFn: mockNullableIntegerDecoder, testName: "UINT_64" },
|
|
239
222
|
];
|
|
240
|
-
it.each(numberTypes)(
|
|
223
|
+
it.each(numberTypes)("should decode nullable $testName column with null mask", ({ scalarType, mockFn }) => {
|
|
241
224
|
// Arrange
|
|
242
225
|
setupNullableStreamMocks();
|
|
243
226
|
mockFn(scalarType);
|
|
@@ -248,27 +231,27 @@ describe('decodePropertyColumn', () => {
|
|
|
248
231
|
const result = decodePropertyColumn(data, offset, column, 2, TEST_DATA.NUM_VALUES);
|
|
249
232
|
// Assert
|
|
250
233
|
expect(result).toBeDefined();
|
|
251
|
-
expect(result._name).toBe(
|
|
234
|
+
expect(result._name).toBe("age");
|
|
252
235
|
});
|
|
253
236
|
});
|
|
254
|
-
describe(
|
|
237
|
+
describe("Integer Vector Encoding Types - SEQUENCE", () => {
|
|
255
238
|
const numberTypes = [
|
|
256
239
|
{
|
|
257
240
|
scalarType: ScalarType.INT_32,
|
|
258
241
|
vectorClass: IntSequenceVector,
|
|
259
242
|
mockFn: mockIntegerSequenceDecoder,
|
|
260
|
-
testName:
|
|
243
|
+
testName: "INT_32",
|
|
261
244
|
},
|
|
262
245
|
{
|
|
263
246
|
scalarType: ScalarType.INT_64,
|
|
264
247
|
vectorClass: LongSequenceVector,
|
|
265
248
|
mockFn: mockIntegerSequenceDecoder,
|
|
266
|
-
testName:
|
|
267
|
-
}
|
|
249
|
+
testName: "INT_64",
|
|
250
|
+
},
|
|
268
251
|
];
|
|
269
|
-
it.each(numberTypes)(
|
|
252
|
+
it.each(numberTypes)("should decode $testName with SEQUENCE encoding", ({ scalarType, vectorClass, mockFn }) => {
|
|
270
253
|
// Arrange
|
|
271
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
254
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockRleStreamMetadata());
|
|
272
255
|
mockFn(scalarType);
|
|
273
256
|
const column = createColumn(scalarType, false);
|
|
274
257
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -277,27 +260,27 @@ describe('decodePropertyColumn', () => {
|
|
|
277
260
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
278
261
|
// Assert
|
|
279
262
|
expect(result).toBeInstanceOf(vectorClass);
|
|
280
|
-
expect(result._name).toBe(
|
|
263
|
+
expect(result._name).toBe("age");
|
|
281
264
|
});
|
|
282
265
|
});
|
|
283
|
-
describe(
|
|
266
|
+
describe("Integer Vector Encoding Types - CONST", () => {
|
|
284
267
|
const numberTypes = [
|
|
285
268
|
{
|
|
286
269
|
scalarType: ScalarType.INT_32,
|
|
287
270
|
vectorClass: IntConstVector,
|
|
288
271
|
mockFn: mockIntegerConstDecoder,
|
|
289
|
-
testName:
|
|
272
|
+
testName: "INT_32",
|
|
290
273
|
},
|
|
291
274
|
{
|
|
292
275
|
scalarType: ScalarType.INT_64,
|
|
293
276
|
vectorClass: LongConstVector,
|
|
294
277
|
mockFn: mockIntegerConstDecoder,
|
|
295
|
-
testName:
|
|
296
|
-
}
|
|
278
|
+
testName: "INT_64",
|
|
279
|
+
},
|
|
297
280
|
];
|
|
298
|
-
it.each(numberTypes)(
|
|
281
|
+
it.each(numberTypes)("should decode $testName with CONST encoding", ({ scalarType, vectorClass, mockFn }) => {
|
|
299
282
|
// Arrange
|
|
300
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
283
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
301
284
|
mockFn(scalarType);
|
|
302
285
|
const column = createColumn(scalarType, false);
|
|
303
286
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -306,27 +289,27 @@ describe('decodePropertyColumn', () => {
|
|
|
306
289
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
307
290
|
// Assert
|
|
308
291
|
expect(result).toBeInstanceOf(vectorClass);
|
|
309
|
-
expect(result._name).toBe(
|
|
292
|
+
expect(result._name).toBe("age");
|
|
310
293
|
});
|
|
311
294
|
});
|
|
312
|
-
describe(
|
|
295
|
+
describe("Float Columns - Non-Nullable", () => {
|
|
313
296
|
const numberTypes = [
|
|
314
297
|
{
|
|
315
298
|
scalarType: ScalarType.FLOAT,
|
|
316
299
|
vectorClass: FloatFlatVector,
|
|
317
300
|
mockFn: mockFloatDecoder,
|
|
318
|
-
testName:
|
|
301
|
+
testName: "FLOAT",
|
|
319
302
|
},
|
|
320
303
|
{
|
|
321
304
|
scalarType: ScalarType.DOUBLE,
|
|
322
305
|
vectorClass: DoubleFlatVector,
|
|
323
306
|
mockFn: mockFloatDecoder,
|
|
324
|
-
testName:
|
|
325
|
-
}
|
|
307
|
+
testName: "DOUBLE",
|
|
308
|
+
},
|
|
326
309
|
];
|
|
327
|
-
it.each(numberTypes)(
|
|
310
|
+
it.each(numberTypes)("should decode $testName column", ({ scalarType, vectorClass, mockFn }) => {
|
|
328
311
|
// Arrange
|
|
329
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
312
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
330
313
|
mockFn(scalarType);
|
|
331
314
|
const column = createColumn(scalarType, false);
|
|
332
315
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -335,26 +318,26 @@ describe('decodePropertyColumn', () => {
|
|
|
335
318
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
336
319
|
// Assert
|
|
337
320
|
expect(result).toBeInstanceOf(vectorClass);
|
|
338
|
-
expect(result._name).toBe(
|
|
321
|
+
expect(result._name).toBe("age");
|
|
339
322
|
expect(result.dataBuffer).toHaveLength(TEST_DATA.NUM_VALUES);
|
|
340
323
|
});
|
|
341
324
|
});
|
|
342
|
-
describe(
|
|
325
|
+
describe("Float Columns - Nullable", () => {
|
|
343
326
|
const numberTypes = [
|
|
344
327
|
{
|
|
345
328
|
scalarType: ScalarType.FLOAT,
|
|
346
329
|
vectorClass: FloatFlatVector,
|
|
347
330
|
mockFn: mockNullableFloatDecoder,
|
|
348
|
-
testName:
|
|
331
|
+
testName: "FLOAT",
|
|
349
332
|
},
|
|
350
333
|
{
|
|
351
334
|
scalarType: ScalarType.DOUBLE,
|
|
352
335
|
vectorClass: DoubleFlatVector,
|
|
353
336
|
mockFn: mockNullableFloatDecoder,
|
|
354
|
-
testName:
|
|
355
|
-
}
|
|
337
|
+
testName: "DOUBLE",
|
|
338
|
+
},
|
|
356
339
|
];
|
|
357
|
-
it.each(numberTypes)(
|
|
340
|
+
it.each(numberTypes)("should decode nullable $testName column with null mask", ({ scalarType, vectorClass, mockFn }) => {
|
|
358
341
|
// Arrange
|
|
359
342
|
setupNullableStreamMocks();
|
|
360
343
|
mockFn(scalarType);
|
|
@@ -365,15 +348,14 @@ describe('decodePropertyColumn', () => {
|
|
|
365
348
|
const result = decodePropertyColumn(data, offset, column, 2, TEST_DATA.NUM_VALUES);
|
|
366
349
|
// Assert
|
|
367
350
|
expect(result).toBeInstanceOf(vectorClass);
|
|
368
|
-
expect(result._name).toBe(
|
|
351
|
+
expect(result._name).toBe("age");
|
|
369
352
|
});
|
|
370
353
|
});
|
|
371
|
-
describe(
|
|
372
|
-
it(
|
|
354
|
+
describe("Boolean Columns", () => {
|
|
355
|
+
it("should decode non-nullable BOOLEAN column", () => {
|
|
373
356
|
// Arrange
|
|
374
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
375
|
-
vi.spyOn(decodingUtils,
|
|
376
|
-
.mockReturnValue(new Uint8Array([0b00000111]));
|
|
357
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
358
|
+
vi.spyOn(decodingUtils, "decodeBooleanRle").mockReturnValue(new Uint8Array([0b00000111]));
|
|
377
359
|
const column = createColumn(ScalarType.BOOLEAN, false);
|
|
378
360
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
379
361
|
const offset = new IntWrapper(0);
|
|
@@ -381,13 +363,12 @@ describe('decodePropertyColumn', () => {
|
|
|
381
363
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
382
364
|
// Assert
|
|
383
365
|
expect(result).toBeInstanceOf(BooleanFlatVector);
|
|
384
|
-
expect(result._name).toBe(
|
|
366
|
+
expect(result._name).toBe("age");
|
|
385
367
|
});
|
|
386
|
-
it(
|
|
368
|
+
it("should decode nullable BOOLEAN column with null mask", () => {
|
|
387
369
|
// Arrange
|
|
388
370
|
setupNullableStreamMocks();
|
|
389
|
-
vi.spyOn(decodingUtils,
|
|
390
|
-
.mockReturnValue(new Uint8Array([0b00000111]));
|
|
371
|
+
vi.spyOn(decodingUtils, "decodeNullableBooleanRle").mockReturnValue(new Uint8Array([0b00000111]));
|
|
391
372
|
const column = createColumn(ScalarType.BOOLEAN, true);
|
|
392
373
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
393
374
|
const offset = new IntWrapper(0);
|
|
@@ -395,20 +376,19 @@ describe('decodePropertyColumn', () => {
|
|
|
395
376
|
const result = decodePropertyColumn(data, offset, column, 2, TEST_DATA.NUM_VALUES);
|
|
396
377
|
// Assert
|
|
397
378
|
expect(result).toBeInstanceOf(BooleanFlatVector);
|
|
398
|
-
expect(result._name).toBe(
|
|
379
|
+
expect(result._name).toBe("age");
|
|
399
380
|
});
|
|
400
381
|
});
|
|
401
|
-
describe(
|
|
382
|
+
describe("String Columns - Nullable", () => {
|
|
402
383
|
const streamConfigs = [
|
|
403
|
-
{ totalStreams: 2, description:
|
|
404
|
-
{ totalStreams: 4, description:
|
|
384
|
+
{ totalStreams: 2, description: "single data stream" },
|
|
385
|
+
{ totalStreams: 4, description: "multiple data streams" },
|
|
405
386
|
];
|
|
406
|
-
it.each(streamConfigs)(
|
|
387
|
+
it.each(streamConfigs)("should decode nullable STRING with $description", ({ totalStreams }) => {
|
|
407
388
|
// Arrange
|
|
408
389
|
setupNullableStreamMocks();
|
|
409
|
-
const mockStringVector = { name:
|
|
410
|
-
const stringDecodeSpy = vi.spyOn(StringDecoder,
|
|
411
|
-
.mockReturnValue(mockStringVector);
|
|
390
|
+
const mockStringVector = { name: "age" };
|
|
391
|
+
const stringDecodeSpy = vi.spyOn(StringDecoder, "decodeString").mockReturnValue(mockStringVector);
|
|
412
392
|
const column = createColumn(ScalarType.STRING, true);
|
|
413
393
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
414
394
|
const offset = new IntWrapper(0);
|
|
@@ -418,13 +398,13 @@ describe('decodePropertyColumn', () => {
|
|
|
418
398
|
expect(result.name).toBe(mockStringVector.name);
|
|
419
399
|
});
|
|
420
400
|
});
|
|
421
|
-
describe(
|
|
422
|
-
it(
|
|
401
|
+
describe("Column Filtering", () => {
|
|
402
|
+
it("should return null when column NOT in propertyColumnNames filter", () => {
|
|
423
403
|
// Arrange
|
|
424
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
425
|
-
const skipColumnSpy = vi.spyOn(decodingUtils,
|
|
404
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
405
|
+
const skipColumnSpy = vi.spyOn(decodingUtils, "skipColumn");
|
|
426
406
|
const column = createColumn(ScalarType.STRING);
|
|
427
|
-
const filterList = new Set([
|
|
407
|
+
const filterList = new Set(["name", "value"]);
|
|
428
408
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
429
409
|
const offset = new IntWrapper(0);
|
|
430
410
|
// Act
|
|
@@ -433,13 +413,12 @@ describe('decodePropertyColumn', () => {
|
|
|
433
413
|
expect(result).toBeNull();
|
|
434
414
|
expect(skipColumnSpy).toHaveBeenCalledWith(1, data, offset);
|
|
435
415
|
});
|
|
436
|
-
it(
|
|
416
|
+
it("should decode column when it IS in propertyColumnNames filter", () => {
|
|
437
417
|
// Arrange
|
|
438
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
439
|
-
vi.spyOn(decodingUtils,
|
|
440
|
-
.mockReturnValue(new Uint8Array([0b00000111]));
|
|
418
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
419
|
+
vi.spyOn(decodingUtils, "decodeBooleanRle").mockReturnValue(new Uint8Array([0b00000111]));
|
|
441
420
|
const column = createColumn(ScalarType.BOOLEAN);
|
|
442
|
-
const filterList = new Set([
|
|
421
|
+
const filterList = new Set(["age", "name"]);
|
|
443
422
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
444
423
|
const offset = new IntWrapper(0);
|
|
445
424
|
// Act
|
|
@@ -447,11 +426,10 @@ describe('decodePropertyColumn', () => {
|
|
|
447
426
|
// Assert
|
|
448
427
|
expect(result).toBeInstanceOf(BooleanFlatVector);
|
|
449
428
|
});
|
|
450
|
-
it(
|
|
429
|
+
it("should ignore filter when propertyColumnNames is undefined", () => {
|
|
451
430
|
// Arrange
|
|
452
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
453
|
-
vi.spyOn(decodingUtils,
|
|
454
|
-
.mockReturnValue(new Uint8Array([0b00000111]));
|
|
431
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
432
|
+
vi.spyOn(decodingUtils, "decodeBooleanRle").mockReturnValue(new Uint8Array([0b00000111]));
|
|
455
433
|
const column = createColumn(ScalarType.BOOLEAN);
|
|
456
434
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
457
435
|
const offset = new IntWrapper(0);
|
|
@@ -460,10 +438,10 @@ describe('decodePropertyColumn', () => {
|
|
|
460
438
|
// Assert
|
|
461
439
|
expect(result).toBeInstanceOf(BooleanFlatVector);
|
|
462
440
|
});
|
|
463
|
-
it(
|
|
441
|
+
it("should handle empty filter set", () => {
|
|
464
442
|
// Arrange
|
|
465
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
466
|
-
const skipColumnSpy = vi.spyOn(decodingUtils,
|
|
443
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
444
|
+
const skipColumnSpy = vi.spyOn(decodingUtils, "skipColumn");
|
|
467
445
|
const column = createColumn(ScalarType.BOOLEAN);
|
|
468
446
|
const filterList = new Set();
|
|
469
447
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -475,15 +453,12 @@ describe('decodePropertyColumn', () => {
|
|
|
475
453
|
expect(skipColumnSpy).toHaveBeenCalled();
|
|
476
454
|
});
|
|
477
455
|
});
|
|
478
|
-
describe(
|
|
479
|
-
it(
|
|
456
|
+
describe("Edge Cases", () => {
|
|
457
|
+
it("should handle single value column", () => {
|
|
480
458
|
// Arrange
|
|
481
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
482
|
-
|
|
483
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
484
|
-
.mockReturnValue(VectorType.FLAT);
|
|
485
|
-
vi.spyOn(IntegerStreamDecoder, 'decodeIntStream')
|
|
486
|
-
.mockReturnValue(new Int32Array([42]));
|
|
459
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata(12, 1));
|
|
460
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
461
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(new Int32Array([42]));
|
|
487
462
|
const column = createColumn(ScalarType.INT_32);
|
|
488
463
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
489
464
|
const offset = new IntWrapper(0);
|
|
@@ -493,19 +468,16 @@ describe('decodePropertyColumn', () => {
|
|
|
493
468
|
expect(result).toBeInstanceOf(IntFlatVector);
|
|
494
469
|
expect(result.dataBuffer).toHaveLength(1);
|
|
495
470
|
});
|
|
496
|
-
it(
|
|
471
|
+
it("should handle large column with many values", () => {
|
|
497
472
|
// Arrange
|
|
498
473
|
const largeNumValues = 100000;
|
|
499
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
500
|
-
|
|
501
|
-
vi.spyOn(IntegerStreamDecoder, 'getVectorType')
|
|
502
|
-
.mockReturnValue(VectorType.FLAT);
|
|
474
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata(400000, largeNumValues));
|
|
475
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
503
476
|
const largeArray = new Int32Array(largeNumValues);
|
|
504
477
|
for (let i = 0; i < largeNumValues; i++) {
|
|
505
478
|
largeArray[i] = i;
|
|
506
479
|
}
|
|
507
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
508
|
-
.mockReturnValue(largeArray);
|
|
480
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(largeArray);
|
|
509
481
|
const column = createColumn(ScalarType.INT_32);
|
|
510
482
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
511
483
|
const offset = new IntWrapper(0);
|
|
@@ -515,14 +487,14 @@ describe('decodePropertyColumn', () => {
|
|
|
515
487
|
expect(result).toBeInstanceOf(IntFlatVector);
|
|
516
488
|
expect(result.dataBuffer).toHaveLength(largeNumValues);
|
|
517
489
|
});
|
|
518
|
-
it(
|
|
490
|
+
it("should handle zero numValues gracefully", () => {
|
|
519
491
|
// Arrange
|
|
520
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
525
|
-
|
|
492
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue({
|
|
493
|
+
...mockStreamMetadata(),
|
|
494
|
+
numValues: 0,
|
|
495
|
+
});
|
|
496
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
497
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(new Int32Array(0));
|
|
526
498
|
const column = createColumn(ScalarType.INT_32);
|
|
527
499
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
528
500
|
const offset = new IntWrapper(0);
|
|
@@ -532,14 +504,11 @@ describe('decodePropertyColumn', () => {
|
|
|
532
504
|
expect(result).toBeInstanceOf(IntFlatVector);
|
|
533
505
|
expect(result.dataBuffer).toHaveLength(0);
|
|
534
506
|
});
|
|
535
|
-
it(
|
|
507
|
+
it("should handle multiple sequential columns with offset advancement", () => {
|
|
536
508
|
// Arrange
|
|
537
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
538
|
-
|
|
539
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
540
|
-
.mockReturnValue(VectorType.FLAT);
|
|
541
|
-
vi.spyOn(IntegerStreamDecoder, 'decodeIntStream')
|
|
542
|
-
.mockReturnValue(new Int32Array([100, 200, 300]));
|
|
509
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata(12, 3));
|
|
510
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
511
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(new Int32Array([100, 200, 300]));
|
|
543
512
|
const column1 = createColumn(ScalarType.INT_32);
|
|
544
513
|
const column2 = createColumn(ScalarType.INT_32);
|
|
545
514
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -554,15 +523,15 @@ describe('decodePropertyColumn', () => {
|
|
|
554
523
|
expect(result2).toBeInstanceOf(IntFlatVector);
|
|
555
524
|
expect(offsetAfterSecond).toEqual(offsetAfterFirst);
|
|
556
525
|
});
|
|
557
|
-
it(
|
|
526
|
+
it("should handle non-scalar column type returning null", () => {
|
|
558
527
|
// Arrange
|
|
559
528
|
const column = {
|
|
560
|
-
name:
|
|
529
|
+
name: "complex",
|
|
561
530
|
nullable: false,
|
|
562
531
|
columnScope: null,
|
|
563
|
-
type:
|
|
564
|
-
complexType: { type:
|
|
565
|
-
scalarType: null
|
|
532
|
+
type: "complexType",
|
|
533
|
+
complexType: { type: "arrayType" },
|
|
534
|
+
scalarType: null,
|
|
566
535
|
};
|
|
567
536
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
568
537
|
const offset = new IntWrapper(0);
|
|
@@ -572,14 +541,12 @@ describe('decodePropertyColumn', () => {
|
|
|
572
541
|
expect(result).toBeNull();
|
|
573
542
|
});
|
|
574
543
|
});
|
|
575
|
-
describe(
|
|
576
|
-
it(
|
|
544
|
+
describe("Offset Management", () => {
|
|
545
|
+
it("should handle offset at non-zero starting position", () => {
|
|
577
546
|
// Arrange
|
|
578
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
579
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
580
|
-
|
|
581
|
-
vi.spyOn(IntegerStreamDecoder, 'decodeIntStream')
|
|
582
|
-
.mockReturnValue(new Int32Array([100, 200, 300]));
|
|
547
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
548
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
549
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(new Int32Array([100, 200, 300]));
|
|
583
550
|
const column = createColumn(ScalarType.INT_32);
|
|
584
551
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
585
552
|
const startOffset = 50;
|
|
@@ -590,15 +557,16 @@ describe('decodePropertyColumn', () => {
|
|
|
590
557
|
expect(result).toBeInstanceOf(IntFlatVector);
|
|
591
558
|
expect(offset.get()).toEqual(startOffset);
|
|
592
559
|
});
|
|
593
|
-
it(
|
|
560
|
+
it("should correctly skip columns with filterList and advance offset", () => {
|
|
594
561
|
// Arrange
|
|
595
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
596
|
-
const skipColumnSpy = vi
|
|
562
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
563
|
+
const skipColumnSpy = vi
|
|
564
|
+
.spyOn(decodingUtils, "skipColumn")
|
|
597
565
|
.mockImplementation((numStreams, data, offset) => {
|
|
598
566
|
offset.add(12 * numStreams); // Simulate skipping
|
|
599
567
|
});
|
|
600
568
|
const column = createColumn(ScalarType.INT_32);
|
|
601
|
-
const filterList = new Set([
|
|
569
|
+
const filterList = new Set(["other_column"]);
|
|
602
570
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
603
571
|
const offset = new IntWrapper(0);
|
|
604
572
|
const startOffset = offset.get();
|
|
@@ -610,14 +578,12 @@ describe('decodePropertyColumn', () => {
|
|
|
610
578
|
expect(skipColumnSpy).toHaveBeenCalledWith(3, data, offset);
|
|
611
579
|
});
|
|
612
580
|
});
|
|
613
|
-
describe(
|
|
614
|
-
it(
|
|
581
|
+
describe("Type Consistency Checks", () => {
|
|
582
|
+
it("should preserve column metadata in returned vector", () => {
|
|
615
583
|
// Arrange
|
|
616
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
617
|
-
vi.spyOn(IntegerStreamDecoder,
|
|
618
|
-
|
|
619
|
-
vi.spyOn(IntegerStreamDecoder, 'decodeIntStream')
|
|
620
|
-
.mockReturnValue(new Int32Array([10, 20, 30]));
|
|
584
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
585
|
+
vi.spyOn(IntegerStreamDecoder, "getVectorType").mockReturnValue(VectorType.FLAT);
|
|
586
|
+
vi.spyOn(IntegerStreamDecoder, "decodeIntStream").mockReturnValue(new Int32Array([10, 20, 30]));
|
|
621
587
|
const column = createColumn(ScalarType.INT_32);
|
|
622
588
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
623
589
|
const offset = new IntWrapper(0);
|
|
@@ -626,14 +592,11 @@ describe('decodePropertyColumn', () => {
|
|
|
626
592
|
// Assert
|
|
627
593
|
expect(result._name).toBe(column.name);
|
|
628
594
|
});
|
|
629
|
-
it(
|
|
595
|
+
it("should handle all signed and unsigned type combinations", () => {
|
|
630
596
|
// Arrange
|
|
631
|
-
const types = [
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
];
|
|
635
|
-
types.forEach(scalarType => {
|
|
636
|
-
vi.spyOn(StreamMetadataDecoder, 'decode').mockReturnValue(mockStreamMetadata());
|
|
597
|
+
const types = [ScalarType.INT_32, ScalarType.UINT_32, ScalarType.INT_64, ScalarType.UINT_64];
|
|
598
|
+
types.forEach((scalarType) => {
|
|
599
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
637
600
|
mockIntegerDecoder(scalarType);
|
|
638
601
|
const column = createColumn(scalarType, false);
|
|
639
602
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
@@ -642,15 +605,15 @@ describe('decodePropertyColumn', () => {
|
|
|
642
605
|
const result = decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
643
606
|
// Assert
|
|
644
607
|
expect(result).toBeDefined();
|
|
645
|
-
expect(result._name).toBe(
|
|
608
|
+
expect(result._name).toBe("age");
|
|
646
609
|
vi.restoreAllMocks();
|
|
647
610
|
});
|
|
648
611
|
});
|
|
649
612
|
});
|
|
650
|
-
describe(
|
|
651
|
-
it(
|
|
613
|
+
describe("Error Scenarios", () => {
|
|
614
|
+
it("should handle invalid scalar type gracefully", () => {
|
|
652
615
|
// Arrange
|
|
653
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
616
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
654
617
|
const column = createColumn(999); // Invalid type
|
|
655
618
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
656
619
|
const offset = new IntWrapper(0);
|
|
@@ -659,16 +622,16 @@ describe('decodePropertyColumn', () => {
|
|
|
659
622
|
decodePropertyColumn(data, offset, column, 1, TEST_DATA.NUM_VALUES);
|
|
660
623
|
}).toThrow();
|
|
661
624
|
});
|
|
662
|
-
it(
|
|
625
|
+
it("should handle mismatched numStreams for string type", () => {
|
|
663
626
|
// Arrange
|
|
664
|
-
vi.spyOn(StreamMetadataDecoder,
|
|
627
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockReturnValue(mockStreamMetadata());
|
|
665
628
|
const column = {
|
|
666
|
-
name:
|
|
629
|
+
name: "stringCol",
|
|
667
630
|
nullable: false,
|
|
668
631
|
columnScope: null,
|
|
669
|
-
type:
|
|
632
|
+
type: "stringType",
|
|
670
633
|
scalarType: null,
|
|
671
|
-
complexType: null
|
|
634
|
+
complexType: null,
|
|
672
635
|
};
|
|
673
636
|
const data = new Uint8Array(TEST_DATA.BUFFER_SIZE);
|
|
674
637
|
const offset = new IntWrapper(0);
|