@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,800 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {
6
+ executeScanTasks,
7
+ emitScanExecutionTelemetry,
8
+ explainTableQuery,
9
+ validateTableQueryLimit,
10
+ type CoreAPI,
11
+ type ScanFragment,
12
+ type ScanFragmentProvider,
13
+ type ScanTask,
14
+ type ScanExecutionTelemetry
15
+ } from '@loaders.gl/loader-utils';
16
+ import type {Schema} from '@loaders.gl/schema';
17
+
18
+ import {ParquetSource} from './parquet-source-loader';
19
+ import {sliceParquetBatch} from './lib/slice-parquet-batch';
20
+ import {PARQUET_TABLE_QUERY_CAPABILITIES} from './parquet-source-capabilities';
21
+ import type {
22
+ ParquetDatasetBatch,
23
+ ParquetDatasetBatchProvenance,
24
+ ParquetDatasetBoundingBox,
25
+ ParquetDatasetFile,
26
+ ParquetDatasetFileScanPlan,
27
+ ParquetDatasetFileCollection,
28
+ ParquetDatasetFileQuery,
29
+ ParquetDatasetFiles,
30
+ ParquetDatasetPartitionValue,
31
+ ParquetDatasetReadOptions,
32
+ ParquetDatasetExplain,
33
+ ParquetDatasetSourceOptions,
34
+ ParquetDatasetTelemetry,
35
+ ParquetSourceBatch,
36
+ ParquetPredicate,
37
+ ParquetSourceExplain,
38
+ ParquetTelemetry
39
+ } from './parquet-source-types';
40
+
41
+ export type {
42
+ ParquetDatasetBatch,
43
+ ParquetDatasetBatchProvenance,
44
+ ParquetDatasetBoundingBox,
45
+ ParquetDatasetExplain,
46
+ ParquetDatasetFile,
47
+ ParquetDatasetFileCollection,
48
+ ParquetDatasetFileScanPlan,
49
+ ParquetDatasetFileProvider,
50
+ ParquetDatasetFileQuery,
51
+ ParquetDatasetFiles,
52
+ ParquetDatasetPartitionValue,
53
+ ParquetDatasetReadOptions,
54
+ ParquetDatasetSourceOptions,
55
+ ParquetDatasetTelemetry
56
+ } from './parquet-source-types';
57
+
58
+ const DEFAULT_FILE_CONCURRENCY = 4;
59
+
60
+ type IndexedParquetDatasetFile = {
61
+ /** Descriptor returned by the provider. */
62
+ file: ParquetDatasetFile;
63
+ /** Position in provider output before local pruning. */
64
+ index: number;
65
+ };
66
+
67
+ type ParquetDatasetDiscoverySummary = {
68
+ /** Descriptors returned by the provider. */
69
+ discovered: number;
70
+ /** Descriptors retained after local pruning. */
71
+ selected: number;
72
+ /** Descriptors rejected by bounding-box intersection. */
73
+ prunedByBoundingBox: number;
74
+ /** Descriptors rejected by partition constraints. */
75
+ prunedByPartitions: number;
76
+ };
77
+
78
+ /**
79
+ * Multi-file Parquet source that composes catalog discovery with selective `ParquetSource` reads.
80
+ *
81
+ * The source accepts static descriptors or a lazy provider, allowing STAC and other catalogs to be
82
+ * injected without coupling `@loaders.gl/parquet` to a catalog protocol.
83
+ */
84
+ export class ParquetDatasetSource implements ScanFragmentProvider<ParquetPredicate> {
85
+ /** Common projection, predicate, limit, streaming, and cancellation capabilities. */
86
+ readonly tableQueryCapabilities = PARQUET_TABLE_QUERY_CAPABILITIES;
87
+ /** Static descriptors or lazy catalog-backed file provider. */
88
+ readonly files: ParquetDatasetFiles;
89
+ /** Child-source and dataset orchestration options. */
90
+ readonly options: ParquetDatasetSourceOptions;
91
+ /** Runtime hooks forwarded to child Parquet sources. */
92
+ readonly coreApi?: CoreAPI;
93
+
94
+ /** Abort controllers for active dataset reads. */
95
+ private readonly activeReadControllers = new Set<AbortController>();
96
+ /** Whether the dataset source has been permanently closed. */
97
+ private closed = false;
98
+ /** Cumulative dataset and child-source telemetry. */
99
+ private readonly telemetry = createParquetDatasetTelemetry();
100
+
101
+ /** Creates a logical dataset over static or lazily discovered Parquet files. */
102
+ constructor(
103
+ files: ParquetDatasetFiles,
104
+ options: ParquetDatasetSourceOptions = {},
105
+ coreApi?: CoreAPI
106
+ ) {
107
+ if (!Array.isArray(files) && typeof files !== 'function') {
108
+ throw new Error(
109
+ 'ParquetDatasetSource files must be a reusable descriptor array or a provider function'
110
+ );
111
+ }
112
+ this.files = files;
113
+ this.options = options;
114
+ this.coreApi = coreApi;
115
+ }
116
+
117
+ /** Returns the schema of the first selected file, closing its temporary child source afterward. */
118
+ async getSchema(query: ParquetDatasetFileQuery = {}): Promise<Schema> {
119
+ this.assertOpen();
120
+ const iterator = this.getSelectedFiles(query)[Symbol.asyncIterator]();
121
+ try {
122
+ const first = await iterator.next();
123
+ if (first.done) {
124
+ throw new Error('ParquetDatasetSource query selected no files');
125
+ }
126
+ const source = this.createSource(first.value.file);
127
+ this.telemetry.filesOpened++;
128
+ try {
129
+ return await source.getSchema({signal: query.signal});
130
+ } finally {
131
+ await source.close();
132
+ this.addParquetTelemetry(source.getTelemetry());
133
+ }
134
+ } finally {
135
+ await iterator.return?.();
136
+ }
137
+ }
138
+
139
+ /** Returns an immutable snapshot of cumulative dataset and child-source telemetry. */
140
+ getTelemetry(): ParquetDatasetTelemetry {
141
+ return Object.freeze({
142
+ ...this.telemetry,
143
+ parquet: Object.freeze({...this.telemetry.parquet})
144
+ });
145
+ }
146
+
147
+ /** Discovers catalog-independent fragments after applying descriptor-level pruning. */
148
+ async getScanFragments(
149
+ options: ParquetDatasetReadOptions = {}
150
+ ): Promise<readonly ScanFragment[]> {
151
+ this.assertOpen();
152
+ const fragments: ScanFragment[] = [];
153
+ const selectedFiles = this.getSelectedFiles(options);
154
+ for await (const indexedFile of selectedFiles) {
155
+ const file = indexedFile.file;
156
+ if (typeof file.data !== 'string' && !file.id) {
157
+ throw new Error(
158
+ 'Parquet dataset Blob fragments require an explicit stable id for fragment discovery'
159
+ );
160
+ }
161
+ fragments.push(
162
+ Object.freeze({
163
+ id: getDatasetFileId(file, indexedFile.index),
164
+ uri: typeof file.data === 'string' ? file.data : undefined,
165
+ partitionValues: file.partitions,
166
+ metadata: file.metadata
167
+ })
168
+ );
169
+ }
170
+ return Object.freeze(fragments);
171
+ }
172
+
173
+ /** Plans descriptor discovery and every retained file's Parquet physical scan. */
174
+ async getScanPlan(options: ParquetDatasetReadOptions = {}): Promise<ParquetDatasetExplain> {
175
+ this.assertOpen();
176
+ validateTableQueryLimit(options.limit);
177
+ const readContext = createDatasetAbortContext(options.signal);
178
+ this.activeReadControllers.add(readContext.abortController);
179
+ const discovery = createParquetDatasetDiscoverySummary();
180
+ const filePlans: ParquetDatasetFileScanPlan[] = [];
181
+ const tasks = this.getPlanTasks(options, readContext.abortController.signal, discovery);
182
+ const fileConcurrency = normalizeFileConcurrency(
183
+ options.fileConcurrency ?? this.options.parquetDataset?.fileConcurrency
184
+ );
185
+ try {
186
+ for await (const filePlan of executeScanTasks(tasks, {
187
+ concurrency: fileConcurrency,
188
+ signal: readContext.abortController.signal
189
+ })) {
190
+ filePlans.push(filePlan);
191
+ }
192
+ const firstFilePlan = filePlans[0];
193
+ if (!firstFilePlan) {
194
+ throw new Error('ParquetDatasetSource query selected no files');
195
+ }
196
+ const effectivePredicate = firstFilePlan.parquet.plan.find(step => step.kind === 'filter');
197
+ const effectiveLimit = options.limit ?? this.options.parquet?.limit;
198
+ const explanation = explainTableQuery(
199
+ firstFilePlan.parquet.sourceColumns,
200
+ {
201
+ columns: firstFilePlan.parquet.outputColumns,
202
+ predicate:
203
+ effectivePredicate?.kind === 'filter' ? effectivePredicate.predicate : undefined,
204
+ limit: effectiveLimit
205
+ },
206
+ PARQUET_TABLE_QUERY_CAPABILITIES
207
+ );
208
+ return Object.freeze({
209
+ ...explanation,
210
+ source: 'parquet-dataset' as const,
211
+ files: Object.freeze({...discovery}),
212
+ filePlans: Object.freeze(filePlans)
213
+ });
214
+ } finally {
215
+ readContext.abortController.abort();
216
+ readContext.removeSignalListener();
217
+ this.activeReadControllers.delete(readContext.abortController);
218
+ }
219
+ }
220
+
221
+ /** Explains the common logical query and physical multi-file Parquet plan. */
222
+ async explain(options: ParquetDatasetReadOptions = {}): Promise<ParquetDatasetExplain> {
223
+ return await this.getScanPlan(options);
224
+ }
225
+
226
+ /** Executes a previously computed dataset plan while retaining each file's row-group choices. */
227
+ async *executeScanPlan(
228
+ plan: ParquetDatasetExplain,
229
+ options: ParquetDatasetReadOptions = {}
230
+ ): AsyncIterable<ParquetDatasetBatch> {
231
+ if (plan.source !== 'parquet-dataset') {
232
+ throw new Error('ParquetDatasetSource can only execute dataset scan plans');
233
+ }
234
+ validateTableQueryLimit(options.limit);
235
+ let remainingRows = options.limit ?? this.options.parquet?.limit ?? Number.POSITIVE_INFINITY;
236
+ if (remainingRows === 0) return;
237
+ const limitStep = plan.plan.find(step => step.kind === 'limit');
238
+ const readOptions: ParquetDatasetReadOptions = {
239
+ ...options,
240
+ columns: options.columns ?? plan.outputColumns,
241
+ predicate: options.predicate,
242
+ limit: options.limit ?? (limitStep?.kind === 'limit' ? limitStep.limit : undefined)
243
+ };
244
+ remainingRows = readOptions.limit ?? Number.POSITIVE_INFINITY;
245
+ const readContext = createDatasetAbortContext(readOptions.signal);
246
+ this.activeReadControllers.add(readContext.abortController);
247
+ const filePlans = new Map(
248
+ plan.filePlans.map(filePlan => [filePlan.fileIndex, filePlan.parquet])
249
+ );
250
+ const tasks = this.getReadTasks(readOptions, readContext.abortController.signal, filePlans);
251
+ const fileConcurrency = normalizeFileConcurrency(
252
+ readOptions.fileConcurrency ?? this.options.parquetDataset?.fileConcurrency
253
+ );
254
+ try {
255
+ for await (const batch of executeScanTasks(tasks, {
256
+ concurrency: fileConcurrency,
257
+ signal: readContext.abortController.signal
258
+ })) {
259
+ const outputBatch = sliceParquetBatch(batch, Math.min(batch.length, remainingRows));
260
+ this.telemetry.batchesEmitted++;
261
+ this.telemetry.rowsEmitted += outputBatch.length;
262
+ yield outputBatch;
263
+ remainingRows -= outputBatch.length;
264
+ if (remainingRows === 0) return;
265
+ }
266
+ } finally {
267
+ readContext.abortController.abort();
268
+ readContext.removeSignalListener();
269
+ this.activeReadControllers.delete(readContext.abortController);
270
+ }
271
+ }
272
+
273
+ /** Common scan-architecture alias for ordered multi-file reads. */
274
+ scan(options: ParquetDatasetReadOptions = {}): AsyncIterable<ParquetDatasetBatch> {
275
+ return this.read(options);
276
+ }
277
+
278
+ /**
279
+ * Reads selected files as deterministic, file-ordered Arrow batches.
280
+ *
281
+ * Files are decoded concurrently. Each later file is limited to one buffered batch until all
282
+ * earlier files have been yielded, bounding memory while retaining stable provider order.
283
+ */
284
+ async *read(options: ParquetDatasetReadOptions = {}): AsyncIterable<ParquetDatasetBatch> {
285
+ this.assertOpen();
286
+ validateTableQueryLimit(options.limit);
287
+ const startedAt = Date.now();
288
+ const telemetryBefore = this.getTelemetry();
289
+ let remainingRows = options.limit ?? this.options.parquet?.limit ?? Number.POSITIVE_INFINITY;
290
+ if (remainingRows === 0) {
291
+ emitScanExecutionTelemetry(
292
+ options.onTelemetry,
293
+ createParquetDatasetScanExecutionTelemetry(
294
+ telemetryBefore,
295
+ this.getTelemetry(),
296
+ startedAt,
297
+ 'early-terminated',
298
+ 'limit'
299
+ )
300
+ );
301
+ return;
302
+ }
303
+ const readContext = createDatasetAbortContext(options.signal);
304
+ this.activeReadControllers.add(readContext.abortController);
305
+ const tasks = this.getReadTasks(options, readContext.abortController.signal);
306
+ const fileConcurrency = normalizeFileConcurrency(
307
+ options.fileConcurrency ?? this.options.parquetDataset?.fileConcurrency
308
+ );
309
+ let completed = false;
310
+ let limitReached = false;
311
+ let readError: unknown;
312
+
313
+ try {
314
+ for await (const batch of executeScanTasks(tasks, {
315
+ concurrency: fileConcurrency,
316
+ signal: readContext.abortController.signal
317
+ })) {
318
+ const outputBatch = sliceParquetBatch(batch, Math.min(batch.length, remainingRows));
319
+ this.telemetry.batchesEmitted++;
320
+ this.telemetry.rowsEmitted += outputBatch.length;
321
+ yield outputBatch;
322
+ remainingRows -= outputBatch.length;
323
+ if (remainingRows === 0) {
324
+ limitReached = true;
325
+ return;
326
+ }
327
+ }
328
+ completed = true;
329
+ } catch (error) {
330
+ readError = error;
331
+ throw error;
332
+ } finally {
333
+ const cancelled = readContext.abortController.signal.aborted || options.signal?.aborted;
334
+ readContext.abortController.abort();
335
+ readContext.removeSignalListener();
336
+ this.activeReadControllers.delete(readContext.abortController);
337
+ const status: ScanExecutionTelemetry['status'] = readError
338
+ ? cancelled
339
+ ? 'cancelled'
340
+ : 'failed'
341
+ : limitReached || !completed
342
+ ? 'early-terminated'
343
+ : 'completed';
344
+ emitScanExecutionTelemetry(
345
+ options.onTelemetry,
346
+ createParquetDatasetScanExecutionTelemetry(
347
+ telemetryBefore,
348
+ this.getTelemetry(),
349
+ startedAt,
350
+ status,
351
+ limitReached
352
+ ? 'limit'
353
+ : !completed && readError === undefined
354
+ ? 'consumer-return'
355
+ : undefined,
356
+ readError
357
+ )
358
+ );
359
+ }
360
+ }
361
+
362
+ /** Permanently closes this dataset source and aborts every active read. */
363
+ async close(): Promise<void> {
364
+ if (this.closed) {
365
+ return;
366
+ }
367
+ this.closed = true;
368
+ for (const abortController of this.activeReadControllers) {
369
+ abortController.abort();
370
+ }
371
+ }
372
+
373
+ /** Reads one child source into its bounded file-order queue. */
374
+ private async *getReadTasks(
375
+ options: ParquetDatasetReadOptions,
376
+ signal: AbortSignal,
377
+ filePlans?: ReadonlyMap<number, ParquetSourceExplain>
378
+ ): AsyncIterable<ScanTask<ParquetDatasetBatch>> {
379
+ const selectedFiles = this.getSelectedFiles({...options, signal});
380
+ for await (const indexedFile of selectedFiles) {
381
+ if (filePlans && !filePlans.has(indexedFile.index)) {
382
+ continue;
383
+ }
384
+ yield {
385
+ run: taskSignal =>
386
+ this.readFile(indexedFile, options, taskSignal, filePlans?.get(indexedFile.index))
387
+ };
388
+ }
389
+ }
390
+
391
+ /** Plans retained files through bounded, ordered common scan tasks. */
392
+ private async *getPlanTasks(
393
+ options: ParquetDatasetReadOptions,
394
+ signal: AbortSignal,
395
+ discovery: ParquetDatasetDiscoverySummary
396
+ ): AsyncIterable<ScanTask<ParquetDatasetFileScanPlan>> {
397
+ const selectedFiles = this.getSelectedFiles({...options, signal}, discovery);
398
+ for await (const indexedFile of selectedFiles) {
399
+ yield {run: taskSignal => this.planFile(indexedFile, options, taskSignal)};
400
+ }
401
+ }
402
+
403
+ /** Produces one child physical plan and closes its temporary source. */
404
+ private async *planFile(
405
+ indexedFile: IndexedParquetDatasetFile,
406
+ options: ParquetDatasetReadOptions,
407
+ signal: AbortSignal
408
+ ): AsyncIterable<ParquetDatasetFileScanPlan> {
409
+ const source = this.createSource(indexedFile.file);
410
+ this.telemetry.filesOpened++;
411
+ try {
412
+ if (this.options.parquetDataset?.validateSchema !== false) {
413
+ await this.validateFileSchema(source, indexedFile, signal);
414
+ }
415
+ const parquet = await source.getScanPlan({
416
+ columns: options.columns,
417
+ predicate: options.predicate,
418
+ bbox: options.bbox,
419
+ geometryColumn: options.geometryColumn,
420
+ rowGroupFilter: options.rowGroupFilter,
421
+ limit: undefined,
422
+ signal
423
+ });
424
+ yield Object.freeze({
425
+ fileIndex: indexedFile.index,
426
+ fileId: getDatasetFileId(indexedFile.file, indexedFile.index),
427
+ partitions: indexedFile.file.partitions,
428
+ parquet
429
+ });
430
+ } finally {
431
+ await source.close();
432
+ this.addParquetTelemetry(source.getTelemetry());
433
+ }
434
+ }
435
+
436
+ /** Reads one child source as an asynchronous batch iterable. */
437
+ private async *readFile(
438
+ indexedFile: IndexedParquetDatasetFile,
439
+ options: ParquetDatasetReadOptions,
440
+ signal: AbortSignal,
441
+ scanPlan?: ParquetSourceExplain
442
+ ): AsyncIterable<ParquetDatasetBatch> {
443
+ const source = this.createSource(indexedFile.file);
444
+ this.telemetry.filesOpened++;
445
+ try {
446
+ if (this.options.parquetDataset?.validateSchema !== false) {
447
+ await this.validateFileSchema(source, indexedFile, signal);
448
+ }
449
+ for await (const batch of source.read({
450
+ columns: options.columns,
451
+ batchSize: options.batchSize,
452
+ concurrency: options.concurrency,
453
+ rowGroups: scanPlan?.rowGroups.indices,
454
+ rowGroupFilter: options.rowGroupFilter,
455
+ predicate: options.predicate ?? (!options.bbox ? getPlanPredicate(scanPlan) : undefined),
456
+ bbox: options.bbox,
457
+ geometryColumn: options.geometryColumn,
458
+ limit: undefined,
459
+ signal
460
+ })) {
461
+ yield createDatasetBatch(batch, indexedFile);
462
+ }
463
+ } catch (error) {
464
+ throw error;
465
+ } finally {
466
+ await source.close();
467
+ this.addParquetTelemetry(source.getTelemetry());
468
+ }
469
+ }
470
+
471
+ /** Establishes and validates a stable field schema for concurrently opened files. */
472
+ private schemaFingerprintPromise: Promise<string> | null = null;
473
+
474
+ /** Validates one child schema against the first file schema observed by this source. */
475
+ private async validateFileSchema(
476
+ source: ParquetSource,
477
+ indexedFile: IndexedParquetDatasetFile,
478
+ signal: AbortSignal
479
+ ): Promise<void> {
480
+ const schema = await source.getSchema({signal});
481
+ const fingerprint = getSchemaFingerprint(schema);
482
+ if (!this.schemaFingerprintPromise) {
483
+ this.schemaFingerprintPromise = Promise.resolve(fingerprint);
484
+ return;
485
+ }
486
+ const expectedFingerprint = await this.schemaFingerprintPromise;
487
+ if (fingerprint !== expectedFingerprint) {
488
+ throw new Error(
489
+ `Parquet dataset file ${getDatasetFileId(indexedFile.file, indexedFile.index)} has an incompatible schema`
490
+ );
491
+ }
492
+ }
493
+
494
+ /** Creates a child source while preserving caller fetch, worker, range, and decode options. */
495
+ private createSource(file: ParquetDatasetFile): ParquetSource {
496
+ const parquetOptions = this.options.parquet
497
+ ? {...this.options.parquet, limit: undefined}
498
+ : undefined;
499
+ return new ParquetSource(file.data, {...this.options, parquet: parquetOptions}, this.coreApi);
500
+ }
501
+
502
+ /** Lazily discovers descriptors and applies conservative local pruning. */
503
+ private async *getSelectedFiles(
504
+ query: ParquetDatasetFileQuery,
505
+ discovery?: ParquetDatasetDiscoverySummary
506
+ ): AsyncIterable<IndexedParquetDatasetFile> {
507
+ throwIfAborted(query.signal);
508
+ const collection = await getFileCollection(this.files, query);
509
+ let index = 0;
510
+ for await (const file of collection) {
511
+ throwIfAborted(query.signal);
512
+ validateDatasetFile(file, index);
513
+ this.telemetry.filesDiscovered++;
514
+ if (discovery) discovery.discovered++;
515
+ if (query.bbox && file.bbox && !doBoundingBoxesIntersect(query.bbox, file.bbox)) {
516
+ this.telemetry.filesPrunedByBoundingBox++;
517
+ if (discovery) discovery.prunedByBoundingBox++;
518
+ index++;
519
+ continue;
520
+ }
521
+ if (query.partitions && !matchesPartitions(file.partitions, query.partitions)) {
522
+ this.telemetry.filesPrunedByPartitions++;
523
+ if (discovery) discovery.prunedByPartitions++;
524
+ index++;
525
+ continue;
526
+ }
527
+ this.telemetry.filesSelected++;
528
+ if (discovery) discovery.selected++;
529
+ yield {file, index: index++};
530
+ }
531
+ }
532
+
533
+ /** Adds a final child-source telemetry snapshot exactly once. */
534
+ private addParquetTelemetry(telemetry: ParquetTelemetry): void {
535
+ for (const key of Object.keys(telemetry) as Array<keyof ParquetTelemetry>) {
536
+ this.telemetry.parquet[key] += telemetry[key];
537
+ }
538
+ }
539
+
540
+ /** Throws when an operation is attempted after `close()`. */
541
+ private assertOpen(): void {
542
+ if (this.closed) {
543
+ throw new Error('ParquetDatasetSource is closed');
544
+ }
545
+ }
546
+ }
547
+
548
+ /** Creates operation-local descriptor discovery counters. */
549
+ function createParquetDatasetDiscoverySummary(): ParquetDatasetDiscoverySummary {
550
+ return {discovered: 0, selected: 0, prunedByBoundingBox: 0, prunedByPartitions: 0};
551
+ }
552
+
553
+ /** Normalizes static descriptors and lazy providers into one file collection. */
554
+ async function getFileCollection(
555
+ files: ParquetDatasetFiles,
556
+ query: ParquetDatasetFileQuery
557
+ ): Promise<ParquetDatasetFileCollection> {
558
+ return typeof files === 'function' ? await files(query) : files;
559
+ }
560
+
561
+ /** Attaches dataset-level descriptor provenance without copying Arrow buffers. */
562
+ function createDatasetBatch(
563
+ batch: ParquetSourceBatch,
564
+ indexedFile: IndexedParquetDatasetFile
565
+ ): ParquetDatasetBatch {
566
+ const datasetProvenance = {
567
+ datasetFileIndex: indexedFile.index,
568
+ datasetFileId: getDatasetFileId(indexedFile.file, indexedFile.index),
569
+ datasetPartitions: indexedFile.file.partitions,
570
+ datasetFileMetadata: indexedFile.file.metadata
571
+ };
572
+ const provenance: ParquetDatasetBatchProvenance = Object.freeze({
573
+ sourceId: batch.sourceId,
574
+ sourceUrl: batch.sourceUrl,
575
+ source: batch.source,
576
+ rowGroupIndex: batch.rowGroupIndex,
577
+ rowOffset: batch.rowOffset,
578
+ rowGroupRowOffset: batch.rowGroupRowOffset,
579
+ rowCount: batch.rowCount,
580
+ rowGroupRowIndices: batch.rowGroupRowIndices,
581
+ rowIndices: batch.rowIndices,
582
+ ...datasetProvenance
583
+ });
584
+ return {...batch, metadata: provenance, ...datasetProvenance};
585
+ }
586
+
587
+ /** Returns the filter predicate recorded in one child source plan. */
588
+ function getPlanPredicate(plan: ParquetSourceExplain | undefined): ParquetPredicate | undefined {
589
+ const filter = plan?.plan.find(step => step.kind === 'filter');
590
+ return filter?.kind === 'filter' ? filter.predicate : undefined;
591
+ }
592
+
593
+ /** Returns a stable descriptor identity for batch provenance and diagnostics. */
594
+ function getDatasetFileId(file: ParquetDatasetFile, index: number): string {
595
+ if (file.id) {
596
+ return file.id;
597
+ }
598
+ if (typeof file.data === 'string') {
599
+ return file.data;
600
+ }
601
+ return typeof File !== 'undefined' && file.data instanceof File && file.data.name
602
+ ? file.data.name
603
+ : `blob-${index}`;
604
+ }
605
+
606
+ /** Validates a provider descriptor before opening a child source. */
607
+ function validateDatasetFile(file: ParquetDatasetFile, index: number): void {
608
+ if (!file || (typeof file.data !== 'string' && !(file.data instanceof Blob))) {
609
+ throw new Error(`Invalid Parquet dataset file descriptor at index ${index}`);
610
+ }
611
+ }
612
+
613
+ /** Tests 2D intersection while conservatively accepting additional dimensions. */
614
+ function doBoundingBoxesIntersect(
615
+ left: ParquetDatasetBoundingBox,
616
+ right: ParquetDatasetBoundingBox
617
+ ): boolean {
618
+ const leftMaximumX = left.length === 8 ? left[4] : left.length === 6 ? left[3] : left[2];
619
+ const leftMaximumY = left.length === 8 ? left[5] : left.length === 6 ? left[4] : left[3];
620
+ const rightMaximumX = right.length === 8 ? right[4] : right.length === 6 ? right[3] : right[2];
621
+ const rightMaximumY = right.length === 8 ? right[5] : right.length === 6 ? right[4] : right[3];
622
+ return (
623
+ doLongitudeIntervalsIntersect(left[0], leftMaximumX, right[0], rightMaximumX) &&
624
+ left[1] <= rightMaximumY &&
625
+ leftMaximumY >= right[1]
626
+ );
627
+ }
628
+
629
+ /** Tests longitude intervals that may use RFC 7946 antimeridian wrapping. */
630
+ function doLongitudeIntervalsIntersect(
631
+ firstWest: number,
632
+ firstEast: number,
633
+ secondWest: number,
634
+ secondEast: number
635
+ ): boolean {
636
+ const firstIntervals =
637
+ firstWest <= firstEast
638
+ ? [[firstWest, firstEast]]
639
+ : [
640
+ [firstWest, 180],
641
+ [-180, firstEast]
642
+ ];
643
+ const secondIntervals =
644
+ secondWest <= secondEast
645
+ ? [[secondWest, secondEast]]
646
+ : [
647
+ [secondWest, 180],
648
+ [-180, secondEast]
649
+ ];
650
+ return firstIntervals.some(first =>
651
+ secondIntervals.some(second => first[0] <= second[1] && first[1] >= second[0])
652
+ );
653
+ }
654
+
655
+ /** Tests exact partition constraints without rejecting files that omit a requested key. */
656
+ function matchesPartitions(
657
+ partitions: Readonly<Record<string, ParquetDatasetPartitionValue>> | undefined,
658
+ query: NonNullable<ParquetDatasetFileQuery['partitions']>
659
+ ): boolean {
660
+ for (const [key, requested] of Object.entries(query)) {
661
+ const actual = partitions?.[key];
662
+ if (actual === undefined) {
663
+ continue;
664
+ }
665
+ const accepted = Array.isArray(requested) ? requested : [requested];
666
+ if (!accepted.includes(actual)) {
667
+ return false;
668
+ }
669
+ }
670
+ return true;
671
+ }
672
+
673
+ /** Creates a deterministic field-only schema fingerprint for cross-file validation. */
674
+ function getSchemaFingerprint(schema: Schema): string {
675
+ return JSON.stringify(schema.fields);
676
+ }
677
+
678
+ /** Validates and normalizes dataset-level file concurrency. */
679
+ function normalizeFileConcurrency(value: number | undefined): number {
680
+ const concurrency = value ?? DEFAULT_FILE_CONCURRENCY;
681
+ if (!Number.isInteger(concurrency) || concurrency < 1) {
682
+ throw new Error(`parquetDataset.fileConcurrency must be a positive integer, received ${value}`);
683
+ }
684
+ return concurrency;
685
+ }
686
+
687
+ /** Creates linked cancellation for one dataset read. */
688
+ function createDatasetAbortContext(signal?: AbortSignal): {
689
+ abortController: AbortController;
690
+ removeSignalListener: () => void;
691
+ } {
692
+ const abortController = new AbortController();
693
+ const abort = (): void => abortController.abort(signal?.reason);
694
+ if (signal?.aborted) {
695
+ abort();
696
+ } else {
697
+ signal?.addEventListener('abort', abort, {once: true});
698
+ }
699
+ return {
700
+ abortController,
701
+ removeSignalListener: () => signal?.removeEventListener('abort', abort)
702
+ };
703
+ }
704
+
705
+ /** Throws a standard abort failure when a dataset read has been cancelled. */
706
+ function throwIfAborted(signal?: AbortSignal): void {
707
+ if (signal?.aborted) {
708
+ throw signal.reason || new DOMException('Aborted', 'AbortError');
709
+ }
710
+ }
711
+
712
+ /** Creates zeroed cumulative dataset and child-source telemetry. */
713
+ function createParquetDatasetTelemetry(): ParquetDatasetTelemetry {
714
+ return {
715
+ filesDiscovered: 0,
716
+ filesSelected: 0,
717
+ filesPrunedByBoundingBox: 0,
718
+ filesPrunedByPartitions: 0,
719
+ filesOpened: 0,
720
+ batchesEmitted: 0,
721
+ rowsEmitted: 0,
722
+ parquet: {
723
+ rangeRequestCount: 0,
724
+ requestedBytes: 0,
725
+ downloadedBytes: 0,
726
+ cacheHits: 0,
727
+ networkDurationMs: 0,
728
+ failedRangeRequestCount: 0,
729
+ abortedRangeRequestCount: 0,
730
+ retryCount: 0,
731
+ decodeDurationMs: 0,
732
+ arrowConversionDurationMs: 0,
733
+ rowGroupsRequested: 0,
734
+ rowGroupsPruned: 0,
735
+ rowGroupsPrunedByStatistics: 0,
736
+ rowGroupsPrunedByBloomFilter: 0,
737
+ bloomFiltersRead: 0,
738
+ bloomFilterBytesRead: 0,
739
+ rowGroupsPrunedByPageIndex: 0,
740
+ pageIndexesRead: 0,
741
+ pagesRead: 0,
742
+ pagesPruned: 0,
743
+ rowsPrunedByPageIndex: 0,
744
+ rowGroupsDecoded: 0,
745
+ batchesEmitted: 0,
746
+ rowsEmitted: 0,
747
+ predicateRowsTested: 0,
748
+ predicateRowsMatched: 0,
749
+ cancellationCount: 0,
750
+ failedReadCount: 0
751
+ }
752
+ };
753
+ }
754
+
755
+ /** Converts cumulative dataset and child counters into one portable read-scoped snapshot. */
756
+ function createParquetDatasetScanExecutionTelemetry(
757
+ before: ParquetDatasetTelemetry,
758
+ after: ParquetDatasetTelemetry,
759
+ startedAt: number,
760
+ status: ScanExecutionTelemetry['status'],
761
+ earlyTerminationReason?: ScanExecutionTelemetry['earlyTerminationReason'],
762
+ error?: unknown
763
+ ): ScanExecutionTelemetry {
764
+ const parquet = Object.fromEntries(
765
+ Object.keys(after.parquet).map(key => {
766
+ const telemetryKey = key as keyof ParquetTelemetry;
767
+ return [key, after.parquet[telemetryKey] - before.parquet[telemetryKey]];
768
+ })
769
+ ) as ParquetTelemetry;
770
+ const dataset = Object.freeze({
771
+ filesDiscovered: after.filesDiscovered - before.filesDiscovered,
772
+ filesSelected: after.filesSelected - before.filesSelected,
773
+ filesPrunedByBoundingBox: after.filesPrunedByBoundingBox - before.filesPrunedByBoundingBox,
774
+ filesPrunedByPartitions: after.filesPrunedByPartitions - before.filesPrunedByPartitions,
775
+ filesOpened: after.filesOpened - before.filesOpened,
776
+ batchesEmitted: after.batchesEmitted - before.batchesEmitted,
777
+ rowsEmitted: after.rowsEmitted - before.rowsEmitted
778
+ });
779
+ const rowsRead = Math.max(parquet.predicateRowsTested, parquet.rowsEmitted, dataset.rowsEmitted);
780
+ return Object.freeze({
781
+ status,
782
+ sourcesPlanned: Math.max(dataset.filesSelected, dataset.filesOpened),
783
+ sourcesRead: dataset.filesOpened,
784
+ batchesRead: dataset.batchesEmitted,
785
+ batchesDecoded: parquet.rowGroupsDecoded,
786
+ rowsRead,
787
+ rowsTested: parquet.predicateRowsTested || undefined,
788
+ rowsRetained: parquet.predicateRowsMatched || undefined,
789
+ rowsReturned: dataset.rowsEmitted,
790
+ bytesRead: parquet.downloadedBytes,
791
+ bytesFetched: parquet.downloadedBytes,
792
+ filesOpened: dataset.filesOpened,
793
+ tasksOpened: parquet.rowGroupsDecoded,
794
+ rowsPruned: parquet.rowsPrunedByPageIndex,
795
+ durationMilliseconds: Date.now() - startedAt,
796
+ earlyTerminationReason,
797
+ details: Object.freeze({dataset, parquet: Object.freeze({...parquet})}),
798
+ ...(error === undefined ? {} : {error})
799
+ });
800
+ }