@maplibre/mlt 0.0.1-alpha.9 → 1.1.0

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