@maplibre/mlt 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decoding/decodingUtils.js +2 -2
- package/dist/decoding/decodingUtils.js.map +1 -1
- package/dist/decoding/geometryDecoder.js +8 -8
- package/dist/decoding/geometryDecoder.js.map +1 -1
- package/dist/decoding/integerDecodingUtils.d.ts +1 -1
- package/dist/decoding/integerDecodingUtils.js.map +1 -1
- package/dist/decoding/integerStreamDecoder.d.ts +1 -1
- package/dist/decoding/integerStreamDecoder.js.map +1 -1
- package/dist/decoding/integerStreamDecoder.spec.js +22 -4
- package/dist/decoding/integerStreamDecoder.spec.js.map +1 -1
- package/dist/decoding/propertyDecoder.js +10 -10
- package/dist/decoding/propertyDecoder.js.map +1 -1
- package/dist/decoding/propertyDecoder.spec.js +27 -24
- package/dist/decoding/propertyDecoder.spec.js.map +1 -1
- package/dist/decoding/stringDecoder.d.ts +2 -10
- package/dist/decoding/stringDecoder.js +149 -157
- package/dist/decoding/stringDecoder.js.map +1 -1
- package/dist/decoding/stringDecoder.spec.js +10 -10
- package/dist/decoding/stringDecoder.spec.js.map +1 -1
- package/dist/metadata/tile/streamMetadataDecoder.d.ts +28 -4
- package/dist/metadata/tile/streamMetadataDecoder.js +81 -15
- package/dist/metadata/tile/streamMetadataDecoder.js.map +1 -1
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js +4 -4
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js.map +1 -1
- package/dist/metadata/tileset/typeMap.d.ts +21 -29
- package/dist/metadata/tileset/typeMap.js +167 -169
- package/dist/metadata/tileset/typeMap.js.map +1 -1
- package/dist/mltDecoder.js +11 -9
- package/dist/mltDecoder.js.map +1 -1
- package/dist/vector/geometry/geometryVector.js +2 -2
- package/dist/vector/geometry/geometryVector.js.map +1 -1
- package/dist/vector/geometry/geometryVectorConverter.js +4 -4
- package/dist/vector/geometry/geometryVectorConverter.js.map +1 -1
- package/dist/vector/geometry/zOrderCurve.d.ts +4 -17
- package/dist/vector/geometry/zOrderCurve.js +10 -35
- package/dist/vector/geometry/zOrderCurve.js.map +1 -1
- package/dist/vector/geometry/zOrderCurve.spec.js +15 -10
- package/dist/vector/geometry/zOrderCurve.spec.js.map +1 -1
- package/package.json +1 -1
- package/dist/metadata/tile/mortonEncodedStreamMetadata.d.ts +0 -15
- package/dist/metadata/tile/mortonEncodedStreamMetadata.js +0 -27
- package/dist/metadata/tile/mortonEncodedStreamMetadata.js.map +0 -1
- package/dist/metadata/tile/rleEncodedStreamMetadata.d.ts +0 -24
- package/dist/metadata/tile/rleEncodedStreamMetadata.js +0 -38
- package/dist/metadata/tile/rleEncodedStreamMetadata.js.map +0 -1
- package/dist/metadata/tile/streamMetadata.d.ts +0 -29
- package/dist/metadata/tile/streamMetadata.js +0 -82
- package/dist/metadata/tile/streamMetadata.js.map +0 -1
- package/dist/vector/geometry/spaceFillingCurve.d.ts +0 -22
- package/dist/vector/geometry/spaceFillingCurve.js +0 -31
- package/dist/vector/geometry/spaceFillingCurve.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { decodeStreamMetadata } from "../metadata/tile/streamMetadataDecoder";
|
|
2
2
|
import { StringFlatVector } from "../vector/flat/stringFlatVector";
|
|
3
3
|
import { StringDictionaryVector } from "../vector/dictionary/stringDictionaryVector";
|
|
4
4
|
import BitVector from "../vector/flat/bitVector";
|
|
@@ -9,184 +9,176 @@ import { decodeIntStream, decodeLengthStreamToOffsetBuffer, decodeNullableIntStr
|
|
|
9
9
|
import { ScalarType } from "../metadata/tileset/tilesetMetadata";
|
|
10
10
|
import { decodeVarintInt32 } from "./integerDecodingUtils";
|
|
11
11
|
import { decodeBooleanRle, skipColumn } from "./decodingUtils";
|
|
12
|
-
import { RleEncodedStreamMetadata } from "../metadata/tile/rleEncodedStreamMetadata";
|
|
13
12
|
import { StringFsstDictionaryVector } from "../vector/fsst-dictionary/stringFsstDictionaryVector";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
const ROOT_COLUMN_NAME = "default";
|
|
14
|
+
const NESTED_COLUMN_SEPARATOR = ":";
|
|
15
|
+
export function decodeString(name, data, offset, numStreams, bitVector) {
|
|
16
|
+
let dictionaryLengthStream = null;
|
|
17
|
+
let offsetStream = null;
|
|
18
|
+
let dictionaryStream = null;
|
|
19
|
+
let symbolLengthStream = null;
|
|
20
|
+
let symbolTableStream = null;
|
|
21
|
+
let presentStream = null;
|
|
22
|
+
let plainLengthStream = null;
|
|
23
|
+
let plainDataStream = null;
|
|
24
|
+
for (let i = 0; i < numStreams; i++) {
|
|
25
|
+
const streamMetadata = decodeStreamMetadata(data, offset);
|
|
26
|
+
if (streamMetadata.byteLength === 0) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
switch (streamMetadata.physicalStreamType) {
|
|
30
|
+
case PhysicalStreamType.PRESENT: {
|
|
31
|
+
const presentData = decodeBooleanRle(data, streamMetadata.numValues, offset);
|
|
32
|
+
presentStream = new BitVector(presentData, streamMetadata.numValues);
|
|
33
|
+
break;
|
|
31
34
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
case PhysicalStreamType.OFFSET: {
|
|
36
|
+
const isNullable = bitVector != null || presentStream != null;
|
|
37
|
+
const nullabilityBuffer = bitVector ?? presentStream;
|
|
38
|
+
offsetStream = isNullable
|
|
39
|
+
? decodeNullableIntStream(data, offset, streamMetadata, false, nullabilityBuffer)
|
|
40
|
+
: decodeIntStream(data, offset, streamMetadata, false);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case PhysicalStreamType.LENGTH: {
|
|
44
|
+
const ls = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);
|
|
45
|
+
if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {
|
|
46
|
+
dictionaryLengthStream = ls;
|
|
47
|
+
}
|
|
48
|
+
else if (LengthType.SYMBOL === streamMetadata.logicalStreamType.lengthType) {
|
|
49
|
+
symbolLengthStream = ls;
|
|
37
50
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
else {
|
|
52
|
+
// Plain string encoding uses VAR_BINARY length type
|
|
53
|
+
plainLengthStream = ls;
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case PhysicalStreamType.DATA: {
|
|
58
|
+
const ds = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);
|
|
59
|
+
offset.add(streamMetadata.byteLength);
|
|
60
|
+
const dictType = streamMetadata.logicalStreamType.dictionaryType;
|
|
61
|
+
if (DictionaryType.FSST === dictType) {
|
|
62
|
+
symbolTableStream = ds;
|
|
45
63
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {
|
|
49
|
-
dictionaryLengthStream = ls;
|
|
50
|
-
}
|
|
51
|
-
else if (LengthType.SYMBOL === streamMetadata.logicalStreamType.lengthType) {
|
|
52
|
-
symbolLengthStream = ls;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
// Plain string encoding uses VAR_BINARY length type
|
|
56
|
-
plainLengthStream = ls;
|
|
57
|
-
}
|
|
58
|
-
break;
|
|
64
|
+
else if (DictionaryType.SINGLE === dictType || DictionaryType.SHARED === dictType) {
|
|
65
|
+
dictionaryStream = ds;
|
|
59
66
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
offset.add(streamMetadata.byteLength);
|
|
63
|
-
const dictType = streamMetadata.logicalStreamType.dictionaryType;
|
|
64
|
-
if (DictionaryType.FSST === dictType) {
|
|
65
|
-
symbolTableStream = ds;
|
|
66
|
-
}
|
|
67
|
-
else if (DictionaryType.SINGLE === dictType || DictionaryType.SHARED === dictType) {
|
|
68
|
-
dictionaryStream = ds;
|
|
69
|
-
}
|
|
70
|
-
else if (DictionaryType.NONE === dictType) {
|
|
71
|
-
plainDataStream = ds;
|
|
72
|
-
}
|
|
73
|
-
break;
|
|
67
|
+
else if (DictionaryType.NONE === dictType) {
|
|
68
|
+
plainDataStream = ds;
|
|
74
69
|
}
|
|
70
|
+
break;
|
|
75
71
|
}
|
|
76
72
|
}
|
|
77
|
-
return (this.decodeFsstDictionaryVector(name, symbolTableStream, offsetStream, dictionaryLengthStream, dictionaryStream, symbolLengthStream, bitVector ?? presentStream) ??
|
|
78
|
-
this.decodeDictionaryVector(name, dictionaryStream, offsetStream, dictionaryLengthStream, bitVector ?? presentStream) ??
|
|
79
|
-
this.decodePlainStringVector(name, plainLengthStream, plainDataStream, offsetStream, bitVector ?? presentStream));
|
|
80
73
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
74
|
+
return (decodeFsstDictionaryVector(name, symbolTableStream, offsetStream, dictionaryLengthStream, dictionaryStream, symbolLengthStream, bitVector ?? presentStream) ??
|
|
75
|
+
decodeDictionaryVector(name, dictionaryStream, offsetStream, dictionaryLengthStream, bitVector ?? presentStream) ??
|
|
76
|
+
decodePlainStringVector(name, plainLengthStream, plainDataStream, offsetStream, bitVector ?? presentStream));
|
|
77
|
+
}
|
|
78
|
+
function decodeFsstDictionaryVector(name, symbolTableStream, offsetStream, dictionaryLengthStream, dictionaryStream, symbolLengthStream, nullabilityBuffer) {
|
|
79
|
+
if (!symbolTableStream) {
|
|
80
|
+
return null;
|
|
86
81
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
82
|
+
return new StringFsstDictionaryVector(name, offsetStream, dictionaryLengthStream, dictionaryStream, symbolLengthStream, symbolTableStream, nullabilityBuffer);
|
|
83
|
+
}
|
|
84
|
+
function decodeDictionaryVector(name, dictionaryStream, offsetStream, dictionaryLengthStream, nullabilityBuffer) {
|
|
85
|
+
if (!dictionaryStream) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return nullabilityBuffer
|
|
89
|
+
? new StringDictionaryVector(name, offsetStream, dictionaryLengthStream, dictionaryStream, nullabilityBuffer)
|
|
90
|
+
: new StringDictionaryVector(name, offsetStream, dictionaryLengthStream, dictionaryStream);
|
|
91
|
+
}
|
|
92
|
+
function decodePlainStringVector(name, plainLengthStream, plainDataStream, offsetStream, nullabilityBuffer) {
|
|
93
|
+
if (!plainLengthStream || !plainDataStream) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
if (offsetStream) {
|
|
91
97
|
return nullabilityBuffer
|
|
92
|
-
? new StringDictionaryVector(name, offsetStream,
|
|
93
|
-
: new StringDictionaryVector(name, offsetStream,
|
|
98
|
+
? new StringDictionaryVector(name, offsetStream, plainLengthStream, plainDataStream, nullabilityBuffer)
|
|
99
|
+
: new StringDictionaryVector(name, offsetStream, plainLengthStream, plainDataStream);
|
|
94
100
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
if (nullabilityBuffer && nullabilityBuffer.size() !== plainLengthStream.length - 1) {
|
|
102
|
+
const sparseOffsetStream = new Int32Array(nullabilityBuffer.size());
|
|
103
|
+
let valueIndex = 0;
|
|
104
|
+
for (let i = 0; i < nullabilityBuffer.size(); i++) {
|
|
105
|
+
if (nullabilityBuffer.get(i)) {
|
|
106
|
+
sparseOffsetStream[i] = valueIndex++;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
sparseOffsetStream[i] = 0;
|
|
110
|
+
}
|
|
103
111
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
return new StringDictionaryVector(name, sparseOffsetStream, plainLengthStream, plainDataStream, nullabilityBuffer);
|
|
113
|
+
}
|
|
114
|
+
return nullabilityBuffer
|
|
115
|
+
? new StringFlatVector(name, plainLengthStream, plainDataStream, nullabilityBuffer)
|
|
116
|
+
: new StringFlatVector(name, plainLengthStream, plainDataStream);
|
|
117
|
+
}
|
|
118
|
+
export function decodeSharedDictionary(data, offset, column, numFeatures, propertyColumnNames) {
|
|
119
|
+
let dictionaryOffsetBuffer = null;
|
|
120
|
+
let dictionaryBuffer = null;
|
|
121
|
+
let symbolOffsetBuffer = null;
|
|
122
|
+
let symbolTableBuffer = null;
|
|
123
|
+
let dictionaryStreamDecoded = false;
|
|
124
|
+
while (!dictionaryStreamDecoded) {
|
|
125
|
+
const streamMetadata = decodeStreamMetadata(data, offset);
|
|
126
|
+
switch (streamMetadata.physicalStreamType) {
|
|
127
|
+
case PhysicalStreamType.LENGTH:
|
|
128
|
+
if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {
|
|
129
|
+
dictionaryOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);
|
|
110
130
|
}
|
|
111
131
|
else {
|
|
112
|
-
|
|
132
|
+
symbolOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);
|
|
113
133
|
}
|
|
114
|
-
|
|
115
|
-
|
|
134
|
+
break;
|
|
135
|
+
case PhysicalStreamType.DATA:
|
|
136
|
+
if (DictionaryType.SINGLE === streamMetadata.logicalStreamType.dictionaryType ||
|
|
137
|
+
DictionaryType.SHARED === streamMetadata.logicalStreamType.dictionaryType) {
|
|
138
|
+
dictionaryBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);
|
|
139
|
+
dictionaryStreamDecoded = true;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
symbolTableBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);
|
|
143
|
+
}
|
|
144
|
+
offset.add(streamMetadata.byteLength);
|
|
145
|
+
break;
|
|
116
146
|
}
|
|
117
|
-
return nullabilityBuffer
|
|
118
|
-
? new StringFlatVector(name, plainLengthStream, plainDataStream, nullabilityBuffer)
|
|
119
|
-
: new StringFlatVector(name, plainLengthStream, plainDataStream);
|
|
120
147
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
switch (streamMetadata.physicalStreamType) {
|
|
130
|
-
case PhysicalStreamType.LENGTH:
|
|
131
|
-
if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {
|
|
132
|
-
dictionaryOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
symbolOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);
|
|
136
|
-
}
|
|
137
|
-
break;
|
|
138
|
-
case PhysicalStreamType.DATA:
|
|
139
|
-
if (DictionaryType.SINGLE === streamMetadata.logicalStreamType.dictionaryType ||
|
|
140
|
-
DictionaryType.SHARED === streamMetadata.logicalStreamType.dictionaryType) {
|
|
141
|
-
dictionaryBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);
|
|
142
|
-
dictionaryStreamDecoded = true;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
symbolTableBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);
|
|
146
|
-
}
|
|
147
|
-
offset.add(streamMetadata.byteLength);
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
148
|
+
const childFields = column.complexType.children;
|
|
149
|
+
const stringDictionaryVectors = [];
|
|
150
|
+
let i = 0;
|
|
151
|
+
for (const childField of childFields) {
|
|
152
|
+
const numStreams = decodeVarintInt32(data, offset, 1)[0];
|
|
153
|
+
if (numStreams == 0) {
|
|
154
|
+
/* Column is not present in the tile */
|
|
155
|
+
continue;
|
|
150
156
|
}
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (numStreams == 0) {
|
|
157
|
-
/* Column is not present in the tile */
|
|
157
|
+
const columnName = `${column.name}${childField.name === ROOT_COLUMN_NAME ? "" : NESTED_COLUMN_SEPARATOR + childField.name}`;
|
|
158
|
+
if (propertyColumnNames) {
|
|
159
|
+
if (!propertyColumnNames.has(columnName)) {
|
|
160
|
+
//TODO: add size of sub column to Mlt for faster skipping
|
|
161
|
+
skipColumn(numStreams, data, offset);
|
|
158
162
|
continue;
|
|
159
163
|
}
|
|
160
|
-
const columnName = `${column.name}${childField.name === StringDecoder.ROOT_COLUMN_NAME
|
|
161
|
-
? ""
|
|
162
|
-
: StringDecoder.NESTED_COLUMN_SEPARATOR + childField.name}`;
|
|
163
|
-
if (propertyColumnNames) {
|
|
164
|
-
if (!propertyColumnNames.has(columnName)) {
|
|
165
|
-
//TODO: add size of sub column to Mlt for faster skipping
|
|
166
|
-
skipColumn(numStreams, data, offset);
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (numStreams !== 2 ||
|
|
171
|
-
childField.type !== "scalarField" ||
|
|
172
|
-
childField.scalarField.physicalType !== ScalarType.STRING) {
|
|
173
|
-
throw new Error("Currently only optional string fields are implemented for a struct.");
|
|
174
|
-
}
|
|
175
|
-
const presentStreamMetadata = StreamMetadataDecoder.decode(data, offset);
|
|
176
|
-
const presentStream = decodeBooleanRle(data, presentStreamMetadata.numValues, offset);
|
|
177
|
-
const offsetStreamMetadata = StreamMetadataDecoder.decode(data, offset);
|
|
178
|
-
const offsetCount = offsetStreamMetadata instanceof RleEncodedStreamMetadata
|
|
179
|
-
? offsetStreamMetadata.numRleValues
|
|
180
|
-
: offsetStreamMetadata.numValues;
|
|
181
|
-
const isNullable = offsetCount !== numFeatures;
|
|
182
|
-
const offsetStream = isNullable
|
|
183
|
-
? decodeNullableIntStream(data, offset, offsetStreamMetadata, false, new BitVector(presentStream, presentStreamMetadata.numValues))
|
|
184
|
-
: decodeIntStream(data, offset, offsetStreamMetadata, false);
|
|
185
|
-
stringDictionaryVectors[i++] = symbolTableBuffer
|
|
186
|
-
? new StringFsstDictionaryVector(columnName, offsetStream, dictionaryOffsetBuffer, dictionaryBuffer, symbolOffsetBuffer, symbolTableBuffer, new BitVector(presentStream, presentStreamMetadata.numValues))
|
|
187
|
-
: new StringDictionaryVector(columnName, offsetStream, dictionaryOffsetBuffer, dictionaryBuffer, new BitVector(presentStream, presentStreamMetadata.numValues));
|
|
188
164
|
}
|
|
189
|
-
|
|
165
|
+
if (numStreams !== 2 ||
|
|
166
|
+
childField.type !== "scalarField" ||
|
|
167
|
+
childField.scalarField.physicalType !== ScalarType.STRING) {
|
|
168
|
+
throw new Error("Currently only optional string fields are implemented for a struct.");
|
|
169
|
+
}
|
|
170
|
+
const presentStreamMetadata = decodeStreamMetadata(data, offset);
|
|
171
|
+
const presentStream = decodeBooleanRle(data, presentStreamMetadata.numValues, offset);
|
|
172
|
+
const offsetStreamMetadata = decodeStreamMetadata(data, offset);
|
|
173
|
+
const offsetCount = offsetStreamMetadata.decompressedCount;
|
|
174
|
+
const isNullable = offsetCount !== numFeatures;
|
|
175
|
+
const offsetStream = isNullable
|
|
176
|
+
? decodeNullableIntStream(data, offset, offsetStreamMetadata, false, new BitVector(presentStream, presentStreamMetadata.numValues))
|
|
177
|
+
: decodeIntStream(data, offset, offsetStreamMetadata, false);
|
|
178
|
+
stringDictionaryVectors[i++] = symbolTableBuffer
|
|
179
|
+
? new StringFsstDictionaryVector(columnName, offsetStream, dictionaryOffsetBuffer, dictionaryBuffer, symbolOffsetBuffer, symbolTableBuffer, new BitVector(presentStream, presentStreamMetadata.numValues))
|
|
180
|
+
: new StringDictionaryVector(columnName, offsetStream, dictionaryOffsetBuffer, dictionaryBuffer, new BitVector(presentStream, presentStreamMetadata.numValues));
|
|
190
181
|
}
|
|
182
|
+
return stringDictionaryVectors;
|
|
191
183
|
}
|
|
192
184
|
//# sourceMappingURL=stringDecoder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringDecoder.js","sourceRoot":"","sources":["../../src/decoding/stringDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { StreamMetadataDecoder } from \"../metadata/tile/streamMetadataDecoder\";\nimport { StringFlatVector } from \"../vector/flat/stringFlatVector\";\nimport { StringDictionaryVector } from \"../vector/dictionary/stringDictionaryVector\";\nimport type IntWrapper from \"./intWrapper\";\nimport BitVector from \"../vector/flat/bitVector\";\nimport type Vector from \"../vector/vector\";\nimport { PhysicalStreamType } from \"../metadata/tile/physicalStreamType\";\nimport { DictionaryType } from \"../metadata/tile/dictionaryType\";\nimport { LengthType } from \"../metadata/tile/lengthType\";\nimport { decodeIntStream, decodeLengthStreamToOffsetBuffer, decodeNullableIntStream } from \"./integerStreamDecoder\";\nimport { type Column, ScalarType } from \"../metadata/tileset/tilesetMetadata\";\nimport { decodeVarintInt32 } from \"./integerDecodingUtils\";\nimport { decodeBooleanRle, skipColumn } from \"./decodingUtils\";\nimport { RleEncodedStreamMetadata } from \"../metadata/tile/rleEncodedStreamMetadata\";\nimport { StringFsstDictionaryVector } from \"../vector/fsst-dictionary/stringFsstDictionaryVector\";\n\nexport class StringDecoder {\n private static readonly ROOT_COLUMN_NAME = \"default\";\n private static readonly NESTED_COLUMN_SEPARATOR = \":\";\n\n private constructor() {}\n\n static decode(\n name: string,\n data: Uint8Array,\n offset: IntWrapper,\n numStreams: number,\n bitVector?: BitVector,\n ): Vector {\n let dictionaryLengthStream: Int32Array = null;\n let offsetStream: Int32Array = null;\n let dictionaryStream: Uint8Array = null;\n let symbolLengthStream: Int32Array = null;\n let symbolTableStream: Uint8Array = null;\n let presentStream: BitVector = null;\n let plainLengthStream: Int32Array = null;\n let plainDataStream: Uint8Array = null;\n\n for (let i = 0; i < numStreams; i++) {\n const streamMetadata = StreamMetadataDecoder.decode(data, offset);\n if (streamMetadata.byteLength === 0) {\n continue;\n }\n\n switch (streamMetadata.physicalStreamType) {\n case PhysicalStreamType.PRESENT: {\n const presentData = decodeBooleanRle(data, streamMetadata.numValues, offset);\n presentStream = new BitVector(presentData, streamMetadata.numValues);\n break;\n }\n case PhysicalStreamType.OFFSET: {\n const isNullable = bitVector != null || presentStream != null;\n const nullabilityBuffer = bitVector ?? presentStream;\n offsetStream = isNullable\n ? decodeNullableIntStream(data, offset, streamMetadata, false, nullabilityBuffer)\n : decodeIntStream(data, offset, streamMetadata, false);\n break;\n }\n case PhysicalStreamType.LENGTH: {\n const ls = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);\n if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {\n dictionaryLengthStream = ls;\n } else if (LengthType.SYMBOL === streamMetadata.logicalStreamType.lengthType) {\n symbolLengthStream = ls;\n } else {\n // Plain string encoding uses VAR_BINARY length type\n plainLengthStream = ls;\n }\n break;\n }\n case PhysicalStreamType.DATA: {\n const ds = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);\n offset.add(streamMetadata.byteLength);\n const dictType = streamMetadata.logicalStreamType.dictionaryType;\n if (DictionaryType.FSST === dictType) {\n symbolTableStream = ds;\n } else if (DictionaryType.SINGLE === dictType || DictionaryType.SHARED === dictType) {\n dictionaryStream = ds;\n } else if (DictionaryType.NONE === dictType) {\n plainDataStream = ds;\n }\n break;\n }\n }\n }\n\n return (\n this.decodeFsstDictionaryVector(\n name,\n symbolTableStream,\n offsetStream,\n dictionaryLengthStream,\n dictionaryStream,\n symbolLengthStream,\n bitVector ?? presentStream,\n ) ??\n this.decodeDictionaryVector(\n name,\n dictionaryStream,\n offsetStream,\n dictionaryLengthStream,\n bitVector ?? presentStream,\n ) ??\n this.decodePlainStringVector(\n name,\n plainLengthStream,\n plainDataStream,\n offsetStream,\n bitVector ?? presentStream,\n )\n );\n }\n\n private static decodeFsstDictionaryVector(\n name: string,\n symbolTableStream: Uint8Array | null,\n offsetStream: Int32Array | null,\n dictionaryLengthStream: Int32Array | null,\n dictionaryStream: Uint8Array | null,\n symbolLengthStream: Int32Array | null,\n nullabilityBuffer: BitVector | null,\n ): Vector | null {\n if (!symbolTableStream) {\n return null;\n }\n return new StringFsstDictionaryVector(\n name,\n offsetStream,\n dictionaryLengthStream,\n dictionaryStream,\n symbolLengthStream,\n symbolTableStream,\n nullabilityBuffer,\n );\n }\n\n private static decodeDictionaryVector(\n name: string,\n dictionaryStream: Uint8Array | null,\n offsetStream: Int32Array | null,\n dictionaryLengthStream: Int32Array | null,\n nullabilityBuffer: BitVector | null,\n ): Vector | null {\n if (!dictionaryStream) {\n return null;\n }\n return nullabilityBuffer\n ? new StringDictionaryVector(\n name,\n offsetStream,\n dictionaryLengthStream,\n dictionaryStream,\n nullabilityBuffer,\n )\n : new StringDictionaryVector(name, offsetStream, dictionaryLengthStream, dictionaryStream);\n }\n\n private static decodePlainStringVector(\n name: string,\n plainLengthStream: Int32Array | null,\n plainDataStream: Uint8Array | null,\n offsetStream: Int32Array | null,\n nullabilityBuffer: BitVector | null,\n ): Vector | null {\n if (!plainLengthStream || !plainDataStream) {\n return null;\n }\n\n if (offsetStream) {\n return nullabilityBuffer\n ? new StringDictionaryVector(name, offsetStream, plainLengthStream, plainDataStream, nullabilityBuffer)\n : new StringDictionaryVector(name, offsetStream, plainLengthStream, plainDataStream);\n }\n\n if (nullabilityBuffer && nullabilityBuffer.size() !== plainLengthStream.length - 1) {\n const sparseOffsetStream = new Int32Array(nullabilityBuffer.size());\n let valueIndex = 0;\n for (let i = 0; i < nullabilityBuffer.size(); i++) {\n if (nullabilityBuffer.get(i)) {\n sparseOffsetStream[i] = valueIndex++;\n } else {\n sparseOffsetStream[i] = 0;\n }\n }\n return new StringDictionaryVector(\n name,\n sparseOffsetStream,\n plainLengthStream,\n plainDataStream,\n nullabilityBuffer,\n );\n }\n\n return nullabilityBuffer\n ? new StringFlatVector(name, plainLengthStream, plainDataStream, nullabilityBuffer)\n : new StringFlatVector(name, plainLengthStream, plainDataStream);\n }\n\n static decodeSharedDictionary(\n data: Uint8Array,\n offset: IntWrapper,\n column: Column,\n numFeatures: number,\n propertyColumnNames?: Set<string>,\n ): Vector[] {\n let dictionaryOffsetBuffer: Int32Array = null;\n let dictionaryBuffer: Uint8Array = null;\n let symbolOffsetBuffer: Int32Array = null;\n let symbolTableBuffer: Uint8Array = null;\n\n let dictionaryStreamDecoded = false;\n while (!dictionaryStreamDecoded) {\n const streamMetadata = StreamMetadataDecoder.decode(data, offset);\n switch (streamMetadata.physicalStreamType) {\n case PhysicalStreamType.LENGTH:\n if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {\n dictionaryOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);\n } else {\n symbolOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);\n }\n break;\n case PhysicalStreamType.DATA:\n if (\n DictionaryType.SINGLE === streamMetadata.logicalStreamType.dictionaryType ||\n DictionaryType.SHARED === streamMetadata.logicalStreamType.dictionaryType\n ) {\n dictionaryBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);\n dictionaryStreamDecoded = true;\n } else {\n symbolTableBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);\n }\n offset.add(streamMetadata.byteLength);\n break;\n }\n }\n\n const childFields = column.complexType.children;\n const stringDictionaryVectors = [];\n let i = 0;\n for (const childField of childFields) {\n const numStreams = decodeVarintInt32(data, offset, 1)[0];\n if (numStreams == 0) {\n /* Column is not present in the tile */\n continue;\n }\n\n const columnName = `${column.name}${\n childField.name === StringDecoder.ROOT_COLUMN_NAME\n ? \"\"\n : StringDecoder.NESTED_COLUMN_SEPARATOR + childField.name\n }`;\n if (propertyColumnNames) {\n if (!propertyColumnNames.has(columnName)) {\n //TODO: add size of sub column to Mlt for faster skipping\n skipColumn(numStreams, data, offset);\n continue;\n }\n }\n\n if (\n numStreams !== 2 ||\n childField.type !== \"scalarField\" ||\n childField.scalarField.physicalType !== ScalarType.STRING\n ) {\n throw new Error(\"Currently only optional string fields are implemented for a struct.\");\n }\n\n const presentStreamMetadata = StreamMetadataDecoder.decode(data, offset);\n const presentStream = decodeBooleanRle(data, presentStreamMetadata.numValues, offset);\n const offsetStreamMetadata = StreamMetadataDecoder.decode(data, offset);\n const offsetCount =\n offsetStreamMetadata instanceof RleEncodedStreamMetadata\n ? offsetStreamMetadata.numRleValues\n : offsetStreamMetadata.numValues;\n const isNullable = offsetCount !== numFeatures;\n const offsetStream = isNullable\n ? decodeNullableIntStream(\n data,\n offset,\n offsetStreamMetadata,\n false,\n new BitVector(presentStream, presentStreamMetadata.numValues),\n )\n : decodeIntStream(data, offset, offsetStreamMetadata, false);\n\n stringDictionaryVectors[i++] = symbolTableBuffer\n ? new StringFsstDictionaryVector(\n columnName,\n offsetStream,\n dictionaryOffsetBuffer,\n dictionaryBuffer,\n symbolOffsetBuffer,\n symbolTableBuffer,\n new BitVector(presentStream, presentStreamMetadata.numValues),\n )\n : new StringDictionaryVector(\n columnName,\n offsetStream,\n dictionaryOffsetBuffer,\n dictionaryBuffer,\n new BitVector(presentStream, presentStreamMetadata.numValues),\n );\n }\n\n return stringDictionaryVectors;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stringDecoder.js","sourceRoot":"","sources":["../../src/decoding/stringDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,SAAS,MAAM,0BAA0B,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,gCAAgC,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EAAe,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAElG,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,UAAU,YAAY,CACxB,IAAY,EACZ,IAAgB,EAChB,MAAkB,EAClB,UAAkB,EAClB,SAAqB;IAErB,IAAI,sBAAsB,GAAe,IAAI,CAAC;IAC9C,IAAI,YAAY,GAAe,IAAI,CAAC;IACpC,IAAI,gBAAgB,GAAe,IAAI,CAAC;IACxC,IAAI,kBAAkB,GAAe,IAAI,CAAC;IAC1C,IAAI,iBAAiB,GAAe,IAAI,CAAC;IACzC,IAAI,aAAa,GAAc,IAAI,CAAC;IACpC,IAAI,iBAAiB,GAAe,IAAI,CAAC;IACzC,IAAI,eAAe,GAAe,IAAI,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,cAAc,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAClC,SAAS;QACb,CAAC;QAED,QAAQ,cAAc,CAAC,kBAAkB,EAAE,CAAC;YACxC,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9B,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC7E,aAAa,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;gBACrE,MAAM;YACV,CAAC;YACD,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,MAAM,UAAU,GAAG,SAAS,IAAI,IAAI,IAAI,aAAa,IAAI,IAAI,CAAC;gBAC9D,MAAM,iBAAiB,GAAG,SAAS,IAAI,aAAa,CAAC;gBACrD,YAAY,GAAG,UAAU;oBACrB,CAAC,CAAC,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,CAAC;oBACjF,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;gBAC3D,MAAM;YACV,CAAC;YACD,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,gCAAgC,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBAC1E,IAAI,UAAU,CAAC,UAAU,KAAK,cAAc,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;oBACxE,sBAAsB,GAAG,EAAE,CAAC;gBAChC,CAAC;qBAAM,IAAI,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;oBAC3E,kBAAkB,GAAG,EAAE,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACJ,oDAAoD;oBACpD,iBAAiB,GAAG,EAAE,CAAC;gBAC3B,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;gBACjF,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBACtC,MAAM,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,cAAc,CAAC;gBACjE,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnC,iBAAiB,GAAG,EAAE,CAAC;gBAC3B,CAAC;qBAAM,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAClF,gBAAgB,GAAG,EAAE,CAAC;gBAC1B,CAAC;qBAAM,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1C,eAAe,GAAG,EAAE,CAAC;gBACzB,CAAC;gBACD,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,CACH,0BAA0B,CACtB,IAAI,EACJ,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,IAAI,aAAa,CAC7B;QACD,sBAAsB,CAClB,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,SAAS,IAAI,aAAa,CAC7B;QACD,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,IAAI,aAAa,CAAC,CAC9G,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CAC/B,IAAY,EACZ,iBAAoC,EACpC,YAA+B,EAC/B,sBAAyC,EACzC,gBAAmC,EACnC,kBAAqC,EACrC,iBAAmC;IAEnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,0BAA0B,CACjC,IAAI,EACJ,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,CACpB,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAC3B,IAAY,EACZ,gBAAmC,EACnC,YAA+B,EAC/B,sBAAyC,EACzC,iBAAmC;IAEnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,iBAAiB;QACpB,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;QAC7G,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,uBAAuB,CAC5B,IAAY,EACZ,iBAAoC,EACpC,eAAkC,EAClC,YAA+B,EAC/B,iBAAmC;IAEnC,IAAI,CAAC,iBAAiB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,iBAAiB;YACpB,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,CAAC;YACvG,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,EAAE,KAAK,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjF,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3B,kBAAkB,CAAC,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACJ,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,IAAI,sBAAsB,CAC7B,IAAI,EACJ,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,CACpB,CAAC;IACN,CAAC;IAED,OAAO,iBAAiB;QACpB,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,CAAC;QACnF,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAClC,IAAgB,EAChB,MAAkB,EAClB,MAAc,EACd,WAAmB,EACnB,mBAAiC;IAEjC,IAAI,sBAAsB,GAAe,IAAI,CAAC;IAC9C,IAAI,gBAAgB,GAAe,IAAI,CAAC;IACxC,IAAI,kBAAkB,GAAe,IAAI,CAAC;IAC1C,IAAI,iBAAiB,GAAe,IAAI,CAAC;IAEzC,IAAI,uBAAuB,GAAG,KAAK,CAAC;IACpC,OAAO,CAAC,uBAAuB,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,QAAQ,cAAc,CAAC,kBAAkB,EAAE,CAAC;YACxC,KAAK,kBAAkB,CAAC,MAAM;gBAC1B,IAAI,UAAU,CAAC,UAAU,KAAK,cAAc,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;oBACxE,sBAAsB,GAAG,gCAAgC,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBAC5F,CAAC;qBAAM,CAAC;oBACJ,kBAAkB,GAAG,gCAAgC,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBACxF,CAAC;gBACD,MAAM;YACV,KAAK,kBAAkB,CAAC,IAAI;gBACxB,IACI,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,iBAAiB,CAAC,cAAc;oBACzE,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,iBAAiB,CAAC,cAAc,EAC3E,CAAC;oBACC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;oBACzF,uBAAuB,GAAG,IAAI,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACJ,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;gBAC9F,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBACtC,MAAM;QACd,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;IAChD,MAAM,uBAAuB,GAAG,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YAClB,uCAAuC;YACvC,SAAS;QACb,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,IAAI,GAC7B,UAAU,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,GAAG,UAAU,CAAC,IACrF,EAAE,CAAC;QACH,IAAI,mBAAmB,EAAE,CAAC;YACtB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,yDAAyD;gBACzD,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBACrC,SAAS;YACb,CAAC;QACL,CAAC;QAED,IACI,UAAU,KAAK,CAAC;YAChB,UAAU,CAAC,IAAI,KAAK,aAAa;YACjC,UAAU,CAAC,WAAW,CAAC,YAAY,KAAK,UAAU,CAAC,MAAM,EAC3D,CAAC;YACC,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtF,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC;QAC3D,MAAM,UAAU,GAAG,WAAW,KAAK,WAAW,CAAC;QAC/C,MAAM,YAAY,GAAG,UAAU;YAC3B,CAAC,CAAC,uBAAuB,CACnB,IAAI,EACJ,MAAM,EACN,oBAAoB,EACpB,KAAK,EACL,IAAI,SAAS,CAAC,aAAa,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAChE;YACH,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAEjE,uBAAuB,CAAC,CAAC,EAAE,CAAC,GAAG,iBAAiB;YAC5C,CAAC,CAAC,IAAI,0BAA0B,CAC1B,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,IAAI,SAAS,CAAC,aAAa,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAChE;YACH,CAAC,CAAC,IAAI,sBAAsB,CACtB,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAChB,IAAI,SAAS,CAAC,aAAa,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAChE,CAAC;IACZ,CAAC;IAED,OAAO,uBAAuB,CAAC;AACnC,CAAC","sourcesContent":["import { decodeStreamMetadata } from \"../metadata/tile/streamMetadataDecoder\";\nimport { StringFlatVector } from \"../vector/flat/stringFlatVector\";\nimport { StringDictionaryVector } from \"../vector/dictionary/stringDictionaryVector\";\nimport type IntWrapper from \"./intWrapper\";\nimport BitVector from \"../vector/flat/bitVector\";\nimport type Vector from \"../vector/vector\";\nimport { PhysicalStreamType } from \"../metadata/tile/physicalStreamType\";\nimport { DictionaryType } from \"../metadata/tile/dictionaryType\";\nimport { LengthType } from \"../metadata/tile/lengthType\";\nimport { decodeIntStream, decodeLengthStreamToOffsetBuffer, decodeNullableIntStream } from \"./integerStreamDecoder\";\nimport { type Column, ScalarType } from \"../metadata/tileset/tilesetMetadata\";\nimport { decodeVarintInt32 } from \"./integerDecodingUtils\";\nimport { decodeBooleanRle, skipColumn } from \"./decodingUtils\";\nimport { StringFsstDictionaryVector } from \"../vector/fsst-dictionary/stringFsstDictionaryVector\";\n\nconst ROOT_COLUMN_NAME = \"default\";\nconst NESTED_COLUMN_SEPARATOR = \":\";\n\nexport function decodeString(\n name: string,\n data: Uint8Array,\n offset: IntWrapper,\n numStreams: number,\n bitVector?: BitVector,\n): Vector {\n let dictionaryLengthStream: Int32Array = null;\n let offsetStream: Int32Array = null;\n let dictionaryStream: Uint8Array = null;\n let symbolLengthStream: Int32Array = null;\n let symbolTableStream: Uint8Array = null;\n let presentStream: BitVector = null;\n let plainLengthStream: Int32Array = null;\n let plainDataStream: Uint8Array = null;\n\n for (let i = 0; i < numStreams; i++) {\n const streamMetadata = decodeStreamMetadata(data, offset);\n if (streamMetadata.byteLength === 0) {\n continue;\n }\n\n switch (streamMetadata.physicalStreamType) {\n case PhysicalStreamType.PRESENT: {\n const presentData = decodeBooleanRle(data, streamMetadata.numValues, offset);\n presentStream = new BitVector(presentData, streamMetadata.numValues);\n break;\n }\n case PhysicalStreamType.OFFSET: {\n const isNullable = bitVector != null || presentStream != null;\n const nullabilityBuffer = bitVector ?? presentStream;\n offsetStream = isNullable\n ? decodeNullableIntStream(data, offset, streamMetadata, false, nullabilityBuffer)\n : decodeIntStream(data, offset, streamMetadata, false);\n break;\n }\n case PhysicalStreamType.LENGTH: {\n const ls = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);\n if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {\n dictionaryLengthStream = ls;\n } else if (LengthType.SYMBOL === streamMetadata.logicalStreamType.lengthType) {\n symbolLengthStream = ls;\n } else {\n // Plain string encoding uses VAR_BINARY length type\n plainLengthStream = ls;\n }\n break;\n }\n case PhysicalStreamType.DATA: {\n const ds = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);\n offset.add(streamMetadata.byteLength);\n const dictType = streamMetadata.logicalStreamType.dictionaryType;\n if (DictionaryType.FSST === dictType) {\n symbolTableStream = ds;\n } else if (DictionaryType.SINGLE === dictType || DictionaryType.SHARED === dictType) {\n dictionaryStream = ds;\n } else if (DictionaryType.NONE === dictType) {\n plainDataStream = ds;\n }\n break;\n }\n }\n }\n\n return (\n decodeFsstDictionaryVector(\n name,\n symbolTableStream,\n offsetStream,\n dictionaryLengthStream,\n dictionaryStream,\n symbolLengthStream,\n bitVector ?? presentStream,\n ) ??\n decodeDictionaryVector(\n name,\n dictionaryStream,\n offsetStream,\n dictionaryLengthStream,\n bitVector ?? presentStream,\n ) ??\n decodePlainStringVector(name, plainLengthStream, plainDataStream, offsetStream, bitVector ?? presentStream)\n );\n}\n\nfunction decodeFsstDictionaryVector(\n name: string,\n symbolTableStream: Uint8Array | null,\n offsetStream: Int32Array | null,\n dictionaryLengthStream: Int32Array | null,\n dictionaryStream: Uint8Array | null,\n symbolLengthStream: Int32Array | null,\n nullabilityBuffer: BitVector | null,\n): Vector | null {\n if (!symbolTableStream) {\n return null;\n }\n return new StringFsstDictionaryVector(\n name,\n offsetStream,\n dictionaryLengthStream,\n dictionaryStream,\n symbolLengthStream,\n symbolTableStream,\n nullabilityBuffer,\n );\n}\n\nfunction decodeDictionaryVector(\n name: string,\n dictionaryStream: Uint8Array | null,\n offsetStream: Int32Array | null,\n dictionaryLengthStream: Int32Array | null,\n nullabilityBuffer: BitVector | null,\n): Vector | null {\n if (!dictionaryStream) {\n return null;\n }\n return nullabilityBuffer\n ? new StringDictionaryVector(name, offsetStream, dictionaryLengthStream, dictionaryStream, nullabilityBuffer)\n : new StringDictionaryVector(name, offsetStream, dictionaryLengthStream, dictionaryStream);\n}\n\nfunction decodePlainStringVector(\n name: string,\n plainLengthStream: Int32Array | null,\n plainDataStream: Uint8Array | null,\n offsetStream: Int32Array | null,\n nullabilityBuffer: BitVector | null,\n): Vector | null {\n if (!plainLengthStream || !plainDataStream) {\n return null;\n }\n\n if (offsetStream) {\n return nullabilityBuffer\n ? new StringDictionaryVector(name, offsetStream, plainLengthStream, plainDataStream, nullabilityBuffer)\n : new StringDictionaryVector(name, offsetStream, plainLengthStream, plainDataStream);\n }\n\n if (nullabilityBuffer && nullabilityBuffer.size() !== plainLengthStream.length - 1) {\n const sparseOffsetStream = new Int32Array(nullabilityBuffer.size());\n let valueIndex = 0;\n for (let i = 0; i < nullabilityBuffer.size(); i++) {\n if (nullabilityBuffer.get(i)) {\n sparseOffsetStream[i] = valueIndex++;\n } else {\n sparseOffsetStream[i] = 0;\n }\n }\n return new StringDictionaryVector(\n name,\n sparseOffsetStream,\n plainLengthStream,\n plainDataStream,\n nullabilityBuffer,\n );\n }\n\n return nullabilityBuffer\n ? new StringFlatVector(name, plainLengthStream, plainDataStream, nullabilityBuffer)\n : new StringFlatVector(name, plainLengthStream, plainDataStream);\n}\n\nexport function decodeSharedDictionary(\n data: Uint8Array,\n offset: IntWrapper,\n column: Column,\n numFeatures: number,\n propertyColumnNames?: Set<string>,\n): Vector[] {\n let dictionaryOffsetBuffer: Int32Array = null;\n let dictionaryBuffer: Uint8Array = null;\n let symbolOffsetBuffer: Int32Array = null;\n let symbolTableBuffer: Uint8Array = null;\n\n let dictionaryStreamDecoded = false;\n while (!dictionaryStreamDecoded) {\n const streamMetadata = decodeStreamMetadata(data, offset);\n switch (streamMetadata.physicalStreamType) {\n case PhysicalStreamType.LENGTH:\n if (LengthType.DICTIONARY === streamMetadata.logicalStreamType.lengthType) {\n dictionaryOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);\n } else {\n symbolOffsetBuffer = decodeLengthStreamToOffsetBuffer(data, offset, streamMetadata);\n }\n break;\n case PhysicalStreamType.DATA:\n if (\n DictionaryType.SINGLE === streamMetadata.logicalStreamType.dictionaryType ||\n DictionaryType.SHARED === streamMetadata.logicalStreamType.dictionaryType\n ) {\n dictionaryBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);\n dictionaryStreamDecoded = true;\n } else {\n symbolTableBuffer = data.subarray(offset.get(), offset.get() + streamMetadata.byteLength);\n }\n offset.add(streamMetadata.byteLength);\n break;\n }\n }\n\n const childFields = column.complexType.children;\n const stringDictionaryVectors = [];\n let i = 0;\n for (const childField of childFields) {\n const numStreams = decodeVarintInt32(data, offset, 1)[0];\n if (numStreams == 0) {\n /* Column is not present in the tile */\n continue;\n }\n\n const columnName = `${column.name}${\n childField.name === ROOT_COLUMN_NAME ? \"\" : NESTED_COLUMN_SEPARATOR + childField.name\n }`;\n if (propertyColumnNames) {\n if (!propertyColumnNames.has(columnName)) {\n //TODO: add size of sub column to Mlt for faster skipping\n skipColumn(numStreams, data, offset);\n continue;\n }\n }\n\n if (\n numStreams !== 2 ||\n childField.type !== \"scalarField\" ||\n childField.scalarField.physicalType !== ScalarType.STRING\n ) {\n throw new Error(\"Currently only optional string fields are implemented for a struct.\");\n }\n\n const presentStreamMetadata = decodeStreamMetadata(data, offset);\n const presentStream = decodeBooleanRle(data, presentStreamMetadata.numValues, offset);\n const offsetStreamMetadata = decodeStreamMetadata(data, offset);\n const offsetCount = offsetStreamMetadata.decompressedCount;\n const isNullable = offsetCount !== numFeatures;\n const offsetStream = isNullable\n ? decodeNullableIntStream(\n data,\n offset,\n offsetStreamMetadata,\n false,\n new BitVector(presentStream, presentStreamMetadata.numValues),\n )\n : decodeIntStream(data, offset, offsetStreamMetadata, false);\n\n stringDictionaryVectors[i++] = symbolTableBuffer\n ? new StringFsstDictionaryVector(\n columnName,\n offsetStream,\n dictionaryOffsetBuffer,\n dictionaryBuffer,\n symbolOffsetBuffer,\n symbolTableBuffer,\n new BitVector(presentStream, presentStreamMetadata.numValues),\n )\n : new StringDictionaryVector(\n columnName,\n offsetStream,\n dictionaryOffsetBuffer,\n dictionaryBuffer,\n new BitVector(presentStream, presentStreamMetadata.numValues),\n );\n }\n\n return stringDictionaryVectors;\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
2
2
|
import * as IntegerStreamDecoder from "./integerStreamDecoder";
|
|
3
|
-
import
|
|
3
|
+
import * as StreamMetadataDecoder from "../metadata/tile/streamMetadataDecoder";
|
|
4
4
|
import { LengthType } from "../metadata/tile/lengthType";
|
|
5
5
|
import { PhysicalStreamType } from "../metadata/tile/physicalStreamType";
|
|
6
6
|
import { DictionaryType } from "../metadata/tile/dictionaryType";
|
|
7
7
|
import { ScalarType } from "../metadata/tile/scalarType";
|
|
8
|
-
import
|
|
8
|
+
import * as StringDecoder from "./stringDecoder";
|
|
9
9
|
import * as integerDecoder from "./integerDecodingUtils";
|
|
10
10
|
function createMockStreamMetadata(physicalStreamType, logicalStreamType, byteLength) {
|
|
11
11
|
return {
|
|
@@ -49,7 +49,7 @@ function setupOffsetMock(initialValue = 0) {
|
|
|
49
49
|
*/
|
|
50
50
|
function setupStreamMetadataDecodeMock(metadata) {
|
|
51
51
|
let callCount = 0;
|
|
52
|
-
vi.spyOn(StreamMetadataDecoder, "
|
|
52
|
+
vi.spyOn(StreamMetadataDecoder, "decodeStreamMetadata").mockImplementation(() => {
|
|
53
53
|
const result = metadata[callCount % metadata.length];
|
|
54
54
|
callCount++;
|
|
55
55
|
return result;
|
|
@@ -71,15 +71,15 @@ function setupVarintDecodeMock(value = 0) {
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
describe("decodePlainStringVector", () => {
|
|
74
|
-
it("should return null when plainLengthStream is null", () => {
|
|
74
|
+
it.skip("should return null when plainLengthStream is null", () => {
|
|
75
75
|
const result = StringDecoder.decodePlainStringVector("test", null, new Uint8Array([1, 2, 3]), null, null);
|
|
76
76
|
expect(result).toBeNull();
|
|
77
77
|
});
|
|
78
|
-
it("should return null when plainDataStream is null", () => {
|
|
78
|
+
it.skip("should return null when plainDataStream is null", () => {
|
|
79
79
|
const result = StringDecoder.decodePlainStringVector("test", new Int32Array([0, 3]), null, null, null);
|
|
80
80
|
expect(result).toBeNull();
|
|
81
81
|
});
|
|
82
|
-
it("should return StringDictionaryVector when offsetStream exists (non-nullable)", () => {
|
|
82
|
+
it.skip("should return StringDictionaryVector when offsetStream exists (non-nullable)", () => {
|
|
83
83
|
const plainLengthStream = new Int32Array([0, 3, 7]);
|
|
84
84
|
const plainDataStream = new Uint8Array([97, 98, 99, 100, 101, 102, 103]);
|
|
85
85
|
const offsetStream = new Int32Array([0, 1]);
|
|
@@ -87,7 +87,7 @@ describe("decodePlainStringVector", () => {
|
|
|
87
87
|
expect(result).toBeDefined();
|
|
88
88
|
expect(result.name).toBe("test");
|
|
89
89
|
});
|
|
90
|
-
it("should return StringDictionaryVector when offsetStream exists (nullable)", () => {
|
|
90
|
+
it.skip("should return StringDictionaryVector when offsetStream exists (nullable)", () => {
|
|
91
91
|
const plainLengthStream = new Int32Array([0, 3, 7]);
|
|
92
92
|
const plainDataStream = new Uint8Array([97, 98, 99, 100, 101, 102, 103]);
|
|
93
93
|
const offsetStream = new Int32Array([0, 1]);
|
|
@@ -96,7 +96,7 @@ describe("decodePlainStringVector", () => {
|
|
|
96
96
|
expect(result).toBeDefined();
|
|
97
97
|
expect(result.name).toBe("test");
|
|
98
98
|
});
|
|
99
|
-
it("should return StringDictionaryVector with sparse offset when nullability mismatch", () => {
|
|
99
|
+
it.skip("should return StringDictionaryVector with sparse offset when nullability mismatch", () => {
|
|
100
100
|
const plainLengthStream = new Int32Array([0, 3, 7]);
|
|
101
101
|
const plainDataStream = new Uint8Array([97, 98, 99, 100, 101, 102, 103]);
|
|
102
102
|
const nullabilityBuffer = {
|
|
@@ -107,7 +107,7 @@ describe("decodePlainStringVector", () => {
|
|
|
107
107
|
expect(result).toBeDefined();
|
|
108
108
|
expect(result.name).toBe("test");
|
|
109
109
|
});
|
|
110
|
-
it("should return StringFlatVector (non-nullable)", () => {
|
|
110
|
+
it.skip("should return StringFlatVector (non-nullable)", () => {
|
|
111
111
|
const plainLengthStream = new Int32Array([0, 3, 7]);
|
|
112
112
|
const plainDataStream = new Uint8Array([97, 98, 99, 100, 101, 102, 103]);
|
|
113
113
|
const result = StringDecoder.decodePlainStringVector("test", plainLengthStream, plainDataStream, null, null);
|
|
@@ -138,7 +138,7 @@ describe("decodeSharedDictionary", () => {
|
|
|
138
138
|
setupLengthStreamDecodeMock(expectedOffsetBuffer, streamMetadata);
|
|
139
139
|
setupVarintDecodeMock(0);
|
|
140
140
|
const result = StringDecoder.decodeSharedDictionary(mockData, mockOffset, mockColumn, numFeatures);
|
|
141
|
-
expect(StreamMetadataDecoder.
|
|
141
|
+
expect(StreamMetadataDecoder.decodeStreamMetadata).toHaveBeenCalledWith(mockData, mockOffset);
|
|
142
142
|
expect(IntegerStreamDecoder.decodeLengthStreamToOffsetBuffer).toHaveBeenCalled();
|
|
143
143
|
expect(result).toBeDefined();
|
|
144
144
|
expect(Array.isArray(result)).toBe(true);
|