@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
@@ -0,0 +1,727 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {ReadableFile} from '@loaders.gl/loader-utils';
6
+
7
+ import type {
8
+ ParquetComparisonPredicate,
9
+ ParquetInPredicate,
10
+ ParquetNullPredicate,
11
+ ParquetPredicate
12
+ } from '../parquet-source-types';
13
+ import {
14
+ ColumnIndex,
15
+ Encoding,
16
+ OffsetIndex,
17
+ type ColumnChunk,
18
+ type RowGroup
19
+ } from '../parquetjs/parquet-thrift/index';
20
+ import type {ParquetField} from '../parquetjs/schema/declare';
21
+ import type {ParquetSchema} from '../parquetjs/schema/schema';
22
+ import * as Types from '../parquetjs/schema/types';
23
+ import {
24
+ copyUint8Array,
25
+ readDoubleLE,
26
+ readFloatLE,
27
+ readInt32LE,
28
+ readInt64LE,
29
+ readUInt32LE,
30
+ readUInt64LE,
31
+ toUint8Array
32
+ } from '../parquetjs/utils/binary-utils';
33
+ import {Uint8ArrayCompactProtocol} from '../parquetjs/utils/uint8-array-compact-protocol';
34
+ import {Uint8ArrayTransport} from '../parquetjs/utils/uint8-array-transport';
35
+ import {
36
+ canParquetStatisticsMatch,
37
+ getParquetPredicatePath,
38
+ getParquetPredicatePaths
39
+ } from './parquet-predicate';
40
+
41
+ /** Half-open logical row range relative to one Parquet row group. */
42
+ export type ParquetRowRange = {
43
+ /** First included row. */
44
+ start: number;
45
+ /** First excluded row. */
46
+ end: number;
47
+ };
48
+
49
+ /** One data-page location decoded from a Parquet offset index. */
50
+ export type ParquetDataPageLocation = {
51
+ /** Absolute page-header offset in the source object. */
52
+ offset: number;
53
+ /** Page header plus compressed body byte length. */
54
+ compressedByteLength: number;
55
+ /** First logical row represented by the page. */
56
+ firstRowIndex: number;
57
+ /** First logical row represented by the next page. */
58
+ endRowIndex: number;
59
+ };
60
+
61
+ /** Page locations keyed by the physical Parquet column path. */
62
+ export type ParquetPageLocations = Record<string, ParquetDataPageLocation[]>;
63
+
64
+ /** Selective page plan for one row group. */
65
+ export type ParquetPagePruningPlan = {
66
+ /** Candidate row ranges after conservative page-statistics pruning. */
67
+ rowRanges: ParquetRowRange[];
68
+ /** Offset-index page locations for every decoded column. */
69
+ pageLocations: ParquetPageLocations;
70
+ /** Number of column and offset index blobs decoded. */
71
+ indexCount: number;
72
+ /** Data pages in all decoded column chunks. */
73
+ totalPageCount: number;
74
+ /** Data pages required by the candidate ranges. */
75
+ selectedPageCount: number;
76
+ /** Logical rows eliminated before data-page reads. */
77
+ prunedRowCount: number;
78
+ };
79
+
80
+ /** Decrypts an encrypted page-index module before Thrift decoding. */
81
+ export type ParquetPageIndexDecryptor = (
82
+ bytes: Uint8Array,
83
+ module: 'column-index' | 'offset-index',
84
+ rowGroupOrdinal: number,
85
+ columnOrdinal: number,
86
+ columnChunk: ColumnChunk
87
+ ) => Promise<Uint8Array>;
88
+
89
+ /** Optional controls for reading page indexes from a Parquet source. */
90
+ export type ParquetPagePruningOptions = {
91
+ /** Row-group ordinal used when constructing encrypted-module AAD. */
92
+ rowGroupOrdinal?: number;
93
+ /** Decode legacy INT96 page statistics as epoch nanoseconds. */
94
+ int96AsTimestamp?: boolean;
95
+ /** Decrypts encrypted index modules; omitted for plaintext files. */
96
+ decryptModule?: ParquetPageIndexDecryptor;
97
+ };
98
+
99
+ /** Logical statistics attached to one data page. */
100
+ export type ParquetPageStatistics = {
101
+ min?: unknown;
102
+ max?: unknown;
103
+ nullCount?: number;
104
+ minIsExact?: boolean;
105
+ maxIsExact?: boolean;
106
+ };
107
+
108
+ type ParquetColumnPageStatistics = {
109
+ pages: ParquetDataPageLocation[];
110
+ statistics: ParquetPageStatistics[];
111
+ };
112
+
113
+ /**
114
+ * Builds a conservative selective-page plan from Parquet column and offset indexes.
115
+ *
116
+ * Returns `undefined` when indexes or the selected decoder cannot safely avoid full column-chunk
117
+ * reads. Repeated leaves are selected only when every decoded column uses the same page row
118
+ * boundaries, so ranges begin and end on complete logical rows. An empty `rowRanges` array means
119
+ * the indexes prove the predicate cannot match.
120
+ */
121
+ export async function createParquetPagePruningPlan(
122
+ file: ReadableFile,
123
+ rowGroup: RowGroup,
124
+ schema: ParquetSchema,
125
+ selectedColumnPaths: readonly string[][],
126
+ predicate: ParquetPredicate,
127
+ signal?: AbortSignal,
128
+ options?: ParquetPagePruningOptions
129
+ ): Promise<ParquetPagePruningPlan | undefined> {
130
+ const rowCount = Number(rowGroup.num_rows);
131
+ const selectedColumnChunks = getSelectedColumnChunks(rowGroup, selectedColumnPaths);
132
+ if (!isSafePageSelection(schema, selectedColumnChunks) || rowCount <= 0) {
133
+ return undefined;
134
+ }
135
+
136
+ const pageLocations: ParquetPageLocations = {};
137
+ const pageStatistics: Record<string, ParquetColumnPageStatistics> = {};
138
+ const predicatePaths = new Set(
139
+ getParquetPredicatePaths(predicate).map(path => JSON.stringify(path))
140
+ );
141
+ let indexCount = 0;
142
+
143
+ await Promise.all(
144
+ selectedColumnChunks.map(async columnChunk => {
145
+ const columnOrdinal = rowGroup.columns.indexOf(columnChunk);
146
+ const path = columnChunk.meta_data!.path_in_schema;
147
+ const pathKey = JSON.stringify(path);
148
+ const offsetIndexRange = getParquetIndexRange(
149
+ columnChunk.offset_index_offset,
150
+ columnChunk.offset_index_length,
151
+ file.size
152
+ );
153
+ if (!offsetIndexRange) {
154
+ return;
155
+ }
156
+ const offsetIndexBytes = await file.read(
157
+ offsetIndexRange.offset,
158
+ offsetIndexRange.length,
159
+ signal
160
+ );
161
+ let pages: ParquetDataPageLocation[];
162
+ try {
163
+ const decryptedBytes = options?.decryptModule
164
+ ? await options.decryptModule(
165
+ toUint8Array(offsetIndexBytes),
166
+ 'offset-index',
167
+ options.rowGroupOrdinal ?? 0,
168
+ columnOrdinal,
169
+ columnChunk
170
+ )
171
+ : toUint8Array(offsetIndexBytes);
172
+ pages = decodeOffsetIndex(decryptedBytes, rowCount);
173
+ } catch {
174
+ return;
175
+ }
176
+ pageLocations[pathKey] = pages;
177
+ indexCount++;
178
+
179
+ if (!predicatePaths.has(pathKey)) {
180
+ return;
181
+ }
182
+ const columnIndexRange = getParquetIndexRange(
183
+ columnChunk.column_index_offset,
184
+ columnChunk.column_index_length,
185
+ file.size
186
+ );
187
+ if (!columnIndexRange) {
188
+ return;
189
+ }
190
+ const columnIndexBytes = await file.read(
191
+ columnIndexRange.offset,
192
+ columnIndexRange.length,
193
+ signal
194
+ );
195
+ const field = schema.findField(path);
196
+ try {
197
+ const decryptedBytes = options?.decryptModule
198
+ ? await options.decryptModule(
199
+ toUint8Array(columnIndexBytes),
200
+ 'column-index',
201
+ options.rowGroupOrdinal ?? 0,
202
+ columnOrdinal,
203
+ columnChunk
204
+ )
205
+ : toUint8Array(columnIndexBytes);
206
+ pageStatistics[pathKey] = {
207
+ pages,
208
+ statistics: decodeParquetColumnIndex(decryptedBytes, pages, field, options)
209
+ };
210
+ } catch {
211
+ return;
212
+ }
213
+ indexCount++;
214
+ })
215
+ );
216
+
217
+ if (
218
+ selectedColumnChunks.some(
219
+ columnChunk => !pageLocations[JSON.stringify(columnChunk.meta_data!.path_in_schema)]
220
+ )
221
+ ) {
222
+ return undefined;
223
+ }
224
+
225
+ if (!hasCompatiblePageBoundaries(schema, selectedColumnChunks, pageLocations)) {
226
+ return undefined;
227
+ }
228
+
229
+ const candidateRanges = getPredicateRowRanges(predicate, pageStatistics, rowCount);
230
+ if (candidateRanges === undefined) {
231
+ return undefined;
232
+ }
233
+ const rowRanges = expandAndMergeRowRanges(candidateRanges, pageLocations, rowCount);
234
+ const prunedRowCount = rowCount - getRowRangeCount(rowRanges);
235
+ if (prunedRowCount <= 0) {
236
+ return undefined;
237
+ }
238
+
239
+ const totalPageCount = Object.values(pageLocations).reduce(
240
+ (count, pages) => count + pages.length,
241
+ 0
242
+ );
243
+ const selectedPageCount = Object.values(pageLocations).reduce(
244
+ (count, pages) => count + countSelectedPages(pages, rowRanges),
245
+ 0
246
+ );
247
+ return {
248
+ rowRanges,
249
+ pageLocations,
250
+ indexCount,
251
+ totalPageCount,
252
+ selectedPageCount,
253
+ prunedRowCount
254
+ };
255
+ }
256
+
257
+ /** Returns data-page byte ranges needed to decode a selective row-group plan. */
258
+ export function getParquetPageReadRanges(
259
+ rowGroup: RowGroup,
260
+ selectedColumnPaths: readonly string[][],
261
+ plan: ParquetPagePruningPlan,
262
+ schema: ParquetSchema
263
+ ): Array<{offset: number; length: number}> {
264
+ const ranges: Array<{offset: number; length: number}> = [];
265
+ for (const columnChunk of getSelectedColumnChunks(rowGroup, selectedColumnPaths)) {
266
+ const columnMetadata = columnChunk.meta_data!;
267
+ const pages = plan.pageLocations[JSON.stringify(columnMetadata.path_in_schema)];
268
+ const selectedPages = pages.filter(page =>
269
+ plan.rowRanges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end)
270
+ );
271
+ if (!selectedPages.length) {
272
+ continue;
273
+ }
274
+ const field = schema.findField(columnMetadata.path_in_schema);
275
+ const repeated = field.rLevelMax > 0 || field.repetitionType === 'REPEATED';
276
+ const dictionaryPageOffset = Number(columnMetadata.dictionary_page_offset);
277
+ if (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0) {
278
+ ranges.push({
279
+ offset: dictionaryPageOffset,
280
+ length: Math.max(0, pages[0].offset - dictionaryPageOffset)
281
+ });
282
+ }
283
+ for (const rowRange of plan.rowRanges) {
284
+ const overlappingPages = pages.filter(
285
+ page => page.endRowIndex > rowRange.start && page.firstRowIndex < rowRange.end
286
+ );
287
+ if (!overlappingPages.length) {
288
+ continue;
289
+ }
290
+ // A repeated page may begin with a continuation level. Transfer the complete prefix so
291
+ // worker-backed readers can probe predecessor pages before decoding the selected range.
292
+ const firstPage = repeated ? pages[0] : overlappingPages[0];
293
+ const lastPage = overlappingPages[overlappingPages.length - 1];
294
+ ranges.push({
295
+ offset: firstPage.offset,
296
+ length: lastPage.offset + lastPage.compressedByteLength - firstPage.offset
297
+ });
298
+ }
299
+ }
300
+ return mergeByteRanges(ranges.filter(range => range.length > 0));
301
+ }
302
+
303
+ /** Decodes one compact-protocol Parquet offset index. */
304
+ export function decodeOffsetIndex(bytes: Uint8Array, rowCount: number): ParquetDataPageLocation[] {
305
+ const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
306
+ const offsetIndex = OffsetIndex.read(protocol as any);
307
+ if (
308
+ offsetIndex.page_locations.length === 0 ||
309
+ Number(offsetIndex.page_locations[0].first_row_index) !== 0
310
+ ) {
311
+ throw new Error('Invalid Parquet offset index page locations');
312
+ }
313
+ let previousFirstRowIndex = -1;
314
+ for (const location of offsetIndex.page_locations) {
315
+ const firstRowIndex = Number(location.first_row_index);
316
+ if (!Number.isSafeInteger(firstRowIndex) || firstRowIndex < previousFirstRowIndex) {
317
+ throw new Error('Invalid Parquet offset index page locations');
318
+ }
319
+ previousFirstRowIndex = firstRowIndex;
320
+ }
321
+ return offsetIndex.page_locations.map((location, index, locations) => {
322
+ const firstRowIndex = Number(location.first_row_index);
323
+ // A repeated row may continue on one or more pages. In that case the offset index
324
+ // legitimately repeats first_row_index. Extend each continuation page to the next
325
+ // strictly larger row start so selecting the row includes the complete continuation.
326
+ let endRowIndex = rowCount;
327
+ for (let nextIndex = index + 1; nextIndex < locations.length; nextIndex++) {
328
+ const nextFirstRowIndex = Number(locations[nextIndex].first_row_index);
329
+ if (nextFirstRowIndex > firstRowIndex) {
330
+ endRowIndex = nextFirstRowIndex;
331
+ break;
332
+ }
333
+ }
334
+ const offset = Number(location.offset);
335
+ const compressedByteLength = location.compressed_page_size;
336
+ if (
337
+ !Number.isSafeInteger(offset) ||
338
+ !Number.isSafeInteger(compressedByteLength) ||
339
+ !Number.isSafeInteger(firstRowIndex) ||
340
+ !Number.isSafeInteger(endRowIndex) ||
341
+ offset < 0 ||
342
+ compressedByteLength <= 0 ||
343
+ firstRowIndex < 0 ||
344
+ endRowIndex <= firstRowIndex ||
345
+ endRowIndex > rowCount
346
+ ) {
347
+ throw new Error('Invalid Parquet offset index page location');
348
+ }
349
+ return {offset, compressedByteLength, firstRowIndex, endRowIndex};
350
+ });
351
+ }
352
+
353
+ /** Returns whether one predicate leaf can match supplied page statistics. */
354
+ function getPredicateRowRanges(
355
+ predicate: ParquetPredicate,
356
+ columns: Record<string, ParquetColumnPageStatistics>,
357
+ rowCount: number
358
+ ): ParquetRowRange[] | undefined {
359
+ if (predicate.op === 'and' || predicate.op === 'or') {
360
+ if (predicate.op === 'and') {
361
+ let ranges: ParquetRowRange[] | undefined;
362
+ for (const child of predicate.args) {
363
+ ranges = intersectRowRanges(ranges, getPredicateRowRanges(child, columns, rowCount));
364
+ }
365
+ return ranges;
366
+ }
367
+ let ranges: ParquetRowRange[] = [];
368
+ for (const child of predicate.args) {
369
+ const childRanges = getPredicateRowRanges(child, columns, rowCount);
370
+ if (childRanges === undefined) {
371
+ return undefined;
372
+ }
373
+ ranges = unionRowRanges(ranges, childRanges);
374
+ }
375
+ return ranges;
376
+ }
377
+ if (predicate.op === 'not') {
378
+ return undefined;
379
+ }
380
+
381
+ const leafPredicate = predicate as
382
+ | ParquetComparisonPredicate
383
+ | ParquetInPredicate
384
+ | ParquetNullPredicate;
385
+ const column = columns[JSON.stringify(getParquetPredicatePath(leafPredicate.args[0]))];
386
+ if (!column) {
387
+ return undefined;
388
+ }
389
+ const ranges: ParquetRowRange[] = [];
390
+ for (let pageIndex = 0; pageIndex < column.pages.length; pageIndex++) {
391
+ const page = column.pages[pageIndex];
392
+ if (
393
+ canParquetStatisticsMatch(
394
+ leafPredicate,
395
+ column.statistics[pageIndex],
396
+ page.endRowIndex - page.firstRowIndex
397
+ )
398
+ ) {
399
+ ranges.push({start: page.firstRowIndex, end: page.endRowIndex});
400
+ }
401
+ }
402
+ return mergeRowRanges(ranges);
403
+ }
404
+
405
+ /** Decodes column-index values into logical per-page statistics. */
406
+ export function decodeParquetColumnIndex(
407
+ bytes: Uint8Array,
408
+ pages: readonly ParquetDataPageLocation[],
409
+ field: ParquetField,
410
+ options?: Pick<ParquetPagePruningOptions, 'int96AsTimestamp'>
411
+ ): ParquetPageStatistics[] {
412
+ const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
413
+ const columnIndex = ColumnIndex.read(protocol as any);
414
+ if (
415
+ columnIndex.null_pages.length !== pages.length ||
416
+ columnIndex.min_values.length !== pages.length ||
417
+ columnIndex.max_values.length !== pages.length ||
418
+ (columnIndex.null_counts !== undefined && columnIndex.null_counts.length !== pages.length)
419
+ ) {
420
+ throw new Error('Parquet column and offset indexes contain different page counts');
421
+ }
422
+ return pages.map((_page, pageIndex) => ({
423
+ min: columnIndex.null_pages[pageIndex]
424
+ ? undefined
425
+ : decodeParquetPageStatisticsValue(columnIndex.min_values[pageIndex], field, options),
426
+ max: columnIndex.null_pages[pageIndex]
427
+ ? undefined
428
+ : decodeParquetPageStatisticsValue(columnIndex.max_values[pageIndex], field, options),
429
+ nullCount:
430
+ columnIndex.null_counts?.[pageIndex] !== undefined
431
+ ? Number(columnIndex.null_counts[pageIndex])
432
+ : columnIndex.null_pages[pageIndex]
433
+ ? pages[pageIndex].endRowIndex - pages[pageIndex].firstRowIndex
434
+ : undefined,
435
+ minIsExact: true,
436
+ maxIsExact: true
437
+ }));
438
+ }
439
+
440
+ /** Decodes one physical page-index statistic and applies its Parquet logical annotation. */
441
+ export function decodeParquetPageStatisticsValue(
442
+ bytes: Uint8Array,
443
+ field: ParquetField,
444
+ options?: Pick<ParquetPagePruningOptions, 'int96AsTimestamp'>
445
+ ): unknown {
446
+ let primitiveValue: unknown;
447
+ switch (field.primitiveType) {
448
+ case 'BOOLEAN':
449
+ primitiveValue = Boolean(bytes[0]);
450
+ break;
451
+ case 'INT32':
452
+ primitiveValue =
453
+ field.originalType === 'UINT_32' ? readUInt32LE(bytes, 0) : readInt32LE(bytes, 0);
454
+ break;
455
+ case 'INT64':
456
+ primitiveValue =
457
+ field.originalType === 'UINT_64' ? readUInt64LE(bytes, 0) : readInt64LE(bytes, 0);
458
+ break;
459
+ case 'FLOAT':
460
+ primitiveValue = readFloatLE(bytes, 0);
461
+ break;
462
+ case 'DOUBLE':
463
+ primitiveValue = readDoubleLE(bytes, 0);
464
+ break;
465
+ case 'INT96':
466
+ if (options?.int96AsTimestamp && bytes.byteLength >= 12) {
467
+ const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
468
+ const nanosecondsOfDay = dataView.getBigUint64(0, true);
469
+ if (nanosecondsOfDay < 86_400_000_000_000n) {
470
+ primitiveValue =
471
+ (BigInt(dataView.getInt32(8, true)) - 2440588n) * 86_400_000_000_000n +
472
+ nanosecondsOfDay;
473
+ break;
474
+ }
475
+ }
476
+ primitiveValue = copyUint8Array(bytes);
477
+ break;
478
+ case 'BYTE_ARRAY':
479
+ case 'FIXED_LEN_BYTE_ARRAY':
480
+ primitiveValue = copyUint8Array(bytes);
481
+ break;
482
+ default:
483
+ return undefined;
484
+ }
485
+ return Types.fromPrimitive(field.originalType || field.primitiveType, primitiveValue, field);
486
+ }
487
+
488
+ /** Returns selected physical chunks, using an empty path list as the all-column sentinel. */
489
+ function getSelectedColumnChunks(
490
+ rowGroup: RowGroup,
491
+ selectedColumnPaths: readonly string[][]
492
+ ): ColumnChunk[] {
493
+ return rowGroup.columns.filter(columnChunk => {
494
+ const path = columnChunk.meta_data?.path_in_schema;
495
+ return Boolean(
496
+ path &&
497
+ (selectedColumnPaths.length === 0 ||
498
+ selectedColumnPaths.some(selectedPath => selectedPath[0] === path[0]))
499
+ );
500
+ });
501
+ }
502
+
503
+ /** Restricts selective page reads to primitive leaves with safe page boundaries. */
504
+ function isSafePageSelection(schema: ParquetSchema, columnChunks: readonly ColumnChunk[]): boolean {
505
+ return (
506
+ columnChunks.length > 0 &&
507
+ columnChunks.every(columnChunk => {
508
+ const path = columnChunk.meta_data?.path_in_schema;
509
+ if (!path) {
510
+ return false;
511
+ }
512
+ const field = schema.findField(path);
513
+ const dictionaryEncoded = columnChunk.meta_data!.encodings.some(
514
+ encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY
515
+ );
516
+ const dictionaryPageOffset = Number(columnChunk.meta_data!.dictionary_page_offset);
517
+ return (
518
+ field.primitiveType !== undefined &&
519
+ (!dictionaryEncoded ||
520
+ (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0))
521
+ );
522
+ })
523
+ );
524
+ }
525
+
526
+ /**
527
+ * Returns whether a column can be decoded from selected page ranges without changing row shape.
528
+ *
529
+ * Repeated leaves are safe only when the selected columns share complete logical-row boundaries.
530
+ */
531
+ export function canUseParquetPageIndexForColumn(
532
+ schema: ParquetSchema,
533
+ columnChunk: ColumnChunk
534
+ ): boolean {
535
+ const path = columnChunk.meta_data?.path_in_schema;
536
+ if (!path) {
537
+ return false;
538
+ }
539
+ const field = schema.findField(path);
540
+ const dictionaryEncoded = columnChunk.meta_data!.encodings.some(
541
+ encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY
542
+ );
543
+ const dictionaryPageOffset = Number(columnChunk.meta_data!.dictionary_page_offset);
544
+ return (
545
+ field.primitiveType !== undefined &&
546
+ field.repetitionType !== 'REPEATED' &&
547
+ field.rLevelMax === 0 &&
548
+ (!dictionaryEncoded || (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0))
549
+ );
550
+ }
551
+
552
+ /** Ensures repeated selective reads keep every selected column on identical row boundaries. */
553
+ function hasCompatiblePageBoundaries(
554
+ schema: ParquetSchema,
555
+ columnChunks: readonly ColumnChunk[],
556
+ pageLocations: ParquetPageLocations
557
+ ): boolean {
558
+ const hasRepeatedLeaf = columnChunks.some(columnChunk => {
559
+ const field = schema.findField(columnChunk.meta_data!.path_in_schema);
560
+ return field.rLevelMax > 0 || field.repetitionType === 'REPEATED';
561
+ });
562
+ if (!hasRepeatedLeaf) {
563
+ return true;
564
+ }
565
+ // Offset indexes identify the first logical row represented by each page, but do not
566
+ // expose repetition levels. Equal starts therefore indicate a continuation page whose
567
+ // boundary cannot be proven safe for a selective read; retain the full-column fallback.
568
+ if (
569
+ columnChunks.some(columnChunk => {
570
+ const pages = pageLocations[JSON.stringify(columnChunk.meta_data!.path_in_schema)];
571
+ return pages.some(
572
+ (page, pageIndex) =>
573
+ pageIndex > 0 && page.firstRowIndex === pages[pageIndex - 1].firstRowIndex
574
+ );
575
+ })
576
+ ) {
577
+ return false;
578
+ }
579
+ const signatures = columnChunks.map(columnChunk => {
580
+ const pages = pageLocations[JSON.stringify(columnChunk.meta_data!.path_in_schema)];
581
+ return pages.map(page => `${page.firstRowIndex}:${page.endRowIndex}`).join('|');
582
+ });
583
+ return signatures.every(signature => signature === signatures[0]);
584
+ }
585
+
586
+ /** Validates one optional footer index byte range against the containing file. */
587
+ export function getParquetIndexRange(
588
+ offsetValue: ColumnChunk['offset_index_offset'],
589
+ lengthValue: number | undefined,
590
+ fileSize: number
591
+ ): {offset: number; length: number} | undefined {
592
+ if (offsetValue === undefined || lengthValue === undefined) {
593
+ return undefined;
594
+ }
595
+ const offset = Number(offsetValue);
596
+ if (
597
+ !Number.isSafeInteger(offset) ||
598
+ !Number.isSafeInteger(lengthValue) ||
599
+ !Number.isSafeInteger(fileSize) ||
600
+ offset < 0 ||
601
+ lengthValue <= 0 ||
602
+ fileSize < 0 ||
603
+ offset > fileSize - lengthValue
604
+ ) {
605
+ return undefined;
606
+ }
607
+ return {offset, length: lengthValue};
608
+ }
609
+
610
+ /** Expands ranges to selected-column page boundaries until all columns agree, then merges them. */
611
+ function expandAndMergeRowRanges(
612
+ ranges: readonly ParquetRowRange[],
613
+ pageLocations: ParquetPageLocations,
614
+ rowCount: number
615
+ ): ParquetRowRange[] {
616
+ const pagesByColumn = Object.values(pageLocations);
617
+ const expanded = ranges.map(range => {
618
+ let current = {...range};
619
+ let changed = true;
620
+ while (changed) {
621
+ changed = false;
622
+ for (const pages of pagesByColumn) {
623
+ const overlapping = pages.filter(
624
+ page => page.endRowIndex > current.start && page.firstRowIndex < current.end
625
+ );
626
+ if (!overlapping.length) {
627
+ continue;
628
+ }
629
+ const start = Math.min(current.start, overlapping[0].firstRowIndex);
630
+ const end = Math.max(current.end, overlapping[overlapping.length - 1].endRowIndex);
631
+ if (start !== current.start || end !== current.end) {
632
+ current = {start, end};
633
+ changed = true;
634
+ }
635
+ }
636
+ }
637
+ return {start: Math.max(0, current.start), end: Math.min(rowCount, current.end)};
638
+ });
639
+ return mergeRowRanges(expanded);
640
+ }
641
+
642
+ /** Intersects sorted row ranges; `undefined` represents every row. */
643
+ function intersectRowRanges(
644
+ left: ParquetRowRange[] | undefined,
645
+ right: ParquetRowRange[] | undefined
646
+ ): ParquetRowRange[] | undefined {
647
+ if (left === undefined) {
648
+ return right;
649
+ }
650
+ if (right === undefined) {
651
+ return left;
652
+ }
653
+ const ranges: ParquetRowRange[] = [];
654
+ let leftIndex = 0;
655
+ let rightIndex = 0;
656
+ while (leftIndex < left.length && rightIndex < right.length) {
657
+ const start = Math.max(left[leftIndex].start, right[rightIndex].start);
658
+ const end = Math.min(left[leftIndex].end, right[rightIndex].end);
659
+ if (start < end) {
660
+ ranges.push({start, end});
661
+ }
662
+ if (left[leftIndex].end < right[rightIndex].end) {
663
+ leftIndex++;
664
+ } else {
665
+ rightIndex++;
666
+ }
667
+ }
668
+ return ranges;
669
+ }
670
+
671
+ /** Unions two sorted row-range sets. */
672
+ function unionRowRanges(
673
+ left: readonly ParquetRowRange[],
674
+ right: readonly ParquetRowRange[]
675
+ ): ParquetRowRange[] {
676
+ return mergeRowRanges([...left, ...right]);
677
+ }
678
+
679
+ /** Sorts and merges overlapping or touching logical row ranges. */
680
+ function mergeRowRanges(ranges: readonly ParquetRowRange[]): ParquetRowRange[] {
681
+ const sorted = [...ranges].sort(
682
+ (left, right) => left.start - right.start || left.end - right.end
683
+ );
684
+ const merged: ParquetRowRange[] = [];
685
+ for (const range of sorted) {
686
+ const previous = merged[merged.length - 1];
687
+ if (previous && range.start <= previous.end) {
688
+ previous.end = Math.max(previous.end, range.end);
689
+ } else {
690
+ merged.push({...range});
691
+ }
692
+ }
693
+ return merged;
694
+ }
695
+
696
+ /** Counts logical rows represented by disjoint ranges. */
697
+ function getRowRangeCount(ranges: readonly ParquetRowRange[]): number {
698
+ return ranges.reduce((count, range) => count + range.end - range.start, 0);
699
+ }
700
+
701
+ /** Counts unique pages overlapping at least one selected row range. */
702
+ function countSelectedPages(
703
+ pages: readonly ParquetDataPageLocation[],
704
+ ranges: readonly ParquetRowRange[]
705
+ ): number {
706
+ return pages.filter(page =>
707
+ ranges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end)
708
+ ).length;
709
+ }
710
+
711
+ /** Sorts and merges overlapping or touching byte ranges without overfetch gaps. */
712
+ function mergeByteRanges(
713
+ ranges: readonly {offset: number; length: number}[]
714
+ ): Array<{offset: number; length: number}> {
715
+ const sorted = [...ranges].sort((left, right) => left.offset - right.offset);
716
+ const merged: Array<{offset: number; length: number}> = [];
717
+ for (const range of sorted) {
718
+ const previous = merged[merged.length - 1];
719
+ const end = range.offset + range.length;
720
+ if (previous && range.offset <= previous.offset + previous.length) {
721
+ previous.length = Math.max(previous.offset + previous.length, end) - previous.offset;
722
+ } else {
723
+ merged.push({...range});
724
+ }
725
+ }
726
+ return merged;
727
+ }