@loaders.gl/parquet 4.5.3 → 5.0.0-alpha.10

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 (790) hide show
  1. package/LICENSE +14 -3
  2. package/dist/bundled.d.ts +9 -0
  3. package/dist/bundled.d.ts.map +1 -0
  4. package/dist/bundled.js +10 -0
  5. package/dist/bundled.js.map +1 -0
  6. package/dist/delta-format.d.ts +9 -0
  7. package/dist/delta-format.d.ts.map +1 -0
  8. package/dist/delta-format.js +12 -0
  9. package/dist/delta-format.js.map +1 -0
  10. package/dist/delta-source-loader-types.d.ts +27 -0
  11. package/dist/delta-source-loader-types.d.ts.map +1 -0
  12. package/dist/delta-source-loader-types.js +28 -0
  13. package/dist/delta-source-loader-types.js.map +1 -0
  14. package/dist/delta-source.d.ts +48 -0
  15. package/dist/delta-source.d.ts.map +1 -0
  16. package/dist/delta-source.js +222 -0
  17. package/dist/delta-source.js.map +1 -0
  18. package/dist/delta-types.d.ts +38 -0
  19. package/dist/delta-types.d.ts.map +1 -0
  20. package/dist/delta-types.js +5 -0
  21. package/dist/delta-types.js.map +1 -0
  22. package/dist/geoparquet-loader-with-parser.d.ts +33 -0
  23. package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
  24. package/dist/geoparquet-loader-with-parser.js +52 -0
  25. package/dist/geoparquet-loader-with-parser.js.map +1 -0
  26. package/dist/geoparquet-loader.d.ts +59 -0
  27. package/dist/geoparquet-loader.d.ts.map +1 -0
  28. package/dist/geoparquet-loader.js +30 -0
  29. package/dist/geoparquet-loader.js.map +1 -0
  30. package/dist/iceberg-rest-catalog.d.ts +49 -0
  31. package/dist/iceberg-rest-catalog.d.ts.map +1 -0
  32. package/dist/iceberg-rest-catalog.js +78 -0
  33. package/dist/iceberg-rest-catalog.js.map +1 -0
  34. package/dist/iceberg-table-source.d.ts +63 -0
  35. package/dist/iceberg-table-source.d.ts.map +1 -0
  36. package/dist/iceberg-table-source.js +797 -0
  37. package/dist/iceberg-table-source.js.map +1 -0
  38. package/dist/iceberg-types.d.ts +150 -0
  39. package/dist/iceberg-types.d.ts.map +1 -0
  40. package/dist/iceberg-types.js +5 -0
  41. package/dist/iceberg-types.js.map +1 -0
  42. package/dist/index.cjs +41568 -6781
  43. package/dist/index.cjs.map +3 -4
  44. package/dist/index.d.ts +15 -9
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +11 -12
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/arrow/convert-columns-to-row-group.js +3 -0
  49. package/dist/lib/arrow/convert-columns-to-row-group.js.map +1 -1
  50. package/dist/lib/arrow/convert-schema-from-parquet.d.ts +3 -1
  51. package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
  52. package/dist/lib/arrow/convert-schema-from-parquet.js +164 -29
  53. package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
  54. package/dist/lib/arrow/convert-schema-to-parquet.d.ts.map +1 -1
  55. package/dist/lib/arrow/convert-schema-to-parquet.js +16 -7
  56. package/dist/lib/arrow/convert-schema-to-parquet.js.map +1 -1
  57. package/dist/lib/arrow/create-nested-arrow-vector.d.ts +8 -0
  58. package/dist/lib/arrow/create-nested-arrow-vector.d.ts.map +1 -0
  59. package/dist/lib/arrow/create-nested-arrow-vector.js +485 -0
  60. package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -0
  61. package/dist/lib/constants.d.ts +0 -1
  62. package/dist/lib/constants.d.ts.map +1 -1
  63. package/dist/lib/constants.js +1 -2
  64. package/dist/lib/constants.js.map +1 -1
  65. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
  66. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
  67. package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
  68. package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
  69. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
  70. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
  71. package/dist/lib/encoders/encode-table-to-parquet-js.js +394 -0
  72. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
  73. package/dist/lib/geo/geoparquet-covering.d.ts +19 -0
  74. package/dist/lib/geo/geoparquet-covering.d.ts.map +1 -0
  75. package/dist/lib/geo/geoparquet-covering.js +137 -0
  76. package/dist/lib/geo/geoparquet-covering.js.map +1 -0
  77. package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
  78. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
  79. package/dist/lib/geo/geospatial-metadata.js +412 -0
  80. package/dist/lib/geo/geospatial-metadata.js.map +1 -0
  81. package/dist/lib/parquet-bloom-filter-planner.d.ts +16 -0
  82. package/dist/lib/parquet-bloom-filter-planner.d.ts.map +1 -0
  83. package/dist/lib/parquet-bloom-filter-planner.js +57 -0
  84. package/dist/lib/parquet-bloom-filter-planner.js.map +1 -0
  85. package/dist/lib/parquet-bloom-filter.d.ts +30 -0
  86. package/dist/lib/parquet-bloom-filter.d.ts.map +1 -0
  87. package/dist/lib/parquet-bloom-filter.js +289 -0
  88. package/dist/lib/parquet-bloom-filter.js.map +1 -0
  89. package/dist/lib/parquet-encryption.d.ts +80 -0
  90. package/dist/lib/parquet-encryption.d.ts.map +1 -0
  91. package/dist/lib/parquet-encryption.js +190 -0
  92. package/dist/lib/parquet-encryption.js.map +1 -0
  93. package/dist/lib/parquet-page-index.d.ts +91 -0
  94. package/dist/lib/parquet-page-index.d.ts.map +1 -0
  95. package/dist/lib/parquet-page-index.js +463 -0
  96. package/dist/lib/parquet-page-index.js.map +1 -0
  97. package/dist/lib/parquet-predicate.d.ts +21 -0
  98. package/dist/lib/parquet-predicate.d.ts.map +1 -0
  99. package/dist/lib/parquet-predicate.js +328 -0
  100. package/dist/lib/parquet-predicate.js.map +1 -0
  101. package/dist/lib/parquet-source-worker-client.d.ts +6 -0
  102. package/dist/lib/parquet-source-worker-client.d.ts.map +1 -0
  103. package/dist/lib/parquet-source-worker-client.js +24 -0
  104. package/dist/lib/parquet-source-worker-client.js.map +1 -0
  105. package/dist/lib/parquet-source-worker-decoder.d.ts +7 -0
  106. package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -0
  107. package/dist/lib/parquet-source-worker-decoder.js +181 -0
  108. package/dist/lib/parquet-source-worker-decoder.js.map +1 -0
  109. package/dist/lib/parquet-source-worker-file.d.ts +24 -0
  110. package/dist/lib/parquet-source-worker-file.d.ts.map +1 -0
  111. package/dist/lib/parquet-source-worker-file.js +40 -0
  112. package/dist/lib/parquet-source-worker-file.js.map +1 -0
  113. package/dist/lib/parquet-source-worker-types.d.ts +121 -0
  114. package/dist/lib/parquet-source-worker-types.d.ts.map +1 -0
  115. package/dist/lib/parquet-source-worker-types.js +5 -0
  116. package/dist/lib/parquet-source-worker-types.js.map +1 -0
  117. package/dist/lib/parquet-worker-transport.d.ts +8 -0
  118. package/dist/lib/parquet-worker-transport.d.ts.map +1 -0
  119. package/dist/lib/parquet-worker-transport.js +40 -0
  120. package/dist/lib/parquet-worker-transport.js.map +1 -0
  121. package/dist/lib/parsers/convert-parquet-tables.d.ts +16 -0
  122. package/dist/lib/parsers/convert-parquet-tables.d.ts.map +1 -0
  123. package/dist/lib/parsers/convert-parquet-tables.js +30 -0
  124. package/dist/lib/parsers/convert-parquet-tables.js.map +1 -0
  125. package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
  126. package/dist/lib/parsers/get-parquet-schema.js +6 -2
  127. package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
  128. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
  129. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
  130. package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
  131. package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
  132. package/dist/lib/parsers/parse-parquet-tables.d.ts +37 -0
  133. package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
  134. package/dist/lib/parsers/parse-parquet-tables.js +50 -0
  135. package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
  136. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +19 -0
  137. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
  138. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +921 -0
  139. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
  140. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
  141. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
  142. package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
  143. package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
  144. package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
  145. package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
  146. package/dist/lib/parsers/parse-parquet-to-columns.js +4 -5
  147. package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
  148. package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
  149. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  150. package/dist/lib/parsers/parse-parquet-to-json.js +95 -28
  151. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  152. package/dist/lib/slice-parquet-batch.d.ts +9 -0
  153. package/dist/lib/slice-parquet-batch.d.ts.map +1 -0
  154. package/dist/lib/slice-parquet-batch.js +28 -0
  155. package/dist/lib/slice-parquet-batch.js.map +1 -0
  156. package/dist/lib/sources/parquet-range-file.d.ts +80 -0
  157. package/dist/lib/sources/parquet-range-file.d.ts.map +1 -0
  158. package/dist/lib/sources/parquet-range-file.js +267 -0
  159. package/dist/lib/sources/parquet-range-file.js.map +1 -0
  160. package/dist/lib/sources/single-batch-queue.d.ts +24 -0
  161. package/dist/lib/sources/single-batch-queue.d.ts.map +1 -0
  162. package/dist/lib/sources/single-batch-queue.js +91 -0
  163. package/dist/lib/sources/single-batch-queue.js.map +1 -0
  164. package/dist/lib/utils/load-wasm-node.d.ts +3 -0
  165. package/dist/lib/utils/load-wasm-node.d.ts.map +1 -0
  166. package/dist/lib/utils/load-wasm-node.js +23 -0
  167. package/dist/lib/utils/load-wasm-node.js.map +1 -0
  168. package/dist/lib/utils/load-wasm.d.ts +2 -2
  169. package/dist/lib/utils/load-wasm.d.ts.map +1 -1
  170. package/dist/lib/utils/load-wasm.js +28 -12
  171. package/dist/lib/utils/load-wasm.js.map +1 -1
  172. package/dist/lib/utils/make-stream-iterator.d.ts +2 -0
  173. package/dist/lib/utils/make-stream-iterator.d.ts.map +1 -1
  174. package/dist/lib/utils/make-stream-iterator.js +123 -14
  175. package/dist/lib/utils/make-stream-iterator.js.map +1 -1
  176. package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
  177. package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
  178. package/dist/lib/utils/normalize-parquet-options.js +25 -0
  179. package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
  180. package/dist/parquet-dataset-source.cjs +38974 -0
  181. package/dist/parquet-dataset-source.cjs.map +6 -0
  182. package/dist/parquet-dataset-source.d.ts +81 -0
  183. package/dist/parquet-dataset-source.d.ts.map +1 -0
  184. package/dist/parquet-dataset-source.js +602 -0
  185. package/dist/parquet-dataset-source.js.map +1 -0
  186. package/dist/parquet-encoded-page-types.d.ts +108 -0
  187. package/dist/parquet-encoded-page-types.d.ts.map +1 -0
  188. package/dist/parquet-encoded-page-types.js +5 -0
  189. package/dist/parquet-encoded-page-types.js.map +1 -0
  190. package/dist/parquet-format.d.ts +2 -0
  191. package/dist/parquet-format.d.ts.map +1 -1
  192. package/dist/parquet-format.js +2 -0
  193. package/dist/parquet-format.js.map +1 -1
  194. package/dist/parquet-js-loader-types.d.ts +59 -0
  195. package/dist/parquet-js-loader-types.d.ts.map +1 -0
  196. package/dist/parquet-js-loader-types.js +34 -0
  197. package/dist/parquet-js-loader-types.js.map +1 -0
  198. package/dist/parquet-js-loader.d.ts +18 -22
  199. package/dist/parquet-js-loader.d.ts.map +1 -1
  200. package/dist/parquet-js-loader.js +53 -14
  201. package/dist/parquet-js-loader.js.map +1 -1
  202. package/dist/parquet-js-writer.d.ts +65 -0
  203. package/dist/parquet-js-writer.d.ts.map +1 -0
  204. package/dist/parquet-js-writer.js +28 -0
  205. package/dist/parquet-js-writer.js.map +1 -0
  206. package/dist/parquet-loader-base.d.ts +25 -0
  207. package/dist/parquet-loader-base.d.ts.map +1 -0
  208. package/dist/parquet-loader-base.js +23 -0
  209. package/dist/parquet-loader-base.js.map +1 -0
  210. package/dist/parquet-loader-options.d.ts +55 -0
  211. package/dist/parquet-loader-options.d.ts.map +1 -0
  212. package/dist/parquet-loader-options.js +10 -0
  213. package/dist/parquet-loader-options.js.map +1 -0
  214. package/dist/parquet-loader-types.d.ts +61 -0
  215. package/dist/parquet-loader-types.d.ts.map +1 -0
  216. package/dist/parquet-loader-types.js +17 -0
  217. package/dist/parquet-loader-types.js.map +1 -0
  218. package/dist/parquet-loader.d.ts +42 -0
  219. package/dist/parquet-loader.d.ts.map +1 -0
  220. package/dist/parquet-loader.js +68 -0
  221. package/dist/parquet-loader.js.map +1 -0
  222. package/dist/parquet-source-capabilities.d.ts +43 -0
  223. package/dist/parquet-source-capabilities.d.ts.map +1 -0
  224. package/dist/parquet-source-capabilities.js +32 -0
  225. package/dist/parquet-source-capabilities.js.map +1 -0
  226. package/dist/parquet-source-loader-types.d.ts +82 -0
  227. package/dist/parquet-source-loader-types.d.ts.map +1 -0
  228. package/dist/parquet-source-loader-types.js +84 -0
  229. package/dist/parquet-source-loader-types.js.map +1 -0
  230. package/dist/parquet-source-loader.cjs +38261 -0
  231. package/dist/parquet-source-loader.cjs.map +6 -0
  232. package/dist/parquet-source-loader.d.ts +167 -0
  233. package/dist/parquet-source-loader.d.ts.map +1 -0
  234. package/dist/parquet-source-loader.js +1438 -0
  235. package/dist/parquet-source-loader.js.map +1 -0
  236. package/dist/parquet-source-types.d.ts +534 -0
  237. package/dist/parquet-source-types.d.ts.map +1 -0
  238. package/dist/parquet-source-types.js +5 -0
  239. package/dist/parquet-source-types.js.map +1 -0
  240. package/dist/parquet-source-worker-factory.d.ts +4 -0
  241. package/dist/parquet-source-worker-factory.d.ts.map +1 -0
  242. package/dist/parquet-source-worker-factory.js +6 -0
  243. package/dist/parquet-source-worker-factory.js.map +1 -0
  244. package/dist/parquet-source-worker-url.d.ts +3 -0
  245. package/dist/parquet-source-worker-url.d.ts.map +1 -0
  246. package/dist/parquet-source-worker-url.js +22 -0
  247. package/dist/parquet-source-worker-url.js.map +1 -0
  248. package/dist/parquet-source-worker.js +38871 -0
  249. package/dist/parquet-source-worker.js.map +7 -0
  250. package/dist/parquet-worker-node.cjs +78507 -0
  251. package/dist/parquet-worker-node.cjs.map +7 -0
  252. package/dist/parquet-worker-url.d.ts +3 -0
  253. package/dist/parquet-worker-url.d.ts.map +1 -0
  254. package/dist/parquet-worker-url.js +19 -0
  255. package/dist/parquet-worker-url.js.map +1 -0
  256. package/dist/parquet-worker.js +20094 -0
  257. package/dist/parquet-worker.js.map +7 -0
  258. package/dist/parquet-writer.d.ts +10 -0
  259. package/dist/parquet-writer.d.ts.map +1 -0
  260. package/dist/parquet-writer.js +27 -0
  261. package/dist/parquet-writer.js.map +1 -0
  262. package/dist/parquet_wasm_bg.wasm +0 -0
  263. package/dist/parquetjs/codecs/byte-stream-split.d.ts +9 -0
  264. package/dist/parquetjs/codecs/byte-stream-split.d.ts.map +1 -0
  265. package/dist/parquetjs/codecs/byte-stream-split.js +159 -0
  266. package/dist/parquetjs/codecs/byte-stream-split.js.map +1 -0
  267. package/dist/parquetjs/codecs/declare.d.ts +35 -3
  268. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  269. package/dist/parquetjs/codecs/declare.js +17 -1
  270. package/dist/parquetjs/codecs/declare.js.map +1 -1
  271. package/dist/parquetjs/codecs/delta.d.ts +17 -0
  272. package/dist/parquetjs/codecs/delta.d.ts.map +1 -0
  273. package/dist/parquetjs/codecs/delta.js +788 -0
  274. package/dist/parquetjs/codecs/delta.js.map +1 -0
  275. package/dist/parquetjs/codecs/dictionary.d.ts +5 -2
  276. package/dist/parquetjs/codecs/dictionary.d.ts.map +1 -1
  277. package/dist/parquetjs/codecs/dictionary.js +16 -4
  278. package/dist/parquetjs/codecs/dictionary.js.map +1 -1
  279. package/dist/parquetjs/codecs/index.d.ts.map +1 -1
  280. package/dist/parquetjs/codecs/index.js +22 -0
  281. package/dist/parquetjs/codecs/index.js.map +1 -1
  282. package/dist/parquetjs/codecs/plain.d.ts +3 -3
  283. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  284. package/dist/parquetjs/codecs/plain.js +231 -78
  285. package/dist/parquetjs/codecs/plain.js.map +1 -1
  286. package/dist/parquetjs/codecs/rle.d.ts +7 -3
  287. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  288. package/dist/parquetjs/codecs/rle.js +613 -69
  289. package/dist/parquetjs/codecs/rle.js.map +1 -1
  290. package/dist/parquetjs/compression.d.ts +16 -8
  291. package/dist/parquetjs/compression.d.ts.map +1 -1
  292. package/dist/parquetjs/compression.js +114 -141
  293. package/dist/parquetjs/compression.js.map +1 -1
  294. package/dist/parquetjs/encoder/dictionary-planner.d.ts +17 -0
  295. package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -0
  296. package/dist/parquetjs/encoder/dictionary-planner.js +67 -0
  297. package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -0
  298. package/dist/parquetjs/encoder/page-planner.d.ts +11 -0
  299. package/dist/parquetjs/encoder/page-planner.d.ts.map +1 -0
  300. package/dist/parquetjs/encoder/page-planner.js +60 -0
  301. package/dist/parquetjs/encoder/page-planner.js.map +1 -0
  302. package/dist/parquetjs/encoder/parquet-encoder.d.ts +54 -5
  303. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  304. package/dist/parquetjs/encoder/parquet-encoder.js +930 -66
  305. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  306. package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts +29 -0
  307. package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts.map +1 -0
  308. package/dist/parquetjs/parquet-thrift/BoundingBox.js +85 -0
  309. package/dist/parquetjs/parquet-thrift/BoundingBox.js.map +1 -0
  310. package/dist/parquetjs/parquet-thrift/BsonType.d.ts +1 -1
  311. package/dist/parquetjs/parquet-thrift/BsonType.d.ts.map +1 -1
  312. package/dist/parquetjs/parquet-thrift/BsonType.js +1 -1
  313. package/dist/parquetjs/parquet-thrift/BsonType.js.map +1 -1
  314. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +7 -2
  315. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
  316. package/dist/parquetjs/parquet-thrift/ColumnChunk.js +37 -2
  317. package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
  318. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts +35 -0
  319. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts.map +1 -0
  320. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js +135 -0
  321. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js.map +1 -0
  322. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts +6 -6
  323. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts.map +1 -1
  324. package/dist/parquetjs/parquet-thrift/ColumnIndex.js +3 -3
  325. package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
  326. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +12 -2
  327. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
  328. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +75 -2
  329. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
  330. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts +1 -1
  331. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts.map +1 -1
  332. package/dist/parquetjs/parquet-thrift/ColumnOrder.js +1 -1
  333. package/dist/parquetjs/parquet-thrift/ColumnOrder.js.map +1 -1
  334. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts +1 -1
  335. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts.map +1 -1
  336. package/dist/parquetjs/parquet-thrift/DataPageHeader.js +1 -1
  337. package/dist/parquetjs/parquet-thrift/DataPageHeader.js.map +1 -1
  338. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts +1 -1
  339. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts.map +1 -1
  340. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js +1 -1
  341. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js.map +1 -1
  342. package/dist/parquetjs/parquet-thrift/DateType.d.ts +1 -1
  343. package/dist/parquetjs/parquet-thrift/DateType.d.ts.map +1 -1
  344. package/dist/parquetjs/parquet-thrift/DateType.js +1 -1
  345. package/dist/parquetjs/parquet-thrift/DateType.js.map +1 -1
  346. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts +1 -1
  347. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts.map +1 -1
  348. package/dist/parquetjs/parquet-thrift/DecimalType.js +1 -1
  349. package/dist/parquetjs/parquet-thrift/DecimalType.js.map +1 -1
  350. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts +1 -1
  351. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts.map +1 -1
  352. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js +1 -1
  353. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js.map +1 -1
  354. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts +8 -0
  355. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts.map +1 -0
  356. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js +14 -0
  357. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js.map +1 -0
  358. package/dist/parquetjs/parquet-thrift/Encoding.d.ts +2 -1
  359. package/dist/parquetjs/parquet-thrift/Encoding.d.ts.map +1 -1
  360. package/dist/parquetjs/parquet-thrift/Encoding.js +1 -0
  361. package/dist/parquetjs/parquet-thrift/Encoding.js.map +1 -1
  362. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts +22 -0
  363. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts.map +1 -0
  364. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js +111 -0
  365. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js.map +1 -0
  366. package/dist/parquetjs/parquet-thrift/EnumType.d.ts +1 -1
  367. package/dist/parquetjs/parquet-thrift/EnumType.d.ts.map +1 -1
  368. package/dist/parquetjs/parquet-thrift/EnumType.js +1 -1
  369. package/dist/parquetjs/parquet-thrift/EnumType.js.map +1 -1
  370. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts +16 -0
  371. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts.map +1 -0
  372. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js +57 -0
  373. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js.map +1 -0
  374. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +7 -2
  375. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
  376. package/dist/parquetjs/parquet-thrift/FileMetaData.js +37 -2
  377. package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
  378. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts +9 -0
  379. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts.map +1 -0
  380. package/dist/parquetjs/parquet-thrift/Float16Type.js +27 -0
  381. package/dist/parquetjs/parquet-thrift/Float16Type.js.map +1 -0
  382. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts +14 -0
  383. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts.map +1 -0
  384. package/dist/parquetjs/parquet-thrift/GeographyType.js +51 -0
  385. package/dist/parquetjs/parquet-thrift/GeographyType.js.map +1 -0
  386. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts +11 -0
  387. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts.map +1 -0
  388. package/dist/parquetjs/parquet-thrift/GeometryType.js +41 -0
  389. package/dist/parquetjs/parquet-thrift/GeometryType.js.map +1 -0
  390. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts +18 -0
  391. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts.map +1 -0
  392. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js +62 -0
  393. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js.map +1 -0
  394. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts +1 -1
  395. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts.map +1 -1
  396. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js +1 -1
  397. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js.map +1 -1
  398. package/dist/parquetjs/parquet-thrift/IntType.d.ts +1 -1
  399. package/dist/parquetjs/parquet-thrift/IntType.d.ts.map +1 -1
  400. package/dist/parquetjs/parquet-thrift/IntType.js +1 -1
  401. package/dist/parquetjs/parquet-thrift/IntType.js.map +1 -1
  402. package/dist/parquetjs/parquet-thrift/JsonType.d.ts +1 -1
  403. package/dist/parquetjs/parquet-thrift/JsonType.d.ts.map +1 -1
  404. package/dist/parquetjs/parquet-thrift/JsonType.js +1 -1
  405. package/dist/parquetjs/parquet-thrift/JsonType.js.map +1 -1
  406. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts +1 -1
  407. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts.map +1 -1
  408. package/dist/parquetjs/parquet-thrift/KeyValue.js +1 -1
  409. package/dist/parquetjs/parquet-thrift/KeyValue.js.map +1 -1
  410. package/dist/parquetjs/parquet-thrift/ListType.d.ts +1 -1
  411. package/dist/parquetjs/parquet-thrift/ListType.d.ts.map +1 -1
  412. package/dist/parquetjs/parquet-thrift/ListType.js +1 -1
  413. package/dist/parquetjs/parquet-thrift/ListType.js.map +1 -1
  414. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts +17 -1
  415. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts.map +1 -1
  416. package/dist/parquetjs/parquet-thrift/LogicalType.js +97 -1
  417. package/dist/parquetjs/parquet-thrift/LogicalType.js.map +1 -1
  418. package/dist/parquetjs/parquet-thrift/MapType.d.ts +1 -1
  419. package/dist/parquetjs/parquet-thrift/MapType.d.ts.map +1 -1
  420. package/dist/parquetjs/parquet-thrift/MapType.js +1 -1
  421. package/dist/parquetjs/parquet-thrift/MapType.js.map +1 -1
  422. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts +1 -1
  423. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts.map +1 -1
  424. package/dist/parquetjs/parquet-thrift/MicroSeconds.js +1 -1
  425. package/dist/parquetjs/parquet-thrift/MicroSeconds.js.map +1 -1
  426. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts +1 -1
  427. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts.map +1 -1
  428. package/dist/parquetjs/parquet-thrift/MilliSeconds.js +1 -1
  429. package/dist/parquetjs/parquet-thrift/MilliSeconds.js.map +1 -1
  430. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts +9 -0
  431. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts.map +1 -0
  432. package/dist/parquetjs/parquet-thrift/NanoSeconds.js +27 -0
  433. package/dist/parquetjs/parquet-thrift/NanoSeconds.js.map +1 -0
  434. package/dist/parquetjs/parquet-thrift/NullType.d.ts +1 -1
  435. package/dist/parquetjs/parquet-thrift/NullType.d.ts.map +1 -1
  436. package/dist/parquetjs/parquet-thrift/NullType.js +1 -1
  437. package/dist/parquetjs/parquet-thrift/NullType.js.map +1 -1
  438. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts +1 -1
  439. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts.map +1 -1
  440. package/dist/parquetjs/parquet-thrift/OffsetIndex.js +1 -1
  441. package/dist/parquetjs/parquet-thrift/OffsetIndex.js.map +1 -1
  442. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts +1 -1
  443. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts.map +1 -1
  444. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js +1 -1
  445. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js.map +1 -1
  446. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts +1 -1
  447. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts.map +1 -1
  448. package/dist/parquetjs/parquet-thrift/PageHeader.js +1 -1
  449. package/dist/parquetjs/parquet-thrift/PageHeader.js.map +1 -1
  450. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts +2 -2
  451. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts.map +1 -1
  452. package/dist/parquetjs/parquet-thrift/PageLocation.js +2 -2
  453. package/dist/parquetjs/parquet-thrift/PageLocation.js.map +1 -1
  454. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts +2 -2
  455. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts.map +1 -1
  456. package/dist/parquetjs/parquet-thrift/RowGroup.js +2 -2
  457. package/dist/parquetjs/parquet-thrift/RowGroup.js.map +1 -1
  458. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts +1 -1
  459. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts.map +1 -1
  460. package/dist/parquetjs/parquet-thrift/SchemaElement.js +1 -1
  461. package/dist/parquetjs/parquet-thrift/SchemaElement.js.map +1 -1
  462. package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts +26 -0
  463. package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts.map +1 -0
  464. package/dist/parquetjs/parquet-thrift/SizeStatistics.js +85 -0
  465. package/dist/parquetjs/parquet-thrift/SizeStatistics.js.map +1 -0
  466. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts +1 -1
  467. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts.map +1 -1
  468. package/dist/parquetjs/parquet-thrift/SortingColumn.js +1 -1
  469. package/dist/parquetjs/parquet-thrift/SortingColumn.js.map +1 -1
  470. package/dist/parquetjs/parquet-thrift/Statistics.d.ts +14 -10
  471. package/dist/parquetjs/parquet-thrift/Statistics.d.ts.map +1 -1
  472. package/dist/parquetjs/parquet-thrift/Statistics.js +38 -2
  473. package/dist/parquetjs/parquet-thrift/Statistics.js.map +1 -1
  474. package/dist/parquetjs/parquet-thrift/StringType.d.ts +1 -1
  475. package/dist/parquetjs/parquet-thrift/StringType.d.ts.map +1 -1
  476. package/dist/parquetjs/parquet-thrift/StringType.js +1 -1
  477. package/dist/parquetjs/parquet-thrift/StringType.js.map +1 -1
  478. package/dist/parquetjs/parquet-thrift/TimeType.d.ts +1 -1
  479. package/dist/parquetjs/parquet-thrift/TimeType.d.ts.map +1 -1
  480. package/dist/parquetjs/parquet-thrift/TimeType.js +1 -1
  481. package/dist/parquetjs/parquet-thrift/TimeType.js.map +1 -1
  482. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts +5 -1
  483. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts.map +1 -1
  484. package/dist/parquetjs/parquet-thrift/TimeUnit.js +25 -1
  485. package/dist/parquetjs/parquet-thrift/TimeUnit.js.map +1 -1
  486. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts +1 -1
  487. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts.map +1 -1
  488. package/dist/parquetjs/parquet-thrift/TimestampType.js +1 -1
  489. package/dist/parquetjs/parquet-thrift/TimestampType.js.map +1 -1
  490. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts +1 -1
  491. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts.map +1 -1
  492. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js +1 -1
  493. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js.map +1 -1
  494. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts +1 -1
  495. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts.map +1 -1
  496. package/dist/parquetjs/parquet-thrift/UUIDType.js +1 -1
  497. package/dist/parquetjs/parquet-thrift/UUIDType.js.map +1 -1
  498. package/dist/parquetjs/parquet-thrift/VariantType.d.ts +11 -0
  499. package/dist/parquetjs/parquet-thrift/VariantType.d.ts.map +1 -0
  500. package/dist/parquetjs/parquet-thrift/VariantType.js +41 -0
  501. package/dist/parquetjs/parquet-thrift/VariantType.js.map +1 -0
  502. package/dist/parquetjs/parquet-thrift/index.d.ts +12 -2
  503. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  504. package/dist/parquetjs/parquet-thrift/index.js +12 -2
  505. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  506. package/dist/parquetjs/parser/decoders.d.ts +23 -3
  507. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  508. package/dist/parquetjs/parser/decoders.js +687 -119
  509. package/dist/parquetjs/parser/decoders.js.map +1 -1
  510. package/dist/parquetjs/parser/encoded-pages.d.ts +24 -0
  511. package/dist/parquetjs/parser/encoded-pages.d.ts.map +1 -0
  512. package/dist/parquetjs/parser/encoded-pages.js +206 -0
  513. package/dist/parquetjs/parser/encoded-pages.js.map +1 -0
  514. package/dist/parquetjs/parser/parquet-reader.d.ts +111 -10
  515. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  516. package/dist/parquetjs/parser/parquet-reader.js +836 -69
  517. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  518. package/dist/parquetjs/schema/declare.d.ts +83 -10
  519. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  520. package/dist/parquetjs/schema/declare.js.map +1 -1
  521. package/dist/parquetjs/schema/schema.d.ts +3 -0
  522. package/dist/parquetjs/schema/schema.d.ts.map +1 -1
  523. package/dist/parquetjs/schema/schema.js +31 -3
  524. package/dist/parquetjs/schema/schema.js.map +1 -1
  525. package/dist/parquetjs/schema/shred.d.ts +2 -0
  526. package/dist/parquetjs/schema/shred.d.ts.map +1 -1
  527. package/dist/parquetjs/schema/shred.js +285 -29
  528. package/dist/parquetjs/schema/shred.js.map +1 -1
  529. package/dist/parquetjs/schema/types.d.ts.map +1 -1
  530. package/dist/parquetjs/schema/types.js +290 -71
  531. package/dist/parquetjs/schema/types.js.map +1 -1
  532. package/dist/parquetjs/schema/variant.d.ts +3 -0
  533. package/dist/parquetjs/schema/variant.d.ts.map +1 -0
  534. package/dist/parquetjs/schema/variant.js +248 -0
  535. package/dist/parquetjs/schema/variant.js.map +1 -0
  536. package/dist/parquetjs/utils/binary-utils.d.ts +41 -0
  537. package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
  538. package/dist/parquetjs/utils/binary-utils.js +106 -0
  539. package/dist/parquetjs/utils/binary-utils.js.map +1 -0
  540. package/dist/parquetjs/utils/crc32.d.ts +3 -0
  541. package/dist/parquetjs/utils/crc32.d.ts.map +1 -0
  542. package/dist/parquetjs/utils/crc32.js +15 -0
  543. package/dist/parquetjs/utils/crc32.js.map +1 -0
  544. package/dist/parquetjs/utils/file-utils.d.ts +1 -1
  545. package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
  546. package/dist/parquetjs/utils/file-utils.js +3 -3
  547. package/dist/parquetjs/utils/file-utils.js.map +1 -1
  548. package/dist/parquetjs/utils/read-utils.d.ts +25 -7
  549. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  550. package/dist/parquetjs/utils/read-utils.js +66 -39
  551. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  552. package/dist/parquetjs/utils/thrift-runtime.d.ts +106 -0
  553. package/dist/parquetjs/utils/thrift-runtime.d.ts.map +1 -0
  554. package/dist/parquetjs/utils/thrift-runtime.js +50 -0
  555. package/dist/parquetjs/utils/thrift-runtime.js.map +1 -0
  556. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
  557. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
  558. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
  559. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
  560. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +80 -0
  561. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
  562. package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
  563. package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
  564. package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
  565. package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
  566. package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
  567. package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
  568. package/dist/polyfills/process.d.ts +12 -0
  569. package/dist/polyfills/process.d.ts.map +1 -0
  570. package/dist/polyfills/process.js +17 -0
  571. package/dist/polyfills/process.js.map +1 -0
  572. package/dist/unbundled.d.ts +10 -0
  573. package/dist/unbundled.d.ts.map +1 -0
  574. package/dist/unbundled.js +11 -0
  575. package/dist/unbundled.js.map +1 -0
  576. package/dist/wasm.d.ts +3 -0
  577. package/dist/wasm.d.ts.map +1 -0
  578. package/dist/wasm.js +6 -0
  579. package/dist/wasm.js.map +1 -0
  580. package/dist/workers/parquet-source-worker.d.ts +2 -0
  581. package/dist/workers/parquet-source-worker.d.ts.map +1 -0
  582. package/dist/workers/parquet-source-worker.js +17 -0
  583. package/dist/workers/parquet-source-worker.js.map +1 -0
  584. package/dist/workers/parquet-worker-node.d.ts +2 -0
  585. package/dist/workers/parquet-worker-node.d.ts.map +1 -0
  586. package/dist/workers/parquet-worker-node.js +5 -0
  587. package/dist/workers/parquet-worker-node.js.map +1 -0
  588. package/dist/workers/parquet-worker.d.ts +2 -0
  589. package/dist/workers/parquet-worker.d.ts.map +1 -0
  590. package/dist/workers/parquet-worker.js +27 -0
  591. package/dist/workers/parquet-worker.js.map +1 -0
  592. package/package.json +84 -40
  593. package/src/bundled.ts +43 -0
  594. package/src/delta-format.ts +12 -0
  595. package/src/delta-source-loader-types.ts +40 -0
  596. package/src/delta-source.ts +305 -0
  597. package/src/delta-types.ts +40 -0
  598. package/src/geoparquet-loader-with-parser.ts +95 -0
  599. package/src/geoparquet-loader.ts +54 -0
  600. package/src/iceberg-rest-catalog.ts +122 -0
  601. package/src/iceberg-table-source.ts +1037 -0
  602. package/src/iceberg-types.ts +165 -0
  603. package/src/index.ts +105 -26
  604. package/src/lib/arrow/convert-columns-to-row-group.ts +3 -0
  605. package/src/lib/arrow/convert-schema-from-parquet.ts +193 -32
  606. package/src/lib/arrow/convert-schema-to-parquet.ts +16 -7
  607. package/src/lib/arrow/create-nested-arrow-vector.ts +705 -0
  608. package/src/lib/constants.ts +0 -2
  609. package/src/lib/encoders/encode-arrow-to-parquet.ts +10 -16
  610. package/src/lib/encoders/encode-table-to-parquet-js.ts +526 -0
  611. package/src/lib/geo/geoparquet-covering.ts +201 -0
  612. package/src/lib/geo/geospatial-metadata.ts +547 -0
  613. package/src/lib/parquet-bloom-filter-planner.ts +86 -0
  614. package/src/lib/parquet-bloom-filter.ts +345 -0
  615. package/src/lib/parquet-encryption.ts +344 -0
  616. package/src/lib/parquet-page-index.ts +727 -0
  617. package/src/lib/parquet-predicate.ts +410 -0
  618. package/src/lib/parquet-source-worker-client.ts +41 -0
  619. package/src/lib/parquet-source-worker-decoder.ts +252 -0
  620. package/src/lib/parquet-source-worker-file.ts +56 -0
  621. package/src/lib/parquet-source-worker-types.ts +132 -0
  622. package/src/lib/parquet-worker-transport.ts +57 -0
  623. package/src/lib/parsers/convert-parquet-tables.ts +39 -0
  624. package/src/lib/parsers/get-parquet-schema.ts +6 -2
  625. package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
  626. package/src/lib/parsers/parse-parquet-tables.ts +82 -0
  627. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +1213 -0
  628. package/src/lib/parsers/parse-parquet-to-arrow.ts +62 -36
  629. package/src/lib/parsers/parse-parquet-to-columns.ts +9 -8
  630. package/src/lib/parsers/parse-parquet-to-json.ts +119 -35
  631. package/src/lib/slice-parquet-batch.ts +32 -0
  632. package/src/lib/sources/parquet-range-file.ts +365 -0
  633. package/src/lib/sources/single-batch-queue.ts +95 -0
  634. package/src/lib/utils/load-wasm-node.ts +25 -0
  635. package/src/lib/utils/load-wasm.ts +36 -13
  636. package/src/lib/utils/make-stream-iterator.ts +126 -14
  637. package/src/lib/utils/normalize-parquet-options.ts +30 -0
  638. package/src/parquet-dataset-source.ts +800 -0
  639. package/src/parquet-encoded-page-types.ts +122 -0
  640. package/src/parquet-format.ts +2 -0
  641. package/src/parquet-js-loader-types.ts +53 -0
  642. package/src/parquet-js-loader.ts +76 -19
  643. package/src/parquet-js-writer.ts +98 -0
  644. package/src/parquet-loader-base.ts +34 -0
  645. package/src/parquet-loader-options.ts +62 -0
  646. package/src/parquet-loader-types.ts +35 -0
  647. package/src/parquet-loader.ts +115 -0
  648. package/src/parquet-source-capabilities.ts +73 -0
  649. package/src/parquet-source-loader-types.ts +97 -0
  650. package/src/parquet-source-loader.ts +2254 -0
  651. package/src/parquet-source-types.ts +627 -0
  652. package/src/parquet-source-worker-factory.ts +8 -0
  653. package/src/parquet-source-worker-url.ts +23 -0
  654. package/src/parquet-worker-url.ts +23 -0
  655. package/src/parquet-writer.ts +42 -0
  656. package/src/parquetjs/LICENSE +23 -1
  657. package/src/parquetjs/codecs/byte-stream-split.ts +221 -0
  658. package/src/parquetjs/codecs/declare.ts +62 -3
  659. package/src/parquetjs/codecs/delta.ts +1047 -0
  660. package/src/parquetjs/codecs/dictionary.ts +22 -4
  661. package/src/parquetjs/codecs/index.ts +22 -0
  662. package/src/parquetjs/codecs/plain.ts +317 -89
  663. package/src/parquetjs/codecs/rle.ts +852 -82
  664. package/src/parquetjs/compression.ts +137 -156
  665. package/src/parquetjs/encoder/dictionary-planner.ts +104 -0
  666. package/src/parquetjs/encoder/page-planner.ts +83 -0
  667. package/src/parquetjs/encoder/parquet-encoder.ts +1374 -95
  668. package/src/parquetjs/parquet-thrift/BoundingBox.ts +108 -0
  669. package/src/parquetjs/parquet-thrift/BsonType.ts +1 -1
  670. package/src/parquetjs/parquet-thrift/ColumnChunk.ts +37 -2
  671. package/src/parquetjs/parquet-thrift/ColumnCryptoMetaData.ts +139 -0
  672. package/src/parquetjs/parquet-thrift/ColumnIndex.ts +13 -13
  673. package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +75 -2
  674. package/src/parquetjs/parquet-thrift/ColumnOrder.ts +1 -1
  675. package/src/parquetjs/parquet-thrift/DataPageHeader.ts +1 -1
  676. package/src/parquetjs/parquet-thrift/DataPageHeaderV2.ts +1 -1
  677. package/src/parquetjs/parquet-thrift/DateType.ts +1 -1
  678. package/src/parquetjs/parquet-thrift/DecimalType.ts +1 -1
  679. package/src/parquetjs/parquet-thrift/DictionaryPageHeader.ts +1 -1
  680. package/src/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.ts +13 -0
  681. package/src/parquetjs/parquet-thrift/Encoding.ts +2 -1
  682. package/src/parquetjs/parquet-thrift/EncryptionAlgorithm.ts +127 -0
  683. package/src/parquetjs/parquet-thrift/EnumType.ts +1 -1
  684. package/src/parquetjs/parquet-thrift/FileCryptoMetaData.ts +60 -0
  685. package/src/parquetjs/parquet-thrift/FileMetaData.ts +37 -2
  686. package/src/parquetjs/parquet-thrift/Float16Type.ts +28 -0
  687. package/src/parquetjs/parquet-thrift/GeographyType.ts +54 -0
  688. package/src/parquetjs/parquet-thrift/GeometryType.ts +43 -0
  689. package/src/parquetjs/parquet-thrift/GeospatialStatistics.ts +68 -0
  690. package/src/parquetjs/parquet-thrift/IndexPageHeader.ts +1 -1
  691. package/src/parquetjs/parquet-thrift/IntType.ts +1 -1
  692. package/src/parquetjs/parquet-thrift/JsonType.ts +1 -1
  693. package/src/parquetjs/parquet-thrift/KeyValue.ts +1 -1
  694. package/src/parquetjs/parquet-thrift/ListType.ts +1 -1
  695. package/src/parquetjs/parquet-thrift/LogicalType.ts +97 -1
  696. package/src/parquetjs/parquet-thrift/MapType.ts +1 -1
  697. package/src/parquetjs/parquet-thrift/MicroSeconds.ts +1 -1
  698. package/src/parquetjs/parquet-thrift/MilliSeconds.ts +1 -1
  699. package/src/parquetjs/parquet-thrift/NanoSeconds.ts +28 -0
  700. package/src/parquetjs/parquet-thrift/NullType.ts +1 -1
  701. package/src/parquetjs/parquet-thrift/OffsetIndex.ts +1 -1
  702. package/src/parquetjs/parquet-thrift/PageEncodingStats.ts +1 -1
  703. package/src/parquetjs/parquet-thrift/PageHeader.ts +1 -1
  704. package/src/parquetjs/parquet-thrift/PageLocation.ts +2 -2
  705. package/src/parquetjs/parquet-thrift/RowGroup.ts +2 -2
  706. package/src/parquetjs/parquet-thrift/SchemaElement.ts +1 -1
  707. package/src/parquetjs/parquet-thrift/SizeStatistics.ts +98 -0
  708. package/src/parquetjs/parquet-thrift/SortingColumn.ts +1 -1
  709. package/src/parquetjs/parquet-thrift/Statistics.ts +50 -14
  710. package/src/parquetjs/parquet-thrift/StringType.ts +1 -1
  711. package/src/parquetjs/parquet-thrift/TimeType.ts +1 -1
  712. package/src/parquetjs/parquet-thrift/TimeUnit.ts +25 -1
  713. package/src/parquetjs/parquet-thrift/TimestampType.ts +1 -1
  714. package/src/parquetjs/parquet-thrift/TypeDefinedOrder.ts +1 -1
  715. package/src/parquetjs/parquet-thrift/UUIDType.ts +1 -1
  716. package/src/parquetjs/parquet-thrift/VariantType.ts +43 -0
  717. package/src/parquetjs/parquet-thrift/index.ts +12 -4
  718. package/src/parquetjs/parser/decoders.ts +922 -143
  719. package/src/parquetjs/parser/encoded-pages.ts +278 -0
  720. package/src/parquetjs/parser/parquet-reader.ts +1334 -83
  721. package/src/parquetjs/schema/declare.ts +121 -9
  722. package/src/parquetjs/schema/schema.ts +33 -3
  723. package/src/parquetjs/schema/shred.ts +345 -41
  724. package/src/parquetjs/schema/types.ts +308 -84
  725. package/src/parquetjs/schema/variant.ts +313 -0
  726. package/src/parquetjs/utils/binary-utils.ts +132 -0
  727. package/src/parquetjs/utils/crc32.ts +15 -0
  728. package/src/parquetjs/utils/file-utils.ts +4 -4
  729. package/src/parquetjs/utils/read-utils.ts +77 -51
  730. package/src/parquetjs/utils/thrift-runtime.ts +109 -0
  731. package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
  732. package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
  733. package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
  734. package/src/polyfills/process.ts +17 -0
  735. package/src/unbundled.ts +47 -0
  736. package/src/wasm.ts +6 -0
  737. package/src/workers/parquet-source-worker.ts +21 -0
  738. package/src/workers/parquet-worker-node.ts +5 -0
  739. package/src/workers/parquet-worker.ts +31 -0
  740. package/dist/parquet-arrow-loader.d.ts +0 -43
  741. package/dist/parquet-arrow-loader.d.ts.map +0 -1
  742. package/dist/parquet-arrow-loader.js +0 -49
  743. package/dist/parquet-arrow-loader.js.map +0 -1
  744. package/dist/parquet-arrow-writer.d.ts +0 -9
  745. package/dist/parquet-arrow-writer.d.ts.map +0 -1
  746. package/dist/parquet-arrow-writer.js +0 -23
  747. package/dist/parquet-arrow-writer.js.map +0 -1
  748. package/dist/parquet-json-loader.d.ts +0 -148
  749. package/dist/parquet-json-loader.d.ts.map +0 -1
  750. package/dist/parquet-json-loader.js +0 -106
  751. package/dist/parquet-json-loader.js.map +0 -1
  752. package/dist/parquet-json-writer.d.ts +0 -19
  753. package/dist/parquet-json-writer.d.ts.map +0 -1
  754. package/dist/parquet-json-writer.js +0 -20
  755. package/dist/parquet-json-writer.js.map +0 -1
  756. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
  757. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
  758. package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
  759. package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
  760. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
  761. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
  762. package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
  763. package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
  764. package/dist/polyfills/buffer/buffer.d.ts +0 -222
  765. package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
  766. package/dist/polyfills/buffer/buffer.js +0 -1868
  767. package/dist/polyfills/buffer/buffer.js.map +0 -1
  768. package/dist/polyfills/buffer/index.d.ts +0 -4
  769. package/dist/polyfills/buffer/index.d.ts.map +0 -1
  770. package/dist/polyfills/buffer/index.js +0 -9
  771. package/dist/polyfills/buffer/index.js.map +0 -1
  772. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
  773. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
  774. package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
  775. package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
  776. package/dist/workers/parquet-json-worker.d.ts +0 -2
  777. package/dist/workers/parquet-json-worker.d.ts.map +0 -1
  778. package/dist/workers/parquet-json-worker.js +0 -7
  779. package/dist/workers/parquet-json-worker.js.map +0 -1
  780. package/src/parquet-arrow-loader.ts +0 -74
  781. package/src/parquet-arrow-writer.ts +0 -33
  782. package/src/parquet-json-loader.ts +0 -160
  783. package/src/parquet-json-writer.ts +0 -27
  784. package/src/parquetjs/modules.d.ts +0 -25
  785. package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
  786. package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
  787. package/src/polyfills/buffer/buffer.ts +0 -2205
  788. package/src/polyfills/buffer/index.ts +0 -11
  789. package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
  790. package/src/workers/parquet-json-worker.ts +0 -8
@@ -5,15 +5,20 @@
5
5
  // Forked from https://github.com/kbajalc/parquets under MIT license
6
6
 
7
7
  import type {PrimitiveType} from '../schema/declare';
8
- import type {CursorBuffer, ParquetCodecOptions} from './declare';
9
- import varint from 'varint';
8
+ import {
9
+ getParquetValueOutput,
10
+ type CursorBuffer,
11
+ type ParquetCodecOptions,
12
+ type ParquetValueBuffer
13
+ } from './declare';
14
+ import {concatUint8Arrays, writeUInt32LE} from '../utils/binary-utils';
10
15
 
11
16
  // eslint-disable-next-line max-statements, complexity
12
17
  export function encodeValues(
13
18
  type: PrimitiveType,
14
19
  values: any[],
15
20
  opts: ParquetCodecOptions
16
- ): Buffer {
21
+ ): Uint8Array {
17
22
  if (!('bitWidth' in opts)) {
18
23
  throw new Error('bitWidth is required');
19
24
  }
@@ -23,14 +28,14 @@ export function encodeValues(
23
28
  case 'INT32':
24
29
  case 'INT64':
25
30
  // tslint:disable-next-line:no-parameter-reassignment
26
- values = values.map((x) => parseInt(x, 10));
31
+ values = values.map(x => parseInt(x, 10));
27
32
  break;
28
33
 
29
34
  default:
30
35
  throw new Error(`unsupported type: ${type}`);
31
36
  }
32
37
 
33
- let buf = Buffer.alloc(0);
38
+ const buffers: Uint8Array[] = [];
34
39
  let run: any[] = [];
35
40
  let repeats = 0;
36
41
 
@@ -40,7 +45,7 @@ export function encodeValues(
40
45
  if (repeats === 0 && run.length % 8 === 0 && values[i] === values[i + 1]) {
41
46
  // If we have any data in runs we need to encode them
42
47
  if (run.length) {
43
- buf = Buffer.concat([buf, encodeRunBitpacked(run, opts)] as Uint8Array[]);
48
+ buffers.push(encodeRunBitpacked(run, opts));
44
49
  run = [];
45
50
  }
46
51
  repeats = 1;
@@ -49,7 +54,7 @@ export function encodeValues(
49
54
  } else {
50
55
  // If values changes we need to post any previous repeated values
51
56
  if (repeats) {
52
- buf = Buffer.concat([buf, encodeRunRepeated(values[i - 1], repeats, opts)] as Uint8Array[]);
57
+ buffers.push(encodeRunRepeated(values[i - 1], repeats, opts));
53
58
  repeats = 0;
54
59
  }
55
60
  run.push(values[i]);
@@ -57,23 +62,19 @@ export function encodeValues(
57
62
  }
58
63
 
59
64
  if (repeats) {
60
- buf = Buffer.concat([
61
- buf,
62
- encodeRunRepeated(values[values.length - 1], repeats, opts)
63
- ] as Uint8Array[]);
65
+ buffers.push(encodeRunRepeated(values[values.length - 1], repeats, opts));
64
66
  } else if (run.length) {
65
- buf = Buffer.concat([buf, encodeRunBitpacked(run, opts)] as Uint8Array[]);
67
+ buffers.push(encodeRunBitpacked(run, opts));
66
68
  }
67
69
 
70
+ const buf = concatUint8Arrays(buffers);
68
71
  if (opts.disableEnvelope) {
69
72
  return buf;
70
73
  }
71
74
 
72
- const envelope = Buffer.alloc(buf.length + 4);
73
-
74
- // @ts-ignore buffer polyfill
75
- envelope.writeUInt32LE(buf.length, undefined);
76
- buf.copy(envelope as Uint8Array, 4);
75
+ const envelope = new Uint8Array(buf.length + 4);
76
+ writeUInt32LE(envelope, buf.length, 0);
77
+ envelope.set(buf, 4);
77
78
 
78
79
  return envelope;
79
80
  }
@@ -82,119 +83,888 @@ export function decodeValues(
82
83
  type: PrimitiveType,
83
84
  cursor: CursorBuffer,
84
85
  count: number,
85
- opts: ParquetCodecOptions
86
- ): number[] {
87
- if (!('bitWidth' in opts)) {
86
+ options: ParquetCodecOptions
87
+ ): ParquetValueBuffer {
88
+ if (!('bitWidth' in options)) {
88
89
  throw new Error('bitWidth is required');
89
90
  }
91
+ const bitWidth = options.bitWidth!;
92
+ if (!Number.isInteger(bitWidth) || bitWidth < 0 || bitWidth > 64) {
93
+ throw new Error(`invalid bit width: ${bitWidth}`);
94
+ }
95
+ if (!Number.isInteger(count) || count < 0) {
96
+ throw new Error(`invalid value count: ${count}`);
97
+ }
90
98
 
91
- if (!opts.disableEnvelope) {
99
+ if (!options.disableEnvelope) {
100
+ assertReadable(cursor, 4);
92
101
  cursor.offset += 4;
93
102
  }
94
103
 
95
- let values: number[] = [];
96
- while (values.length < count) {
97
- const header = varint.decode(cursor.buffer, cursor.offset);
98
- cursor.offset += varint.encodingLength(header);
99
- let decodedValues: number[];
100
- if (header & 1) {
101
- const count = (header >> 1) * 8;
102
- decodedValues = decodeRunBitpacked(cursor, count, opts);
104
+ const {output, outputOffset: initialOutputOffset} = getParquetValueOutput(options, count);
105
+ let outputOffset = 0;
106
+ while (outputOffset < count) {
107
+ const header = readUnsignedVarIntNumber(cursor);
108
+ if (header % 2 === 1) {
109
+ const runValueCount = ((header - 1) / 2) * 8;
110
+ if (runValueCount === 0) {
111
+ throw new Error('invalid RLE bit-packed run length');
112
+ }
113
+ const outputCount = Math.min(runValueCount, count - outputOffset);
114
+ decodeBitPackedRun(
115
+ cursor,
116
+ runValueCount,
117
+ outputCount,
118
+ bitWidth,
119
+ output,
120
+ initialOutputOffset + outputOffset,
121
+ options.dictionary
122
+ );
123
+ outputOffset += outputCount;
103
124
  } else {
104
- const count = header >> 1;
105
- decodedValues = decodeRunRepeated(cursor, count, opts);
125
+ const runValueCount = header / 2;
126
+ if (runValueCount === 0) {
127
+ throw new Error('invalid RLE repeated run length');
128
+ }
129
+ const outputCount = Math.min(runValueCount, count - outputOffset);
130
+ const value = decodeRepeatedRun(cursor, bitWidth);
131
+ const resolvedValue = resolveDictionaryValue(value, options.dictionary);
132
+ fillParquetValueBuffer(
133
+ output,
134
+ resolvedValue,
135
+ initialOutputOffset + outputOffset,
136
+ initialOutputOffset + outputOffset + outputCount
137
+ );
138
+ outputOffset += outputCount;
106
139
  }
140
+ }
141
+
142
+ return output;
143
+ }
107
144
 
108
- // strange failure in docusaurus / webpack if we don't cast the type here
109
- for (const value of decodedValues as any[]) {
110
- values.push(value);
145
+ /** Encodes legacy Parquet BIT_PACKED values, including the optional page length envelope. */
146
+ export function encodeBitPackedValues(
147
+ type: PrimitiveType,
148
+ values: any[],
149
+ options: ParquetCodecOptions
150
+ ): Uint8Array {
151
+ if (!('bitWidth' in options)) {
152
+ throw new Error('bitWidth is required');
153
+ }
154
+ const bitWidth = options.bitWidth!;
155
+ if (!Number.isInteger(bitWidth) || bitWidth < 0 || bitWidth > 32) {
156
+ throw new Error(`invalid bit width: ${bitWidth}`);
157
+ }
158
+ if (type !== 'BOOLEAN' && type !== 'INT32' && type !== 'INT64') {
159
+ throw new Error(`unsupported type: ${type}`);
160
+ }
161
+ const paddedValueCount = Math.ceil(values.length / 8) * 8;
162
+ const encoded = new Uint8Array(Math.ceil((paddedValueCount * bitWidth) / 8));
163
+ for (let valueIndex = 0; valueIndex < values.length; valueIndex++) {
164
+ let value = Number(values[valueIndex]);
165
+ for (let bitIndex = 0; bitIndex < bitWidth; bitIndex++) {
166
+ if (value & (1 << bitIndex)) {
167
+ const packedBit = valueIndex * bitWidth + bitIndex;
168
+ encoded[Math.floor(packedBit / 8)] |= 1 << (packedBit % 8);
169
+ }
111
170
  }
112
171
  }
113
- values = values.slice(0, count);
114
-
115
- if (values.length !== count) {
116
- throw new Error('invalid RLE encoding');
172
+ if (options.disableEnvelope) {
173
+ return encoded;
117
174
  }
118
-
119
- return values;
175
+ const envelope = new Uint8Array(encoded.length + 4);
176
+ writeUInt32LE(envelope, encoded.length, 0);
177
+ envelope.set(encoded, 4);
178
+ return envelope;
120
179
  }
121
180
 
122
- function decodeRunBitpacked(
181
+ /** Decodes legacy Parquet BIT_PACKED values, including the optional page length envelope. */
182
+ export function decodeBitPackedValues(
183
+ type: PrimitiveType,
123
184
  cursor: CursorBuffer,
124
185
  count: number,
125
- opts: ParquetCodecOptions
126
- ): number[] {
127
- // @ts-ignore
128
- const bitWidth: number = opts.bitWidth;
186
+ options: ParquetCodecOptions
187
+ ): ParquetValueBuffer {
188
+ if (!('bitWidth' in options)) {
189
+ throw new Error('bitWidth is required');
190
+ }
191
+ const bitWidth = options.bitWidth!;
192
+ if (!Number.isInteger(bitWidth) || bitWidth < 0 || bitWidth > 64) {
193
+ throw new Error(`invalid bit width: ${bitWidth}`);
194
+ }
195
+ if (!Number.isInteger(count) || count < 0) {
196
+ throw new Error(`invalid value count: ${count}`);
197
+ }
198
+ const envelopeEnd = options.disableEnvelope
199
+ ? undefined
200
+ : (() => {
201
+ assertReadable(cursor, 4);
202
+ const length =
203
+ cursor.buffer[cursor.offset] |
204
+ (cursor.buffer[cursor.offset + 1] << 8) |
205
+ (cursor.buffer[cursor.offset + 2] << 16) |
206
+ (cursor.buffer[cursor.offset + 3] << 24);
207
+ cursor.offset += 4;
208
+ if (length < 0) throw new Error('invalid BIT_PACKED length');
209
+ assertReadable(cursor, length);
210
+ return cursor.offset + length;
211
+ })();
212
+ const paddedValueCount = Math.ceil(count / 8) * 8;
213
+ const packedByteLength = Math.ceil((paddedValueCount * bitWidth) / 8);
214
+ assertReadable(cursor, packedByteLength);
215
+ const {output, outputOffset} = getParquetValueOutput(options, count);
216
+ decodeBitPackedRun(cursor, paddedValueCount, count, bitWidth, output, outputOffset);
217
+ if (envelopeEnd !== undefined) {
218
+ if (cursor.offset > envelopeEnd) throw new Error('invalid BIT_PACKED length');
219
+ cursor.offset = envelopeEnd;
220
+ }
221
+ return output;
222
+ }
129
223
 
130
- if (count % 8 !== 0) {
224
+ /** Decodes one complete bit-packed run directly into the caller's output array. */
225
+ function decodeBitPackedRun(
226
+ cursor: CursorBuffer,
227
+ runValueCount: number,
228
+ outputCount: number,
229
+ bitWidth: number,
230
+ output: ParquetValueBuffer,
231
+ outputOffset: number,
232
+ dictionary?: readonly unknown[]
233
+ ): void {
234
+ if (runValueCount % 8 !== 0) {
131
235
  throw new Error('must be a multiple of 8');
132
236
  }
237
+ const packedByteLength = bitWidth * (runValueCount / 8);
238
+ const packedOffset = cursor.offset;
239
+ const size = cursor.size ?? cursor.buffer.length;
240
+ // Preserve compatibility with files whose malformed final dictionary run omits encoded bytes.
241
+ cursor.offset = Math.min(cursor.offset + packedByteLength, size);
242
+
243
+ if (bitWidth === 0) {
244
+ const resolvedValue = resolveDictionaryValue(0, dictionary);
245
+ fillParquetValueBuffer(output, resolvedValue, outputOffset, outputOffset + outputCount);
246
+ return;
247
+ }
248
+ if (bitWidth <= 24) {
249
+ decodeUint32BitPackedRun(
250
+ cursor.buffer,
251
+ packedOffset,
252
+ outputCount,
253
+ bitWidth,
254
+ output,
255
+ outputOffset,
256
+ dictionary
257
+ );
258
+ return;
259
+ }
260
+ if (bitWidth <= 45) {
261
+ decodeNumberBitPackedRun(
262
+ cursor.buffer,
263
+ packedOffset,
264
+ outputCount,
265
+ bitWidth,
266
+ output,
267
+ outputOffset,
268
+ dictionary
269
+ );
270
+ return;
271
+ }
272
+
273
+ const bitWidthBigInt = BigInt(bitWidth);
274
+ const mask = (1n << bitWidthBigInt) - 1n;
275
+ let packedBits = 0n;
276
+ let packedBitCount = 0;
277
+ let byteOffset = packedOffset;
278
+ for (let valueIndex = 0; valueIndex < outputCount; valueIndex++) {
279
+ while (packedBitCount < bitWidth) {
280
+ packedBits |= BigInt(cursor.buffer[byteOffset++] ?? 0) << BigInt(packedBitCount);
281
+ packedBitCount += 8;
282
+ }
283
+ const value = Number(packedBits & mask);
284
+ output[outputOffset + valueIndex] = resolveDictionaryValue(value, dictionary);
285
+ packedBits >>= bitWidthBigInt;
286
+ packedBitCount -= bitWidth;
287
+ }
288
+ }
289
+
290
+ /** Fills a decoder destination while preserving bigint typed-array semantics. */
291
+ function fillParquetValueBuffer(
292
+ output: ParquetValueBuffer,
293
+ value: unknown,
294
+ start: number,
295
+ end: number
296
+ ): void {
297
+ if (output instanceof BigInt64Array) {
298
+ output.fill(typeof value === 'bigint' ? value : BigInt(value as number), start, end);
299
+ return;
300
+ }
301
+ if (Array.isArray(output)) {
302
+ // Array#fill cannot grow a boxed destination when column metadata omitted its value count.
303
+ // Indexed writes grow those same destinations in the bit-packed path; run fills must too.
304
+ if (output.length < end) output.length = end;
305
+ output.fill(value, start, end);
306
+ return;
307
+ }
308
+ output.fill(Number(value), start, end);
309
+ }
310
+
311
+ /** Decodes common narrow bit widths with a fast 32-bit reservoir. */
312
+ function decodeUint32BitPackedRun(
313
+ buffer: Uint8Array,
314
+ packedOffset: number,
315
+ count: number,
316
+ bitWidth: number,
317
+ output: ParquetValueBuffer,
318
+ outputOffset: number,
319
+ dictionary?: readonly unknown[]
320
+ ): void {
321
+ if (!dictionary && bitWidth <= 4) {
322
+ decodeNarrowUnsignedBitPackedRun(buffer, packedOffset, count, bitWidth, output, outputOffset);
323
+ return;
324
+ }
325
+ if (dictionary && bitWidth <= 4) {
326
+ decodeNarrowDictionaryBitPackedRun(
327
+ buffer,
328
+ packedOffset,
329
+ count,
330
+ bitWidth,
331
+ output,
332
+ outputOffset,
333
+ dictionary
334
+ );
335
+ return;
336
+ }
337
+ if (dictionary && bitWidth === 10) {
338
+ decode10BitDictionaryRun(buffer, packedOffset, count, output, outputOffset, dictionary);
339
+ return;
340
+ }
341
+ if (dictionary && bitWidth === 12) {
342
+ decode12BitDictionaryRun(buffer, packedOffset, count, output, outputOffset, dictionary);
343
+ return;
344
+ }
345
+ if (bitWidth === 8) {
346
+ if (dictionary) {
347
+ for (let valueIndex = 0; valueIndex < count; valueIndex++) {
348
+ const value = buffer[packedOffset + valueIndex] ?? 0;
349
+ if (value >= dictionary.length) {
350
+ throw new Error(`Invalid Parquet dictionary index ${value}`);
351
+ }
352
+ output[outputOffset + valueIndex] = dictionary[value];
353
+ }
354
+ return;
355
+ }
356
+ for (let valueIndex = 0; valueIndex < count; valueIndex++) {
357
+ output[outputOffset + valueIndex] = buffer[packedOffset + valueIndex] ?? 0;
358
+ }
359
+ return;
360
+ }
361
+
362
+ const mask = 2 ** bitWidth - 1;
363
+ let packedBits = 0;
364
+ let packedBitCount = 0;
365
+ let byteOffset = packedOffset;
366
+ if (dictionary) {
367
+ for (let valueIndex = 0; valueIndex < count; valueIndex++) {
368
+ while (packedBitCount < bitWidth) {
369
+ packedBits |= (buffer[byteOffset++] ?? 0) << packedBitCount;
370
+ packedBitCount += 8;
371
+ }
372
+ const value = packedBits & mask;
373
+ if (value >= dictionary.length) {
374
+ throw new Error(`Invalid Parquet dictionary index ${value}`);
375
+ }
376
+ output[outputOffset + valueIndex] = dictionary[value];
377
+ packedBits >>>= bitWidth;
378
+ packedBitCount -= bitWidth;
379
+ }
380
+ return;
381
+ }
382
+ for (let valueIndex = 0; valueIndex < count; valueIndex++) {
383
+ while (packedBitCount < bitWidth) {
384
+ packedBits |= (buffer[byteOffset++] ?? 0) << packedBitCount;
385
+ packedBitCount += 8;
386
+ }
387
+ const value = packedBits & mask;
388
+ output[outputOffset + valueIndex] = value;
389
+ packedBits >>>= bitWidth;
390
+ packedBitCount -= bitWidth;
391
+ }
392
+ }
133
393
 
134
- // tslint:disable-next-line:prefer-array-literal
135
- const values = new Array(count).fill(0);
136
- for (let b = 0; b < bitWidth * count; b++) {
137
- if (cursor.buffer[cursor.offset + Math.floor(b / 8)] & (1 << (b % 8))) {
138
- values[Math.floor(b / bitWidth)] |= 1 << (b % bitWidth);
394
+ /** Decodes complete groups of eight narrow unsigned values without a per-value reservoir. */
395
+ function decodeNarrowUnsignedBitPackedRun(
396
+ buffer: Uint8Array,
397
+ packedOffset: number,
398
+ count: number,
399
+ bitWidth: number,
400
+ output: ParquetValueBuffer,
401
+ outputOffset: number
402
+ ): void {
403
+ if (bitWidth === 1) {
404
+ decode1BitUnsignedRun(buffer, packedOffset, count, output, outputOffset);
405
+ return;
406
+ }
407
+ if (bitWidth === 2) {
408
+ decode2BitUnsignedRun(buffer, packedOffset, count, output, outputOffset);
409
+ return;
410
+ }
411
+ const mask = 2 ** bitWidth - 1;
412
+ let byteOffset = packedOffset;
413
+ let valueIndex = 0;
414
+ while (valueIndex < count) {
415
+ const packedBits =
416
+ (buffer[byteOffset] ?? 0) |
417
+ ((buffer[byteOffset + 1] ?? 0) << 8) |
418
+ ((buffer[byteOffset + 2] ?? 0) << 16) |
419
+ ((buffer[byteOffset + 3] ?? 0) << 24);
420
+ const groupValueCount = Math.min(8, count - valueIndex);
421
+ for (let groupIndex = 0; groupIndex < groupValueCount; groupIndex++) {
422
+ output[outputOffset + valueIndex + groupIndex] =
423
+ (packedBits >>> (groupIndex * bitWidth)) & mask;
139
424
  }
425
+ byteOffset += bitWidth;
426
+ valueIndex += groupValueCount;
140
427
  }
428
+ }
141
429
 
142
- cursor.offset += bitWidth * (count / 8);
143
- return values;
430
+ /** Expands byte-aligned groups of eight one-bit level values. */
431
+ function decode1BitUnsignedRun(
432
+ buffer: Uint8Array,
433
+ packedOffset: number,
434
+ count: number,
435
+ output: ParquetValueBuffer,
436
+ outputOffset: number
437
+ ): void {
438
+ let byteOffset = packedOffset;
439
+ let valueIndex = 0;
440
+ while (valueIndex + 8 <= count) {
441
+ const packedBits = buffer[byteOffset++] ?? 0;
442
+ output[outputOffset + valueIndex] = packedBits & 1;
443
+ output[outputOffset + valueIndex + 1] = (packedBits >>> 1) & 1;
444
+ output[outputOffset + valueIndex + 2] = (packedBits >>> 2) & 1;
445
+ output[outputOffset + valueIndex + 3] = (packedBits >>> 3) & 1;
446
+ output[outputOffset + valueIndex + 4] = (packedBits >>> 4) & 1;
447
+ output[outputOffset + valueIndex + 5] = (packedBits >>> 5) & 1;
448
+ output[outputOffset + valueIndex + 6] = (packedBits >>> 6) & 1;
449
+ output[outputOffset + valueIndex + 7] = packedBits >>> 7;
450
+ valueIndex += 8;
451
+ }
452
+ const packedBits = buffer[byteOffset] ?? 0;
453
+ for (let tailIndex = 0; valueIndex + tailIndex < count; tailIndex++) {
454
+ output[outputOffset + valueIndex + tailIndex] = (packedBits >>> tailIndex) & 1;
455
+ }
144
456
  }
145
457
 
146
- function decodeRunRepeated(
147
- cursor: CursorBuffer,
458
+ /** Expands two-byte groups of eight two-bit level values. */
459
+ function decode2BitUnsignedRun(
460
+ buffer: Uint8Array,
461
+ packedOffset: number,
148
462
  count: number,
149
- opts: ParquetCodecOptions
150
- ): number[] {
151
- // @ts-ignore
152
- const bitWidth: number = opts.bitWidth;
463
+ output: ParquetValueBuffer,
464
+ outputOffset: number
465
+ ): void {
466
+ let byteOffset = packedOffset;
467
+ let valueIndex = 0;
468
+ while (valueIndex + 8 <= count) {
469
+ const packedBits = (buffer[byteOffset] ?? 0) | ((buffer[byteOffset + 1] ?? 0) << 8);
470
+ output[outputOffset + valueIndex] = packedBits & 3;
471
+ output[outputOffset + valueIndex + 1] = (packedBits >>> 2) & 3;
472
+ output[outputOffset + valueIndex + 2] = (packedBits >>> 4) & 3;
473
+ output[outputOffset + valueIndex + 3] = (packedBits >>> 6) & 3;
474
+ output[outputOffset + valueIndex + 4] = (packedBits >>> 8) & 3;
475
+ output[outputOffset + valueIndex + 5] = (packedBits >>> 10) & 3;
476
+ output[outputOffset + valueIndex + 6] = (packedBits >>> 12) & 3;
477
+ output[outputOffset + valueIndex + 7] = (packedBits >>> 14) & 3;
478
+ byteOffset += 2;
479
+ valueIndex += 8;
480
+ }
481
+ const packedBits = (buffer[byteOffset] ?? 0) | ((buffer[byteOffset + 1] ?? 0) << 8);
482
+ for (let tailIndex = 0; valueIndex + tailIndex < count; tailIndex++) {
483
+ output[outputOffset + valueIndex + tailIndex] = (packedBits >>> (tailIndex * 2)) & 3;
484
+ }
485
+ }
486
+
487
+ /** Resolves aligned groups of four 10-bit dictionary indices from five input bytes. */
488
+ function decode10BitDictionaryRun(
489
+ buffer: Uint8Array,
490
+ packedOffset: number,
491
+ count: number,
492
+ output: ParquetValueBuffer,
493
+ outputOffset: number,
494
+ dictionary: readonly unknown[]
495
+ ): void {
496
+ let byteOffset = packedOffset;
497
+ let valueIndex = 0;
498
+ while (valueIndex + 4 <= count) {
499
+ const byte0 = buffer[byteOffset] ?? 0;
500
+ const byte1 = buffer[byteOffset + 1] ?? 0;
501
+ const byte2 = buffer[byteOffset + 2] ?? 0;
502
+ const byte3 = buffer[byteOffset + 3] ?? 0;
503
+ const byte4 = buffer[byteOffset + 4] ?? 0;
504
+ const index0 = byte0 | ((byte1 & 0x03) << 8);
505
+ const index1 = (byte1 >>> 2) | ((byte2 & 0x0f) << 6);
506
+ const index2 = (byte2 >>> 4) | ((byte3 & 0x3f) << 4);
507
+ const index3 = (byte3 >>> 6) | (byte4 << 2);
508
+ if (
509
+ index0 >= dictionary.length ||
510
+ index1 >= dictionary.length ||
511
+ index2 >= dictionary.length ||
512
+ index3 >= dictionary.length
513
+ ) {
514
+ const invalidIndex = [index0, index1, index2, index3].find(
515
+ dictionaryIndex => dictionaryIndex >= dictionary.length
516
+ );
517
+ throw new Error(`Invalid Parquet dictionary index ${invalidIndex}`);
518
+ }
519
+ output[outputOffset + valueIndex] = dictionary[index0];
520
+ output[outputOffset + valueIndex + 1] = dictionary[index1];
521
+ output[outputOffset + valueIndex + 2] = dictionary[index2];
522
+ output[outputOffset + valueIndex + 3] = dictionary[index3];
523
+ byteOffset += 5;
524
+ valueIndex += 4;
525
+ }
526
+ decodeDictionaryBitPackedTail(
527
+ buffer,
528
+ byteOffset,
529
+ count - valueIndex,
530
+ 10,
531
+ output,
532
+ outputOffset + valueIndex,
533
+ dictionary
534
+ );
535
+ }
536
+
537
+ /** Resolves aligned pairs of 12-bit dictionary indices from three input bytes. */
538
+ function decode12BitDictionaryRun(
539
+ buffer: Uint8Array,
540
+ packedOffset: number,
541
+ count: number,
542
+ output: ParquetValueBuffer,
543
+ outputOffset: number,
544
+ dictionary: readonly unknown[]
545
+ ): void {
546
+ let byteOffset = packedOffset;
547
+ let valueIndex = 0;
548
+ while (valueIndex + 2 <= count) {
549
+ const byte0 = buffer[byteOffset] ?? 0;
550
+ const byte1 = buffer[byteOffset + 1] ?? 0;
551
+ const byte2 = buffer[byteOffset + 2] ?? 0;
552
+ const index0 = byte0 | ((byte1 & 0x0f) << 8);
553
+ const index1 = (byte1 >>> 4) | (byte2 << 4);
554
+ if (index0 >= dictionary.length || index1 >= dictionary.length) {
555
+ const invalidIndex = index0 >= dictionary.length ? index0 : index1;
556
+ throw new Error(`Invalid Parquet dictionary index ${invalidIndex}`);
557
+ }
558
+ output[outputOffset + valueIndex] = dictionary[index0];
559
+ output[outputOffset + valueIndex + 1] = dictionary[index1];
560
+ byteOffset += 3;
561
+ valueIndex += 2;
562
+ }
563
+ decodeDictionaryBitPackedTail(
564
+ buffer,
565
+ byteOffset,
566
+ count - valueIndex,
567
+ 12,
568
+ output,
569
+ outputOffset + valueIndex,
570
+ dictionary
571
+ );
572
+ }
573
+
574
+ /** Resolves the byte-aligned remainder after a fixed-width dictionary group. */
575
+ function decodeDictionaryBitPackedTail(
576
+ buffer: Uint8Array,
577
+ packedOffset: number,
578
+ count: number,
579
+ bitWidth: number,
580
+ output: ParquetValueBuffer,
581
+ outputOffset: number,
582
+ dictionary: readonly unknown[]
583
+ ): void {
584
+ const mask = 2 ** bitWidth - 1;
585
+ let packedBits = 0;
586
+ let packedBitCount = 0;
587
+ let byteOffset = packedOffset;
588
+ for (let valueIndex = 0; valueIndex < count; valueIndex++) {
589
+ while (packedBitCount < bitWidth) {
590
+ packedBits |= (buffer[byteOffset++] ?? 0) << packedBitCount;
591
+ packedBitCount += 8;
592
+ }
593
+ const dictionaryIndex = packedBits & mask;
594
+ if (dictionaryIndex >= dictionary.length) {
595
+ throw new Error(`Invalid Parquet dictionary index ${dictionaryIndex}`);
596
+ }
597
+ output[outputOffset + valueIndex] = dictionary[dictionaryIndex];
598
+ packedBits >>>= bitWidth;
599
+ packedBitCount -= bitWidth;
600
+ }
601
+ }
602
+
603
+ /** Resolves complete groups of eight narrow dictionary indices without a per-value reservoir. */
604
+ function decodeNarrowDictionaryBitPackedRun(
605
+ buffer: Uint8Array,
606
+ packedOffset: number,
607
+ count: number,
608
+ bitWidth: number,
609
+ output: ParquetValueBuffer,
610
+ outputOffset: number,
611
+ dictionary: readonly unknown[]
612
+ ): void {
613
+ if (bitWidth === 1) {
614
+ decode1BitDictionaryRun(buffer, packedOffset, count, output, outputOffset, dictionary);
615
+ return;
616
+ }
617
+ if (bitWidth === 2) {
618
+ decode2BitDictionaryRun(buffer, packedOffset, count, output, outputOffset, dictionary);
619
+ return;
620
+ }
621
+ if (bitWidth === 3) {
622
+ decode3BitDictionaryRun(buffer, packedOffset, count, output, outputOffset, dictionary);
623
+ return;
624
+ }
625
+ if (bitWidth === 4) {
626
+ decode4BitDictionaryRun(buffer, packedOffset, count, output, outputOffset, dictionary);
627
+ return;
628
+ }
629
+ const mask = 2 ** bitWidth - 1;
630
+ let byteOffset = packedOffset;
631
+ let valueIndex = 0;
632
+ while (valueIndex < count) {
633
+ const packedBits =
634
+ (buffer[byteOffset] ?? 0) |
635
+ ((buffer[byteOffset + 1] ?? 0) << 8) |
636
+ ((buffer[byteOffset + 2] ?? 0) << 16) |
637
+ ((buffer[byteOffset + 3] ?? 0) << 24);
638
+ const groupValueCount = Math.min(8, count - valueIndex);
639
+ for (let groupIndex = 0; groupIndex < groupValueCount; groupIndex++) {
640
+ const dictionaryIndex = (packedBits >>> (groupIndex * bitWidth)) & mask;
641
+ if (dictionaryIndex >= dictionary.length) {
642
+ throw new Error(`Invalid Parquet dictionary index ${dictionaryIndex}`);
643
+ }
644
+ output[outputOffset + valueIndex + groupIndex] = dictionary[dictionaryIndex];
645
+ }
646
+ byteOffset += bitWidth;
647
+ valueIndex += groupValueCount;
648
+ }
649
+ }
650
+
651
+ /** Resolves byte-aligned groups of eight one-bit dictionary indices. */
652
+ function decode1BitDictionaryRun(
653
+ buffer: Uint8Array,
654
+ packedOffset: number,
655
+ count: number,
656
+ output: ParquetValueBuffer,
657
+ outputOffset: number,
658
+ dictionary: readonly unknown[]
659
+ ): void {
660
+ let byteOffset = packedOffset;
661
+ let valueIndex = 0;
662
+ while (valueIndex + 8 <= count) {
663
+ const packedBits = buffer[byteOffset++] ?? 0;
664
+ if (dictionary.length < 2 && packedBits !== 0) {
665
+ throw new Error('Invalid Parquet dictionary index 1');
666
+ }
667
+ output[outputOffset + valueIndex] = dictionary[packedBits & 1];
668
+ output[outputOffset + valueIndex + 1] = dictionary[(packedBits >>> 1) & 1];
669
+ output[outputOffset + valueIndex + 2] = dictionary[(packedBits >>> 2) & 1];
670
+ output[outputOffset + valueIndex + 3] = dictionary[(packedBits >>> 3) & 1];
671
+ output[outputOffset + valueIndex + 4] = dictionary[(packedBits >>> 4) & 1];
672
+ output[outputOffset + valueIndex + 5] = dictionary[(packedBits >>> 5) & 1];
673
+ output[outputOffset + valueIndex + 6] = dictionary[(packedBits >>> 6) & 1];
674
+ output[outputOffset + valueIndex + 7] = dictionary[packedBits >>> 7];
675
+ valueIndex += 8;
676
+ }
677
+ decodeDictionaryBitPackedTail(
678
+ buffer,
679
+ byteOffset,
680
+ count - valueIndex,
681
+ 1,
682
+ output,
683
+ outputOffset + valueIndex,
684
+ dictionary
685
+ );
686
+ }
687
+
688
+ /** Resolves two-byte groups of eight two-bit dictionary indices. */
689
+ function decode2BitDictionaryRun(
690
+ buffer: Uint8Array,
691
+ packedOffset: number,
692
+ count: number,
693
+ output: ParquetValueBuffer,
694
+ outputOffset: number,
695
+ dictionary: readonly unknown[]
696
+ ): void {
697
+ let byteOffset = packedOffset;
698
+ let valueIndex = 0;
699
+ while (valueIndex + 8 <= count) {
700
+ const packedBits = (buffer[byteOffset] ?? 0) | ((buffer[byteOffset + 1] ?? 0) << 8);
701
+ const index0 = packedBits & 3;
702
+ const index1 = (packedBits >>> 2) & 3;
703
+ const index2 = (packedBits >>> 4) & 3;
704
+ const index3 = (packedBits >>> 6) & 3;
705
+ const index4 = (packedBits >>> 8) & 3;
706
+ const index5 = (packedBits >>> 10) & 3;
707
+ const index6 = (packedBits >>> 12) & 3;
708
+ const index7 = packedBits >>> 14;
709
+ if (
710
+ index0 >= dictionary.length ||
711
+ index1 >= dictionary.length ||
712
+ index2 >= dictionary.length ||
713
+ index3 >= dictionary.length ||
714
+ index4 >= dictionary.length ||
715
+ index5 >= dictionary.length ||
716
+ index6 >= dictionary.length ||
717
+ index7 >= dictionary.length
718
+ ) {
719
+ throw new Error('Invalid Parquet dictionary index');
720
+ }
721
+ output[outputOffset + valueIndex] = dictionary[index0];
722
+ output[outputOffset + valueIndex + 1] = dictionary[index1];
723
+ output[outputOffset + valueIndex + 2] = dictionary[index2];
724
+ output[outputOffset + valueIndex + 3] = dictionary[index3];
725
+ output[outputOffset + valueIndex + 4] = dictionary[index4];
726
+ output[outputOffset + valueIndex + 5] = dictionary[index5];
727
+ output[outputOffset + valueIndex + 6] = dictionary[index6];
728
+ output[outputOffset + valueIndex + 7] = dictionary[index7];
729
+ byteOffset += 2;
730
+ valueIndex += 8;
731
+ }
732
+ decodeDictionaryBitPackedTail(
733
+ buffer,
734
+ byteOffset,
735
+ count - valueIndex,
736
+ 2,
737
+ output,
738
+ outputOffset + valueIndex,
739
+ dictionary
740
+ );
741
+ }
742
+
743
+ /** Resolves byte-aligned groups of eight three-bit dictionary indices. */
744
+ function decode3BitDictionaryRun(
745
+ buffer: Uint8Array,
746
+ packedOffset: number,
747
+ count: number,
748
+ output: ParquetValueBuffer,
749
+ outputOffset: number,
750
+ dictionary: readonly unknown[]
751
+ ): void {
752
+ let byteOffset = packedOffset;
753
+ let valueIndex = 0;
754
+ while (valueIndex + 8 <= count) {
755
+ const packedBits =
756
+ (buffer[byteOffset] ?? 0) |
757
+ ((buffer[byteOffset + 1] ?? 0) << 8) |
758
+ ((buffer[byteOffset + 2] ?? 0) << 16);
759
+ const index0 = packedBits & 7;
760
+ const index1 = (packedBits >>> 3) & 7;
761
+ const index2 = (packedBits >>> 6) & 7;
762
+ const index3 = (packedBits >>> 9) & 7;
763
+ const index4 = (packedBits >>> 12) & 7;
764
+ const index5 = (packedBits >>> 15) & 7;
765
+ const index6 = (packedBits >>> 18) & 7;
766
+ const index7 = (packedBits >>> 21) & 7;
767
+ if (
768
+ index0 >= dictionary.length ||
769
+ index1 >= dictionary.length ||
770
+ index2 >= dictionary.length ||
771
+ index3 >= dictionary.length ||
772
+ index4 >= dictionary.length ||
773
+ index5 >= dictionary.length ||
774
+ index6 >= dictionary.length ||
775
+ index7 >= dictionary.length
776
+ ) {
777
+ throw new Error('Invalid Parquet dictionary index');
778
+ }
779
+ output[outputOffset + valueIndex] = dictionary[index0];
780
+ output[outputOffset + valueIndex + 1] = dictionary[index1];
781
+ output[outputOffset + valueIndex + 2] = dictionary[index2];
782
+ output[outputOffset + valueIndex + 3] = dictionary[index3];
783
+ output[outputOffset + valueIndex + 4] = dictionary[index4];
784
+ output[outputOffset + valueIndex + 5] = dictionary[index5];
785
+ output[outputOffset + valueIndex + 6] = dictionary[index6];
786
+ output[outputOffset + valueIndex + 7] = dictionary[index7];
787
+ byteOffset += 3;
788
+ valueIndex += 8;
789
+ }
790
+ decodeDictionaryBitPackedTail(
791
+ buffer,
792
+ byteOffset,
793
+ count - valueIndex,
794
+ 3,
795
+ output,
796
+ outputOffset + valueIndex,
797
+ dictionary
798
+ );
799
+ }
800
+
801
+ /** Resolves pairs of four-bit dictionary indices from each input byte. */
802
+ function decode4BitDictionaryRun(
803
+ buffer: Uint8Array,
804
+ packedOffset: number,
805
+ count: number,
806
+ output: ParquetValueBuffer,
807
+ outputOffset: number,
808
+ dictionary: readonly unknown[]
809
+ ): void {
810
+ let byteOffset = packedOffset;
811
+ let valueIndex = 0;
812
+ while (valueIndex + 2 <= count) {
813
+ const packedByte = buffer[byteOffset++] ?? 0;
814
+ const index0 = packedByte & 15;
815
+ const index1 = packedByte >>> 4;
816
+ if (index0 >= dictionary.length || index1 >= dictionary.length) {
817
+ throw new Error(
818
+ `Invalid Parquet dictionary index ${index0 >= dictionary.length ? index0 : index1}`
819
+ );
820
+ }
821
+ output[outputOffset + valueIndex] = dictionary[index0];
822
+ output[outputOffset + valueIndex + 1] = dictionary[index1];
823
+ valueIndex += 2;
824
+ }
825
+ decodeDictionaryBitPackedTail(
826
+ buffer,
827
+ byteOffset,
828
+ count - valueIndex,
829
+ 4,
830
+ output,
831
+ outputOffset + valueIndex,
832
+ dictionary
833
+ );
834
+ }
835
+
836
+ /** Decodes a bit-packed run with an exact number-based bit reservoir. */
837
+ function decodeNumberBitPackedRun(
838
+ buffer: Uint8Array,
839
+ packedOffset: number,
840
+ count: number,
841
+ bitWidth: number,
842
+ output: ParquetValueBuffer,
843
+ outputOffset: number,
844
+ dictionary?: readonly unknown[]
845
+ ): void {
846
+ const divisor = 2 ** bitWidth;
847
+ let packedBits = 0;
848
+ let packedBitCount = 0;
849
+ let byteOffset = packedOffset;
850
+ for (let valueIndex = 0; valueIndex < count; valueIndex++) {
851
+ while (packedBitCount < bitWidth) {
852
+ packedBits += (buffer[byteOffset++] ?? 0) * 2 ** packedBitCount;
853
+ packedBitCount += 8;
854
+ }
855
+ const value = packedBits % divisor;
856
+ output[outputOffset + valueIndex] = resolveDictionaryValue(value, dictionary);
857
+ packedBits = Math.floor(packedBits / divisor);
858
+ packedBitCount -= bitWidth;
859
+ }
860
+ }
861
+
862
+ /** Resolves one dictionary index and rejects corrupt out-of-range references. */
863
+ function resolveDictionaryValue(value: number, dictionary?: readonly unknown[]): unknown {
864
+ if (!dictionary) {
865
+ return value;
866
+ }
867
+ if (value < 0 || value >= dictionary.length) {
868
+ throw new Error(`Invalid Parquet dictionary index ${value}`);
869
+ }
870
+ return dictionary[value];
871
+ }
872
+
873
+ /** Decodes the single little-endian value stored by a repeated run. */
874
+ function decodeRepeatedRun(cursor: CursorBuffer, bitWidth: number): number {
875
+ const byteWidth = Math.ceil(bitWidth / 8);
876
+ assertReadable(cursor, byteWidth);
877
+ if (byteWidth <= 6) {
878
+ let value = 0;
879
+ let multiplier = 1;
880
+ for (let byteIndex = 0; byteIndex < byteWidth; byteIndex++) {
881
+ value += cursor.buffer[cursor.offset++] * multiplier;
882
+ multiplier *= 256;
883
+ }
884
+ return value;
885
+ }
886
+
887
+ let value = 0n;
888
+ for (let byteIndex = 0; byteIndex < byteWidth; byteIndex++) {
889
+ value |= BigInt(cursor.buffer[cursor.offset++]) << BigInt(byteIndex * 8);
890
+ }
891
+ return Number(value);
892
+ }
153
893
 
894
+ /** Reads an unsigned base-128 run header without allocating an intermediate buffer. */
895
+ function readUnsignedVarIntNumber(cursor: CursorBuffer): number {
154
896
  let value = 0;
155
- for (let i = 0; i < Math.ceil(bitWidth / 8); i++) {
156
- // eslint-disable-next-line
157
- value << 8; // TODO - this looks wrong
158
- value += cursor.buffer[cursor.offset];
159
- cursor.offset += 1;
897
+ let multiplier = 1;
898
+ for (let byteIndex = 0; byteIndex < 10; byteIndex++) {
899
+ assertReadable(cursor, 1);
900
+ const byte = cursor.buffer[cursor.offset++];
901
+ value += (byte & 0x7f) * multiplier;
902
+ if ((byte & 0x80) === 0) {
903
+ if (!Number.isSafeInteger(value)) {
904
+ throw new Error('RLE run header exceeds the safe integer range');
905
+ }
906
+ return value;
907
+ }
908
+ multiplier *= 128;
909
+ }
910
+ throw new Error('invalid RLE run header');
911
+ }
912
+
913
+ /** Encodes a non-negative safe integer as a little-endian base-128 varint. */
914
+ function encodeUnsignedVarIntNumber(value: number): Uint8Array {
915
+ if (!Number.isSafeInteger(value) || value < 0) {
916
+ throw new Error('RLE run header must be a non-negative safe integer');
160
917
  }
161
918
 
162
- // tslint:disable-next-line:prefer-array-literal
163
- return new Array(count).fill(value);
919
+ const bytes: number[] = [];
920
+ while (value >= 0x80) {
921
+ bytes.push((value % 0x80) | 0x80);
922
+ value = Math.floor(value / 0x80);
923
+ }
924
+ bytes.push(value);
925
+ return Uint8Array.from(bytes);
926
+ }
927
+
928
+ /** Ensures an RLE read stays within the current cursor. */
929
+ function assertReadable(cursor: CursorBuffer, byteLength: number): void {
930
+ const size = cursor.size ?? cursor.buffer.length;
931
+ if (byteLength < 0 || cursor.offset + byteLength > size) {
932
+ throw new Error(
933
+ `unexpected end of RLE data (offset=${cursor.offset}, requested=${byteLength}, size=${size})`
934
+ );
935
+ }
164
936
  }
165
937
 
166
- function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Buffer {
938
+ function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Uint8Array {
167
939
  // @ts-ignore
168
940
  const bitWidth: number = opts.bitWidth;
169
941
 
170
- for (let i = 0; i < values.length % 8; i++) {
171
- values.push(0);
942
+ const paddedValues = values.slice();
943
+ const padding = (8 - (paddedValues.length % 8)) % 8;
944
+ for (let index = 0; index < padding; index++) {
945
+ paddedValues.push(0);
172
946
  }
173
947
 
174
- const buf = Buffer.alloc(Math.ceil(bitWidth * (values.length / 8)));
175
- for (let b = 0; b < bitWidth * values.length; b++) {
176
- if ((values[Math.floor(b / bitWidth)] & (1 << (b % bitWidth))) > 0) {
948
+ const buf = new Uint8Array(Math.ceil(bitWidth * (paddedValues.length / 8)));
949
+ for (let b = 0; b < bitWidth * paddedValues.length; b++) {
950
+ if ((paddedValues[Math.floor(b / bitWidth)] & (1 << (b % bitWidth))) > 0) {
177
951
  buf[Math.floor(b / 8)] |= 1 << (b % 8);
178
952
  }
179
953
  }
180
954
 
181
- return Buffer.concat([
182
- Buffer.from(varint.encode(((values.length / 8) << 1) | 1)),
183
- buf
184
- ] as Uint8Array[]);
955
+ return concatUint8Arrays([encodeUnsignedVarIntNumber(((paddedValues.length / 8) << 1) | 1), buf]);
185
956
  }
186
957
 
187
- function encodeRunRepeated(value: number, count: number, opts: ParquetCodecOptions): Buffer {
958
+ function encodeRunRepeated(value: number, count: number, opts: ParquetCodecOptions): Uint8Array {
188
959
  // @ts-ignore
189
960
  const bitWidth: number = opts.bitWidth;
190
961
 
191
- const buf = Buffer.alloc(Math.ceil(bitWidth / 8));
962
+ const buf = new Uint8Array(Math.ceil(bitWidth / 8));
192
963
 
193
964
  for (let i = 0; i < buf.length; i++) {
194
- buf.writeUInt8(value & 0xff, i);
195
- // eslint-disable-next-line
196
- value >> 8; // TODO - this looks wrong
965
+ buf[i] = value & 0xff;
966
+ value = Math.floor(value / 256);
197
967
  }
198
968
 
199
- return Buffer.concat([Buffer.from(varint.encode(count << 1)), buf] as Uint8Array[]);
969
+ return concatUint8Arrays([encodeUnsignedVarIntNumber(count << 1), buf]);
200
970
  }