@maplibre/mlt 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/decoding/decodingTestUtils.d.ts +75 -0
  2. package/dist/decoding/decodingTestUtils.js +285 -0
  3. package/dist/decoding/decodingTestUtils.js.map +1 -0
  4. package/dist/decoding/decodingUtils.d.ts +5 -8
  5. package/dist/decoding/decodingUtils.js +22 -49
  6. package/dist/decoding/decodingUtils.js.map +1 -1
  7. package/dist/decoding/decodingUtils.spec.js +85 -69
  8. package/dist/decoding/decodingUtils.spec.js.map +1 -1
  9. package/dist/decoding/fsstDecoder.spec.js +52 -35
  10. package/dist/decoding/fsstDecoder.spec.js.map +1 -1
  11. package/dist/decoding/geometryDecoder.js +41 -30
  12. package/dist/decoding/geometryDecoder.js.map +1 -1
  13. package/dist/decoding/integerDecodingUtils.d.ts +18 -31
  14. package/dist/decoding/integerDecodingUtils.js +134 -299
  15. package/dist/decoding/integerDecodingUtils.js.map +1 -1
  16. package/dist/decoding/integerDecodingUtils.spec.js +254 -148
  17. package/dist/decoding/integerDecodingUtils.spec.js.map +1 -1
  18. package/dist/decoding/integerStreamDecoder.d.ts +4 -6
  19. package/dist/decoding/integerStreamDecoder.js +104 -122
  20. package/dist/decoding/integerStreamDecoder.js.map +1 -1
  21. package/dist/decoding/integerStreamDecoder.spec.js +370 -131
  22. package/dist/decoding/integerStreamDecoder.spec.js.map +1 -1
  23. package/dist/decoding/propertyDecoder.js +13 -23
  24. package/dist/decoding/propertyDecoder.js.map +1 -1
  25. package/dist/decoding/propertyDecoder.spec.js +397 -608
  26. package/dist/decoding/propertyDecoder.spec.js.map +1 -1
  27. package/dist/decoding/stringDecoder.js +5 -9
  28. package/dist/decoding/stringDecoder.js.map +1 -1
  29. package/dist/decoding/stringDecoder.spec.js +322 -321
  30. package/dist/decoding/stringDecoder.spec.js.map +1 -1
  31. package/dist/decoding/unpackNullableUtils.d.ts +25 -0
  32. package/dist/decoding/unpackNullableUtils.js +51 -0
  33. package/dist/decoding/unpackNullableUtils.js.map +1 -0
  34. package/dist/decoding/unpackNullableUtils.spec.js +71 -0
  35. package/dist/decoding/unpackNullableUtils.spec.js.map +1 -0
  36. package/dist/encoding/embeddedTilesetMetadataEncoder.d.ts +16 -0
  37. package/dist/encoding/embeddedTilesetMetadataEncoder.js +40 -0
  38. package/dist/encoding/embeddedTilesetMetadataEncoder.js.map +1 -0
  39. package/dist/encoding/encodingUtils.d.ts +7 -0
  40. package/dist/encoding/encodingUtils.js +107 -0
  41. package/dist/encoding/encodingUtils.js.map +1 -0
  42. package/dist/encoding/fsstEncoder.d.ts +21 -0
  43. package/dist/encoding/fsstEncoder.js +78 -0
  44. package/dist/encoding/fsstEncoder.js.map +1 -0
  45. package/dist/encoding/integerEncodingUtils.d.ts +68 -0
  46. package/dist/encoding/integerEncodingUtils.js +655 -0
  47. package/dist/encoding/integerEncodingUtils.js.map +1 -0
  48. package/dist/encoding/integerStreamEncoder.d.ts +27 -0
  49. package/dist/encoding/integerStreamEncoder.js +139 -0
  50. package/dist/encoding/integerStreamEncoder.js.map +1 -0
  51. package/dist/encoding/packNullableUtils.d.ts +4 -0
  52. package/dist/encoding/packNullableUtils.js +55 -0
  53. package/dist/encoding/packNullableUtils.js.map +1 -0
  54. package/dist/encoding/propertyEncoder.d.ts +78 -0
  55. package/dist/encoding/propertyEncoder.js +335 -0
  56. package/dist/encoding/propertyEncoder.js.map +1 -0
  57. package/dist/encoding/stringEncoder.d.ts +12 -0
  58. package/dist/encoding/stringEncoder.js +182 -0
  59. package/dist/encoding/stringEncoder.js.map +1 -0
  60. package/dist/encoding/zOrderCurveEncoder.d.ts +1 -0
  61. package/dist/encoding/zOrderCurveEncoder.js +10 -0
  62. package/dist/encoding/zOrderCurveEncoder.js.map +1 -0
  63. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.d.ts +5 -1
  64. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js +29 -41
  65. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js.map +1 -1
  66. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.d.ts +1 -0
  67. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.js +142 -0
  68. package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.js.map +1 -0
  69. package/dist/mltDecoder.js +1 -2
  70. package/dist/mltDecoder.js.map +1 -1
  71. package/dist/vector/dictionary/stringDictionaryVector.d.ts +1 -1
  72. package/dist/vector/dictionary/stringDictionaryVector.js.map +1 -1
  73. package/dist/vector/flat/stringFlatVector.d.ts +1 -1
  74. package/dist/vector/flat/stringFlatVector.js.map +1 -1
  75. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.d.ts +1 -1
  76. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.js.map +1 -1
  77. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js +2 -2
  78. package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js.map +1 -1
  79. package/dist/vector/geometry/constGpuVector.d.ts +2 -2
  80. package/dist/vector/geometry/constGpuVector.js.map +1 -1
  81. package/dist/vector/geometry/flatGpuVector.d.ts +2 -2
  82. package/dist/vector/geometry/flatGpuVector.js.map +1 -1
  83. package/dist/vector/geometry/gpuVector.d.ts +2 -2
  84. package/dist/vector/geometry/gpuVector.js.map +1 -1
  85. package/dist/vector/geometry/topologyVector.d.ts +4 -4
  86. package/dist/vector/geometry/topologyVector.js +0 -1
  87. package/dist/vector/geometry/topologyVector.js.map +1 -1
  88. package/dist/vector/geometry/zOrderCurve.spec.js +17 -11
  89. package/dist/vector/geometry/zOrderCurve.spec.js.map +1 -1
  90. package/dist/vector/variableSizeVector.d.ts +2 -2
  91. package/dist/vector/variableSizeVector.js +0 -1
  92. package/dist/vector/variableSizeVector.js.map +1 -1
  93. package/package.json +6 -8
  94. package/dist/decoding/geometryDecoder.spec.js +0 -5
  95. package/dist/decoding/geometryDecoder.spec.js.map +0 -1
  96. /package/dist/decoding/{geometryDecoder.spec.d.ts → unpackNullableUtils.spec.d.ts} +0 -0
@@ -0,0 +1,75 @@
1
+ import { PhysicalStreamType } from "../metadata/tile/physicalStreamType";
2
+ import { LogicalStreamType } from "../metadata/tile/logicalStreamType";
3
+ import { LogicalLevelTechnique } from "../metadata/tile/logicalLevelTechnique";
4
+ import { PhysicalLevelTechnique } from "../metadata/tile/physicalLevelTechnique";
5
+ import { DictionaryType } from "../metadata/tile/dictionaryType";
6
+ import { type RleEncodedStreamMetadata, type StreamMetadata } from "../metadata/tile/streamMetadataDecoder";
7
+ import { type Column } from "../metadata/tileset/tilesetMetadata";
8
+ /**
9
+ * Creates basic stream metadata with logical techniques.
10
+ */
11
+ export declare function createStreamMetadata(logicalTechnique1: LogicalLevelTechnique, logicalTechnique2?: LogicalLevelTechnique, numValues?: number): StreamMetadata;
12
+ /**
13
+ * Creates RLE-encoded stream metadata.
14
+ */
15
+ export declare function createRleMetadata(logicalTechnique1: LogicalLevelTechnique, logicalTechnique2: LogicalLevelTechnique, runs: number, numRleValues: number): RleEncodedStreamMetadata;
16
+ /**
17
+ * Creates column metadata for STRUCT type columns.
18
+ */
19
+ export declare function createColumnMetadataForStruct(columnName: string, childFields: Array<{
20
+ name: string;
21
+ type?: number;
22
+ }>): Column;
23
+ /**
24
+ * Creates a single stream with metadata and data.
25
+ */
26
+ export declare function createStream(physicalType: PhysicalStreamType, data: Uint8Array, options?: {
27
+ logical?: LogicalStreamType;
28
+ technique?: PhysicalLevelTechnique;
29
+ count?: number;
30
+ }): Uint8Array;
31
+ /**
32
+ * Encodes FSST-compressed strings into a complete stream.
33
+ * This uses hardcoded test data: ["cat", "dog", "cat"]
34
+ * @returns Encoded Uint8Array that can be passed to decodeString
35
+ */
36
+ export declare function encodeFsstStrings(): Uint8Array;
37
+ /**
38
+ * Encodes a shared dictionary for struct fields.
39
+ * @param dictionaryStrings - Array of unique strings in the dictionary
40
+ * @param options - Encoding options
41
+ * @returns Object containing length and data streams
42
+ */
43
+ export declare function encodeSharedDictionary(dictionaryStrings: string[], options?: {
44
+ useFsst?: boolean;
45
+ dictionaryType?: DictionaryType;
46
+ }): {
47
+ lengthStream: Uint8Array;
48
+ dataStream: Uint8Array;
49
+ symbolLengthStream?: Uint8Array;
50
+ symbolDataStream?: Uint8Array;
51
+ };
52
+ /**
53
+ * Encodes streams for a struct field.
54
+ * @param offsetIndices - Indices into the shared dictionary
55
+ * @param presentValues - Boolean array indicating which values are present
56
+ * @param isPresent - Whether the field itself is present
57
+ * @returns Encoded streams for the field
58
+ */
59
+ export declare function encodeStructField(offsetIndices: number[], presentValues: boolean[], isPresent?: boolean): Uint8Array;
60
+ /**
61
+ * Builds a complete encoded stream by combining metadata and data.
62
+ */
63
+ export declare function buildEncodedStream(streamMetadata: StreamMetadata | RleEncodedStreamMetadata, encodedData: Uint8Array): Uint8Array;
64
+ /**
65
+ * Encodes stream metadata into binary format.
66
+ * - Byte 1: Stream type (physical type in upper 4 bits, logical subtype in lower 4 bits)
67
+ * - Byte 2: Encodings (llt1[5-7], llt2[2-4], plt[0-1])
68
+ * - Varints: numValues, byteLength
69
+ * - If RLE: Varints: runs, numRleValues
70
+ */
71
+ export declare function encodeStreamMetadata(metadata: StreamMetadata | RleEncodedStreamMetadata): Uint8Array;
72
+ /**
73
+ * Concatenates multiple Uint8Array buffers into a single buffer.
74
+ */
75
+ export declare function concatenateBuffers(...buffers: Uint8Array[]): Uint8Array;
@@ -0,0 +1,285 @@
1
+ import { PhysicalStreamType } from "../metadata/tile/physicalStreamType";
2
+ import { LogicalStreamType } from "../metadata/tile/logicalStreamType";
3
+ import { LogicalLevelTechnique } from "../metadata/tile/logicalLevelTechnique";
4
+ import { PhysicalLevelTechnique } from "../metadata/tile/physicalLevelTechnique";
5
+ import { DictionaryType } from "../metadata/tile/dictionaryType";
6
+ import { LengthType } from "../metadata/tile/lengthType";
7
+ import { OffsetType } from "../metadata/tile/offsetType";
8
+ import IntWrapper from "./intWrapper";
9
+ import { ComplexType, ScalarType } from "../metadata/tileset/tilesetMetadata";
10
+ import { encodeBooleanRle, encodeStrings, createStringLengths } from "../encoding/encodingUtils";
11
+ import { encodeVarintInt32Value, encodeVarintInt32 } from "../encoding/integerEncodingUtils";
12
+ /**
13
+ * Creates basic stream metadata with logical techniques.
14
+ */
15
+ export function createStreamMetadata(logicalTechnique1, logicalTechnique2 = LogicalLevelTechnique.NONE, numValues = 3) {
16
+ return {
17
+ physicalStreamType: PhysicalStreamType.DATA,
18
+ logicalStreamType: new LogicalStreamType(DictionaryType.NONE),
19
+ logicalLevelTechnique1: logicalTechnique1,
20
+ logicalLevelTechnique2: logicalTechnique2,
21
+ physicalLevelTechnique: PhysicalLevelTechnique.VARINT,
22
+ numValues,
23
+ byteLength: 10,
24
+ decompressedCount: numValues,
25
+ };
26
+ }
27
+ /**
28
+ * Creates RLE-encoded stream metadata.
29
+ */
30
+ export function createRleMetadata(logicalTechnique1, logicalTechnique2, runs, numRleValues) {
31
+ return {
32
+ physicalStreamType: PhysicalStreamType.DATA,
33
+ logicalStreamType: new LogicalStreamType(DictionaryType.NONE),
34
+ logicalLevelTechnique1: logicalTechnique1,
35
+ logicalLevelTechnique2: logicalTechnique2,
36
+ physicalLevelTechnique: PhysicalLevelTechnique.VARINT,
37
+ numValues: runs * 2,
38
+ byteLength: 10,
39
+ decompressedCount: numRleValues,
40
+ runs,
41
+ numRleValues,
42
+ };
43
+ }
44
+ /**
45
+ * Creates column metadata for STRUCT type columns.
46
+ */
47
+ export function createColumnMetadataForStruct(columnName, childFields) {
48
+ const children = childFields.map((fieldConfig) => ({
49
+ name: fieldConfig.name,
50
+ nullable: true,
51
+ scalarField: {
52
+ physicalType: fieldConfig.type ?? ScalarType.STRING,
53
+ type: "physicalType",
54
+ },
55
+ type: "scalarField",
56
+ }));
57
+ return {
58
+ name: columnName,
59
+ nullable: false,
60
+ complexType: {
61
+ physicalType: ComplexType.STRUCT,
62
+ children,
63
+ type: "physicalType",
64
+ },
65
+ type: "complexType",
66
+ };
67
+ }
68
+ /**
69
+ * Creates a single stream with metadata and data.
70
+ */
71
+ export function createStream(physicalType, data, options = {}) {
72
+ const count = options.count ?? 0;
73
+ return buildEncodedStream({
74
+ physicalStreamType: physicalType,
75
+ logicalStreamType: options.logical ?? new LogicalStreamType(),
76
+ logicalLevelTechnique1: LogicalLevelTechnique.NONE,
77
+ logicalLevelTechnique2: LogicalLevelTechnique.NONE,
78
+ physicalLevelTechnique: options.technique ?? PhysicalLevelTechnique.NONE,
79
+ numValues: count,
80
+ byteLength: data.length,
81
+ decompressedCount: count,
82
+ }, data);
83
+ }
84
+ /**
85
+ * Encodes FSST-compressed strings into a complete stream.
86
+ * This uses hardcoded test data: ["cat", "dog", "cat"]
87
+ * @returns Encoded Uint8Array that can be passed to decodeString
88
+ */
89
+ export function encodeFsstStrings() {
90
+ const symbolTable = new Uint8Array([99, 97, 116, 100, 111, 103]); // "catdog"
91
+ const symbolLengths = new Int32Array([3, 3]);
92
+ const compressedDictionary = new Uint8Array([0, 1]);
93
+ const dictionaryLengths = new Int32Array([3, 3]);
94
+ const offsets = new Int32Array([0, 1, 0]); // "cat", "dog", "cat"
95
+ const numValues = 3;
96
+ return concatenateBuffers(createStream(PhysicalStreamType.PRESENT, encodeBooleanRle(new Array(numValues).fill(true)), {
97
+ technique: PhysicalLevelTechnique.VARINT,
98
+ count: numValues,
99
+ }), createStream(PhysicalStreamType.DATA, symbolTable, {
100
+ logical: new LogicalStreamType(DictionaryType.FSST),
101
+ }), createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(symbolLengths), {
102
+ logical: new LogicalStreamType(undefined, undefined, LengthType.SYMBOL),
103
+ technique: PhysicalLevelTechnique.VARINT,
104
+ count: symbolLengths.length,
105
+ }), createStream(PhysicalStreamType.OFFSET, encodeVarintInt32(offsets), {
106
+ logical: new LogicalStreamType(undefined, OffsetType.STRING),
107
+ technique: PhysicalLevelTechnique.VARINT,
108
+ count: offsets.length,
109
+ }), createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(dictionaryLengths), {
110
+ logical: new LogicalStreamType(undefined, undefined, LengthType.DICTIONARY),
111
+ technique: PhysicalLevelTechnique.VARINT,
112
+ count: dictionaryLengths.length,
113
+ }), createStream(PhysicalStreamType.DATA, compressedDictionary, {
114
+ logical: new LogicalStreamType(DictionaryType.SINGLE),
115
+ }));
116
+ }
117
+ /**
118
+ * Encodes a shared dictionary for struct fields.
119
+ * @param dictionaryStrings - Array of unique strings in the dictionary
120
+ * @param options - Encoding options
121
+ * @returns Object containing length and data streams
122
+ */
123
+ export function encodeSharedDictionary(dictionaryStrings, options = {}) {
124
+ const { useFsst = false, dictionaryType = DictionaryType.SHARED } = options;
125
+ const encodedDictionary = encodeStrings(dictionaryStrings);
126
+ const dictionaryLengths = createStringLengths(dictionaryStrings);
127
+ const lengthStream = createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(new Int32Array(dictionaryLengths)), {
128
+ logical: new LogicalStreamType(undefined, undefined, LengthType.DICTIONARY),
129
+ technique: PhysicalLevelTechnique.VARINT,
130
+ count: dictionaryLengths.length,
131
+ });
132
+ const dataStream = createStream(PhysicalStreamType.DATA, encodedDictionary, {
133
+ logical: new LogicalStreamType(dictionaryType),
134
+ count: encodedDictionary.length,
135
+ });
136
+ if (useFsst) {
137
+ const symbolTable = new Uint8Array([99, 97, 116, 100, 111, 103]); // "catdog"
138
+ const symbolLengths = new Int32Array([3, 3]);
139
+ const symbolLengthStream = createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(symbolLengths), {
140
+ logical: new LogicalStreamType(undefined, undefined, LengthType.SYMBOL),
141
+ technique: PhysicalLevelTechnique.VARINT,
142
+ count: symbolLengths.length,
143
+ });
144
+ const symbolDataStream = createStream(PhysicalStreamType.DATA, symbolTable, {
145
+ logical: new LogicalStreamType(DictionaryType.FSST),
146
+ count: symbolTable.length,
147
+ });
148
+ return { lengthStream, dataStream, symbolLengthStream, symbolDataStream };
149
+ }
150
+ return { lengthStream, dataStream };
151
+ }
152
+ /**
153
+ * Encodes streams for a struct field.
154
+ * @param offsetIndices - Indices into the shared dictionary
155
+ * @param presentValues - Boolean array indicating which values are present
156
+ * @param isPresent - Whether the field itself is present
157
+ * @returns Encoded streams for the field
158
+ */
159
+ export function encodeStructField(offsetIndices, presentValues, isPresent = true) {
160
+ if (!isPresent) {
161
+ return encodeNumStreams(0);
162
+ }
163
+ const numStreamsEncoded = encodeNumStreams(2);
164
+ const encodedPresent = createPresentStream(presentValues);
165
+ const encodedOffsets = createOffsetStream(offsetIndices);
166
+ return concatenateBuffers(numStreamsEncoded, encodedPresent, encodedOffsets);
167
+ }
168
+ function encodeNumStreams(numStreams) {
169
+ const buffer = new Uint8Array(5);
170
+ const offset = new IntWrapper(0);
171
+ encodeVarintInt32Value(numStreams, buffer, offset);
172
+ return buffer.slice(0, offset.get());
173
+ }
174
+ function createPresentStream(presentValues) {
175
+ const metadata = {
176
+ physicalStreamType: PhysicalStreamType.PRESENT,
177
+ logicalStreamType: new LogicalStreamType(DictionaryType.NONE),
178
+ logicalLevelTechnique1: LogicalLevelTechnique.NONE,
179
+ logicalLevelTechnique2: LogicalLevelTechnique.NONE,
180
+ physicalLevelTechnique: PhysicalLevelTechnique.VARINT,
181
+ numValues: presentValues.length,
182
+ byteLength: 0,
183
+ decompressedCount: presentValues.length,
184
+ };
185
+ return buildEncodedStream(metadata, encodeBooleanRle(presentValues));
186
+ }
187
+ function createOffsetStream(offsetIndices) {
188
+ const metadata = {
189
+ physicalStreamType: PhysicalStreamType.OFFSET,
190
+ logicalStreamType: new LogicalStreamType(undefined, OffsetType.STRING),
191
+ logicalLevelTechnique1: LogicalLevelTechnique.NONE,
192
+ logicalLevelTechnique2: LogicalLevelTechnique.NONE,
193
+ physicalLevelTechnique: PhysicalLevelTechnique.VARINT,
194
+ numValues: offsetIndices.length,
195
+ byteLength: 0,
196
+ decompressedCount: offsetIndices.length,
197
+ };
198
+ return buildEncodedStream(metadata, encodeVarintInt32(new Int32Array(offsetIndices)));
199
+ }
200
+ /**
201
+ * Builds a complete encoded stream by combining metadata and data.
202
+ */
203
+ export function buildEncodedStream(streamMetadata, encodedData) {
204
+ const updatedMetadata = {
205
+ ...streamMetadata,
206
+ byteLength: encodedData.length,
207
+ };
208
+ const metadataBuffer = encodeStreamMetadata(updatedMetadata);
209
+ const result = new Uint8Array(metadataBuffer.length + encodedData.length);
210
+ result.set(metadataBuffer, 0);
211
+ result.set(encodedData, metadataBuffer.length);
212
+ return result;
213
+ }
214
+ /**
215
+ * Encodes stream metadata into binary format.
216
+ * - Byte 1: Stream type (physical type in upper 4 bits, logical subtype in lower 4 bits)
217
+ * - Byte 2: Encodings (llt1[5-7], llt2[2-4], plt[0-1])
218
+ * - Varints: numValues, byteLength
219
+ * - If RLE: Varints: runs, numRleValues
220
+ */
221
+ export function encodeStreamMetadata(metadata) {
222
+ const buffer = new Uint8Array(100);
223
+ let writeOffset = 0;
224
+ // Byte 1: Stream type
225
+ buffer[writeOffset++] = encodeStreamTypeByte(metadata);
226
+ // Byte 2: Encoding techniques
227
+ buffer[writeOffset++] = encodeEncodingsByte(metadata);
228
+ // Variable-length fields
229
+ const offset = new IntWrapper(writeOffset);
230
+ encodeVarintInt32Value(metadata.numValues, buffer, offset);
231
+ encodeVarintInt32Value(metadata.byteLength, buffer, offset);
232
+ // RLE-specific fields
233
+ if (isRleMetadata(metadata)) {
234
+ encodeVarintInt32Value(metadata.runs, buffer, offset);
235
+ encodeVarintInt32Value(metadata.numRleValues, buffer, offset);
236
+ }
237
+ return buffer.slice(0, offset.get());
238
+ }
239
+ function encodeStreamTypeByte(metadata) {
240
+ const physicalTypeIndex = Object.values(PhysicalStreamType).indexOf(metadata.physicalStreamType);
241
+ const lowerNibble = getLogicalSubtypeValue(metadata);
242
+ return (physicalTypeIndex << 4) | lowerNibble;
243
+ }
244
+ function getLogicalSubtypeValue(metadata) {
245
+ const { physicalStreamType, logicalStreamType } = metadata;
246
+ switch (physicalStreamType) {
247
+ case PhysicalStreamType.DATA:
248
+ return logicalStreamType.dictionaryType !== undefined
249
+ ? Object.values(DictionaryType).indexOf(logicalStreamType.dictionaryType)
250
+ : 0;
251
+ case PhysicalStreamType.OFFSET:
252
+ return logicalStreamType.offsetType !== undefined
253
+ ? Object.values(OffsetType).indexOf(logicalStreamType.offsetType)
254
+ : 0;
255
+ case PhysicalStreamType.LENGTH:
256
+ return logicalStreamType.lengthType !== undefined
257
+ ? Object.values(LengthType).indexOf(logicalStreamType.lengthType)
258
+ : 0;
259
+ default:
260
+ return 0;
261
+ }
262
+ }
263
+ function encodeEncodingsByte(metadata) {
264
+ const llt1Index = Object.values(LogicalLevelTechnique).indexOf(metadata.logicalLevelTechnique1);
265
+ const llt2Index = Object.values(LogicalLevelTechnique).indexOf(metadata.logicalLevelTechnique2);
266
+ const pltIndex = Object.values(PhysicalLevelTechnique).indexOf(metadata.physicalLevelTechnique);
267
+ return (llt1Index << 5) | (llt2Index << 2) | pltIndex;
268
+ }
269
+ function isRleMetadata(metadata) {
270
+ return "runs" in metadata && "numRleValues" in metadata;
271
+ }
272
+ /**
273
+ * Concatenates multiple Uint8Array buffers into a single buffer.
274
+ */
275
+ export function concatenateBuffers(...buffers) {
276
+ const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);
277
+ const result = new Uint8Array(totalLength);
278
+ let offset = 0;
279
+ for (const buffer of buffers) {
280
+ result.set(buffer, offset);
281
+ offset += buffer.length;
282
+ }
283
+ return result;
284
+ }
285
+ //# sourceMappingURL=decodingTestUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodingTestUtils.js","sourceRoot":"","sources":["../../src/decoding/decodingTestUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { PhysicalStreamType } from \"../metadata/tile/physicalStreamType\";\nimport { LogicalStreamType } from \"../metadata/tile/logicalStreamType\";\nimport { LogicalLevelTechnique } from \"../metadata/tile/logicalLevelTechnique\";\nimport { PhysicalLevelTechnique } from \"../metadata/tile/physicalLevelTechnique\";\nimport { DictionaryType } from \"../metadata/tile/dictionaryType\";\nimport { LengthType } from \"../metadata/tile/lengthType\";\nimport { OffsetType } from \"../metadata/tile/offsetType\";\nimport { type RleEncodedStreamMetadata, type StreamMetadata } from \"../metadata/tile/streamMetadataDecoder\";\nimport IntWrapper from \"./intWrapper\";\nimport { type Column, type Field, ComplexType, ScalarType } from \"../metadata/tileset/tilesetMetadata\";\nimport { encodeBooleanRle, encodeStrings, createStringLengths } from \"../encoding/encodingUtils\";\nimport { encodeVarintInt32Value, encodeVarintInt32 } from \"../encoding/integerEncodingUtils\";\n\n/**\n * Creates basic stream metadata with logical techniques.\n */\nexport function createStreamMetadata(\n logicalTechnique1: LogicalLevelTechnique,\n logicalTechnique2: LogicalLevelTechnique = LogicalLevelTechnique.NONE,\n numValues: number = 3,\n): StreamMetadata {\n return {\n physicalStreamType: PhysicalStreamType.DATA,\n logicalStreamType: new LogicalStreamType(DictionaryType.NONE),\n logicalLevelTechnique1: logicalTechnique1,\n logicalLevelTechnique2: logicalTechnique2,\n physicalLevelTechnique: PhysicalLevelTechnique.VARINT,\n numValues,\n byteLength: 10,\n decompressedCount: numValues,\n };\n}\n\n/**\n * Creates RLE-encoded stream metadata.\n */\nexport function createRleMetadata(\n logicalTechnique1: LogicalLevelTechnique,\n logicalTechnique2: LogicalLevelTechnique,\n runs: number,\n numRleValues: number,\n): RleEncodedStreamMetadata {\n return {\n physicalStreamType: PhysicalStreamType.DATA,\n logicalStreamType: new LogicalStreamType(DictionaryType.NONE),\n logicalLevelTechnique1: logicalTechnique1,\n logicalLevelTechnique2: logicalTechnique2,\n physicalLevelTechnique: PhysicalLevelTechnique.VARINT,\n numValues: runs * 2,\n byteLength: 10,\n decompressedCount: numRleValues,\n runs,\n numRleValues,\n };\n}\n\n/**\n * Creates column metadata for STRUCT type columns.\n */\nexport function createColumnMetadataForStruct(\n columnName: string,\n childFields: Array<{ name: string; type?: number }>,\n): Column {\n const children: Field[] = childFields.map((fieldConfig) => ({\n name: fieldConfig.name,\n nullable: true,\n scalarField: {\n physicalType: fieldConfig.type ?? ScalarType.STRING,\n type: \"physicalType\" as const,\n },\n type: \"scalarField\" as const,\n }));\n\n return {\n name: columnName,\n nullable: false,\n complexType: {\n physicalType: ComplexType.STRUCT,\n children,\n type: \"physicalType\" as const,\n },\n type: \"complexType\" as const,\n };\n}\n\n/**\n * Creates a single stream with metadata and data.\n */\nexport function createStream(\n physicalType: PhysicalStreamType,\n data: Uint8Array,\n options: {\n logical?: LogicalStreamType;\n technique?: PhysicalLevelTechnique;\n count?: number;\n } = {},\n): Uint8Array {\n const count = options.count ?? 0;\n return buildEncodedStream(\n {\n physicalStreamType: physicalType,\n logicalStreamType: options.logical ?? new LogicalStreamType(),\n logicalLevelTechnique1: LogicalLevelTechnique.NONE,\n logicalLevelTechnique2: LogicalLevelTechnique.NONE,\n physicalLevelTechnique: options.technique ?? PhysicalLevelTechnique.NONE,\n numValues: count,\n byteLength: data.length,\n decompressedCount: count,\n },\n data,\n );\n}\n\n/**\n * Encodes FSST-compressed strings into a complete stream.\n * This uses hardcoded test data: [\"cat\", \"dog\", \"cat\"]\n * @returns Encoded Uint8Array that can be passed to decodeString\n */\nexport function encodeFsstStrings(): Uint8Array {\n const symbolTable = new Uint8Array([99, 97, 116, 100, 111, 103]); // \"catdog\"\n const symbolLengths = new Int32Array([3, 3]);\n const compressedDictionary = new Uint8Array([0, 1]);\n const dictionaryLengths = new Int32Array([3, 3]);\n const offsets = new Int32Array([0, 1, 0]); // \"cat\", \"dog\", \"cat\"\n const numValues = 3;\n\n return concatenateBuffers(\n createStream(PhysicalStreamType.PRESENT, encodeBooleanRle(new Array(numValues).fill(true)), {\n technique: PhysicalLevelTechnique.VARINT,\n count: numValues,\n }),\n createStream(PhysicalStreamType.DATA, symbolTable, {\n logical: new LogicalStreamType(DictionaryType.FSST),\n }),\n createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(symbolLengths), {\n logical: new LogicalStreamType(undefined, undefined, LengthType.SYMBOL),\n technique: PhysicalLevelTechnique.VARINT,\n count: symbolLengths.length,\n }),\n createStream(PhysicalStreamType.OFFSET, encodeVarintInt32(offsets), {\n logical: new LogicalStreamType(undefined, OffsetType.STRING),\n technique: PhysicalLevelTechnique.VARINT,\n count: offsets.length,\n }),\n createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(dictionaryLengths), {\n logical: new LogicalStreamType(undefined, undefined, LengthType.DICTIONARY),\n technique: PhysicalLevelTechnique.VARINT,\n count: dictionaryLengths.length,\n }),\n createStream(PhysicalStreamType.DATA, compressedDictionary, {\n logical: new LogicalStreamType(DictionaryType.SINGLE),\n }),\n );\n}\n\n/**\n * Encodes a shared dictionary for struct fields.\n * @param dictionaryStrings - Array of unique strings in the dictionary\n * @param options - Encoding options\n * @returns Object containing length and data streams\n */\nexport function encodeSharedDictionary(\n dictionaryStrings: string[],\n options: { useFsst?: boolean; dictionaryType?: DictionaryType } = {},\n): {\n lengthStream: Uint8Array;\n dataStream: Uint8Array;\n symbolLengthStream?: Uint8Array;\n symbolDataStream?: Uint8Array;\n} {\n const { useFsst = false, dictionaryType = DictionaryType.SHARED } = options;\n\n const encodedDictionary = encodeStrings(dictionaryStrings);\n const dictionaryLengths = createStringLengths(dictionaryStrings);\n\n const lengthStream = createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(new Int32Array(dictionaryLengths)), {\n logical: new LogicalStreamType(undefined, undefined, LengthType.DICTIONARY),\n technique: PhysicalLevelTechnique.VARINT,\n count: dictionaryLengths.length,\n });\n\n const dataStream = createStream(PhysicalStreamType.DATA, encodedDictionary, {\n logical: new LogicalStreamType(dictionaryType),\n count: encodedDictionary.length,\n });\n\n if (useFsst) {\n const symbolTable = new Uint8Array([99, 97, 116, 100, 111, 103]); // \"catdog\"\n const symbolLengths = new Int32Array([3, 3]);\n\n const symbolLengthStream = createStream(PhysicalStreamType.LENGTH, encodeVarintInt32(symbolLengths), {\n logical: new LogicalStreamType(undefined, undefined, LengthType.SYMBOL),\n technique: PhysicalLevelTechnique.VARINT,\n count: symbolLengths.length,\n });\n\n const symbolDataStream = createStream(PhysicalStreamType.DATA, symbolTable, {\n logical: new LogicalStreamType(DictionaryType.FSST),\n count: symbolTable.length,\n });\n\n return { lengthStream, dataStream, symbolLengthStream, symbolDataStream };\n }\n\n return { lengthStream, dataStream };\n}\n\n/**\n * Encodes streams for a struct field.\n * @param offsetIndices - Indices into the shared dictionary\n * @param presentValues - Boolean array indicating which values are present\n * @param isPresent - Whether the field itself is present\n * @returns Encoded streams for the field\n */\nexport function encodeStructField(\n offsetIndices: number[],\n presentValues: boolean[],\n isPresent: boolean = true,\n): Uint8Array {\n if (!isPresent) {\n return encodeNumStreams(0);\n }\n\n const numStreamsEncoded = encodeNumStreams(2);\n const encodedPresent = createPresentStream(presentValues);\n const encodedOffsets = createOffsetStream(offsetIndices);\n\n return concatenateBuffers(numStreamsEncoded, encodedPresent, encodedOffsets);\n}\n\nfunction encodeNumStreams(numStreams: number): Uint8Array {\n const buffer = new Uint8Array(5);\n const offset = new IntWrapper(0);\n encodeVarintInt32Value(numStreams, buffer, offset);\n return buffer.slice(0, offset.get());\n}\n\nfunction createPresentStream(presentValues: boolean[]): Uint8Array {\n const metadata = {\n physicalStreamType: PhysicalStreamType.PRESENT,\n logicalStreamType: new LogicalStreamType(DictionaryType.NONE),\n logicalLevelTechnique1: LogicalLevelTechnique.NONE,\n logicalLevelTechnique2: LogicalLevelTechnique.NONE,\n physicalLevelTechnique: PhysicalLevelTechnique.VARINT,\n numValues: presentValues.length,\n byteLength: 0,\n decompressedCount: presentValues.length,\n };\n return buildEncodedStream(metadata, encodeBooleanRle(presentValues));\n}\n\nfunction createOffsetStream(offsetIndices: number[]): Uint8Array {\n const metadata = {\n physicalStreamType: PhysicalStreamType.OFFSET,\n logicalStreamType: new LogicalStreamType(undefined, OffsetType.STRING),\n logicalLevelTechnique1: LogicalLevelTechnique.NONE,\n logicalLevelTechnique2: LogicalLevelTechnique.NONE,\n physicalLevelTechnique: PhysicalLevelTechnique.VARINT,\n numValues: offsetIndices.length,\n byteLength: 0,\n decompressedCount: offsetIndices.length,\n };\n return buildEncodedStream(metadata, encodeVarintInt32(new Int32Array(offsetIndices)));\n}\n\n/**\n * Builds a complete encoded stream by combining metadata and data.\n */\nexport function buildEncodedStream(\n streamMetadata: StreamMetadata | RleEncodedStreamMetadata,\n encodedData: Uint8Array,\n): Uint8Array {\n const updatedMetadata = {\n ...streamMetadata,\n byteLength: encodedData.length,\n };\n\n const metadataBuffer = encodeStreamMetadata(updatedMetadata);\n const result = new Uint8Array(metadataBuffer.length + encodedData.length);\n result.set(metadataBuffer, 0);\n result.set(encodedData, metadataBuffer.length);\n\n return result;\n}\n\n/**\n * Encodes stream metadata into binary format.\n * - Byte 1: Stream type (physical type in upper 4 bits, logical subtype in lower 4 bits)\n * - Byte 2: Encodings (llt1[5-7], llt2[2-4], plt[0-1])\n * - Varints: numValues, byteLength\n * - If RLE: Varints: runs, numRleValues\n */\nexport function encodeStreamMetadata(metadata: StreamMetadata | RleEncodedStreamMetadata): Uint8Array {\n const buffer = new Uint8Array(100);\n let writeOffset = 0;\n\n // Byte 1: Stream type\n buffer[writeOffset++] = encodeStreamTypeByte(metadata);\n\n // Byte 2: Encoding techniques\n buffer[writeOffset++] = encodeEncodingsByte(metadata);\n\n // Variable-length fields\n const offset = new IntWrapper(writeOffset);\n encodeVarintInt32Value(metadata.numValues, buffer, offset);\n encodeVarintInt32Value(metadata.byteLength, buffer, offset);\n\n // RLE-specific fields\n if (isRleMetadata(metadata)) {\n encodeVarintInt32Value(metadata.runs, buffer, offset);\n encodeVarintInt32Value(metadata.numRleValues, buffer, offset);\n }\n\n return buffer.slice(0, offset.get());\n}\n\nfunction encodeStreamTypeByte(metadata: StreamMetadata | RleEncodedStreamMetadata): number {\n const physicalTypeIndex = Object.values(PhysicalStreamType).indexOf(metadata.physicalStreamType);\n const lowerNibble = getLogicalSubtypeValue(metadata);\n return (physicalTypeIndex << 4) | lowerNibble;\n}\n\nfunction getLogicalSubtypeValue(metadata: StreamMetadata | RleEncodedStreamMetadata): number {\n const { physicalStreamType, logicalStreamType } = metadata;\n\n switch (physicalStreamType) {\n case PhysicalStreamType.DATA:\n return logicalStreamType.dictionaryType !== undefined\n ? Object.values(DictionaryType).indexOf(logicalStreamType.dictionaryType)\n : 0;\n case PhysicalStreamType.OFFSET:\n return logicalStreamType.offsetType !== undefined\n ? Object.values(OffsetType).indexOf(logicalStreamType.offsetType)\n : 0;\n case PhysicalStreamType.LENGTH:\n return logicalStreamType.lengthType !== undefined\n ? Object.values(LengthType).indexOf(logicalStreamType.lengthType)\n : 0;\n default:\n return 0;\n }\n}\n\nfunction encodeEncodingsByte(metadata: StreamMetadata | RleEncodedStreamMetadata): number {\n const llt1Index = Object.values(LogicalLevelTechnique).indexOf(metadata.logicalLevelTechnique1);\n const llt2Index = Object.values(LogicalLevelTechnique).indexOf(metadata.logicalLevelTechnique2);\n const pltIndex = Object.values(PhysicalLevelTechnique).indexOf(metadata.physicalLevelTechnique);\n return (llt1Index << 5) | (llt2Index << 2) | pltIndex;\n}\n\nfunction isRleMetadata(metadata: StreamMetadata | RleEncodedStreamMetadata): metadata is RleEncodedStreamMetadata {\n return \"runs\" in metadata && \"numRleValues\" in metadata;\n}\n\n/**\n * Concatenates multiple Uint8Array buffers into a single buffer.\n */\nexport function concatenateBuffers(...buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const buffer of buffers) {\n result.set(buffer, offset);\n offset += buffer.length;\n }\n\n return result;\n}\n"]}
@@ -1,13 +1,10 @@
1
1
  import type IntWrapper from "./intWrapper";
2
2
  import { VectorType } from "../vector/vectorType";
3
- import BitVector from "../vector/flat/bitVector";
3
+ import type BitVector from "../vector/flat/bitVector";
4
4
  export declare function skipColumn(numStreams: number, tile: Uint8Array, offset: IntWrapper): void;
5
- export declare function decodeBooleanRle(buffer: Uint8Array, numBooleans: number, pos: IntWrapper): Uint8Array;
6
- export declare function decodeNullableBooleanRle(buffer: Uint8Array, numBooleans: number, pos: IntWrapper, nullabilityBuffer: BitVector): Uint8Array;
7
- export declare function decodeByteRle(buffer: Uint8Array, numBytes: number, pos: IntWrapper): Uint8Array;
8
- export declare function decodeFloatsLE(encodedValues: Uint8Array, pos: IntWrapper, numValues: number): Float32Array;
9
- export declare function decodeDoublesLE(encodedValues: Uint8Array, pos: IntWrapper, numValues: number): Float64Array;
10
- export declare function decodeNullableFloatsLE(encodedValues: Uint8Array, pos: IntWrapper, nullabilityBuffer: BitVector, numValues: number): Float32Array;
11
- export declare function decodeNullableDoublesLE(encodedValues: Uint8Array, pos: IntWrapper, nullabilityBuffer: BitVector, numValues: number): Float64Array;
5
+ export declare function decodeBooleanRle(buffer: Uint8Array, numBooleans: number, byteLength: number, pos: IntWrapper, nullabilityBuffer?: BitVector): Uint8Array;
6
+ export declare function decodeByteRle(buffer: Uint8Array, numBytes: number, byteLength: number, pos: IntWrapper): Uint8Array;
7
+ export declare function decodeFloatsLE(encodedValues: Uint8Array, pos: IntWrapper, numValues: number, nullabilityBuffer?: BitVector): Float32Array;
8
+ export declare function decodeDoublesLE(encodedValues: Uint8Array, pos: IntWrapper, numValues: number, nullabilityBuffer?: BitVector): Float64Array;
12
9
  export declare function decodeString(buf: Uint8Array, pos: number, end: number): string;
13
10
  export declare function getVectorTypeBooleanStream(numFeatures: number, byteLength: number, data: Uint8Array, offset: IntWrapper): VectorType;
@@ -1,6 +1,6 @@
1
1
  import { VectorType } from "../vector/vectorType";
2
- import BitVector from "../vector/flat/bitVector";
3
2
  import { decodeStreamMetadata } from "../metadata/tile/streamMetadataDecoder";
3
+ import { unpackNullableBoolean, unpackNullable } from "./unpackNullableUtils";
4
4
  export function skipColumn(numStreams, tile, offset) {
5
5
  //TODO: add size of column in Mlt for fast skipping
6
6
  for (let i = 0; i < numStreams; i++) {
@@ -8,90 +8,63 @@ export function skipColumn(numStreams, tile, offset) {
8
8
  offset.add(streamMetadata.byteLength);
9
9
  }
10
10
  }
11
- export function decodeBooleanRle(buffer, numBooleans, pos) {
11
+ export function decodeBooleanRle(buffer, numBooleans, byteLength, pos, nullabilityBuffer) {
12
12
  const numBytes = Math.ceil(numBooleans / 8.0);
13
- return decodeByteRle(buffer, numBytes, pos);
14
- }
15
- export function decodeNullableBooleanRle(buffer, numBooleans, pos, nullabilityBuffer) {
16
- // TODO: refactor quick and dirty solution -> use solution in one pass
17
- const numBytes = Math.ceil(numBooleans / 8);
18
- const values = decodeByteRle(buffer, numBytes, pos);
19
- const bitVector = new BitVector(values, numBooleans);
20
- const size = nullabilityBuffer.size();
21
- const nullableBitvector = new BitVector(new Uint8Array(size), size);
22
- let valueCounter = 0;
23
- for (let i = 0; i < nullabilityBuffer.size(); i++) {
24
- const value = nullabilityBuffer.get(i) ? bitVector.get(valueCounter++) : false;
25
- nullableBitvector.set(i, value);
13
+ const values = decodeByteRle(buffer, numBytes, byteLength, pos);
14
+ if (nullabilityBuffer) {
15
+ return unpackNullableBoolean(values, numBooleans, nullabilityBuffer);
26
16
  }
27
- return nullableBitvector.getBuffer();
17
+ return values;
28
18
  }
29
- export function decodeByteRle(buffer, numBytes, pos) {
19
+ export function decodeByteRle(buffer, numBytes, byteLength, pos) {
30
20
  const values = new Uint8Array(numBytes);
31
21
  let valueOffset = 0;
22
+ const streamEndPos = pos.get() + byteLength;
32
23
  while (valueOffset < numBytes) {
24
+ if (pos.get() >= streamEndPos) {
25
+ break;
26
+ }
33
27
  const header = buffer[pos.increment()];
34
28
  /* Runs */
35
29
  if (header <= 0x7f) {
36
30
  const numRuns = header + 3;
37
31
  const value = buffer[pos.increment()];
38
- const endValueOffset = valueOffset + numRuns;
32
+ const endValueOffset = Math.min(valueOffset + numRuns, numBytes);
39
33
  values.fill(value, valueOffset, endValueOffset);
40
34
  valueOffset = endValueOffset;
41
35
  }
42
36
  else {
43
37
  /* Literals */
44
38
  const numLiterals = 256 - header;
45
- for (let i = 0; i < numLiterals; i++) {
39
+ for (let i = 0; i < numLiterals && valueOffset < numBytes; i++) {
46
40
  values[valueOffset++] = buffer[pos.increment()];
47
41
  }
48
42
  }
49
43
  }
44
+ pos.set(streamEndPos);
50
45
  return values;
51
46
  }
52
- export function decodeFloatsLE(encodedValues, pos, numValues) {
53
- const currentPos = pos.get();
54
- const newOffset = currentPos + numValues * Float32Array.BYTES_PER_ELEMENT;
55
- const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;
56
- const fb = new Float32Array(newBuf);
57
- pos.set(newOffset);
58
- return fb;
59
- }
60
- export function decodeDoublesLE(encodedValues, pos, numValues) {
61
- const currentPos = pos.get();
62
- const newOffset = currentPos + numValues * Float64Array.BYTES_PER_ELEMENT;
63
- const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;
64
- const fb = new Float64Array(newBuf);
65
- pos.set(newOffset);
66
- return fb;
67
- }
68
- export function decodeNullableFloatsLE(encodedValues, pos, nullabilityBuffer, numValues) {
47
+ export function decodeFloatsLE(encodedValues, pos, numValues, nullabilityBuffer) {
69
48
  const currentPos = pos.get();
70
49
  const newOffset = currentPos + numValues * Float32Array.BYTES_PER_ELEMENT;
71
50
  const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;
72
51
  const fb = new Float32Array(newBuf);
73
52
  pos.set(newOffset);
74
- const numTotalValues = nullabilityBuffer.size();
75
- const nullableFloatsBuffer = new Float32Array(numTotalValues);
76
- let offset = 0;
77
- for (let i = 0; i < numTotalValues; i++) {
78
- nullableFloatsBuffer[i] = nullabilityBuffer.get(i) ? fb[offset++] : 0;
53
+ if (nullabilityBuffer) {
54
+ return unpackNullable(fb, nullabilityBuffer, 0);
79
55
  }
80
- return nullableFloatsBuffer;
56
+ return fb;
81
57
  }
82
- export function decodeNullableDoublesLE(encodedValues, pos, nullabilityBuffer, numValues) {
58
+ export function decodeDoublesLE(encodedValues, pos, numValues, nullabilityBuffer) {
83
59
  const currentPos = pos.get();
84
60
  const newOffset = currentPos + numValues * Float64Array.BYTES_PER_ELEMENT;
85
61
  const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;
86
62
  const fb = new Float64Array(newBuf);
87
63
  pos.set(newOffset);
88
- const numTotalValues = nullabilityBuffer.size();
89
- const nullableDoubleBuffer = new Float64Array(numTotalValues);
90
- let offset = 0;
91
- for (let i = 0; i < numTotalValues; i++) {
92
- nullableDoubleBuffer[i] = nullabilityBuffer.get(i) ? fb[offset++] : 0;
64
+ if (nullabilityBuffer) {
65
+ return unpackNullable(fb, nullabilityBuffer, 0);
93
66
  }
94
- return nullableDoubleBuffer;
67
+ return fb;
95
68
  }
96
69
  const TEXT_DECODER_MIN_LENGTH = 12;
97
70
  const utf8TextDecoder = new TextDecoder();
@@ -1 +1 @@
1
- {"version":3,"file":"decodingUtils.js","sourceRoot":"","sources":["../../src/decoding/decodingUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type IntWrapper from \"./intWrapper\";\nimport { VectorType } from \"../vector/vectorType\";\nimport BitVector from \"../vector/flat/bitVector\";\nimport { decodeStreamMetadata } from \"../metadata/tile/streamMetadataDecoder\";\n\nexport function skipColumn(numStreams: number, tile: Uint8Array, offset: IntWrapper) {\n //TODO: add size of column in Mlt for fast skipping\n for (let i = 0; i < numStreams; i++) {\n const streamMetadata = decodeStreamMetadata(tile, offset);\n offset.add(streamMetadata.byteLength);\n }\n}\n\nexport function decodeBooleanRle(buffer: Uint8Array, numBooleans: number, pos: IntWrapper): Uint8Array {\n const numBytes = Math.ceil(numBooleans / 8.0);\n return decodeByteRle(buffer, numBytes, pos);\n}\n\nexport function decodeNullableBooleanRle(\n buffer: Uint8Array,\n numBooleans: number,\n pos: IntWrapper,\n nullabilityBuffer: BitVector,\n): Uint8Array {\n // TODO: refactor quick and dirty solution -> use solution in one pass\n const numBytes = Math.ceil(numBooleans / 8);\n const values = decodeByteRle(buffer, numBytes, pos);\n const bitVector = new BitVector(values, numBooleans);\n\n const size = nullabilityBuffer.size();\n const nullableBitvector = new BitVector(new Uint8Array(size), size);\n let valueCounter = 0;\n for (let i = 0; i < nullabilityBuffer.size(); i++) {\n const value = nullabilityBuffer.get(i) ? bitVector.get(valueCounter++) : false;\n nullableBitvector.set(i, value);\n }\n\n return nullableBitvector.getBuffer();\n}\n\nexport function decodeByteRle(buffer: Uint8Array, numBytes: number, pos: IntWrapper): Uint8Array {\n const values = new Uint8Array(numBytes);\n\n let valueOffset = 0;\n while (valueOffset < numBytes) {\n const header = buffer[pos.increment()];\n\n /* Runs */\n if (header <= 0x7f) {\n const numRuns = header + 3;\n const value = buffer[pos.increment()];\n const endValueOffset = valueOffset + numRuns;\n values.fill(value, valueOffset, endValueOffset);\n valueOffset = endValueOffset;\n } else {\n /* Literals */\n const numLiterals = 256 - header;\n for (let i = 0; i < numLiterals; i++) {\n values[valueOffset++] = buffer[pos.increment()];\n }\n }\n }\n return values;\n}\n\nexport function decodeFloatsLE(encodedValues: Uint8Array, pos: IntWrapper, numValues: number): Float32Array {\n const currentPos = pos.get();\n const newOffset = currentPos + numValues * Float32Array.BYTES_PER_ELEMENT;\n const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;\n const fb = new Float32Array(newBuf);\n pos.set(newOffset);\n return fb;\n}\n\nexport function decodeDoublesLE(encodedValues: Uint8Array, pos: IntWrapper, numValues: number): Float64Array {\n const currentPos = pos.get();\n const newOffset = currentPos + numValues * Float64Array.BYTES_PER_ELEMENT;\n const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;\n const fb = new Float64Array(newBuf);\n pos.set(newOffset);\n return fb;\n}\n\nexport function decodeNullableFloatsLE(\n encodedValues: Uint8Array,\n pos: IntWrapper,\n nullabilityBuffer: BitVector,\n numValues: number,\n): Float32Array {\n const currentPos = pos.get();\n const newOffset = currentPos + numValues * Float32Array.BYTES_PER_ELEMENT;\n const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;\n const fb = new Float32Array(newBuf);\n pos.set(newOffset);\n\n const numTotalValues = nullabilityBuffer.size();\n const nullableFloatsBuffer = new Float32Array(numTotalValues);\n let offset = 0;\n for (let i = 0; i < numTotalValues; i++) {\n nullableFloatsBuffer[i] = nullabilityBuffer.get(i) ? fb[offset++] : 0;\n }\n\n return nullableFloatsBuffer;\n}\n\nexport function decodeNullableDoublesLE(\n encodedValues: Uint8Array,\n pos: IntWrapper,\n nullabilityBuffer: BitVector,\n numValues: number,\n): Float64Array {\n const currentPos = pos.get();\n const newOffset = currentPos + numValues * Float64Array.BYTES_PER_ELEMENT;\n const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;\n const fb = new Float64Array(newBuf);\n pos.set(newOffset);\n\n const numTotalValues = nullabilityBuffer.size();\n const nullableDoubleBuffer = new Float64Array(numTotalValues);\n let offset = 0;\n for (let i = 0; i < numTotalValues; i++) {\n nullableDoubleBuffer[i] = nullabilityBuffer.get(i) ? fb[offset++] : 0;\n }\n\n return nullableDoubleBuffer;\n}\n\nconst TEXT_DECODER_MIN_LENGTH = 12;\nconst utf8TextDecoder = new TextDecoder();\n\n// Source: https://github.com/mapbox/pbf/issues/106\nexport function decodeString(buf: Uint8Array, pos: number, end: number): string {\n if (end - pos >= TEXT_DECODER_MIN_LENGTH) {\n // longer strings are fast with the built-in browser TextDecoder API\n return utf8TextDecoder.decode(buf.subarray(pos, end));\n }\n // short strings are fast with custom implementation\n return readUtf8(buf, pos, end);\n}\n\nfunction readUtf8(buf, pos, end): string {\n let str = \"\";\n let i = pos;\n\n while (i < end) {\n const b0 = buf[i];\n let c = null; // codepoint\n let bytesPerSequence = b0 > 0xef ? 4 : b0 > 0xdf ? 3 : b0 > 0xbf ? 2 : 1;\n\n if (i + bytesPerSequence > end) break;\n\n let b1, b2, b3;\n\n if (bytesPerSequence === 1) {\n if (b0 < 0x80) {\n c = b0;\n }\n } else if (bytesPerSequence === 2) {\n b1 = buf[i + 1];\n if ((b1 & 0xc0) === 0x80) {\n c = ((b0 & 0x1f) << 0x6) | (b1 & 0x3f);\n if (c <= 0x7f) {\n c = null;\n }\n }\n } else if (bytesPerSequence === 3) {\n b1 = buf[i + 1];\n b2 = buf[i + 2];\n if ((b1 & 0xc0) === 0x80 && (b2 & 0xc0) === 0x80) {\n c = ((b0 & 0xf) << 0xc) | ((b1 & 0x3f) << 0x6) | (b2 & 0x3f);\n if (c <= 0x7ff || (c >= 0xd800 && c <= 0xdfff)) {\n c = null;\n }\n }\n } else if (bytesPerSequence === 4) {\n b1 = buf[i + 1];\n b2 = buf[i + 2];\n b3 = buf[i + 3];\n if ((b1 & 0xc0) === 0x80 && (b2 & 0xc0) === 0x80 && (b3 & 0xc0) === 0x80) {\n c = ((b0 & 0xf) << 0x12) | ((b1 & 0x3f) << 0xc) | ((b2 & 0x3f) << 0x6) | (b3 & 0x3f);\n if (c <= 0xffff || c >= 0x110000) {\n c = null;\n }\n }\n }\n\n if (c === null) {\n c = 0xfffd;\n bytesPerSequence = 1;\n } else if (c > 0xffff) {\n c -= 0x10000;\n str += String.fromCharCode(((c >>> 10) & 0x3ff) | 0xd800);\n c = 0xdc00 | (c & 0x3ff);\n }\n\n str += String.fromCharCode(c);\n i += bytesPerSequence;\n }\n\n return str;\n}\n\nexport function getVectorTypeBooleanStream(\n numFeatures: number,\n byteLength: number,\n data: Uint8Array,\n offset: IntWrapper,\n): VectorType {\n const valuesPerRun = 0x83;\n // TODO: use VectorType metadata field for to test which VectorType is used\n return Math.ceil(numFeatures / valuesPerRun) * 2 == byteLength &&\n /* Test the first value byte if all bits are set to true */\n (data[offset.get() + 1] & 0xff) === (bitCount(numFeatures) << 2) - 1\n ? VectorType.CONST\n : VectorType.FLAT;\n}\n\nfunction bitCount(number): number {\n //TODO: refactor to get rid of special case handling\n return number === 0 ? 1 : Math.floor(Math.log2(number) + 1);\n}\n"]}
1
+ {"version":3,"file":"decodingUtils.js","sourceRoot":"","sources":["../../src/decoding/decodingUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type IntWrapper from \"./intWrapper\";\nimport { VectorType } from \"../vector/vectorType\";\nimport type BitVector from \"../vector/flat/bitVector\";\nimport { decodeStreamMetadata } from \"../metadata/tile/streamMetadataDecoder\";\nimport { unpackNullableBoolean, unpackNullable } from \"./unpackNullableUtils\";\n\nexport function skipColumn(numStreams: number, tile: Uint8Array, offset: IntWrapper) {\n //TODO: add size of column in Mlt for fast skipping\n for (let i = 0; i < numStreams; i++) {\n const streamMetadata = decodeStreamMetadata(tile, offset);\n offset.add(streamMetadata.byteLength);\n }\n}\n\nexport function decodeBooleanRle(\n buffer: Uint8Array,\n numBooleans: number,\n byteLength: number,\n pos: IntWrapper,\n nullabilityBuffer?: BitVector,\n): Uint8Array {\n const numBytes = Math.ceil(numBooleans / 8.0);\n const values = decodeByteRle(buffer, numBytes, byteLength, pos);\n\n if (nullabilityBuffer) {\n return unpackNullableBoolean(values, numBooleans, nullabilityBuffer);\n }\n\n return values;\n}\n\nexport function decodeByteRle(buffer: Uint8Array, numBytes: number, byteLength: number, pos: IntWrapper): Uint8Array {\n const values = new Uint8Array(numBytes);\n\n let valueOffset = 0;\n const streamEndPos = pos.get() + byteLength;\n\n while (valueOffset < numBytes) {\n if (pos.get() >= streamEndPos) {\n break;\n }\n\n const header = buffer[pos.increment()];\n /* Runs */\n if (header <= 0x7f) {\n const numRuns = header + 3;\n const value = buffer[pos.increment()];\n const endValueOffset = Math.min(valueOffset + numRuns, numBytes);\n values.fill(value, valueOffset, endValueOffset);\n valueOffset = endValueOffset;\n } else {\n /* Literals */\n const numLiterals = 256 - header;\n for (let i = 0; i < numLiterals && valueOffset < numBytes; i++) {\n values[valueOffset++] = buffer[pos.increment()];\n }\n }\n }\n pos.set(streamEndPos);\n return values;\n}\n\nexport function decodeFloatsLE(\n encodedValues: Uint8Array,\n pos: IntWrapper,\n numValues: number,\n nullabilityBuffer?: BitVector,\n): Float32Array {\n const currentPos = pos.get();\n const newOffset = currentPos + numValues * Float32Array.BYTES_PER_ELEMENT;\n const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;\n const fb = new Float32Array(newBuf);\n pos.set(newOffset);\n\n if (nullabilityBuffer) {\n return unpackNullable(fb, nullabilityBuffer, 0);\n }\n\n return fb;\n}\n\nexport function decodeDoublesLE(\n encodedValues: Uint8Array,\n pos: IntWrapper,\n numValues: number,\n nullabilityBuffer?: BitVector,\n): Float64Array {\n const currentPos = pos.get();\n const newOffset = currentPos + numValues * Float64Array.BYTES_PER_ELEMENT;\n const newBuf = new Uint8Array(encodedValues.subarray(currentPos, newOffset)).buffer;\n const fb = new Float64Array(newBuf);\n pos.set(newOffset);\n\n if (nullabilityBuffer) {\n return unpackNullable(fb, nullabilityBuffer, 0);\n }\n\n return fb;\n}\n\nconst TEXT_DECODER_MIN_LENGTH = 12;\nconst utf8TextDecoder = new TextDecoder();\n\n// Source: https://github.com/mapbox/pbf/issues/106\nexport function decodeString(buf: Uint8Array, pos: number, end: number): string {\n if (end - pos >= TEXT_DECODER_MIN_LENGTH) {\n // longer strings are fast with the built-in browser TextDecoder API\n return utf8TextDecoder.decode(buf.subarray(pos, end));\n }\n // short strings are fast with custom implementation\n return readUtf8(buf, pos, end);\n}\n\nfunction readUtf8(buf, pos, end): string {\n let str = \"\";\n let i = pos;\n\n while (i < end) {\n const b0 = buf[i];\n let c = null; // codepoint\n let bytesPerSequence = b0 > 0xef ? 4 : b0 > 0xdf ? 3 : b0 > 0xbf ? 2 : 1;\n\n if (i + bytesPerSequence > end) break;\n\n let b1, b2, b3;\n\n if (bytesPerSequence === 1) {\n if (b0 < 0x80) {\n c = b0;\n }\n } else if (bytesPerSequence === 2) {\n b1 = buf[i + 1];\n if ((b1 & 0xc0) === 0x80) {\n c = ((b0 & 0x1f) << 0x6) | (b1 & 0x3f);\n if (c <= 0x7f) {\n c = null;\n }\n }\n } else if (bytesPerSequence === 3) {\n b1 = buf[i + 1];\n b2 = buf[i + 2];\n if ((b1 & 0xc0) === 0x80 && (b2 & 0xc0) === 0x80) {\n c = ((b0 & 0xf) << 0xc) | ((b1 & 0x3f) << 0x6) | (b2 & 0x3f);\n if (c <= 0x7ff || (c >= 0xd800 && c <= 0xdfff)) {\n c = null;\n }\n }\n } else if (bytesPerSequence === 4) {\n b1 = buf[i + 1];\n b2 = buf[i + 2];\n b3 = buf[i + 3];\n if ((b1 & 0xc0) === 0x80 && (b2 & 0xc0) === 0x80 && (b3 & 0xc0) === 0x80) {\n c = ((b0 & 0xf) << 0x12) | ((b1 & 0x3f) << 0xc) | ((b2 & 0x3f) << 0x6) | (b3 & 0x3f);\n if (c <= 0xffff || c >= 0x110000) {\n c = null;\n }\n }\n }\n\n if (c === null) {\n c = 0xfffd;\n bytesPerSequence = 1;\n } else if (c > 0xffff) {\n c -= 0x10000;\n str += String.fromCharCode(((c >>> 10) & 0x3ff) | 0xd800);\n c = 0xdc00 | (c & 0x3ff);\n }\n\n str += String.fromCharCode(c);\n i += bytesPerSequence;\n }\n\n return str;\n}\n\nexport function getVectorTypeBooleanStream(\n numFeatures: number,\n byteLength: number,\n data: Uint8Array,\n offset: IntWrapper,\n): VectorType {\n const valuesPerRun = 0x83;\n // TODO: use VectorType metadata field for to test which VectorType is used\n return Math.ceil(numFeatures / valuesPerRun) * 2 == byteLength &&\n /* Test the first value byte if all bits are set to true */\n (data[offset.get() + 1] & 0xff) === (bitCount(numFeatures) << 2) - 1\n ? VectorType.CONST\n : VectorType.FLAT;\n}\n\nfunction bitCount(number): number {\n //TODO: refactor to get rid of special case handling\n return number === 0 ? 1 : Math.floor(Math.log2(number) + 1);\n}\n"]}