@maplibre/mlt 1.1.5 → 1.1.7
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/bigEndianDecode.d.ts +13 -0
- package/dist/decoding/bigEndianDecode.js +50 -0
- package/dist/decoding/bigEndianDecode.js.map +1 -0
- package/dist/decoding/decodingTestUtils.d.ts +1 -1
- package/dist/decoding/decodingTestUtils.js.map +1 -1
- package/dist/decoding/decodingUtils.js +4 -2
- package/dist/decoding/decodingUtils.js.map +1 -1
- package/dist/decoding/fastPforDecoder.d.ts +48 -0
- package/dist/decoding/fastPforDecoder.js +482 -0
- package/dist/decoding/fastPforDecoder.js.map +1 -0
- package/dist/decoding/fastPforShared.d.ts +9 -0
- package/dist/decoding/fastPforShared.js +29 -0
- package/dist/decoding/fastPforShared.js.map +1 -0
- package/dist/decoding/fastPforUnpack.d.ts +23 -0
- package/dist/decoding/fastPforUnpack.js +910 -0
- package/dist/decoding/fastPforUnpack.js.map +1 -0
- package/dist/decoding/geometryDecoder.d.ts +2 -2
- package/dist/decoding/geometryDecoder.js +11 -8
- package/dist/decoding/geometryDecoder.js.map +1 -1
- package/dist/decoding/integerDecodingUtils.d.ts +14 -10
- package/dist/decoding/integerDecodingUtils.js +44 -22
- package/dist/decoding/integerDecodingUtils.js.map +1 -1
- package/dist/decoding/integerStreamDecoder.d.ts +1 -1
- package/dist/decoding/integerStreamDecoder.js +13 -6
- package/dist/decoding/integerStreamDecoder.js.map +1 -1
- package/dist/decoding/propertyDecoder.js +10 -14
- package/dist/decoding/propertyDecoder.js.map +1 -1
- package/dist/decoding/stringDecoder.js +2 -11
- package/dist/decoding/stringDecoder.js.map +1 -1
- package/dist/encoding/bigEndianEncode.d.ts +7 -0
- package/dist/encoding/bigEndianEncode.js +16 -0
- package/dist/encoding/bigEndianEncode.js.map +1 -0
- package/dist/encoding/constGeometryVectorEncoder.d.ts +19 -0
- package/dist/encoding/constGeometryVectorEncoder.js +248 -0
- package/dist/encoding/constGeometryVectorEncoder.js.map +1 -0
- package/dist/encoding/encodingUtils.d.ts +1 -1
- package/dist/encoding/encodingUtils.js +2 -2
- package/dist/encoding/encodingUtils.js.map +1 -1
- package/dist/encoding/fastPforEncoder.d.ts +19 -0
- package/dist/encoding/fastPforEncoder.js +310 -0
- package/dist/encoding/fastPforEncoder.js.map +1 -0
- package/dist/encoding/integerEncodingUtils.d.ts +7 -7
- package/dist/encoding/integerEncodingUtils.js +25 -17
- package/dist/encoding/integerEncodingUtils.js.map +1 -1
- package/dist/encoding/integerStreamEncoder.d.ts +1 -1
- package/dist/encoding/integerStreamEncoder.js +5 -5
- package/dist/encoding/integerStreamEncoder.js.map +1 -1
- package/dist/encoding/packNullableUtils.d.ts +1 -1
- package/dist/encoding/packNullableUtils.js.map +1 -1
- package/dist/encoding/propertyEncoder.d.ts +1 -1
- package/dist/encoding/propertyEncoder.js +8 -8
- package/dist/encoding/propertyEncoder.js.map +1 -1
- package/dist/encoding/stringEncoder.js +3 -3
- package/dist/encoding/stringEncoder.js.map +1 -1
- package/dist/encoding/zOrderCurveEncoder.js +1 -1
- package/dist/encoding/zOrderCurveEncoder.js.map +1 -1
- package/dist/metadata/tile/logicalStreamType.d.ts +3 -3
- package/dist/metadata/tile/logicalStreamType.js.map +1 -1
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.d.ts +1 -1
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.js.map +1 -1
- package/dist/metadata/tileset/typeMap.d.ts +10 -2
- package/dist/metadata/tileset/typeMap.js +25 -15
- package/dist/metadata/tileset/typeMap.js.map +1 -1
- package/dist/mltDecoder.js +29 -26
- package/dist/mltDecoder.js.map +1 -1
- package/dist/mltMetadata.js.map +1 -1
- package/dist/vector/constant/intConstVector.d.ts +1 -1
- package/dist/vector/constant/intConstVector.js +1 -1
- package/dist/vector/constant/intConstVector.js.map +1 -1
- package/dist/vector/constant/longConstVector.d.ts +1 -1
- package/dist/vector/constant/longConstVector.js +1 -1
- package/dist/vector/constant/longConstVector.js.map +1 -1
- package/dist/vector/dictionary/stringDictionaryVector.d.ts +0 -1
- package/dist/vector/dictionary/stringDictionaryVector.js +0 -2
- package/dist/vector/dictionary/stringDictionaryVector.js.map +1 -1
- package/dist/vector/featureTable.d.ts +4 -5
- package/dist/vector/featureTable.js +2 -29
- package/dist/vector/featureTable.js.map +1 -1
- package/dist/vector/filter/flatSelectionVector.d.ts +1 -1
- package/dist/vector/filter/flatSelectionVector.js.map +1 -1
- package/dist/vector/filter/selectionVectorUtils.d.ts +1 -1
- package/dist/vector/filter/selectionVectorUtils.js.map +1 -1
- package/dist/vector/filter/sequenceSelectionVector.d.ts +1 -1
- package/dist/vector/filter/sequenceSelectionVector.js.map +1 -1
- package/dist/vector/flat/stringFlatVector.d.ts +0 -1
- package/dist/vector/flat/stringFlatVector.js +0 -2
- package/dist/vector/flat/stringFlatVector.js.map +1 -1
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.d.ts +0 -2
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.js +0 -36
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.js.map +1 -1
- package/dist/vector/geometry/constGeometryVector.d.ts +2 -2
- package/dist/vector/geometry/constGeometryVector.js +1 -1
- package/dist/vector/geometry/constGeometryVector.js.map +1 -1
- package/dist/vector/geometry/constGpuVector.d.ts +2 -2
- package/dist/vector/geometry/constGpuVector.js +1 -1
- package/dist/vector/geometry/constGpuVector.js.map +1 -1
- package/dist/vector/geometry/flatGeometryVector.d.ts +1 -1
- package/dist/vector/geometry/flatGeometryVector.js.map +1 -1
- package/dist/vector/geometry/flatGpuVector.d.ts +1 -1
- package/dist/vector/geometry/flatGpuVector.js.map +1 -1
- package/dist/vector/geometry/geometryType.js.map +1 -1
- package/dist/vector/geometry/geometryVector.d.ts +4 -5
- package/dist/vector/geometry/geometryVector.js +0 -8
- package/dist/vector/geometry/geometryVector.js.map +1 -1
- package/dist/vector/geometry/geometryVectorConverter.d.ts +1 -1
- package/dist/vector/geometry/geometryVectorConverter.js +167 -211
- package/dist/vector/geometry/geometryVectorConverter.js.map +1 -1
- package/dist/vector/geometry/gpuVector.d.ts +2 -2
- package/dist/vector/geometry/gpuVector.js.map +1 -1
- package/dist/vector/geometry/topologyVector.d.ts +5 -9
- package/dist/vector/geometry/topologyVector.js +1 -19
- package/dist/vector/geometry/topologyVector.js.map +1 -1
- package/dist/vector/geometry/vertexBufferType.js.map +1 -1
- package/dist/vector/intVector.d.ts +7 -7
- package/dist/vector/intVector.js.map +1 -1
- package/dist/vector/vector.js +1 -1
- package/dist/vector/vector.js.map +1 -1
- package/dist/vector/vectorType.js.map +1 -1
- package/package.json +9 -10
- package/dist/decoding/decodingUtils.spec.d.ts +0 -1
- package/dist/decoding/decodingUtils.spec.js +0 -141
- package/dist/decoding/decodingUtils.spec.js.map +0 -1
- package/dist/decoding/fsstDecoder.spec.d.ts +0 -1
- package/dist/decoding/fsstDecoder.spec.js +0 -57
- package/dist/decoding/fsstDecoder.spec.js.map +0 -1
- package/dist/decoding/integerDecodingUtils.spec.d.ts +0 -1
- package/dist/decoding/integerDecodingUtils.spec.js +0 -300
- package/dist/decoding/integerDecodingUtils.spec.js.map +0 -1
- package/dist/decoding/integerStreamDecoder.spec.d.ts +0 -1
- package/dist/decoding/integerStreamDecoder.spec.js +0 -402
- package/dist/decoding/integerStreamDecoder.spec.js.map +0 -1
- package/dist/decoding/propertyDecoder.spec.d.ts +0 -1
- package/dist/decoding/propertyDecoder.spec.js +0 -448
- package/dist/decoding/propertyDecoder.spec.js.map +0 -1
- package/dist/decoding/stringDecoder.spec.d.ts +0 -1
- package/dist/decoding/stringDecoder.spec.js +0 -387
- package/dist/decoding/stringDecoder.spec.js.map +0 -1
- package/dist/decoding/unpackNullableUtils.spec.d.ts +0 -1
- package/dist/decoding/unpackNullableUtils.spec.js +0 -71
- package/dist/decoding/unpackNullableUtils.spec.js.map +0 -1
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.d.ts +0 -1
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.js +0 -142
- package/dist/metadata/tileset/embeddedTilesetMetadataDecoder.spec.js.map +0 -1
- package/dist/mltDecoder.spec.d.ts +0 -1
- package/dist/mltDecoder.spec.js +0 -152
- package/dist/mltDecoder.spec.js.map +0 -1
- package/dist/vector/filter/flatSelectionVector.spec.d.ts +0 -1
- package/dist/vector/filter/flatSelectionVector.spec.js +0 -51
- package/dist/vector/filter/flatSelectionVector.spec.js.map +0 -1
- package/dist/vector/filter/selectionVectorUtil.spec.d.ts +0 -1
- package/dist/vector/filter/selectionVectorUtil.spec.js +0 -154
- package/dist/vector/filter/selectionVectorUtil.spec.js.map +0 -1
- package/dist/vector/filter/sequenceSelectionVector.spec.d.ts +0 -1
- package/dist/vector/filter/sequenceSelectionVector.spec.js +0 -115
- package/dist/vector/filter/sequenceSelectionVector.spec.js.map +0 -1
- package/dist/vector/flat/floatFlatVector.spec.d.ts +0 -1
- package/dist/vector/flat/floatFlatVector.spec.js +0 -14
- package/dist/vector/flat/floatFlatVector.spec.js.map +0 -1
- package/dist/vector/flat/intFlatVector.spec.d.ts +0 -1
- package/dist/vector/flat/intFlatVector.spec.js +0 -15
- package/dist/vector/flat/intFlatVector.spec.js.map +0 -1
- package/dist/vector/flat/longFlatVector.spec.d.ts +0 -1
- package/dist/vector/flat/longFlatVector.spec.js +0 -14
- package/dist/vector/flat/longFlatVector.spec.js.map +0 -1
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.d.ts +0 -1
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js +0 -28
- package/dist/vector/fsst-dictionary/stringFsstDictionaryVector.spec.js.map +0 -1
- package/dist/vector/geometry/zOrderCurve.spec.d.ts +0 -1
- package/dist/vector/geometry/zOrderCurve.spec.js +0 -25
- package/dist/vector/geometry/zOrderCurve.spec.js.map +0 -1
- package/dist/vector/sequence/longSequenceVektor.spec.d.ts +0 -1
- package/dist/vector/sequence/longSequenceVektor.spec.js +0 -11
- package/dist/vector/sequence/longSequenceVektor.spec.js.map +0 -1
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { decodeField, decodeEmbeddedTileSetMetadata } from "./embeddedTilesetMetadataDecoder";
|
|
3
|
-
import IntWrapper from "../../decoding/intWrapper";
|
|
4
|
-
import { concatenateBuffers } from "../../decoding/decodingTestUtils";
|
|
5
|
-
import { ComplexType, ScalarType } from "./tilesetMetadata";
|
|
6
|
-
import { encodeChildCount, encodeFieldName, encodeTypeCode, scalarTypeCode, } from "../../encoding/embeddedTilesetMetadataEncoder";
|
|
7
|
-
const STRUCT_TYPE_CODE = 30;
|
|
8
|
-
describe("embeddedTilesetMetadataDecoder", () => {
|
|
9
|
-
describe("decodeField", () => {
|
|
10
|
-
describe("scalar fields", () => {
|
|
11
|
-
it("should decode non-nullable STRING field", () => {
|
|
12
|
-
const buffer = concatenateBuffers(encodeTypeCode(scalarTypeCode(ScalarType.STRING, false)), encodeFieldName("street"));
|
|
13
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
14
|
-
expect(field.name).toBe("street");
|
|
15
|
-
expect(field.nullable).toBe(false);
|
|
16
|
-
expect(field.type).toBe("scalarField");
|
|
17
|
-
expect(field.scalarField?.physicalType).toBe(ScalarType.STRING);
|
|
18
|
-
});
|
|
19
|
-
it("should decode nullable UINT_64 field", () => {
|
|
20
|
-
const buffer = concatenateBuffers(encodeTypeCode(scalarTypeCode(ScalarType.UINT_64, true)), encodeFieldName("population"));
|
|
21
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
22
|
-
expect(field.name).toBe("population");
|
|
23
|
-
expect(field.nullable).toBe(true);
|
|
24
|
-
expect(field.type).toBe("scalarField");
|
|
25
|
-
expect(field.scalarField?.physicalType).toBe(ScalarType.UINT_64);
|
|
26
|
-
});
|
|
27
|
-
it("should decode BOOLEAN field", () => {
|
|
28
|
-
const buffer = concatenateBuffers(encodeTypeCode(scalarTypeCode(ScalarType.BOOLEAN, false)), encodeFieldName("isActive"));
|
|
29
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
30
|
-
expect(field.name).toBe("isActive");
|
|
31
|
-
expect(field.nullable).toBe(false);
|
|
32
|
-
expect(field.type).toBe("scalarField");
|
|
33
|
-
expect(field.scalarField?.physicalType).toBe(ScalarType.BOOLEAN);
|
|
34
|
-
});
|
|
35
|
-
it("should decode non-nullable UINT_32 field", () => {
|
|
36
|
-
const buffer = concatenateBuffers(encodeTypeCode(scalarTypeCode(ScalarType.UINT_32, false)), encodeFieldName("count"));
|
|
37
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
38
|
-
expect(field.name).toBe("count");
|
|
39
|
-
expect(field.nullable).toBe(false);
|
|
40
|
-
expect(field.type).toBe("scalarField");
|
|
41
|
-
expect(field.scalarField?.physicalType).toBe(ScalarType.UINT_32);
|
|
42
|
-
});
|
|
43
|
-
it("should decode nullable FLOAT field", () => {
|
|
44
|
-
const buffer = concatenateBuffers(encodeTypeCode(scalarTypeCode(ScalarType.FLOAT, true)), encodeFieldName("temperature"));
|
|
45
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
46
|
-
expect(field.name).toBe("temperature");
|
|
47
|
-
expect(field.nullable).toBe(true);
|
|
48
|
-
expect(field.type).toBe("scalarField");
|
|
49
|
-
expect(field.scalarField?.physicalType).toBe(ScalarType.FLOAT);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe("complex fields", () => {
|
|
53
|
-
it("should decode STRUCT field with nested children", () => {
|
|
54
|
-
const children = [
|
|
55
|
-
{
|
|
56
|
-
typeCode: scalarTypeCode(ScalarType.STRING, false),
|
|
57
|
-
name: "street",
|
|
58
|
-
nullable: false,
|
|
59
|
-
physicalType: ScalarType.STRING,
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
typeCode: scalarTypeCode(ScalarType.UINT_32, true),
|
|
63
|
-
name: "zipcode",
|
|
64
|
-
nullable: true,
|
|
65
|
-
physicalType: ScalarType.UINT_32,
|
|
66
|
-
},
|
|
67
|
-
];
|
|
68
|
-
const buffer = concatenateBuffers(encodeTypeCode(STRUCT_TYPE_CODE), encodeFieldName("address"), encodeChildCount(children.length), ...children.flatMap((c) => [encodeTypeCode(c.typeCode), encodeFieldName(c.name)]));
|
|
69
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
70
|
-
expect(field.name).toBe("address");
|
|
71
|
-
expect(field.nullable).toBe(false);
|
|
72
|
-
expect(field.type).toBe("complexField");
|
|
73
|
-
expect(field.complexField?.physicalType).toBe(ComplexType.STRUCT);
|
|
74
|
-
expect(field.complexField?.children).toHaveLength(children.length);
|
|
75
|
-
for (let i = 0; i < children.length; i++) {
|
|
76
|
-
const child = children[i];
|
|
77
|
-
expect(field.complexField?.children[i].name).toBe(child.name);
|
|
78
|
-
expect(field.complexField?.children[i].nullable).toBe(child.nullable);
|
|
79
|
-
expect(field.complexField?.children[i].scalarField?.physicalType).toBe(child.physicalType);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe("deeply nested structures", () => {
|
|
84
|
-
it("should decode 3-level nested STRUCT", () => {
|
|
85
|
-
const leafChildren = [
|
|
86
|
-
{ typeCode: scalarTypeCode(ScalarType.FLOAT, false), name: "lat" },
|
|
87
|
-
{ typeCode: scalarTypeCode(ScalarType.FLOAT, false), name: "lon" },
|
|
88
|
-
];
|
|
89
|
-
const buffer = concatenateBuffers(
|
|
90
|
-
// Parent STRUCT "location"
|
|
91
|
-
encodeTypeCode(STRUCT_TYPE_CODE), encodeFieldName("location"), encodeChildCount(1),
|
|
92
|
-
// Child STRUCT "address"
|
|
93
|
-
encodeTypeCode(STRUCT_TYPE_CODE), encodeFieldName("address"), encodeChildCount(1),
|
|
94
|
-
// Grandchild STRUCT "coordinates"
|
|
95
|
-
encodeTypeCode(STRUCT_TYPE_CODE), encodeFieldName("coordinates"), encodeChildCount(leafChildren.length),
|
|
96
|
-
// Great-grandchildren
|
|
97
|
-
...leafChildren.flatMap((c) => [encodeTypeCode(c.typeCode), encodeFieldName(c.name)]));
|
|
98
|
-
const field = decodeField(buffer, new IntWrapper(0));
|
|
99
|
-
expect(field.name).toBe("location");
|
|
100
|
-
expect(field.type).toBe("complexField");
|
|
101
|
-
expect(field.complexField?.physicalType).toBe(ComplexType.STRUCT);
|
|
102
|
-
const address = field.complexField?.children[0];
|
|
103
|
-
expect(address?.name).toBe("address");
|
|
104
|
-
expect(address?.type).toBe("complexField");
|
|
105
|
-
const coordinates = address?.complexField?.children[0];
|
|
106
|
-
expect(coordinates?.name).toBe("coordinates");
|
|
107
|
-
expect(coordinates?.complexField?.children).toHaveLength(leafChildren.length);
|
|
108
|
-
for (let i = 0; i < leafChildren.length; i++) {
|
|
109
|
-
const child = leafChildren[i];
|
|
110
|
-
expect(coordinates?.complexField?.children[i].name).toBe(child.name);
|
|
111
|
-
expect(coordinates?.complexField?.children[i].scalarField?.physicalType).toBe(ScalarType.FLOAT);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
describe("offset tracking", () => {
|
|
116
|
-
it("should correctly advance offset", () => {
|
|
117
|
-
const buffer = concatenateBuffers(encodeTypeCode(scalarTypeCode(ScalarType.STRING, false)), encodeFieldName("test"));
|
|
118
|
-
const offset = new IntWrapper(0);
|
|
119
|
-
decodeField(buffer, offset);
|
|
120
|
-
expect(offset.get()).toBe(buffer.length);
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
describe("error handling", () => {
|
|
124
|
-
it("should throw error for unsupported typeCode", () => {
|
|
125
|
-
const buffer = encodeTypeCode(999);
|
|
126
|
-
expect(() => {
|
|
127
|
-
decodeField(buffer, new IntWrapper(0));
|
|
128
|
-
}).toThrow("Unsupported field type code 999. Supported: 10-29(scalars), 30(STRUCT)");
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
describe("decodeEmbeddedTileSetMetadata", () => {
|
|
133
|
-
it("should decode tileset with STRUCT column", () => {
|
|
134
|
-
const buffer = concatenateBuffers(encodeFieldName(""), encodeTypeCode(4096), encodeChildCount(1), encodeTypeCode(STRUCT_TYPE_CODE), encodeFieldName("props"), encodeChildCount(1), encodeTypeCode(scalarTypeCode(ScalarType.STRING, false)), encodeFieldName("name"));
|
|
135
|
-
const [metadata, extent] = decodeEmbeddedTileSetMetadata(buffer, new IntWrapper(0));
|
|
136
|
-
expect(extent).toBe(4096);
|
|
137
|
-
expect(metadata.featureTables[0].name).toBe("");
|
|
138
|
-
expect(metadata.featureTables[0].columns[0].complexType.children).toHaveLength(1);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
//# sourceMappingURL=embeddedTilesetMetadataDecoder.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embeddedTilesetMetadataDecoder.spec.js","sourceRoot":"","sources":["../../../src/metadata/tileset/embeddedTilesetMetadataDecoder.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { decodeField, decodeEmbeddedTileSetMetadata } from \"./embeddedTilesetMetadataDecoder\";\nimport IntWrapper from \"../../decoding/intWrapper\";\nimport { concatenateBuffers } from \"../../decoding/decodingTestUtils\";\nimport { ComplexType, ScalarType } from \"./tilesetMetadata\";\nimport {\n encodeChildCount,\n encodeFieldName,\n encodeTypeCode,\n scalarTypeCode,\n} from \"../../encoding/embeddedTilesetMetadataEncoder\";\n\nconst STRUCT_TYPE_CODE = 30;\n\ndescribe(\"embeddedTilesetMetadataDecoder\", () => {\n describe(\"decodeField\", () => {\n describe(\"scalar fields\", () => {\n it(\"should decode non-nullable STRING field\", () => {\n const buffer = concatenateBuffers(\n encodeTypeCode(scalarTypeCode(ScalarType.STRING, false)),\n encodeFieldName(\"street\"),\n );\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"street\");\n expect(field.nullable).toBe(false);\n expect(field.type).toBe(\"scalarField\");\n expect(field.scalarField?.physicalType).toBe(ScalarType.STRING);\n });\n\n it(\"should decode nullable UINT_64 field\", () => {\n const buffer = concatenateBuffers(\n encodeTypeCode(scalarTypeCode(ScalarType.UINT_64, true)),\n encodeFieldName(\"population\"),\n );\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"population\");\n expect(field.nullable).toBe(true);\n expect(field.type).toBe(\"scalarField\");\n expect(field.scalarField?.physicalType).toBe(ScalarType.UINT_64);\n });\n\n it(\"should decode BOOLEAN field\", () => {\n const buffer = concatenateBuffers(\n encodeTypeCode(scalarTypeCode(ScalarType.BOOLEAN, false)),\n encodeFieldName(\"isActive\"),\n );\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"isActive\");\n expect(field.nullable).toBe(false);\n expect(field.type).toBe(\"scalarField\");\n expect(field.scalarField?.physicalType).toBe(ScalarType.BOOLEAN);\n });\n\n it(\"should decode non-nullable UINT_32 field\", () => {\n const buffer = concatenateBuffers(\n encodeTypeCode(scalarTypeCode(ScalarType.UINT_32, false)),\n encodeFieldName(\"count\"),\n );\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"count\");\n expect(field.nullable).toBe(false);\n expect(field.type).toBe(\"scalarField\");\n expect(field.scalarField?.physicalType).toBe(ScalarType.UINT_32);\n });\n\n it(\"should decode nullable FLOAT field\", () => {\n const buffer = concatenateBuffers(\n encodeTypeCode(scalarTypeCode(ScalarType.FLOAT, true)),\n encodeFieldName(\"temperature\"),\n );\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"temperature\");\n expect(field.nullable).toBe(true);\n expect(field.type).toBe(\"scalarField\");\n expect(field.scalarField?.physicalType).toBe(ScalarType.FLOAT);\n });\n });\n\n describe(\"complex fields\", () => {\n it(\"should decode STRUCT field with nested children\", () => {\n const children = [\n {\n typeCode: scalarTypeCode(ScalarType.STRING, false),\n name: \"street\",\n nullable: false,\n physicalType: ScalarType.STRING,\n },\n {\n typeCode: scalarTypeCode(ScalarType.UINT_32, true),\n name: \"zipcode\",\n nullable: true,\n physicalType: ScalarType.UINT_32,\n },\n ];\n\n const buffer = concatenateBuffers(\n encodeTypeCode(STRUCT_TYPE_CODE),\n encodeFieldName(\"address\"),\n encodeChildCount(children.length),\n ...children.flatMap((c) => [encodeTypeCode(c.typeCode), encodeFieldName(c.name)]),\n );\n\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"address\");\n expect(field.nullable).toBe(false);\n expect(field.type).toBe(\"complexField\");\n expect(field.complexField?.physicalType).toBe(ComplexType.STRUCT);\n expect(field.complexField?.children).toHaveLength(children.length);\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n\n expect(field.complexField?.children[i].name).toBe(child.name);\n expect(field.complexField?.children[i].nullable).toBe(child.nullable);\n expect(field.complexField?.children[i].scalarField?.physicalType).toBe(child.physicalType);\n }\n });\n });\n\n describe(\"deeply nested structures\", () => {\n it(\"should decode 3-level nested STRUCT\", () => {\n const leafChildren = [\n { typeCode: scalarTypeCode(ScalarType.FLOAT, false), name: \"lat\" },\n { typeCode: scalarTypeCode(ScalarType.FLOAT, false), name: \"lon\" },\n ];\n\n const buffer = concatenateBuffers(\n // Parent STRUCT \"location\"\n encodeTypeCode(STRUCT_TYPE_CODE),\n encodeFieldName(\"location\"),\n encodeChildCount(1),\n // Child STRUCT \"address\"\n encodeTypeCode(STRUCT_TYPE_CODE),\n encodeFieldName(\"address\"),\n encodeChildCount(1),\n // Grandchild STRUCT \"coordinates\"\n encodeTypeCode(STRUCT_TYPE_CODE),\n encodeFieldName(\"coordinates\"),\n encodeChildCount(leafChildren.length),\n // Great-grandchildren\n ...leafChildren.flatMap((c) => [encodeTypeCode(c.typeCode), encodeFieldName(c.name)]),\n );\n\n const field = decodeField(buffer, new IntWrapper(0));\n\n expect(field.name).toBe(\"location\");\n expect(field.type).toBe(\"complexField\");\n expect(field.complexField?.physicalType).toBe(ComplexType.STRUCT);\n\n const address = field.complexField?.children[0];\n expect(address?.name).toBe(\"address\");\n expect(address?.type).toBe(\"complexField\");\n\n const coordinates = address?.complexField?.children[0];\n expect(coordinates?.name).toBe(\"coordinates\");\n expect(coordinates?.complexField?.children).toHaveLength(leafChildren.length);\n\n for (let i = 0; i < leafChildren.length; i++) {\n const child = leafChildren[i];\n\n expect(coordinates?.complexField?.children[i].name).toBe(child.name);\n expect(coordinates?.complexField?.children[i].scalarField?.physicalType).toBe(ScalarType.FLOAT);\n }\n });\n });\n\n describe(\"offset tracking\", () => {\n it(\"should correctly advance offset\", () => {\n const buffer = concatenateBuffers(\n encodeTypeCode(scalarTypeCode(ScalarType.STRING, false)),\n encodeFieldName(\"test\"),\n );\n const offset = new IntWrapper(0);\n\n decodeField(buffer, offset);\n\n expect(offset.get()).toBe(buffer.length);\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw error for unsupported typeCode\", () => {\n const buffer = encodeTypeCode(999);\n\n expect(() => {\n decodeField(buffer, new IntWrapper(0));\n }).toThrow(\"Unsupported field type code 999. Supported: 10-29(scalars), 30(STRUCT)\");\n });\n });\n\n });\n\n describe(\"decodeEmbeddedTileSetMetadata\", () => {\n it(\"should decode tileset with STRUCT column\", () => {\n const buffer = concatenateBuffers(\n encodeFieldName(\"\"),\n encodeTypeCode(4096),\n encodeChildCount(1),\n encodeTypeCode(STRUCT_TYPE_CODE),\n encodeFieldName(\"props\"),\n encodeChildCount(1),\n encodeTypeCode(scalarTypeCode(ScalarType.STRING, false)),\n encodeFieldName(\"name\"),\n );\n\n const [metadata, extent] = decodeEmbeddedTileSetMetadata(buffer, new IntWrapper(0));\n\n expect(extent).toBe(4096);\n expect(metadata.featureTables[0].name).toBe(\"\");\n expect(metadata.featureTables[0].columns[0].complexType.children).toHaveLength(1);\n });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/mltDecoder.spec.js
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { expect, describe, it } from "vitest";
|
|
2
|
-
import { readdirSync, readFileSync } from "fs";
|
|
3
|
-
import { parse, join } from "path";
|
|
4
|
-
import { VectorTile } from "@mapbox/vector-tile";
|
|
5
|
-
import Pbf from "pbf";
|
|
6
|
-
import { decodeTile } from ".";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import fs from "node:fs";
|
|
9
|
-
const ITERATOR_TILE = path.resolve(__dirname, "../../test/expected/tag0x01/simple/multiline-boolean.mlt");
|
|
10
|
-
describe("MLT Decoder - MVT comparison for SIMPLE tiles", () => {
|
|
11
|
-
const simpleMltTileDir = "../test/expected/tag0x01/simple";
|
|
12
|
-
const simpleMvtTileDir = "../test/fixtures/simple";
|
|
13
|
-
testTiles(simpleMltTileDir, simpleMvtTileDir);
|
|
14
|
-
});
|
|
15
|
-
describe("MLT Decoder - MVT comparison for Amazon tiles", () => {
|
|
16
|
-
const amazonMltTileDir = "../test/expected/tag0x01/amazon";
|
|
17
|
-
const amazonMvtTileDir = "../test/fixtures/amazon";
|
|
18
|
-
testTiles(amazonMltTileDir, amazonMvtTileDir);
|
|
19
|
-
});
|
|
20
|
-
describe("MLT Decoder - MVT comparison for OMT tiles", () => {
|
|
21
|
-
const omtMltTileDir = "../test/expected/tag0x01/omt";
|
|
22
|
-
const omtMvtTileDir = "../test/fixtures/omt";
|
|
23
|
-
testTiles(omtMltTileDir, omtMvtTileDir);
|
|
24
|
-
}, 150000);
|
|
25
|
-
describe("FeatureTable", () => {
|
|
26
|
-
it("should iterate through features correctly", () => {
|
|
27
|
-
const bytes = new Uint8Array(fs.readFileSync(ITERATOR_TILE));
|
|
28
|
-
const featureTables = decodeTile(bytes);
|
|
29
|
-
const table = featureTables[0];
|
|
30
|
-
expect(table.name).toBe("layer");
|
|
31
|
-
expect(table.extent).toBe(4096);
|
|
32
|
-
let featureCount = 0;
|
|
33
|
-
for (const feature of table) {
|
|
34
|
-
expect(feature.geometry).toBeTruthy();
|
|
35
|
-
expect(feature.geometry.coordinates).toBeInstanceOf(Array);
|
|
36
|
-
expect(feature.geometry.coordinates.length).toBeGreaterThan(0);
|
|
37
|
-
expect(typeof feature.geometry.type).toBe("number");
|
|
38
|
-
featureCount++;
|
|
39
|
-
}
|
|
40
|
-
expect(featureCount).toBe(table.numFeatures);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
function testTiles(mltSearchDir, mvtSearchDir) {
|
|
44
|
-
const mltFileNames = readdirSync(mltSearchDir)
|
|
45
|
-
.filter((file) => parse(file).ext === ".mlt")
|
|
46
|
-
.map((file) => parse(file).name);
|
|
47
|
-
for (const fileName of mltFileNames) {
|
|
48
|
-
it(`should compare ${fileName} tile`, () => {
|
|
49
|
-
const mltFileName = `${fileName}.mlt`;
|
|
50
|
-
const mltPath = join(mltSearchDir, mltFileName);
|
|
51
|
-
const mvtPath = join(mvtSearchDir, `${fileName}.mvt`);
|
|
52
|
-
const encodedMvt = readFileSync(mvtPath);
|
|
53
|
-
const encodedMlt = readFileSync(mltPath);
|
|
54
|
-
const buf = new Pbf(encodedMvt);
|
|
55
|
-
const decodedMvt = new VectorTile(buf);
|
|
56
|
-
const decodedMlt = decodeTile(encodedMlt, undefined, true);
|
|
57
|
-
comparePlainGeometryEncodedTile(decodedMlt, decodedMvt);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function removeEmptyStrings(mvtProperties) {
|
|
62
|
-
for (const key of Object.keys(mvtProperties)) {
|
|
63
|
-
const value = mvtProperties[key];
|
|
64
|
-
if (typeof value === "string" && !value.length) {
|
|
65
|
-
delete mvtProperties[key];
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function comparePlainGeometryEncodedTile(mlt, mvt) {
|
|
70
|
-
for (const featureTable of mlt) {
|
|
71
|
-
const layer = mvt.layers[featureTable.name];
|
|
72
|
-
// Use getFeatures() instead of iterator (like C++ and Java implementations)
|
|
73
|
-
const mltFeatures = featureTable.getFeatures();
|
|
74
|
-
expect(mltFeatures.length).toBe(layer.length);
|
|
75
|
-
for (let j = 0; j < layer.length; j++) {
|
|
76
|
-
const mvtFeature = layer.feature(j);
|
|
77
|
-
const mltFeature = mltFeatures[j];
|
|
78
|
-
compareId(mltFeature, mvtFeature, true);
|
|
79
|
-
const mltGeometry = mltFeature.geometry?.coordinates;
|
|
80
|
-
const mvtGeometry = mvtFeature.loadGeometry();
|
|
81
|
-
expect(mltGeometry).toEqual(mvtGeometry);
|
|
82
|
-
const mltProperties = mltFeature.properties;
|
|
83
|
-
const mvtProperties = mvtFeature.properties;
|
|
84
|
-
transformPropertyNames(mltProperties);
|
|
85
|
-
transformPropertyNames(mvtProperties);
|
|
86
|
-
convertBigIntPropertyValues(mltProperties);
|
|
87
|
-
//TODO: fix -> since a change in the java converter shared dictionary encoding empty strings are not
|
|
88
|
-
//encoded anymore
|
|
89
|
-
removeEmptyStrings(mvtProperties);
|
|
90
|
-
removeEmptyStrings(mltProperties);
|
|
91
|
-
expect(Object.keys(mltProperties).length).toEqual(Object.keys(mvtProperties).length);
|
|
92
|
-
expect(mltProperties).toEqual(mvtProperties);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
function compareId(mltFeature, mvtFeature, idWithinMaxSafeInteger) {
|
|
97
|
-
if (!mvtFeature.id) {
|
|
98
|
-
/* Java MVT library in the MVT converter decodes zero for undefined ids */
|
|
99
|
-
expect([0, null, 0n]).toContain(mltFeature.id);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const mltFeatureId = mltFeature.id;
|
|
103
|
-
/* For const and sequence vectors the decoder can return bigint compared to the vector-tile-js library */
|
|
104
|
-
const actualId = idWithinMaxSafeInteger && typeof mltFeatureId !== "bigint" ? mltFeatureId : Number(mltFeatureId);
|
|
105
|
-
/*
|
|
106
|
-
* The id check can fail for two known reasons:
|
|
107
|
-
* - The java-vector-tile library used in the Java converter returns negative integers for the
|
|
108
|
-
* unoptimized tileset in some tiles
|
|
109
|
-
* - The vector-tile-js library is using number types for the id so there can only be stored
|
|
110
|
-
* values up to 53 bits without loss of precision
|
|
111
|
-
**/
|
|
112
|
-
if (mltFeatureId < 0 || mltFeatureId > Number.MAX_SAFE_INTEGER) {
|
|
113
|
-
/* Expected to fail in some/most cases */
|
|
114
|
-
try {
|
|
115
|
-
expect(actualId).toEqual(mvtFeature.id);
|
|
116
|
-
}
|
|
117
|
-
catch (e) {
|
|
118
|
-
//console.info("id mismatch", featureTableName, mltFeatureId, mvtFeature.id);
|
|
119
|
-
}
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
expect(actualId).toEqual(mvtFeature.id);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/* Change bigint to number for comparison with MVT */
|
|
126
|
-
function convertBigIntPropertyValues(mltProperties) {
|
|
127
|
-
for (const key of Object.keys(mltProperties)) {
|
|
128
|
-
if (typeof mltProperties[key] === "bigint") {
|
|
129
|
-
mltProperties[key] = Number(mltProperties[key]);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
function transformPropertyNames(properties) {
|
|
134
|
-
const propertyNames = Object.keys(properties);
|
|
135
|
-
for (let k = 0; k < propertyNames.length; k++) {
|
|
136
|
-
const key = propertyNames[k];
|
|
137
|
-
let newKey = key;
|
|
138
|
-
/* rename the property names which are separated with : in mlt to match _ in omt mvts */
|
|
139
|
-
if (key.startsWith("name") && key.includes(":")) {
|
|
140
|
-
newKey = key.replaceAll(":", "_");
|
|
141
|
-
properties[newKey] = properties[key];
|
|
142
|
-
delete properties[key];
|
|
143
|
-
}
|
|
144
|
-
/* Currently id is not supported as a property name in a FeatureTable,
|
|
145
|
-
* so this quick workaround is implemented */
|
|
146
|
-
if (newKey === "_id") {
|
|
147
|
-
properties["id"] = properties[newKey];
|
|
148
|
-
delete properties[newKey];
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
//# sourceMappingURL=mltDecoder.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mltDecoder.spec.js","sourceRoot":"","sources":["../src/mltDecoder.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, describe, it } from \"vitest\";\nimport { readdirSync, readFileSync } from \"fs\";\nimport { parse, join } from \"path\";\nimport { VectorTile, type VectorTileFeature } from \"@mapbox/vector-tile\";\nimport Pbf from \"pbf\";\n\nimport { type FeatureTable, type Feature, decodeTile } from \".\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\n\nconst ITERATOR_TILE = path.resolve(__dirname, \"../../test/expected/tag0x01/simple/multiline-boolean.mlt\");\n\ndescribe(\"MLT Decoder - MVT comparison for SIMPLE tiles\", () => {\n const simpleMltTileDir = \"../test/expected/tag0x01/simple\";\n const simpleMvtTileDir = \"../test/fixtures/simple\";\n testTiles(simpleMltTileDir, simpleMvtTileDir);\n});\n\ndescribe(\"MLT Decoder - MVT comparison for Amazon tiles\", () => {\n const amazonMltTileDir = \"../test/expected/tag0x01/amazon\";\n const amazonMvtTileDir = \"../test/fixtures/amazon\";\n testTiles(amazonMltTileDir, amazonMvtTileDir);\n});\n\ndescribe(\"MLT Decoder - MVT comparison for OMT tiles\", () => {\n const omtMltTileDir = \"../test/expected/tag0x01/omt\";\n const omtMvtTileDir = \"../test/fixtures/omt\";\n testTiles(omtMltTileDir, omtMvtTileDir);\n}, 150000);\n\ndescribe(\"FeatureTable\", () => {\n it(\"should iterate through features correctly\", () => {\n const bytes = new Uint8Array(fs.readFileSync(ITERATOR_TILE));\n const featureTables = decodeTile(bytes);\n\n const table = featureTables[0];\n\n expect(table.name).toBe(\"layer\");\n expect(table.extent).toBe(4096);\n\n let featureCount = 0;\n for (const feature of table) {\n expect(feature.geometry).toBeTruthy();\n expect(feature.geometry.coordinates).toBeInstanceOf(Array);\n expect(feature.geometry.coordinates.length).toBeGreaterThan(0);\n expect(typeof feature.geometry.type).toBe(\"number\");\n\n featureCount++;\n }\n expect(featureCount).toBe(table.numFeatures);\n });\n});\n\nfunction testTiles(mltSearchDir: string, mvtSearchDir: string) {\n const mltFileNames = readdirSync(mltSearchDir)\n .filter((file) => parse(file).ext === \".mlt\")\n .map((file) => parse(file).name);\n for (const fileName of mltFileNames) {\n it(`should compare ${fileName} tile`, () => {\n const mltFileName = `${fileName}.mlt`;\n const mltPath = join(mltSearchDir, mltFileName);\n const mvtPath = join(mvtSearchDir, `${fileName}.mvt`);\n\n const encodedMvt = readFileSync(mvtPath);\n const encodedMlt = readFileSync(mltPath);\n const buf = new Pbf(encodedMvt);\n const decodedMvt = new VectorTile(buf);\n\n const decodedMlt = decodeTile(encodedMlt, undefined, true);\n comparePlainGeometryEncodedTile(decodedMlt, decodedMvt);\n });\n }\n}\n\nfunction removeEmptyStrings(mvtProperties: Record<string, any>) {\n for (const key of Object.keys(mvtProperties)) {\n const value = mvtProperties[key];\n if (typeof value === \"string\" && !value.length) {\n delete mvtProperties[key];\n }\n }\n}\n\nfunction comparePlainGeometryEncodedTile(mlt: FeatureTable[], mvt: VectorTile) {\n for (const featureTable of mlt) {\n const layer = mvt.layers[featureTable.name];\n\n // Use getFeatures() instead of iterator (like C++ and Java implementations)\n const mltFeatures = featureTable.getFeatures();\n\n expect(mltFeatures.length).toBe(layer.length);\n\n for (let j = 0; j < layer.length; j++) {\n const mvtFeature = layer.feature(j);\n const mltFeature = mltFeatures[j];\n\n compareId(mltFeature, mvtFeature, true);\n\n const mltGeometry = mltFeature.geometry?.coordinates;\n const mvtGeometry = mvtFeature.loadGeometry();\n expect(mltGeometry).toEqual(mvtGeometry);\n\n const mltProperties = mltFeature.properties;\n const mvtProperties = mvtFeature.properties;\n transformPropertyNames(mltProperties);\n transformPropertyNames(mvtProperties);\n convertBigIntPropertyValues(mltProperties);\n //TODO: fix -> since a change in the java converter shared dictionary encoding empty strings are not\n //encoded anymore\n removeEmptyStrings(mvtProperties);\n removeEmptyStrings(mltProperties);\n\n expect(Object.keys(mltProperties).length).toEqual(Object.keys(mvtProperties).length);\n expect(mltProperties).toEqual(mvtProperties);\n }\n }\n}\n\nfunction compareId(mltFeature: Feature, mvtFeature: VectorTileFeature, idWithinMaxSafeInteger: boolean) {\n if (!mvtFeature.id) {\n /* Java MVT library in the MVT converter decodes zero for undefined ids */\n expect([0, null, 0n]).toContain(mltFeature.id);\n } else {\n const mltFeatureId = mltFeature.id;\n /* For const and sequence vectors the decoder can return bigint compared to the vector-tile-js library */\n const actualId =\n idWithinMaxSafeInteger && typeof mltFeatureId !== \"bigint\" ? mltFeatureId : Number(mltFeatureId);\n /*\n * The id check can fail for two known reasons:\n * - The java-vector-tile library used in the Java converter returns negative integers for the\n * unoptimized tileset in some tiles\n * - The vector-tile-js library is using number types for the id so there can only be stored\n * values up to 53 bits without loss of precision\n **/\n if (mltFeatureId < 0 || mltFeatureId > Number.MAX_SAFE_INTEGER) {\n /* Expected to fail in some/most cases */\n try {\n expect(actualId).toEqual(mvtFeature.id);\n } catch (e) {\n //console.info(\"id mismatch\", featureTableName, mltFeatureId, mvtFeature.id);\n }\n return;\n }\n\n expect(actualId).toEqual(mvtFeature.id);\n }\n}\n\n/* Change bigint to number for comparison with MVT */\nfunction convertBigIntPropertyValues(mltProperties: Record<string, any>) {\n for (const key of Object.keys(mltProperties)) {\n if (typeof mltProperties[key] === \"bigint\") {\n mltProperties[key] = Number(mltProperties[key]);\n }\n }\n}\n\nfunction transformPropertyNames(properties: Record<string, any>) {\n const propertyNames = Object.keys(properties);\n for (let k = 0; k < propertyNames.length; k++) {\n const key = propertyNames[k];\n\n let newKey = key;\n /* rename the property names which are separated with : in mlt to match _ in omt mvts */\n if (key.startsWith(\"name\") && key.includes(\":\")) {\n newKey = (key as any).replaceAll(\":\", \"_\");\n properties[newKey] = properties[key];\n delete properties[key];\n }\n\n /* Currently id is not supported as a property name in a FeatureTable,\n * so this quick workaround is implemented */\n if (newKey === \"_id\") {\n properties[\"id\"] = properties[newKey];\n delete properties[newKey];\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { FlatSelectionVector } from "./flatSelectionVector";
|
|
3
|
-
describe("flatSelectionVector", () => {
|
|
4
|
-
describe("Basic functionality", () => {
|
|
5
|
-
it("Should store and retrieve indices", () => {
|
|
6
|
-
const fsVector = new FlatSelectionVector([0, 1, 999999999999, -28, 36]);
|
|
7
|
-
expect(fsVector.getIndex(0)).toBe(0);
|
|
8
|
-
expect(fsVector.getIndex(2)).toBe(999999999999);
|
|
9
|
-
expect(fsVector.getIndex(3)).toBe(-28);
|
|
10
|
-
fsVector.setIndex(2, -48);
|
|
11
|
-
expect(fsVector.getIndex(2)).toBe(-48);
|
|
12
|
-
});
|
|
13
|
-
it("Should throw RangeError for out of bounds access", () => {
|
|
14
|
-
const fsVector = new FlatSelectionVector([0, 1, 2]);
|
|
15
|
-
expect(() => fsVector.getIndex(10)).toThrowError("Index out of bounds");
|
|
16
|
-
expect(() => fsVector.getIndex(-1)).toThrowError("Index out of bounds");
|
|
17
|
-
expect(() => fsVector.setIndex(-1, 0)).toThrowError("Index out of bounds");
|
|
18
|
-
expect(() => fsVector.setIndex(10, 0)).toThrowError("Index out of bounds");
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
describe("Array wrapper behavior", () => {
|
|
22
|
-
it("Should return reference to underlying array", () => {
|
|
23
|
-
const vector = [0, 1, 2, 3, 4];
|
|
24
|
-
const fsVector = new FlatSelectionVector(vector);
|
|
25
|
-
expect(fsVector.selectionValues()).toBe(vector);
|
|
26
|
-
});
|
|
27
|
-
it("Should use array length as default limit and capacity", () => {
|
|
28
|
-
const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5]);
|
|
29
|
-
expect(fsVector.limit).toBe(5);
|
|
30
|
-
expect(fsVector.capacity).toBe(5);
|
|
31
|
-
});
|
|
32
|
-
it("Should allow custom limit independent of array length", () => {
|
|
33
|
-
const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5], 3);
|
|
34
|
-
expect(fsVector.limit).toBe(3);
|
|
35
|
-
expect(fsVector.capacity).toBe(5);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
describe("set Limit Tests", () => {
|
|
39
|
-
it("should set Limit", () => {
|
|
40
|
-
const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5], 3);
|
|
41
|
-
fsVector.setLimit(2);
|
|
42
|
-
expect(fsVector.limit).toBe(2);
|
|
43
|
-
});
|
|
44
|
-
it("should throw out of bounds error", () => {
|
|
45
|
-
const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5], 3);
|
|
46
|
-
expect(() => fsVector.setLimit(-10)).toThrowError("Limit out of bounds");
|
|
47
|
-
expect(() => fsVector.setLimit(10)).toThrowError("Limit out of bounds");
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
//# sourceMappingURL=flatSelectionVector.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flatSelectionVector.spec.js","sourceRoot":"","sources":["../../../src/vector/filter/flatSelectionVector.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { FlatSelectionVector } from \"./flatSelectionVector\";\n\ndescribe(\"flatSelectionVector\", () => {\n describe(\"Basic functionality\", () => {\n it(\"Should store and retrieve indices\", () => {\n const fsVector = new FlatSelectionVector([0, 1, 999999999999, -28, 36]);\n expect(fsVector.getIndex(0)).toBe(0);\n expect(fsVector.getIndex(2)).toBe(999999999999);\n expect(fsVector.getIndex(3)).toBe(-28);\n\n fsVector.setIndex(2, -48);\n expect(fsVector.getIndex(2)).toBe(-48);\n });\n\n it(\"Should throw RangeError for out of bounds access\", () => {\n const fsVector = new FlatSelectionVector([0, 1, 2]);\n expect(() => fsVector.getIndex(10)).toThrowError(\"Index out of bounds\");\n expect(() => fsVector.getIndex(-1)).toThrowError(\"Index out of bounds\");\n expect(() => fsVector.setIndex(-1, 0)).toThrowError(\"Index out of bounds\");\n expect(() => fsVector.setIndex(10, 0)).toThrowError(\"Index out of bounds\");\n });\n });\n\n describe(\"Array wrapper behavior\", () => {\n it(\"Should return reference to underlying array\", () => {\n const vector = [0, 1, 2, 3, 4];\n const fsVector = new FlatSelectionVector(vector);\n expect(fsVector.selectionValues()).toBe(vector);\n });\n\n it(\"Should use array length as default limit and capacity\", () => {\n const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5]);\n expect(fsVector.limit).toBe(5);\n expect(fsVector.capacity).toBe(5);\n });\n\n it(\"Should allow custom limit independent of array length\", () => {\n const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5], 3);\n expect(fsVector.limit).toBe(3);\n expect(fsVector.capacity).toBe(5);\n });\n });\n describe(\"set Limit Tests\", () => {\n it(\"should set Limit\", () => {\n const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5], 3);\n fsVector.setLimit(2);\n expect(fsVector.limit).toBe(2);\n });\n it(\"should throw out of bounds error\", () => {\n const fsVector = new FlatSelectionVector([1, 2, 3, 4, 5], 3);\n expect(() => fsVector.setLimit(-10)).toThrowError(\"Limit out of bounds\");\n expect(() => fsVector.setLimit(10)).toThrowError(\"Limit out of bounds\");\n });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { createSelectionVector, createNullableSelectionVector, updateNullableSelectionVector, } from "./selectionVectorUtils";
|
|
3
|
-
import { FlatSelectionVector } from "./flatSelectionVector";
|
|
4
|
-
import { SequenceSelectionVector } from "./sequenceSelectionVector";
|
|
5
|
-
import BitVector from "../flat/bitVector";
|
|
6
|
-
describe("selectionVectorUtils", () => {
|
|
7
|
-
describe("createSelectionVector", () => {
|
|
8
|
-
it("Should create a SequenceSelectionVector with given size", () => {
|
|
9
|
-
const sv = createSelectionVector(5);
|
|
10
|
-
expect(sv).toBeInstanceOf(SequenceSelectionVector);
|
|
11
|
-
expect(sv.limit).toBe(5);
|
|
12
|
-
});
|
|
13
|
-
it("Should handle zero size", () => {
|
|
14
|
-
const sv = createSelectionVector(0);
|
|
15
|
-
expect(sv).toBeInstanceOf(SequenceSelectionVector);
|
|
16
|
-
expect(sv.limit).toBe(0);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
describe("createNullableSelectionVector", () => {
|
|
20
|
-
it("Should return all indices when nullabilityBuffer is not provided", () => {
|
|
21
|
-
const sv = createNullableSelectionVector(5);
|
|
22
|
-
expect(sv).toBeInstanceOf(FlatSelectionVector);
|
|
23
|
-
expect(sv.limit).toBe(5);
|
|
24
|
-
});
|
|
25
|
-
it("Should return empty vector when size is 0 and nullabilityBuffer is not provided", () => {
|
|
26
|
-
const sv = createNullableSelectionVector(0);
|
|
27
|
-
expect(sv).toBeInstanceOf(FlatSelectionVector);
|
|
28
|
-
expect(sv.limit).toBe(0);
|
|
29
|
-
});
|
|
30
|
-
it("Should return empty vector when size is 0 with BitVector provided", () => {
|
|
31
|
-
const buffer = new Uint8Array([0b11111111]);
|
|
32
|
-
const bitVector = new BitVector(buffer, 8);
|
|
33
|
-
const sv = createNullableSelectionVector(0, bitVector);
|
|
34
|
-
expect(sv).toBeInstanceOf(FlatSelectionVector);
|
|
35
|
-
expect(sv.limit).toBe(0);
|
|
36
|
-
});
|
|
37
|
-
it("Should create FlatSelectionVector with only set bits", () => {
|
|
38
|
-
const buffer = new Uint8Array([0b00001011]); // bits 0, 1, 3 are set
|
|
39
|
-
const bitVector = new BitVector(buffer, 8);
|
|
40
|
-
const sv = createNullableSelectionVector(8, bitVector);
|
|
41
|
-
expect(sv).toBeInstanceOf(FlatSelectionVector);
|
|
42
|
-
expect(sv.limit).toBe(3);
|
|
43
|
-
});
|
|
44
|
-
it("Should create empty vector when no bits are set", () => {
|
|
45
|
-
const buffer = new Uint8Array([0b00000000]);
|
|
46
|
-
const bitVector = new BitVector(buffer, 8);
|
|
47
|
-
const sv = createNullableSelectionVector(8, bitVector);
|
|
48
|
-
expect(sv).toBeInstanceOf(FlatSelectionVector);
|
|
49
|
-
expect(sv.limit).toBe(0);
|
|
50
|
-
});
|
|
51
|
-
it("Should handle multiple bytes in BitVector", () => {
|
|
52
|
-
const buffer = new Uint8Array([0b10101010, 0b01010101]);
|
|
53
|
-
const bitVector = new BitVector(buffer, 16);
|
|
54
|
-
const sv = createNullableSelectionVector(16, bitVector);
|
|
55
|
-
expect(sv).toBeInstanceOf(FlatSelectionVector);
|
|
56
|
-
expect(sv.limit).toBe(8);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
describe("updateNullableSelectionVector", () => {
|
|
60
|
-
describe("with FlatSelectionVector", () => {
|
|
61
|
-
it("Should return new instance when filtering with BitVector", () => {
|
|
62
|
-
const selectionVector = new FlatSelectionVector([0, 1, 2, 3, 4, 5, 6, 7]);
|
|
63
|
-
const buffer = new Uint8Array([0b00001011]);
|
|
64
|
-
const bitVector = new BitVector(buffer, 8);
|
|
65
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
66
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
67
|
-
expect(result.limit).toBe(3);
|
|
68
|
-
expect(result).not.toBe(selectionVector);
|
|
69
|
-
});
|
|
70
|
-
it("Should return same instance when BitVector is null", () => {
|
|
71
|
-
const selectionVector = new FlatSelectionVector([0, 1, 2, 3, 4, 5, 6, 7]);
|
|
72
|
-
const result = updateNullableSelectionVector(selectionVector, null);
|
|
73
|
-
expect(result).toStrictEqual(selectionVector);
|
|
74
|
-
});
|
|
75
|
-
it("Should return all indices when nullabilityBuffer is undefined", () => {
|
|
76
|
-
const selectionVector = new FlatSelectionVector([0, 2, 4, 6]);
|
|
77
|
-
const result = updateNullableSelectionVector(selectionVector, undefined);
|
|
78
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
79
|
-
expect(result.limit).toBe(4);
|
|
80
|
-
});
|
|
81
|
-
it("Should keep all indices when all bits are set", () => {
|
|
82
|
-
const selectionVector = new FlatSelectionVector([0, 2, 4, 6]);
|
|
83
|
-
const buffer = new Uint8Array([0b01010101]);
|
|
84
|
-
const bitVector = new BitVector(buffer, 8);
|
|
85
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
86
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
87
|
-
expect(result.limit).toBe(4);
|
|
88
|
-
});
|
|
89
|
-
it("Should filter out null indices from selection vector", () => {
|
|
90
|
-
const selectionVector = new FlatSelectionVector([0, 2, 4, 6]);
|
|
91
|
-
const buffer = new Uint8Array([0b01000101]); // bits at 0, 2, 6
|
|
92
|
-
const bitVector = new BitVector(buffer, 8);
|
|
93
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
94
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
95
|
-
expect(result.limit).toBe(3);
|
|
96
|
-
});
|
|
97
|
-
it("Should return empty vector when all selected indices are null", () => {
|
|
98
|
-
const selectionVector = new FlatSelectionVector([1, 3, 5]);
|
|
99
|
-
const buffer = new Uint8Array([0b01010101]); // bits at 0, 2, 4, 6 (not 1, 3, 5)
|
|
100
|
-
const bitVector = new BitVector(buffer, 8);
|
|
101
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
102
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
103
|
-
expect(result.limit).toBe(0);
|
|
104
|
-
});
|
|
105
|
-
it("Should handle empty FlatSelectionVector", () => {
|
|
106
|
-
const selectionVector = new FlatSelectionVector([]);
|
|
107
|
-
const buffer = new Uint8Array([0b11111111]);
|
|
108
|
-
const bitVector = new BitVector(buffer, 8);
|
|
109
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
110
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
111
|
-
expect(result.limit).toBe(0);
|
|
112
|
-
});
|
|
113
|
-
it("Should filter large index values from selection vector", () => {
|
|
114
|
-
const selectionVector = new FlatSelectionVector([0, 8, 16]);
|
|
115
|
-
const buffer = new Uint8Array([0b00000001, 0b00000000, 0b00000000]);
|
|
116
|
-
const bitVector = new BitVector(buffer, 24);
|
|
117
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
118
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
119
|
-
expect(result.limit).toBe(1);
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
describe("with SequenceSelectionVector", () => {
|
|
123
|
-
it("Should filter SequenceSelectionVector with all bits set", () => {
|
|
124
|
-
const selectionVector = new SequenceSelectionVector(0, 2, 4); // [0, 2, 4, 6]
|
|
125
|
-
const buffer = new Uint8Array([0b01010101]);
|
|
126
|
-
const bitVector = new BitVector(buffer, 8);
|
|
127
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
128
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
129
|
-
expect(result.limit).toBe(4);
|
|
130
|
-
});
|
|
131
|
-
it("Should partially filter SequenceSelectionVector", () => {
|
|
132
|
-
const selectionVector = new SequenceSelectionVector(0, 2, 4); // [0, 2, 4, 6]
|
|
133
|
-
const buffer = new Uint8Array([0b00010001]); // bits at 0, 4
|
|
134
|
-
const bitVector = new BitVector(buffer, 8);
|
|
135
|
-
const result = updateNullableSelectionVector(selectionVector, bitVector);
|
|
136
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
137
|
-
expect(result.limit).toBe(2);
|
|
138
|
-
});
|
|
139
|
-
it("Should preserve all SequenceSelectionVector values when nullabilityBuffer is undefined", () => {
|
|
140
|
-
const selectionVector = new SequenceSelectionVector(1, 3, 3); // [1, 4, 7]
|
|
141
|
-
const result = updateNullableSelectionVector(selectionVector, undefined);
|
|
142
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
143
|
-
expect(result.limit).toBe(3);
|
|
144
|
-
});
|
|
145
|
-
it("Should create FlatSelectionVector when BitVector is null", () => {
|
|
146
|
-
const selectionVector = new SequenceSelectionVector(0, 2, 4); // [0, 2, 4, 6]
|
|
147
|
-
const result = updateNullableSelectionVector(selectionVector, null);
|
|
148
|
-
expect(result).toBeInstanceOf(FlatSelectionVector);
|
|
149
|
-
expect(result.limit).toBe(4);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
//# sourceMappingURL=selectionVectorUtil.spec.js.map
|