@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,410 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {ArrayType} from '@loaders.gl/schema';
6
+
7
+ import type {
8
+ ParquetColumnChunkStatistics,
9
+ ParquetComparisonPredicate,
10
+ ParquetInPredicate,
11
+ ParquetLogicalPredicate,
12
+ ParquetNotPredicate,
13
+ ParquetNullPredicate,
14
+ ParquetPredicate,
15
+ ParquetPredicateProperty,
16
+ ParquetPredicateValue,
17
+ ParquetRowGroupMetadata
18
+ } from '../parquet-source-types';
19
+ import {encodeUtf8} from '../parquetjs/utils/binary-utils';
20
+
21
+ /** Returns the unique top-level columns referenced by a predicate. */
22
+ export function getParquetPredicateColumns(predicate: ParquetPredicate): string[] {
23
+ return [...new Set(getParquetPredicatePaths(predicate).map(path => path[0]))];
24
+ }
25
+
26
+ /** Returns the unique physical schema paths referenced by a predicate. */
27
+ export function getParquetPredicatePaths(predicate: ParquetPredicate): string[][] {
28
+ const paths = new Map<string, string[]>();
29
+ visitParquetPredicate(predicate, child => {
30
+ const property = getPredicateProperty(child);
31
+ if (property) {
32
+ const path = [...getParquetPredicatePath(property)];
33
+ paths.set(path.join('\0'), path);
34
+ }
35
+ });
36
+ return [...paths.values()];
37
+ }
38
+
39
+ /** Copies a predicate tree and mutable scalar values for read-scoped option snapshots. */
40
+ export function copyParquetPredicate(predicate: ParquetPredicate): ParquetPredicate {
41
+ if (isParquetLogicalPredicate(predicate)) {
42
+ return {
43
+ op: predicate.op,
44
+ args: predicate.args.map(copyParquetPredicate)
45
+ };
46
+ }
47
+ if (isParquetNotPredicate(predicate)) {
48
+ return {
49
+ op: 'not',
50
+ args: [copyParquetPredicate(predicate.args[0])]
51
+ };
52
+ }
53
+ const property = copyPredicateProperty(predicate.args[0]);
54
+ if (predicate.op === 'isNull') {
55
+ return {op: 'isNull', args: [property]};
56
+ }
57
+ if (predicate.op === 'in') {
58
+ return {
59
+ op: 'in',
60
+ args: [property, predicate.args[1].map(copyPredicateValue)]
61
+ };
62
+ }
63
+ return {
64
+ op: predicate.op,
65
+ args: [property, copyPredicateValue(predicate.args[1])]
66
+ };
67
+ }
68
+
69
+ /** Validates a predicate and every referenced top-level column. */
70
+ export function validateParquetPredicate(
71
+ predicate: ParquetPredicate,
72
+ availableColumns: ReadonlySet<string>
73
+ ): void {
74
+ visitParquetPredicate(predicate, child => {
75
+ if (isParquetLogicalPredicate(child)) {
76
+ if (child.args.length < 2) {
77
+ throw new Error(`Parquet predicate ${child.op} requires at least two child predicates`);
78
+ }
79
+ return;
80
+ }
81
+ if (isParquetNotPredicate(child)) {
82
+ return;
83
+ }
84
+ const property = child.args[0];
85
+ const path = getParquetPredicatePath(property);
86
+ if (!path.length || path.some(pathComponent => !pathComponent)) {
87
+ throw new Error('Parquet predicate property path must contain non-empty strings');
88
+ }
89
+ if (!availableColumns.has(path[0])) {
90
+ throw new Error(`Parquet predicate column not found: ${path.join('.')}`);
91
+ }
92
+ if (child.op === 'in' && child.args[1].length === 0) {
93
+ throw new Error('Parquet predicate in requires at least one value');
94
+ }
95
+ });
96
+ }
97
+
98
+ /** Conservatively determines whether a row group can contain a matching row. */
99
+ export function canParquetRowGroupMatch(
100
+ predicate: ParquetPredicate,
101
+ rowGroup: ParquetRowGroupMetadata
102
+ ): boolean {
103
+ if (isParquetLogicalPredicate(predicate)) {
104
+ return predicate.op === 'and'
105
+ ? predicate.args.every(child => canParquetRowGroupMatch(child, rowGroup))
106
+ : predicate.args.some(child => canParquetRowGroupMatch(child, rowGroup));
107
+ }
108
+ if (isParquetNotPredicate(predicate)) {
109
+ const child = predicate.args[0];
110
+ if (child.op !== 'isNull') {
111
+ return true;
112
+ }
113
+ const column = getRowGroupColumn(rowGroup, getParquetPredicatePath(child.args[0]));
114
+ return !column?.statistics || column.statistics.nullCount !== rowGroup.rowCount;
115
+ }
116
+
117
+ const column = getRowGroupColumn(rowGroup, getParquetPredicatePath(predicate.args[0]));
118
+ const statistics = column?.statistics;
119
+ if (!statistics) {
120
+ return true;
121
+ }
122
+ return canParquetStatisticsMatch(predicate, statistics, rowGroup.rowCount);
123
+ }
124
+
125
+ /** Conservatively determines whether one predicate leaf can match supplied statistics. */
126
+ export function canParquetStatisticsMatch(
127
+ predicate: ParquetComparisonPredicate | ParquetInPredicate | ParquetNullPredicate,
128
+ statistics: ParquetColumnChunkStatistics,
129
+ rowCount: number
130
+ ): boolean {
131
+ if (statistics.nullCount === rowCount) {
132
+ return predicate.op === 'isNull';
133
+ }
134
+ if (predicate.op === 'isNull') {
135
+ return statistics.nullCount !== 0;
136
+ }
137
+ const minimum = statistics.minIsExact === false ? undefined : statistics.min;
138
+ const maximum = statistics.maxIsExact === false ? undefined : statistics.max;
139
+ if (predicate.op === 'in') {
140
+ return predicate.args[1].some(value => canComparisonMatch('=', value, minimum, maximum));
141
+ }
142
+ return canComparisonMatch(predicate.op, predicate.args[1], minimum, maximum);
143
+ }
144
+
145
+ /** Returns exact source row indexes matching a predicate. */
146
+ export function filterParquetRowIndices(
147
+ predicate: ParquetPredicate | undefined,
148
+ columns: Record<string, ArrayType>,
149
+ rowCount: number
150
+ ): number[] {
151
+ if (!predicate) {
152
+ return Array.from({length: rowCount}, (_, index) => index);
153
+ }
154
+ const rowIndices: number[] = [];
155
+ for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {
156
+ if (evaluateParquetPredicate(predicate, columns, rowIndex) === true) {
157
+ rowIndices.push(rowIndex);
158
+ }
159
+ }
160
+ return rowIndices;
161
+ }
162
+
163
+ /** Gathers selected source rows without constructing row objects. */
164
+ export function gatherParquetColumns(
165
+ columns: Record<string, ArrayType>,
166
+ rowIndices: readonly number[],
167
+ selectedColumns?: ReadonlySet<string>
168
+ ): Record<string, ArrayType> {
169
+ const gatheredColumns: Record<string, ArrayType> = {};
170
+ for (const [name, column] of Object.entries(columns)) {
171
+ if (selectedColumns && !selectedColumns.has(name)) {
172
+ continue;
173
+ }
174
+ gatheredColumns[name] = rowIndices.map(rowIndex => (column as ArrayLike<unknown>)[rowIndex]);
175
+ }
176
+ return gatheredColumns;
177
+ }
178
+
179
+ /** Applies an exact predicate to one materialized row. */
180
+ function evaluateParquetPredicate(
181
+ predicate: ParquetPredicate,
182
+ columns: Record<string, ArrayType>,
183
+ rowIndex: number
184
+ ): boolean | null {
185
+ if (isParquetLogicalPredicate(predicate)) {
186
+ const results = predicate.args.map(child => evaluateParquetPredicate(child, columns, rowIndex));
187
+ if (predicate.op === 'and') {
188
+ return results.includes(false) ? false : results.includes(null) ? null : true;
189
+ }
190
+ return results.includes(true) ? true : results.includes(null) ? null : false;
191
+ }
192
+ if (isParquetNotPredicate(predicate)) {
193
+ const result = evaluateParquetPredicate(predicate.args[0], columns, rowIndex);
194
+ return result === null ? null : !result;
195
+ }
196
+ const value = getColumnValue(columns, getParquetPredicatePath(predicate.args[0]), rowIndex);
197
+ if (predicate.op === 'isNull') {
198
+ return value === null || value === undefined;
199
+ }
200
+ if (value === null || value === undefined) {
201
+ return null;
202
+ }
203
+ if (predicate.op === 'in') {
204
+ return predicate.args[1].some(candidate => comparePredicateValues(value, candidate) === 0);
205
+ }
206
+ const comparison = comparePredicateValues(value, predicate.args[1]);
207
+ switch (predicate.op) {
208
+ case '=':
209
+ return comparison === 0;
210
+ case '<>':
211
+ return comparison !== 0;
212
+ case '<':
213
+ return comparison < 0;
214
+ case '<=':
215
+ return comparison <= 0;
216
+ case '>':
217
+ return comparison > 0;
218
+ case '>=':
219
+ return comparison >= 0;
220
+ }
221
+ }
222
+
223
+ /** Returns whether footer min/max leave any possible match for one comparison. */
224
+ function canComparisonMatch(
225
+ operator: '=' | '<>' | '<' | '<=' | '>' | '>=',
226
+ value: ParquetPredicateValue,
227
+ minimum: unknown,
228
+ maximum: unknown
229
+ ): boolean {
230
+ try {
231
+ switch (operator) {
232
+ case '=':
233
+ return !(
234
+ (minimum !== undefined && compareStatisticsValues(value, minimum) < 0) ||
235
+ (maximum !== undefined && compareStatisticsValues(value, maximum) > 0)
236
+ );
237
+ case '<>':
238
+ return !(
239
+ minimum !== undefined &&
240
+ maximum !== undefined &&
241
+ compareStatisticsValues(value, minimum) === 0 &&
242
+ compareStatisticsValues(value, maximum) === 0
243
+ );
244
+ case '<':
245
+ return minimum === undefined || compareStatisticsValues(minimum, value) < 0;
246
+ case '<=':
247
+ return minimum === undefined || compareStatisticsValues(minimum, value) <= 0;
248
+ case '>':
249
+ return maximum === undefined || compareStatisticsValues(maximum, value) > 0;
250
+ case '>=':
251
+ return maximum === undefined || compareStatisticsValues(maximum, value) >= 0;
252
+ }
253
+ } catch {
254
+ return true;
255
+ }
256
+ }
257
+
258
+ /** Compares statistics using Parquet's unsigned UTF-8 byte ordering for strings. */
259
+ function compareStatisticsValues(left: unknown, right: unknown): number {
260
+ if (typeof left === 'string' && typeof right === 'string') {
261
+ return compareUint8Arrays(encodeUtf8(left), encodeUtf8(right));
262
+ }
263
+ return comparePredicateValues(left, right);
264
+ }
265
+
266
+ /** Compares predicate-compatible scalar values and rejects incomparable types. */
267
+ function comparePredicateValues(left: unknown, right: unknown): number {
268
+ if (left instanceof Uint8Array && right instanceof Uint8Array) {
269
+ return compareUint8Arrays(left, right);
270
+ }
271
+ if (left instanceof Uint8Array || right instanceof Uint8Array) {
272
+ throw new Error('Parquet binary predicates require binary values on both sides');
273
+ }
274
+ if (left instanceof Date || right instanceof Date) {
275
+ if (!(left instanceof Date) || !(right instanceof Date)) {
276
+ throw new Error('Parquet date predicates require date values on both sides');
277
+ }
278
+ const leftTime = left.getTime();
279
+ const rightTime = right.getTime();
280
+ if (!Number.isFinite(leftTime) || !Number.isFinite(rightTime)) {
281
+ throw new Error('Invalid dates cannot be ordered by a Parquet predicate');
282
+ }
283
+ return leftTime < rightTime ? -1 : leftTime > rightTime ? 1 : 0;
284
+ }
285
+ const leftType = typeof left;
286
+ const rightType = typeof right;
287
+ const bothNumeric =
288
+ (leftType === 'number' || leftType === 'bigint') &&
289
+ (rightType === 'number' || rightType === 'bigint');
290
+ if (!bothNumeric && leftType !== rightType) {
291
+ throw new Error(`Parquet predicate cannot compare ${leftType} with ${rightType}`);
292
+ }
293
+ if (!bothNumeric && leftType !== 'string' && leftType !== 'boolean') {
294
+ throw new Error(`Parquet predicate does not support ${leftType} values`);
295
+ }
296
+ const comparableLeft = left as string | boolean | number | bigint;
297
+ const comparableRight = right as string | boolean | number | bigint;
298
+ if (
299
+ (typeof comparableLeft === 'number' && !Number.isFinite(comparableLeft)) ||
300
+ (typeof comparableRight === 'number' && !Number.isFinite(comparableRight))
301
+ ) {
302
+ throw new Error('Non-finite numbers cannot be ordered by a Parquet predicate');
303
+ }
304
+ if ((comparableLeft as never) < (comparableRight as never)) {
305
+ return -1;
306
+ }
307
+ if ((comparableLeft as never) > (comparableRight as never)) {
308
+ return 1;
309
+ }
310
+ return 0;
311
+ }
312
+
313
+ /** Compares two byte sequences using unsigned lexicographic ordering. */
314
+ function compareUint8Arrays(left: Uint8Array, right: Uint8Array): number {
315
+ const length = Math.min(left.length, right.length);
316
+ for (let index = 0; index < length; index++) {
317
+ if (left[index] !== right[index]) {
318
+ return left[index] < right[index] ? -1 : 1;
319
+ }
320
+ }
321
+ return Math.sign(left.length - right.length);
322
+ }
323
+
324
+ /** Reads one value from an array-like materialized Parquet column. */
325
+ function getColumnValue(
326
+ columns: Record<string, ArrayType>,
327
+ path: readonly string[],
328
+ rowIndex: number
329
+ ): unknown {
330
+ const column = columns[path[0]];
331
+ if (!column) {
332
+ throw new Error('Parquet predicate column was not decoded');
333
+ }
334
+ let value = (column as ArrayLike<unknown>)[rowIndex];
335
+ for (let pathIndex = 1; pathIndex < path.length; pathIndex++) {
336
+ if (value === null || value === undefined || typeof value !== 'object') {
337
+ return undefined;
338
+ }
339
+ const property = path[pathIndex];
340
+ value =
341
+ typeof (value as {get?: unknown}).get === 'function'
342
+ ? (value as {get: (name: string) => unknown}).get(property)
343
+ : (value as Record<string, unknown>)[property];
344
+ }
345
+ return value;
346
+ }
347
+
348
+ /** Copies mutable binary and date predicate values. */
349
+ function copyPredicateValue(value: ParquetPredicateValue): ParquetPredicateValue {
350
+ if (value instanceof Uint8Array) {
351
+ return value.slice();
352
+ }
353
+ if (value instanceof Date) {
354
+ return new Date(value.getTime());
355
+ }
356
+ return value;
357
+ }
358
+
359
+ /** Copies a predicate property reference. */
360
+ function copyPredicateProperty(property: ParquetPredicateProperty): ParquetPredicateProperty {
361
+ return {
362
+ property: Array.isArray(property.property) ? [...property.property] : property.property
363
+ };
364
+ }
365
+
366
+ /** Returns one predicate property as an explicit Parquet schema path. */
367
+ export function getParquetPredicatePath(property: ParquetPredicateProperty): readonly string[] {
368
+ return Array.isArray(property.property) ? property.property : [property.property as string];
369
+ }
370
+
371
+ /** Returns the property reference from a leaf predicate. */
372
+ function getPredicateProperty(predicate: ParquetPredicate): ParquetPredicateProperty | undefined {
373
+ return isParquetLogicalPredicate(predicate) || isParquetNotPredicate(predicate)
374
+ ? undefined
375
+ : predicate.args[0];
376
+ }
377
+
378
+ /** Returns one top-level column chunk from normalized row-group metadata. */
379
+ function getRowGroupColumn(rowGroup: ParquetRowGroupMetadata, path: readonly string[]) {
380
+ return rowGroup.columns.find(
381
+ columnChunk =>
382
+ columnChunk.path.length === path.length &&
383
+ columnChunk.path.every((pathComponent, index) => pathComponent === path[index])
384
+ );
385
+ }
386
+
387
+ /** Visits every predicate node depth-first. */
388
+ function visitParquetPredicate(
389
+ predicate: ParquetPredicate,
390
+ visit: (predicate: ParquetPredicate) => void
391
+ ): void {
392
+ visit(predicate);
393
+ if (isParquetLogicalPredicate(predicate) || isParquetNotPredicate(predicate)) {
394
+ for (const child of predicate.args) {
395
+ visitParquetPredicate(child, visit);
396
+ }
397
+ }
398
+ }
399
+
400
+ /** Returns whether a predicate combines multiple child predicates. */
401
+ function isParquetLogicalPredicate(
402
+ predicate: ParquetPredicate
403
+ ): predicate is ParquetLogicalPredicate {
404
+ return predicate.op === 'and' || predicate.op === 'or';
405
+ }
406
+
407
+ /** Returns whether a predicate negates one child predicate. */
408
+ function isParquetNotPredicate(predicate: ParquetPredicate): predicate is ParquetNotPredicate {
409
+ return predicate.op === 'not';
410
+ }
@@ -0,0 +1,41 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Loader} from '@loaders.gl/loader-utils';
6
+ import {canParseWithWorker, isBrowser, parseWithWorker} from '@loaders.gl/loader-utils';
7
+
8
+ import {PARQUET_LOADER_BASE} from '../parquet-loader-base';
9
+ import {PARQUET_SOURCE_WORKER_LOAD_WORKER} from '../parquet-source-worker-factory';
10
+ import {PARQUET_SOURCE_WORKER_URL} from '../parquet-source-worker-url';
11
+ import type {
12
+ ParquetSourceWorkerInput,
13
+ ParquetSourceWorkerOptions,
14
+ ParquetSourceWorkerResult
15
+ } from './parquet-source-worker-types';
16
+
17
+ /** Private worker descriptor using the package-local selective source worker bundle. */
18
+ const PARQUET_SOURCE_WORKER: Loader = {
19
+ ...PARQUET_LOADER_BASE,
20
+ id: 'parquet-source',
21
+ name: 'ParquetSource',
22
+ worker: PARQUET_SOURCE_WORKER_URL,
23
+ loadWorker: PARQUET_SOURCE_WORKER_LOAD_WORKER
24
+ };
25
+
26
+ /** Returns whether this runtime and option set can decode Parquet source rows on a worker. */
27
+ export function canDecodeParquetSourceOnWorker(options: ParquetSourceWorkerOptions): boolean {
28
+ return isBrowser && canParseWithWorker(PARQUET_SOURCE_WORKER, options);
29
+ }
30
+
31
+ /** Sends selected compressed Parquet chunks to a worker and returns transferable Arrow buffers. */
32
+ export async function decodeParquetSourceRowGroupOnWorker(
33
+ input: ParquetSourceWorkerInput,
34
+ options: ParquetSourceWorkerOptions
35
+ ): Promise<ParquetSourceWorkerResult> {
36
+ return (await parseWithWorker(
37
+ PARQUET_SOURCE_WORKER,
38
+ input,
39
+ options
40
+ )) as ParquetSourceWorkerResult;
41
+ }
@@ -0,0 +1,252 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {dehydrateArrowTable} from '@loaders.gl/arrow/transport';
6
+ import type {ArrayType} from '@loaders.gl/schema';
7
+ import {convertTable} from '@loaders.gl/schema-utils';
8
+
9
+ import {preloadCompressions} from '../parquetjs/compression';
10
+ import {filterParquetRowIndices, gatherParquetColumns} from './parquet-predicate';
11
+ import type {RowGroup} from '../parquetjs/parquet-thrift/index';
12
+ import {ParquetReader} from '../parquetjs/parser/parquet-reader';
13
+ import {ParquetSchema} from '../parquetjs/schema/schema';
14
+ import {ParquetSourceWorkerFile} from './parquet-source-worker-file';
15
+ import type {ParquetKeyRetriever} from './parquet-encryption';
16
+ import type {
17
+ ParquetSourceWorkerBatch,
18
+ ParquetSourceWorkerColumnChunk,
19
+ ParquetSourceWorkerInput,
20
+ ParquetSourceWorkerResult
21
+ } from './parquet-source-worker-types';
22
+
23
+ /** Decodes one transferred row group entirely inside the worker. */
24
+ export async function decodeParquetSourceWorkerInput(
25
+ input: ParquetSourceWorkerInput
26
+ ): Promise<ParquetSourceWorkerResult> {
27
+ await preloadCompressions();
28
+ const file = new ParquetSourceWorkerFile(input.fileByteLength, input.ranges);
29
+ const schema = new ParquetSchema(input.schemaDefinition);
30
+ const keyRetriever = input.encryption
31
+ ? createWorkerKeyRetriever(
32
+ input.columnChunks,
33
+ input.encryption.aadPrefix?.byteLength ?? 0,
34
+ input.encryption.fileUnique.byteLength
35
+ )
36
+ : undefined;
37
+ const reader = new ParquetReader(file, {
38
+ preserveBinary: input.preserveBinary,
39
+ int96AsTimestamp: input.int96AsTimestamp,
40
+ verifyPageChecksums: input.verifyPageChecksums,
41
+ encryptionContext: input.encryption
42
+ ? {
43
+ algorithm: input.encryption.algorithm,
44
+ aadPrefix: input.encryption.aadPrefix
45
+ ? new Uint8Array(input.encryption.aadPrefix)
46
+ : undefined,
47
+ fileUnique: new Uint8Array(input.encryption.fileUnique)
48
+ }
49
+ : undefined,
50
+ keyRetriever
51
+ });
52
+ const rowGroup = createWorkerRowGroup(input);
53
+
54
+ const decodeStartTime = getCurrentTime();
55
+ let decodedRowGroups;
56
+ try {
57
+ decodedRowGroups = input.pagePlan
58
+ ? await Promise.all(
59
+ input.pagePlan.rowRanges.map(rowRange =>
60
+ reader.readRowGroupRange(schema, rowGroup, [], rowRange, input.pagePlan!.pageLocations)
61
+ )
62
+ )
63
+ : [await reader.readRowGroup(schema, rowGroup, [])];
64
+ } catch (error) {
65
+ throw new Error(
66
+ `Parquet worker decode failed: ${
67
+ error instanceof Error ? `${error.name}: ${error.message}` : String(error)
68
+ }`
69
+ );
70
+ }
71
+ const columns = concatenateMaterializedColumns(
72
+ decodedRowGroups.map(decodedRowGroup => schema.materializeColumns(decodedRowGroup))
73
+ );
74
+ const sourceRowIndices = input.pagePlan
75
+ ? input.pagePlan.rowRanges.flatMap(rowRange =>
76
+ Array.from({length: rowRange.end - rowRange.start}, (_, index) => rowRange.start + index)
77
+ )
78
+ : undefined;
79
+ const sourceRowCount = sourceRowIndices?.length ?? input.rowCount;
80
+ const localRowIndices = input.predicate
81
+ ? filterParquetRowIndices(input.predicate, columns, sourceRowCount)
82
+ : undefined;
83
+ const rowIndices = localRowIndices?.map(rowIndex => sourceRowIndices?.[rowIndex] ?? rowIndex);
84
+ const decodeDurationMs = getCurrentTime() - decodeStartTime;
85
+
86
+ const conversionStartTime = getCurrentTime();
87
+ const batches: ParquetSourceWorkerBatch[] = [];
88
+ const outputColumns = new Set(input.projectedSchema.fields.map(field => field.name));
89
+ const outputRowCount = rowIndices?.length ?? sourceRowCount;
90
+ for (
91
+ let outputRowOffset = 0;
92
+ outputRowOffset < outputRowCount;
93
+ outputRowOffset += input.batchSize
94
+ ) {
95
+ const rowCount = Math.min(input.batchSize, outputRowCount - outputRowOffset);
96
+ const batchRowIndices = rowIndices?.slice(outputRowOffset, outputRowOffset + rowCount);
97
+ const batchLocalRowIndices = localRowIndices?.slice(
98
+ outputRowOffset,
99
+ outputRowOffset + rowCount
100
+ );
101
+ const rowGroupRowOffset = batchRowIndices?.[0] ?? outputRowOffset;
102
+ const batchColumns = batchLocalRowIndices
103
+ ? gatherParquetColumns(columns, batchLocalRowIndices, outputColumns)
104
+ : sliceColumns(columns, outputRowOffset, outputRowOffset + rowCount);
105
+ const arrowTable = convertTable(
106
+ {
107
+ shape: 'columnar-table',
108
+ schema: input.projectedSchema,
109
+ data: batchColumns
110
+ },
111
+ 'arrow-table'
112
+ );
113
+ batches.push({
114
+ rowGroupRowOffset,
115
+ rowCount,
116
+ rowGroupRowIndices: batchRowIndices,
117
+ arrowTable: dehydrateArrowTable(arrowTable.data)
118
+ });
119
+ }
120
+ const arrowConversionDurationMs = getCurrentTime() - conversionStartTime;
121
+ return {
122
+ sourceRowCount,
123
+ rowCount: outputRowCount,
124
+ batches,
125
+ decodeDurationMs,
126
+ arrowConversionDurationMs
127
+ };
128
+ }
129
+
130
+ /** Concatenates materialized page-range fragments without constructing row objects. */
131
+ function concatenateMaterializedColumns(
132
+ fragments: readonly Record<string, ArrayType>[]
133
+ ): Record<string, ArrayType> {
134
+ const columns: Record<string, unknown[]> = {};
135
+ for (const fragment of fragments) {
136
+ for (const [name, values] of Object.entries(fragment)) {
137
+ columns[name] ||= [];
138
+ const destination = columns[name];
139
+ for (let index = 0; index < values.length; index++) {
140
+ destination.push(values[index]);
141
+ }
142
+ }
143
+ }
144
+ return columns as Record<string, ArrayType>;
145
+ }
146
+
147
+ /** Returns a contiguous row slice of every decoded column without constructing row objects. */
148
+ function sliceColumns(
149
+ columns: Record<string, ArrayType>,
150
+ start: number,
151
+ end: number
152
+ ): Record<string, ArrayType> {
153
+ const slicedColumns: Record<string, ArrayType> = {};
154
+ for (const [name, column] of Object.entries(columns)) {
155
+ const slice = (column as ArrayType & {slice?: (start: number, end: number) => ArrayType}).slice;
156
+ slicedColumns[name] = slice
157
+ ? slice.call(column, start, end)
158
+ : Array.prototype.slice.call(column, start, end);
159
+ }
160
+ return slicedColumns;
161
+ }
162
+
163
+ /** Reconstructs the minimal Thrift-compatible row-group object used by the decoder. */
164
+ function createWorkerRowGroup(input: ParquetSourceWorkerInput): RowGroup {
165
+ return {
166
+ num_rows: input.rowCount,
167
+ total_byte_size: input.uncompressedByteLength,
168
+ columns: input.columnChunks.map((columnChunk, index) => {
169
+ const result = {
170
+ file_path: columnChunk.filePath,
171
+ parquetColumnOrdinal: columnChunk.columnOrdinal ?? index,
172
+ meta_data: {
173
+ type: columnChunk.physicalType,
174
+ codec: columnChunk.compressionCodec,
175
+ path_in_schema: columnChunk.path,
176
+ num_values: columnChunk.valueCount,
177
+ total_compressed_size: columnChunk.compressedByteLength,
178
+ total_uncompressed_size: columnChunk.uncompressedByteLength,
179
+ data_page_offset: columnChunk.dataPageOffset,
180
+ dictionary_page_offset: columnChunk.dictionaryPageOffset,
181
+ encodings: []
182
+ }
183
+ } as unknown as RowGroup['columns'][number];
184
+ if (columnChunk.encrypted) {
185
+ result.crypto_metadata = (columnChunk.keyMetadata
186
+ ? {
187
+ ENCRYPTION_WITH_COLUMN_KEY: {
188
+ path_in_schema: columnChunk.path,
189
+ key_metadata: new Uint8Array(columnChunk.keyMetadata)
190
+ }
191
+ }
192
+ : {
193
+ ENCRYPTION_WITH_FOOTER_KEY: {}
194
+ }) as unknown as RowGroup['columns'][number]['crypto_metadata'];
195
+ }
196
+ return result;
197
+ })
198
+ } as unknown as RowGroup;
199
+ }
200
+
201
+ /** Creates a worker-local key retriever from caller-resolved transferable keys. */
202
+ export function createWorkerKeyRetriever(
203
+ columnChunks: readonly ParquetSourceWorkerColumnChunk[],
204
+ aadPrefixByteLength: number,
205
+ fileUniqueByteLength: number
206
+ ): ParquetKeyRetriever {
207
+ return (keyMetadata, context) => {
208
+ const columnOrdinal = getColumnOrdinalFromAad(
209
+ context.aad,
210
+ aadPrefixByteLength,
211
+ fileUniqueByteLength
212
+ );
213
+ const metadataMatches = columnChunks.filter(columnChunk =>
214
+ equalBytes(keyMetadata, columnChunk.keyMetadata && new Uint8Array(columnChunk.keyMetadata))
215
+ );
216
+ const matchingColumn =
217
+ metadataMatches.find(columnChunk => columnChunk.columnOrdinal === columnOrdinal) ??
218
+ (metadataMatches.length === 1 ? metadataMatches[0] : undefined);
219
+ if (!matchingColumn?.keyMaterial) {
220
+ throw new Error('Encrypted Parquet worker key was not transferred for the selected column');
221
+ }
222
+ return new Uint8Array(matchingColumn.keyMaterial);
223
+ };
224
+ }
225
+
226
+ /** Extracts the physical column ordinal encoded in a page-module AAD suffix. */
227
+ function getColumnOrdinalFromAad(
228
+ aad: Uint8Array,
229
+ aadPrefixByteLength: number,
230
+ fileUniqueByteLength: number
231
+ ): number | undefined {
232
+ const columnOrdinalOffset = aadPrefixByteLength + fileUniqueByteLength + 3;
233
+ if (columnOrdinalOffset + 2 > aad.byteLength) return undefined;
234
+ return new DataView(aad.buffer, aad.byteOffset + columnOrdinalOffset, 2).getInt16(0, true);
235
+ }
236
+
237
+ /** Compares optional key metadata without exposing key material in structured-clone state. */
238
+ function equalBytes(
239
+ firstBytes: Uint8Array | undefined,
240
+ secondBytes: Uint8Array | undefined
241
+ ): boolean {
242
+ if (!firstBytes || !secondBytes) return !firstBytes && !secondBytes;
243
+ return (
244
+ firstBytes.length === secondBytes.length &&
245
+ firstBytes.every((value, index) => value === secondBytes[index])
246
+ );
247
+ }
248
+
249
+ /** Returns a monotonic timestamp when available and falls back to wall-clock time. */
250
+ function getCurrentTime(): number {
251
+ return globalThis.performance?.now() ?? Date.now();
252
+ }