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