@loaders.gl/parquet 4.4.5 → 5.0.0-alpha.2

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 (674) 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/geoparquet-loader-with-parser.d.ts +33 -0
  7. package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
  8. package/dist/geoparquet-loader-with-parser.js +52 -0
  9. package/dist/geoparquet-loader-with-parser.js.map +1 -0
  10. package/dist/geoparquet-loader.d.ts +59 -0
  11. package/dist/geoparquet-loader.d.ts.map +1 -0
  12. package/dist/geoparquet-loader.js +30 -0
  13. package/dist/geoparquet-loader.js.map +1 -0
  14. package/dist/index.cjs +25873 -4776
  15. package/dist/index.cjs.map +3 -4
  16. package/dist/index.d.ts +10 -7
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +7 -11
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/arrow/convert-columns-to-row-group.js +3 -0
  21. package/dist/lib/arrow/convert-columns-to-row-group.js.map +1 -1
  22. package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
  23. package/dist/lib/arrow/convert-schema-from-parquet.js +86 -26
  24. package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
  25. package/dist/lib/arrow/convert-schema-to-parquet.d.ts.map +1 -1
  26. package/dist/lib/arrow/convert-schema-to-parquet.js +16 -7
  27. package/dist/lib/arrow/convert-schema-to-parquet.js.map +1 -1
  28. package/dist/lib/arrow/create-nested-arrow-vector.d.ts +8 -0
  29. package/dist/lib/arrow/create-nested-arrow-vector.d.ts.map +1 -0
  30. package/dist/lib/arrow/create-nested-arrow-vector.js +396 -0
  31. package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -0
  32. package/dist/lib/constants.d.ts +0 -1
  33. package/dist/lib/constants.d.ts.map +1 -1
  34. package/dist/lib/constants.js +1 -2
  35. package/dist/lib/constants.js.map +1 -1
  36. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
  37. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
  38. package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
  39. package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
  40. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
  41. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
  42. package/dist/lib/encoders/encode-table-to-parquet-js.js +199 -0
  43. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
  44. package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
  45. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
  46. package/dist/lib/geo/geospatial-metadata.js +338 -0
  47. package/dist/lib/geo/geospatial-metadata.js.map +1 -0
  48. package/dist/lib/parquet-page-index.d.ts +62 -0
  49. package/dist/lib/parquet-page-index.d.ts.map +1 -0
  50. package/dist/lib/parquet-page-index.js +377 -0
  51. package/dist/lib/parquet-page-index.js.map +1 -0
  52. package/dist/lib/parquet-predicate.d.ts +17 -0
  53. package/dist/lib/parquet-predicate.d.ts.map +1 -0
  54. package/dist/lib/parquet-predicate.js +300 -0
  55. package/dist/lib/parquet-predicate.js.map +1 -0
  56. package/dist/lib/parquet-source-worker-client.d.ts +6 -0
  57. package/dist/lib/parquet-source-worker-client.d.ts.map +1 -0
  58. package/dist/lib/parquet-source-worker-client.js +22 -0
  59. package/dist/lib/parquet-source-worker-client.js.map +1 -0
  60. package/dist/lib/parquet-source-worker-decoder.d.ts +4 -0
  61. package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -0
  62. package/dist/lib/parquet-source-worker-decoder.js +115 -0
  63. package/dist/lib/parquet-source-worker-decoder.js.map +1 -0
  64. package/dist/lib/parquet-source-worker-file.d.ts +24 -0
  65. package/dist/lib/parquet-source-worker-file.d.ts.map +1 -0
  66. package/dist/lib/parquet-source-worker-file.js +40 -0
  67. package/dist/lib/parquet-source-worker-file.js.map +1 -0
  68. package/dist/lib/parquet-source-worker-types.d.ts +97 -0
  69. package/dist/lib/parquet-source-worker-types.d.ts.map +1 -0
  70. package/dist/lib/parquet-source-worker-types.js +5 -0
  71. package/dist/lib/parquet-source-worker-types.js.map +1 -0
  72. package/dist/lib/parquet-worker-transport.d.ts +8 -0
  73. package/dist/lib/parquet-worker-transport.d.ts.map +1 -0
  74. package/dist/lib/parquet-worker-transport.js +40 -0
  75. package/dist/lib/parquet-worker-transport.js.map +1 -0
  76. package/dist/lib/parsers/convert-parquet-tables.d.ts +16 -0
  77. package/dist/lib/parsers/convert-parquet-tables.d.ts.map +1 -0
  78. package/dist/lib/parsers/convert-parquet-tables.js +30 -0
  79. package/dist/lib/parsers/convert-parquet-tables.js.map +1 -0
  80. package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
  81. package/dist/lib/parsers/get-parquet-schema.js +3 -1
  82. package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
  83. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
  84. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
  85. package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
  86. package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
  87. package/dist/lib/parsers/parse-parquet-tables.d.ts +37 -0
  88. package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
  89. package/dist/lib/parsers/parse-parquet-tables.js +50 -0
  90. package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
  91. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +19 -0
  92. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
  93. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +608 -0
  94. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
  95. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
  96. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
  97. package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
  98. package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
  99. package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
  100. package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
  101. package/dist/lib/parsers/parse-parquet-to-columns.js +1 -4
  102. package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
  103. package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
  104. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  105. package/dist/lib/parsers/parse-parquet-to-json.js +77 -26
  106. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  107. package/dist/lib/sources/parquet-range-file.d.ts +80 -0
  108. package/dist/lib/sources/parquet-range-file.d.ts.map +1 -0
  109. package/dist/lib/sources/parquet-range-file.js +261 -0
  110. package/dist/lib/sources/parquet-range-file.js.map +1 -0
  111. package/dist/lib/sources/single-batch-queue.d.ts +24 -0
  112. package/dist/lib/sources/single-batch-queue.d.ts.map +1 -0
  113. package/dist/lib/sources/single-batch-queue.js +91 -0
  114. package/dist/lib/sources/single-batch-queue.js.map +1 -0
  115. package/dist/lib/utils/load-wasm-node.d.ts +3 -0
  116. package/dist/lib/utils/load-wasm-node.d.ts.map +1 -0
  117. package/dist/lib/utils/load-wasm-node.js +23 -0
  118. package/dist/lib/utils/load-wasm-node.js.map +1 -0
  119. package/dist/lib/utils/load-wasm.d.ts +2 -2
  120. package/dist/lib/utils/load-wasm.d.ts.map +1 -1
  121. package/dist/lib/utils/load-wasm.js +28 -12
  122. package/dist/lib/utils/load-wasm.js.map +1 -1
  123. package/dist/lib/utils/make-stream-iterator.d.ts +2 -0
  124. package/dist/lib/utils/make-stream-iterator.d.ts.map +1 -1
  125. package/dist/lib/utils/make-stream-iterator.js +123 -14
  126. package/dist/lib/utils/make-stream-iterator.js.map +1 -1
  127. package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
  128. package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
  129. package/dist/lib/utils/normalize-parquet-options.js +11 -0
  130. package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
  131. package/dist/parquet-dataset-source.cjs +26413 -0
  132. package/dist/parquet-dataset-source.cjs.map +6 -0
  133. package/dist/parquet-dataset-source.d.ts +54 -0
  134. package/dist/parquet-dataset-source.d.ts.map +1 -0
  135. package/dist/parquet-dataset-source.js +380 -0
  136. package/dist/parquet-dataset-source.js.map +1 -0
  137. package/dist/parquet-format.d.ts +2 -0
  138. package/dist/parquet-format.d.ts.map +1 -1
  139. package/dist/parquet-format.js +2 -0
  140. package/dist/parquet-format.js.map +1 -1
  141. package/dist/parquet-js-loader-types.d.ts +57 -0
  142. package/dist/parquet-js-loader-types.d.ts.map +1 -0
  143. package/dist/parquet-js-loader-types.js +33 -0
  144. package/dist/parquet-js-loader-types.js.map +1 -0
  145. package/dist/parquet-js-loader.d.ts +32 -0
  146. package/dist/parquet-js-loader.d.ts.map +1 -0
  147. package/dist/parquet-js-loader.js +58 -0
  148. package/dist/parquet-js-loader.js.map +1 -0
  149. package/dist/parquet-js-writer.d.ts +44 -0
  150. package/dist/parquet-js-writer.d.ts.map +1 -0
  151. package/dist/parquet-js-writer.js +28 -0
  152. package/dist/parquet-js-writer.js.map +1 -0
  153. package/dist/parquet-loader-base.d.ts +25 -0
  154. package/dist/parquet-loader-base.d.ts.map +1 -0
  155. package/dist/parquet-loader-base.js +23 -0
  156. package/dist/parquet-loader-base.js.map +1 -0
  157. package/dist/parquet-loader-options.d.ts +44 -0
  158. package/dist/parquet-loader-options.d.ts.map +1 -0
  159. package/dist/parquet-loader-options.js +10 -0
  160. package/dist/parquet-loader-options.js.map +1 -0
  161. package/dist/parquet-loader-types.d.ts +61 -0
  162. package/dist/parquet-loader-types.d.ts.map +1 -0
  163. package/dist/parquet-loader-types.js +17 -0
  164. package/dist/parquet-loader-types.js.map +1 -0
  165. package/dist/parquet-loader.d.ts +42 -0
  166. package/dist/parquet-loader.d.ts.map +1 -0
  167. package/dist/parquet-loader.js +68 -0
  168. package/dist/parquet-loader.js.map +1 -0
  169. package/dist/parquet-source-capabilities.d.ts +36 -0
  170. package/dist/parquet-source-capabilities.d.ts.map +1 -0
  171. package/dist/parquet-source-capabilities.js +22 -0
  172. package/dist/parquet-source-capabilities.js.map +1 -0
  173. package/dist/parquet-source-loader-types.d.ts +72 -0
  174. package/dist/parquet-source-loader-types.d.ts.map +1 -0
  175. package/dist/parquet-source-loader-types.js +74 -0
  176. package/dist/parquet-source-loader-types.js.map +1 -0
  177. package/dist/parquet-source-loader.cjs +25975 -0
  178. package/dist/parquet-source-loader.cjs.map +6 -0
  179. package/dist/parquet-source-loader.d.ts +120 -0
  180. package/dist/parquet-source-loader.d.ts.map +1 -0
  181. package/dist/parquet-source-loader.js +812 -0
  182. package/dist/parquet-source-loader.js.map +1 -0
  183. package/dist/parquet-source-types.d.ts +384 -0
  184. package/dist/parquet-source-types.d.ts.map +1 -0
  185. package/dist/parquet-source-types.js +5 -0
  186. package/dist/parquet-source-types.js.map +1 -0
  187. package/dist/parquet-source-worker-url.d.ts +3 -0
  188. package/dist/parquet-source-worker-url.d.ts.map +1 -0
  189. package/dist/parquet-source-worker-url.js +22 -0
  190. package/dist/parquet-source-worker-url.js.map +1 -0
  191. package/dist/parquet-source-worker.js +38491 -0
  192. package/dist/parquet-source-worker.js.map +7 -0
  193. package/dist/parquet-worker-node.cjs +54779 -0
  194. package/dist/parquet-worker-node.cjs.map +7 -0
  195. package/dist/parquet-worker-url.d.ts +3 -0
  196. package/dist/parquet-worker-url.d.ts.map +1 -0
  197. package/dist/parquet-worker-url.js +15 -0
  198. package/dist/parquet-worker-url.js.map +1 -0
  199. package/dist/parquet-worker.js +19920 -0
  200. package/dist/parquet-worker.js.map +7 -0
  201. package/dist/parquet-writer.d.ts +10 -0
  202. package/dist/parquet-writer.d.ts.map +1 -0
  203. package/dist/parquet-writer.js +27 -0
  204. package/dist/parquet-writer.js.map +1 -0
  205. package/dist/parquet_wasm_bg.wasm +0 -0
  206. package/dist/parquetjs/codecs/byte-stream-split.d.ts +9 -0
  207. package/dist/parquetjs/codecs/byte-stream-split.d.ts.map +1 -0
  208. package/dist/parquetjs/codecs/byte-stream-split.js +159 -0
  209. package/dist/parquetjs/codecs/byte-stream-split.js.map +1 -0
  210. package/dist/parquetjs/codecs/declare.d.ts +20 -3
  211. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  212. package/dist/parquetjs/codecs/declare.js +7 -1
  213. package/dist/parquetjs/codecs/declare.js.map +1 -1
  214. package/dist/parquetjs/codecs/delta.d.ts +17 -0
  215. package/dist/parquetjs/codecs/delta.d.ts.map +1 -0
  216. package/dist/parquetjs/codecs/delta.js +439 -0
  217. package/dist/parquetjs/codecs/delta.js.map +1 -0
  218. package/dist/parquetjs/codecs/dictionary.d.ts +5 -2
  219. package/dist/parquetjs/codecs/dictionary.d.ts.map +1 -1
  220. package/dist/parquetjs/codecs/dictionary.js +16 -4
  221. package/dist/parquetjs/codecs/dictionary.js.map +1 -1
  222. package/dist/parquetjs/codecs/index.d.ts.map +1 -1
  223. package/dist/parquetjs/codecs/index.js +18 -0
  224. package/dist/parquetjs/codecs/index.js.map +1 -1
  225. package/dist/parquetjs/codecs/plain.d.ts +3 -3
  226. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  227. package/dist/parquetjs/codecs/plain.js +88 -76
  228. package/dist/parquetjs/codecs/plain.js.map +1 -1
  229. package/dist/parquetjs/codecs/rle.d.ts +3 -3
  230. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  231. package/dist/parquetjs/codecs/rle.js +196 -68
  232. package/dist/parquetjs/codecs/rle.js.map +1 -1
  233. package/dist/parquetjs/compression.d.ts +7 -8
  234. package/dist/parquetjs/compression.d.ts.map +1 -1
  235. package/dist/parquetjs/compression.js +95 -141
  236. package/dist/parquetjs/compression.js.map +1 -1
  237. package/dist/parquetjs/encoder/dictionary-planner.d.ts +17 -0
  238. package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -0
  239. package/dist/parquetjs/encoder/dictionary-planner.js +64 -0
  240. package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -0
  241. package/dist/parquetjs/encoder/page-planner.d.ts +11 -0
  242. package/dist/parquetjs/encoder/page-planner.d.ts.map +1 -0
  243. package/dist/parquetjs/encoder/page-planner.js +60 -0
  244. package/dist/parquetjs/encoder/page-planner.js.map +1 -0
  245. package/dist/parquetjs/encoder/parquet-encoder.d.ts +11 -4
  246. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  247. package/dist/parquetjs/encoder/parquet-encoder.js +259 -52
  248. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  249. package/dist/parquetjs/parquet-thrift/BsonType.d.ts +1 -1
  250. package/dist/parquetjs/parquet-thrift/BsonType.d.ts.map +1 -1
  251. package/dist/parquetjs/parquet-thrift/BsonType.js +1 -1
  252. package/dist/parquetjs/parquet-thrift/BsonType.js.map +1 -1
  253. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +2 -2
  254. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
  255. package/dist/parquetjs/parquet-thrift/ColumnChunk.js +2 -2
  256. package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
  257. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts +6 -6
  258. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts.map +1 -1
  259. package/dist/parquetjs/parquet-thrift/ColumnIndex.js +3 -3
  260. package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
  261. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +2 -2
  262. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
  263. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +2 -2
  264. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
  265. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts +1 -1
  266. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts.map +1 -1
  267. package/dist/parquetjs/parquet-thrift/ColumnOrder.js +1 -1
  268. package/dist/parquetjs/parquet-thrift/ColumnOrder.js.map +1 -1
  269. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts +1 -1
  270. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts.map +1 -1
  271. package/dist/parquetjs/parquet-thrift/DataPageHeader.js +1 -1
  272. package/dist/parquetjs/parquet-thrift/DataPageHeader.js.map +1 -1
  273. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts +1 -1
  274. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts.map +1 -1
  275. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js +1 -1
  276. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js.map +1 -1
  277. package/dist/parquetjs/parquet-thrift/DateType.d.ts +1 -1
  278. package/dist/parquetjs/parquet-thrift/DateType.d.ts.map +1 -1
  279. package/dist/parquetjs/parquet-thrift/DateType.js +1 -1
  280. package/dist/parquetjs/parquet-thrift/DateType.js.map +1 -1
  281. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts +1 -1
  282. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts.map +1 -1
  283. package/dist/parquetjs/parquet-thrift/DecimalType.js +1 -1
  284. package/dist/parquetjs/parquet-thrift/DecimalType.js.map +1 -1
  285. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts +1 -1
  286. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts.map +1 -1
  287. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js +1 -1
  288. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js.map +1 -1
  289. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts +8 -0
  290. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts.map +1 -0
  291. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js +14 -0
  292. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js.map +1 -0
  293. package/dist/parquetjs/parquet-thrift/Encoding.d.ts +2 -1
  294. package/dist/parquetjs/parquet-thrift/Encoding.d.ts.map +1 -1
  295. package/dist/parquetjs/parquet-thrift/Encoding.js +1 -0
  296. package/dist/parquetjs/parquet-thrift/Encoding.js.map +1 -1
  297. package/dist/parquetjs/parquet-thrift/EnumType.d.ts +1 -1
  298. package/dist/parquetjs/parquet-thrift/EnumType.d.ts.map +1 -1
  299. package/dist/parquetjs/parquet-thrift/EnumType.js +1 -1
  300. package/dist/parquetjs/parquet-thrift/EnumType.js.map +1 -1
  301. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +2 -2
  302. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
  303. package/dist/parquetjs/parquet-thrift/FileMetaData.js +2 -2
  304. package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
  305. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts +9 -0
  306. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts.map +1 -0
  307. package/dist/parquetjs/parquet-thrift/Float16Type.js +27 -0
  308. package/dist/parquetjs/parquet-thrift/Float16Type.js.map +1 -0
  309. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts +14 -0
  310. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts.map +1 -0
  311. package/dist/parquetjs/parquet-thrift/GeographyType.js +51 -0
  312. package/dist/parquetjs/parquet-thrift/GeographyType.js.map +1 -0
  313. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts +11 -0
  314. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts.map +1 -0
  315. package/dist/parquetjs/parquet-thrift/GeometryType.js +41 -0
  316. package/dist/parquetjs/parquet-thrift/GeometryType.js.map +1 -0
  317. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts +1 -1
  318. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts.map +1 -1
  319. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js +1 -1
  320. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js.map +1 -1
  321. package/dist/parquetjs/parquet-thrift/IntType.d.ts +1 -1
  322. package/dist/parquetjs/parquet-thrift/IntType.d.ts.map +1 -1
  323. package/dist/parquetjs/parquet-thrift/IntType.js +1 -1
  324. package/dist/parquetjs/parquet-thrift/IntType.js.map +1 -1
  325. package/dist/parquetjs/parquet-thrift/JsonType.d.ts +1 -1
  326. package/dist/parquetjs/parquet-thrift/JsonType.d.ts.map +1 -1
  327. package/dist/parquetjs/parquet-thrift/JsonType.js +1 -1
  328. package/dist/parquetjs/parquet-thrift/JsonType.js.map +1 -1
  329. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts +1 -1
  330. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts.map +1 -1
  331. package/dist/parquetjs/parquet-thrift/KeyValue.js +1 -1
  332. package/dist/parquetjs/parquet-thrift/KeyValue.js.map +1 -1
  333. package/dist/parquetjs/parquet-thrift/ListType.d.ts +1 -1
  334. package/dist/parquetjs/parquet-thrift/ListType.d.ts.map +1 -1
  335. package/dist/parquetjs/parquet-thrift/ListType.js +1 -1
  336. package/dist/parquetjs/parquet-thrift/ListType.js.map +1 -1
  337. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts +17 -1
  338. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts.map +1 -1
  339. package/dist/parquetjs/parquet-thrift/LogicalType.js +97 -1
  340. package/dist/parquetjs/parquet-thrift/LogicalType.js.map +1 -1
  341. package/dist/parquetjs/parquet-thrift/MapType.d.ts +1 -1
  342. package/dist/parquetjs/parquet-thrift/MapType.d.ts.map +1 -1
  343. package/dist/parquetjs/parquet-thrift/MapType.js +1 -1
  344. package/dist/parquetjs/parquet-thrift/MapType.js.map +1 -1
  345. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts +1 -1
  346. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts.map +1 -1
  347. package/dist/parquetjs/parquet-thrift/MicroSeconds.js +1 -1
  348. package/dist/parquetjs/parquet-thrift/MicroSeconds.js.map +1 -1
  349. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts +1 -1
  350. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts.map +1 -1
  351. package/dist/parquetjs/parquet-thrift/MilliSeconds.js +1 -1
  352. package/dist/parquetjs/parquet-thrift/MilliSeconds.js.map +1 -1
  353. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts +9 -0
  354. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts.map +1 -0
  355. package/dist/parquetjs/parquet-thrift/NanoSeconds.js +27 -0
  356. package/dist/parquetjs/parquet-thrift/NanoSeconds.js.map +1 -0
  357. package/dist/parquetjs/parquet-thrift/NullType.d.ts +1 -1
  358. package/dist/parquetjs/parquet-thrift/NullType.d.ts.map +1 -1
  359. package/dist/parquetjs/parquet-thrift/NullType.js +1 -1
  360. package/dist/parquetjs/parquet-thrift/NullType.js.map +1 -1
  361. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts +1 -1
  362. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts.map +1 -1
  363. package/dist/parquetjs/parquet-thrift/OffsetIndex.js +1 -1
  364. package/dist/parquetjs/parquet-thrift/OffsetIndex.js.map +1 -1
  365. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts +1 -1
  366. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts.map +1 -1
  367. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js +1 -1
  368. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js.map +1 -1
  369. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts +1 -1
  370. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts.map +1 -1
  371. package/dist/parquetjs/parquet-thrift/PageHeader.js +1 -1
  372. package/dist/parquetjs/parquet-thrift/PageHeader.js.map +1 -1
  373. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts +2 -2
  374. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts.map +1 -1
  375. package/dist/parquetjs/parquet-thrift/PageLocation.js +2 -2
  376. package/dist/parquetjs/parquet-thrift/PageLocation.js.map +1 -1
  377. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts +2 -2
  378. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts.map +1 -1
  379. package/dist/parquetjs/parquet-thrift/RowGroup.js +2 -2
  380. package/dist/parquetjs/parquet-thrift/RowGroup.js.map +1 -1
  381. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts +1 -1
  382. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts.map +1 -1
  383. package/dist/parquetjs/parquet-thrift/SchemaElement.js +1 -1
  384. package/dist/parquetjs/parquet-thrift/SchemaElement.js.map +1 -1
  385. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts +1 -1
  386. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts.map +1 -1
  387. package/dist/parquetjs/parquet-thrift/SortingColumn.js +1 -1
  388. package/dist/parquetjs/parquet-thrift/SortingColumn.js.map +1 -1
  389. package/dist/parquetjs/parquet-thrift/Statistics.d.ts +14 -10
  390. package/dist/parquetjs/parquet-thrift/Statistics.d.ts.map +1 -1
  391. package/dist/parquetjs/parquet-thrift/Statistics.js +38 -2
  392. package/dist/parquetjs/parquet-thrift/Statistics.js.map +1 -1
  393. package/dist/parquetjs/parquet-thrift/StringType.d.ts +1 -1
  394. package/dist/parquetjs/parquet-thrift/StringType.d.ts.map +1 -1
  395. package/dist/parquetjs/parquet-thrift/StringType.js +1 -1
  396. package/dist/parquetjs/parquet-thrift/StringType.js.map +1 -1
  397. package/dist/parquetjs/parquet-thrift/TimeType.d.ts +1 -1
  398. package/dist/parquetjs/parquet-thrift/TimeType.d.ts.map +1 -1
  399. package/dist/parquetjs/parquet-thrift/TimeType.js +1 -1
  400. package/dist/parquetjs/parquet-thrift/TimeType.js.map +1 -1
  401. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts +5 -1
  402. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts.map +1 -1
  403. package/dist/parquetjs/parquet-thrift/TimeUnit.js +25 -1
  404. package/dist/parquetjs/parquet-thrift/TimeUnit.js.map +1 -1
  405. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts +1 -1
  406. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts.map +1 -1
  407. package/dist/parquetjs/parquet-thrift/TimestampType.js +1 -1
  408. package/dist/parquetjs/parquet-thrift/TimestampType.js.map +1 -1
  409. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts +1 -1
  410. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts.map +1 -1
  411. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js +1 -1
  412. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js.map +1 -1
  413. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts +1 -1
  414. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts.map +1 -1
  415. package/dist/parquetjs/parquet-thrift/UUIDType.js +1 -1
  416. package/dist/parquetjs/parquet-thrift/UUIDType.js.map +1 -1
  417. package/dist/parquetjs/parquet-thrift/VariantType.d.ts +11 -0
  418. package/dist/parquetjs/parquet-thrift/VariantType.d.ts.map +1 -0
  419. package/dist/parquetjs/parquet-thrift/VariantType.js +41 -0
  420. package/dist/parquetjs/parquet-thrift/VariantType.js.map +1 -0
  421. package/dist/parquetjs/parquet-thrift/index.d.ts +6 -2
  422. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  423. package/dist/parquetjs/parquet-thrift/index.js +6 -2
  424. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  425. package/dist/parquetjs/parser/decoders.d.ts +14 -3
  426. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  427. package/dist/parquetjs/parser/decoders.js +381 -117
  428. package/dist/parquetjs/parser/decoders.js.map +1 -1
  429. package/dist/parquetjs/parser/parquet-reader.d.ts +35 -10
  430. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  431. package/dist/parquetjs/parser/parquet-reader.js +179 -59
  432. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  433. package/dist/parquetjs/schema/declare.d.ts +62 -8
  434. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  435. package/dist/parquetjs/schema/declare.js.map +1 -1
  436. package/dist/parquetjs/schema/schema.d.ts +3 -0
  437. package/dist/parquetjs/schema/schema.d.ts.map +1 -1
  438. package/dist/parquetjs/schema/schema.js +21 -3
  439. package/dist/parquetjs/schema/schema.js.map +1 -1
  440. package/dist/parquetjs/schema/shred.d.ts +2 -0
  441. package/dist/parquetjs/schema/shred.d.ts.map +1 -1
  442. package/dist/parquetjs/schema/shred.js +71 -23
  443. package/dist/parquetjs/schema/shred.js.map +1 -1
  444. package/dist/parquetjs/schema/types.d.ts.map +1 -1
  445. package/dist/parquetjs/schema/types.js +272 -51
  446. package/dist/parquetjs/schema/types.js.map +1 -1
  447. package/dist/parquetjs/utils/binary-utils.d.ts +41 -0
  448. package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
  449. package/dist/parquetjs/utils/binary-utils.js +106 -0
  450. package/dist/parquetjs/utils/binary-utils.js.map +1 -0
  451. package/dist/parquetjs/utils/file-utils.d.ts +1 -1
  452. package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
  453. package/dist/parquetjs/utils/file-utils.js +3 -3
  454. package/dist/parquetjs/utils/file-utils.js.map +1 -1
  455. package/dist/parquetjs/utils/read-utils.d.ts +14 -6
  456. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  457. package/dist/parquetjs/utils/read-utils.js +46 -39
  458. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  459. package/dist/parquetjs/utils/thrift-runtime.d.ts +106 -0
  460. package/dist/parquetjs/utils/thrift-runtime.d.ts.map +1 -0
  461. package/dist/parquetjs/utils/thrift-runtime.js +50 -0
  462. package/dist/parquetjs/utils/thrift-runtime.js.map +1 -0
  463. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
  464. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
  465. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
  466. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
  467. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +80 -0
  468. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
  469. package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
  470. package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
  471. package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
  472. package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
  473. package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
  474. package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
  475. package/dist/polyfills/process.d.ts +12 -0
  476. package/dist/polyfills/process.d.ts.map +1 -0
  477. package/dist/polyfills/process.js +17 -0
  478. package/dist/polyfills/process.js.map +1 -0
  479. package/dist/unbundled.d.ts +9 -0
  480. package/dist/unbundled.d.ts.map +1 -0
  481. package/dist/unbundled.js +10 -0
  482. package/dist/unbundled.js.map +1 -0
  483. package/dist/wasm.d.ts +3 -0
  484. package/dist/wasm.d.ts.map +1 -0
  485. package/dist/wasm.js +6 -0
  486. package/dist/wasm.js.map +1 -0
  487. package/dist/workers/parquet-source-worker.d.ts +2 -0
  488. package/dist/workers/parquet-source-worker.d.ts.map +1 -0
  489. package/dist/workers/parquet-source-worker.js +17 -0
  490. package/dist/workers/parquet-source-worker.js.map +1 -0
  491. package/dist/workers/parquet-worker-node.d.ts +2 -0
  492. package/dist/workers/parquet-worker-node.d.ts.map +1 -0
  493. package/dist/workers/parquet-worker-node.js +5 -0
  494. package/dist/workers/parquet-worker-node.js.map +1 -0
  495. package/dist/workers/parquet-worker.d.ts +2 -0
  496. package/dist/workers/parquet-worker.d.ts.map +1 -0
  497. package/dist/workers/parquet-worker.js +27 -0
  498. package/dist/workers/parquet-worker.js.map +1 -0
  499. package/package.json +63 -33
  500. package/src/bundled.ts +33 -0
  501. package/src/geoparquet-loader-with-parser.ts +95 -0
  502. package/src/geoparquet-loader.ts +54 -0
  503. package/src/index.ts +49 -23
  504. package/src/lib/arrow/convert-columns-to-row-group.ts +3 -0
  505. package/src/lib/arrow/convert-schema-from-parquet.ts +97 -30
  506. package/src/lib/arrow/convert-schema-to-parquet.ts +16 -7
  507. package/src/lib/arrow/create-nested-arrow-vector.ts +589 -0
  508. package/src/lib/constants.ts +0 -2
  509. package/src/lib/encoders/encode-arrow-to-parquet.ts +10 -16
  510. package/src/lib/encoders/encode-table-to-parquet-js.ts +261 -0
  511. package/src/lib/geo/geospatial-metadata.ts +457 -0
  512. package/src/lib/parquet-page-index.ts +581 -0
  513. package/src/lib/parquet-predicate.ts +374 -0
  514. package/src/lib/parquet-source-worker-client.ts +39 -0
  515. package/src/lib/parquet-source-worker-decoder.ts +156 -0
  516. package/src/lib/parquet-source-worker-file.ts +56 -0
  517. package/src/lib/parquet-source-worker-types.ts +107 -0
  518. package/src/lib/parquet-worker-transport.ts +57 -0
  519. package/src/lib/parsers/convert-parquet-tables.ts +39 -0
  520. package/src/lib/parsers/get-parquet-schema.ts +3 -1
  521. package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
  522. package/src/lib/parsers/parse-parquet-tables.ts +82 -0
  523. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +829 -0
  524. package/src/lib/parsers/parse-parquet-to-arrow.ts +63 -36
  525. package/src/lib/parsers/parse-parquet-to-columns.ts +6 -7
  526. package/src/lib/parsers/parse-parquet-to-json.ts +101 -33
  527. package/src/lib/sources/parquet-range-file.ts +359 -0
  528. package/src/lib/sources/single-batch-queue.ts +95 -0
  529. package/src/lib/utils/load-wasm-node.ts +25 -0
  530. package/src/lib/utils/load-wasm.ts +36 -13
  531. package/src/lib/utils/make-stream-iterator.ts +126 -14
  532. package/src/lib/utils/normalize-parquet-options.ts +14 -0
  533. package/src/parquet-dataset-source.ts +488 -0
  534. package/src/parquet-format.ts +2 -0
  535. package/src/parquet-js-loader-types.ts +52 -0
  536. package/src/parquet-js-loader.ts +83 -0
  537. package/src/parquet-js-writer.ts +68 -0
  538. package/src/parquet-loader-base.ts +34 -0
  539. package/src/parquet-loader-options.ts +51 -0
  540. package/src/parquet-loader-types.ts +35 -0
  541. package/src/parquet-loader.ts +115 -0
  542. package/src/parquet-source-capabilities.ts +56 -0
  543. package/src/parquet-source-loader-types.ts +87 -0
  544. package/src/parquet-source-loader.ts +1265 -0
  545. package/src/parquet-source-types.ts +458 -0
  546. package/src/parquet-source-worker-url.ts +23 -0
  547. package/src/parquet-worker-url.ts +18 -0
  548. package/src/parquet-writer.ts +42 -0
  549. package/src/parquetjs/LICENSE +23 -1
  550. package/src/parquetjs/codecs/byte-stream-split.ts +221 -0
  551. package/src/parquetjs/codecs/declare.ts +35 -3
  552. package/src/parquetjs/codecs/delta.ts +587 -0
  553. package/src/parquetjs/codecs/dictionary.ts +22 -4
  554. package/src/parquetjs/codecs/index.ts +18 -0
  555. package/src/parquetjs/codecs/plain.ts +149 -87
  556. package/src/parquetjs/codecs/rle.ts +268 -82
  557. package/src/parquetjs/compression.ts +110 -155
  558. package/src/parquetjs/encoder/dictionary-planner.ts +99 -0
  559. package/src/parquetjs/encoder/page-planner.ts +83 -0
  560. package/src/parquetjs/encoder/parquet-encoder.ts +378 -77
  561. package/src/parquetjs/parquet-thrift/BsonType.ts +1 -1
  562. package/src/parquetjs/parquet-thrift/ColumnChunk.ts +2 -2
  563. package/src/parquetjs/parquet-thrift/ColumnIndex.ts +13 -13
  564. package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +2 -2
  565. package/src/parquetjs/parquet-thrift/ColumnOrder.ts +1 -1
  566. package/src/parquetjs/parquet-thrift/DataPageHeader.ts +1 -1
  567. package/src/parquetjs/parquet-thrift/DataPageHeaderV2.ts +1 -1
  568. package/src/parquetjs/parquet-thrift/DateType.ts +1 -1
  569. package/src/parquetjs/parquet-thrift/DecimalType.ts +1 -1
  570. package/src/parquetjs/parquet-thrift/DictionaryPageHeader.ts +1 -1
  571. package/src/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.ts +13 -0
  572. package/src/parquetjs/parquet-thrift/Encoding.ts +2 -1
  573. package/src/parquetjs/parquet-thrift/EnumType.ts +1 -1
  574. package/src/parquetjs/parquet-thrift/FileMetaData.ts +2 -2
  575. package/src/parquetjs/parquet-thrift/Float16Type.ts +28 -0
  576. package/src/parquetjs/parquet-thrift/GeographyType.ts +54 -0
  577. package/src/parquetjs/parquet-thrift/GeometryType.ts +43 -0
  578. package/src/parquetjs/parquet-thrift/IndexPageHeader.ts +1 -1
  579. package/src/parquetjs/parquet-thrift/IntType.ts +1 -1
  580. package/src/parquetjs/parquet-thrift/JsonType.ts +1 -1
  581. package/src/parquetjs/parquet-thrift/KeyValue.ts +1 -1
  582. package/src/parquetjs/parquet-thrift/ListType.ts +1 -1
  583. package/src/parquetjs/parquet-thrift/LogicalType.ts +97 -1
  584. package/src/parquetjs/parquet-thrift/MapType.ts +1 -1
  585. package/src/parquetjs/parquet-thrift/MicroSeconds.ts +1 -1
  586. package/src/parquetjs/parquet-thrift/MilliSeconds.ts +1 -1
  587. package/src/parquetjs/parquet-thrift/NanoSeconds.ts +28 -0
  588. package/src/parquetjs/parquet-thrift/NullType.ts +1 -1
  589. package/src/parquetjs/parquet-thrift/OffsetIndex.ts +1 -1
  590. package/src/parquetjs/parquet-thrift/PageEncodingStats.ts +1 -1
  591. package/src/parquetjs/parquet-thrift/PageHeader.ts +1 -1
  592. package/src/parquetjs/parquet-thrift/PageLocation.ts +2 -2
  593. package/src/parquetjs/parquet-thrift/RowGroup.ts +2 -2
  594. package/src/parquetjs/parquet-thrift/SchemaElement.ts +1 -1
  595. package/src/parquetjs/parquet-thrift/SortingColumn.ts +1 -1
  596. package/src/parquetjs/parquet-thrift/Statistics.ts +50 -14
  597. package/src/parquetjs/parquet-thrift/StringType.ts +1 -1
  598. package/src/parquetjs/parquet-thrift/TimeType.ts +1 -1
  599. package/src/parquetjs/parquet-thrift/TimeUnit.ts +25 -1
  600. package/src/parquetjs/parquet-thrift/TimestampType.ts +1 -1
  601. package/src/parquetjs/parquet-thrift/TypeDefinedOrder.ts +1 -1
  602. package/src/parquetjs/parquet-thrift/UUIDType.ts +1 -1
  603. package/src/parquetjs/parquet-thrift/VariantType.ts +43 -0
  604. package/src/parquetjs/parquet-thrift/index.ts +6 -4
  605. package/src/parquetjs/parser/decoders.ts +487 -133
  606. package/src/parquetjs/parser/parquet-reader.ts +297 -71
  607. package/src/parquetjs/schema/declare.ts +99 -7
  608. package/src/parquetjs/schema/schema.ts +23 -3
  609. package/src/parquetjs/schema/shred.ts +112 -35
  610. package/src/parquetjs/schema/types.ts +294 -61
  611. package/src/parquetjs/utils/binary-utils.ts +132 -0
  612. package/src/parquetjs/utils/file-utils.ts +4 -4
  613. package/src/parquetjs/utils/read-utils.ts +56 -55
  614. package/src/parquetjs/utils/thrift-runtime.ts +109 -0
  615. package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
  616. package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
  617. package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
  618. package/src/polyfills/process.ts +17 -0
  619. package/src/unbundled.ts +33 -0
  620. package/src/wasm.ts +6 -0
  621. package/src/workers/parquet-source-worker.ts +21 -0
  622. package/src/workers/parquet-worker-node.ts +5 -0
  623. package/src/workers/parquet-worker.ts +31 -0
  624. package/dist/parquet-arrow-loader.d.ts +0 -43
  625. package/dist/parquet-arrow-loader.d.ts.map +0 -1
  626. package/dist/parquet-arrow-loader.js +0 -49
  627. package/dist/parquet-arrow-loader.js.map +0 -1
  628. package/dist/parquet-arrow-writer.d.ts +0 -9
  629. package/dist/parquet-arrow-writer.d.ts.map +0 -1
  630. package/dist/parquet-arrow-writer.js +0 -23
  631. package/dist/parquet-arrow-writer.js.map +0 -1
  632. package/dist/parquet-json-loader.d.ts +0 -148
  633. package/dist/parquet-json-loader.d.ts.map +0 -1
  634. package/dist/parquet-json-loader.js +0 -106
  635. package/dist/parquet-json-loader.js.map +0 -1
  636. package/dist/parquet-json-writer.d.ts +0 -19
  637. package/dist/parquet-json-writer.d.ts.map +0 -1
  638. package/dist/parquet-json-writer.js +0 -20
  639. package/dist/parquet-json-writer.js.map +0 -1
  640. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
  641. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
  642. package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
  643. package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
  644. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
  645. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
  646. package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
  647. package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
  648. package/dist/polyfills/buffer/buffer.d.ts +0 -222
  649. package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
  650. package/dist/polyfills/buffer/buffer.js +0 -1868
  651. package/dist/polyfills/buffer/buffer.js.map +0 -1
  652. package/dist/polyfills/buffer/index.d.ts +0 -4
  653. package/dist/polyfills/buffer/index.d.ts.map +0 -1
  654. package/dist/polyfills/buffer/index.js +0 -9
  655. package/dist/polyfills/buffer/index.js.map +0 -1
  656. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
  657. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
  658. package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
  659. package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
  660. package/dist/workers/parquet-json-worker.d.ts +0 -2
  661. package/dist/workers/parquet-json-worker.d.ts.map +0 -1
  662. package/dist/workers/parquet-json-worker.js +0 -7
  663. package/dist/workers/parquet-json-worker.js.map +0 -1
  664. package/src/parquet-arrow-loader.ts +0 -74
  665. package/src/parquet-arrow-writer.ts +0 -33
  666. package/src/parquet-json-loader.ts +0 -160
  667. package/src/parquet-json-writer.ts +0 -27
  668. package/src/parquetjs/modules.d.ts +0 -25
  669. package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
  670. package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
  671. package/src/polyfills/buffer/buffer.ts +0 -2205
  672. package/src/polyfills/buffer/index.ts +0 -11
  673. package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
  674. package/src/workers/parquet-json-worker.ts +0 -8
@@ -0,0 +1,1265 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {hydrateArrowTable} from '@loaders.gl/arrow';
6
+ import type {CoreAPI, ReadableFile, SourceLoader} from '@loaders.gl/loader-utils';
7
+ import {BlobFile, DataSource, isBrowser} from '@loaders.gl/loader-utils';
8
+ import type {ArrayType, ArrowTable, Schema} from '@loaders.gl/schema';
9
+ import {convertTable} from '@loaders.gl/schema-utils';
10
+
11
+ import {getSchemaFromParquetReader} from './lib/parsers/get-parquet-schema';
12
+ import {
13
+ canParquetRowGroupMatch,
14
+ copyParquetPredicate,
15
+ filterParquetRowIndices,
16
+ gatherParquetColumns,
17
+ getParquetPredicateColumns,
18
+ validateParquetPredicate
19
+ } from './lib/parquet-predicate';
20
+ import {
21
+ createParquetPagePruningPlan,
22
+ getParquetPageReadRanges,
23
+ type ParquetPagePruningPlan
24
+ } from './lib/parquet-page-index';
25
+ import {
26
+ canDecodeParquetSourceOnWorker,
27
+ decodeParquetSourceRowGroupOnWorker
28
+ } from './lib/parquet-source-worker-client';
29
+ import {
30
+ type ParquetSourceWorkerColumnChunk,
31
+ type ParquetSourceWorkerOptions,
32
+ type ParquetSourceWorkerResult
33
+ } from './lib/parquet-source-worker-types';
34
+ import {ParquetRangeFile} from './lib/sources/parquet-range-file';
35
+ import {
36
+ PARQUET_SOURCE_CAPABILITIES,
37
+ type ParquetSourceCapabilities
38
+ } from './parquet-source-capabilities';
39
+ import {ParquetSourceLoader as ParquetSourceLoaderMetadata} from './parquet-source-loader-types';
40
+ import type {
41
+ ParquetBatch,
42
+ ParquetColumnChunkMetadata,
43
+ ParquetColumnChunkStatistics,
44
+ ParquetMetadataRequestOptions,
45
+ ParquetObjectVersion,
46
+ ParquetPredicate,
47
+ ParquetRowGroupMetadata,
48
+ ParquetSourceBatch,
49
+ ParquetSourceLoaderOptions,
50
+ ParquetSourceMetadata,
51
+ ParquetSourceReadOptions,
52
+ ParquetTelemetry,
53
+ ParquetTelemetryEvent
54
+ } from './parquet-source-types';
55
+ export {
56
+ PARQUET_SOURCE_CAPABILITIES,
57
+ type ParquetSourceCapabilities
58
+ } from './parquet-source-capabilities';
59
+ import {preloadCompressions} from './parquetjs/compression';
60
+ import {
61
+ CompressionCodec,
62
+ Encoding,
63
+ type ColumnChunk,
64
+ type FileMetaData,
65
+ type Statistics as ParquetThriftStatistics
66
+ } from './parquetjs/parquet-thrift/index';
67
+ import {ParquetReader} from './parquetjs/parser/parquet-reader';
68
+ import type {ParquetField} from './parquetjs/schema/declare';
69
+ import type {ParquetSchema} from './parquetjs/schema/schema';
70
+ import * as Types from './parquetjs/schema/types';
71
+ import {
72
+ copyUint8Array,
73
+ readDoubleLE,
74
+ readFloatLE,
75
+ readInt32LE,
76
+ readInt64LE,
77
+ readUInt32LE,
78
+ readUInt64LE,
79
+ toUint8Array
80
+ } from './parquetjs/utils/binary-utils';
81
+ import {fieldIndexOf} from './parquetjs/utils/read-utils';
82
+
83
+ export type {
84
+ ParquetBatch,
85
+ ParquetBatchMetadata,
86
+ ParquetBatchProvenance,
87
+ ParquetColumnChunkMetadata,
88
+ ParquetColumnChunkStatistics,
89
+ ParquetMetadataRequestOptions,
90
+ ParquetObjectVersion,
91
+ ParquetComparisonPredicate,
92
+ ParquetInPredicate,
93
+ ParquetLogicalPredicate,
94
+ ParquetNotPredicate,
95
+ ParquetNullPredicate,
96
+ ParquetPredicate,
97
+ ParquetPredicateProperty,
98
+ ParquetPredicateValue,
99
+ ParquetRangeRequestOptions,
100
+ ParquetReadOptions,
101
+ ParquetRowGroupMetadata,
102
+ ParquetSourceBatch,
103
+ ParquetSourceLoaderOptions,
104
+ ParquetSourceMetadata,
105
+ ParquetSourceReadOptions,
106
+ ParquetTelemetry,
107
+ ParquetTelemetryEvent
108
+ } from './parquet-source-types';
109
+
110
+ type ParquetSourceInitialization = {
111
+ /** Random-access file shared by all reads. */
112
+ file: ReadableFile;
113
+ /** TypeScript Parquet reader with a cached footer. */
114
+ reader: ParquetReader;
115
+ /** loaders.gl logical schema. */
116
+ schema: Schema;
117
+ /** TypeScript Parquet decoder schema. */
118
+ parquetSchema: ParquetSchema;
119
+ /** Decoded Thrift footer. */
120
+ fileMetadata: FileMetaData;
121
+ /** Normalized public source metadata. */
122
+ metadata: ParquetSourceMetadata;
123
+ };
124
+
125
+ type ParquetRowGroupReadResult = {
126
+ /** Zero-based source row-group index. */
127
+ rowGroupIndex: number;
128
+ /** Number of logical rows retained for output. */
129
+ rowCount: number;
130
+ /** Exact source row indexes retained by the predicate. */
131
+ rowIndices?: number[];
132
+ /** Caller-thread columns when worker decoding is unavailable or disabled. */
133
+ columns?: Record<string, ArrayType>;
134
+ /** Directly transferable Arrow batches when worker decoding is enabled. */
135
+ workerResult?: ParquetSourceWorkerResult;
136
+ };
137
+
138
+ type SettledParquetRowGroupRead =
139
+ | {
140
+ /** Successfully decoded row group. */
141
+ result: ParquetRowGroupReadResult;
142
+ /** No error occurred. */
143
+ error?: never;
144
+ }
145
+ | {
146
+ /** Row-group read failed. */
147
+ error: unknown;
148
+ /** No result was decoded. */
149
+ result?: never;
150
+ };
151
+
152
+ const {
153
+ preload: _preloadParquetSourceLoader,
154
+ createDataSource: _createMetadataDataSource,
155
+ ...ParquetSourceLoaderBase
156
+ } = ParquetSourceLoaderMetadata;
157
+
158
+ /** Runtime source factory for reusable, range-backed Parquet access. */
159
+ export const ParquetSourceLoaderWithParser = {
160
+ ...ParquetSourceLoaderBase,
161
+ createDataSource: (
162
+ data: string | Blob,
163
+ options: ParquetSourceLoaderOptions,
164
+ coreApi?: CoreAPI
165
+ ): ParquetSource => new ParquetSource(data, options, coreApi)
166
+ } as const satisfies SourceLoader<ParquetSource>;
167
+
168
+ /** Runtime Parquet source loader exposed by the explicit package subpath. */
169
+ export {ParquetSourceLoaderWithParser as ParquetSourceLoader};
170
+
171
+ /** Reusable Parquet source that caches footer/schema state and selectively reads byte ranges. */
172
+ export class ParquetSource extends DataSource<string | Blob, ParquetSourceLoaderOptions> {
173
+ /** Immutable feature support for the current range-backed source implementation. */
174
+ readonly capabilities: ParquetSourceCapabilities = PARQUET_SOURCE_CAPABILITIES;
175
+ /** Shared initialization for this source instance. */
176
+ private initializationPromise: Promise<ParquetSourceInitialization> | null = null;
177
+ /** File allocated during source initialization, including while it is opening. */
178
+ private readableFile: ReadableFile | null = null;
179
+ /** Whether this source has been permanently closed. */
180
+ private closed = false;
181
+ /** Compression module preload shared by all selective reads. */
182
+ private compressionPromise: Promise<void> | null = null;
183
+ /** Read abort controllers used to cancel active iterators when the source closes. */
184
+ private activeReadControllers = new Set<AbortController>();
185
+ /** Cumulative source telemetry counters. */
186
+ private telemetry = createParquetTelemetry();
187
+
188
+ /** Creates a Parquet source backed by strict URL ranges or Blob slices. */
189
+ constructor(data: string | Blob, options: ParquetSourceLoaderOptions, coreApi?: CoreAPI) {
190
+ const wasmUrl = options.parquet?.wasmUrl;
191
+ super(data, options, ParquetSourceLoaderWithParser.defaultOptions, coreApi);
192
+ if (wasmUrl !== undefined) {
193
+ this.options.parquet.wasmUrl = wasmUrl;
194
+ }
195
+ }
196
+
197
+ /** Returns the cached logical schema decoded from the Parquet footer. */
198
+ async getSchema(options: {signal?: AbortSignal} = {}): Promise<Schema> {
199
+ const initialization = await this.getInitialization(options.signal);
200
+ return initialization.schema;
201
+ }
202
+
203
+ /** Returns normalized dataset, row-group, and column-chunk metadata. */
204
+ async getMetadata(options: ParquetMetadataRequestOptions = {}): Promise<ParquetSourceMetadata> {
205
+ const initialization = await this.getInitialization(options.signal);
206
+ if (!options.formatSpecificMetadata) {
207
+ return initialization.metadata;
208
+ }
209
+ return {
210
+ ...initialization.metadata,
211
+ formatSpecificMetadata: initialization.fileMetadata
212
+ };
213
+ }
214
+
215
+ /** Returns a copy of cumulative transport, decode, conversion, and pruning telemetry. */
216
+ getTelemetry(): ParquetTelemetry {
217
+ return Object.freeze({...this.telemetry});
218
+ }
219
+
220
+ /** Selectively fetches row groups and columns as ordered Arrow batches with source provenance. */
221
+ async *read(options: ParquetSourceReadOptions = {}): AsyncIterable<ParquetSourceBatch> {
222
+ const readOptions = this.getReadOptions(options);
223
+ const readContext = createReadAbortContext(readOptions.signal);
224
+ const inFlightReads = new Set<Promise<SettledParquetRowGroupRead>>();
225
+ let completed = false;
226
+ let readError: unknown;
227
+ this.activeReadControllers.add(readContext.abortController);
228
+
229
+ try {
230
+ const initialization = await this.getInitialization(readContext.abortController.signal);
231
+ await this.getCompressionInitialization();
232
+ throwIfAborted(readContext.abortController.signal);
233
+
234
+ const candidateRowGroupIndices = normalizeRowGroupIndices(
235
+ readOptions.rowGroups,
236
+ initialization.fileMetadata.row_groups.length
237
+ );
238
+ const callbackFilteredRowGroupIndices = readOptions.rowGroupFilter
239
+ ? candidateRowGroupIndices.filter(rowGroupIndex =>
240
+ readOptions.rowGroupFilter!(initialization.metadata.rowGroups[rowGroupIndex])
241
+ )
242
+ : candidateRowGroupIndices;
243
+ const predicate = readOptions.predicate;
244
+ const availableColumns = new Set(initialization.schema.fields.map(field => field.name));
245
+ if (predicate) {
246
+ validateParquetPredicate(predicate, availableColumns);
247
+ }
248
+ const rowGroupIndices = predicate
249
+ ? callbackFilteredRowGroupIndices.filter(rowGroupIndex =>
250
+ canParquetRowGroupMatch(predicate, initialization.metadata.rowGroups[rowGroupIndex])
251
+ )
252
+ : callbackFilteredRowGroupIndices;
253
+ const rowGroupsPrunedByStatistics =
254
+ callbackFilteredRowGroupIndices.length - rowGroupIndices.length;
255
+ this.recordTelemetry(
256
+ 'row-group-prune',
257
+ {
258
+ rowGroupsRequested: candidateRowGroupIndices.length,
259
+ rowGroupsPruned: candidateRowGroupIndices.length - rowGroupIndices.length,
260
+ rowGroupsPrunedByStatistics
261
+ },
262
+ {}
263
+ );
264
+ const columns = normalizeColumns(readOptions.columns, initialization.schema);
265
+ const predicateColumns = predicate ? getParquetPredicateColumns(predicate) : [];
266
+ const decodedColumns =
267
+ columns.length === 0 ? [] : [...new Set([...columns, ...predicateColumns])];
268
+ const columnList = decodedColumns.map(column => [column]);
269
+ const batchSize = normalizeBatchSize(readOptions.batchSize);
270
+ const concurrency = normalizeConcurrency(readOptions.concurrency);
271
+ const projectedSchema = projectSchema(initialization.schema, columns);
272
+ const projectedColumnNames = columns.length ? new Set(columns) : undefined;
273
+ const workerOptions = this.getWorkerOptions(concurrency, readContext.abortController.signal);
274
+ const decodeOnWorker = canDecodeParquetSourceOnWorker(workerOptions);
275
+ const scheduledReads = new Map<number, Promise<SettledParquetRowGroupRead>>();
276
+ let nextPositionToSchedule = 0;
277
+
278
+ const scheduleReads = (): void => {
279
+ while (
280
+ nextPositionToSchedule < rowGroupIndices.length &&
281
+ scheduledReads.size < concurrency
282
+ ) {
283
+ const position = nextPositionToSchedule++;
284
+ const rowGroupIndex = rowGroupIndices[position];
285
+ const read: Promise<SettledParquetRowGroupRead> = this.readRowGroup(
286
+ initialization,
287
+ rowGroupIndex,
288
+ columnList,
289
+ projectedSchema,
290
+ batchSize,
291
+ predicate,
292
+ projectedColumnNames,
293
+ decodeOnWorker ? workerOptions : undefined,
294
+ readContext.abortController.signal
295
+ ).then(
296
+ result => ({result}) as SettledParquetRowGroupRead,
297
+ error => ({error}) as SettledParquetRowGroupRead
298
+ );
299
+ scheduledReads.set(position, read);
300
+ inFlightReads.add(read);
301
+ void read.then(() => inFlightReads.delete(read));
302
+ }
303
+ };
304
+
305
+ scheduleReads();
306
+ for (let position = 0; position < rowGroupIndices.length; position++) {
307
+ const settledRead = await scheduledReads.get(position)!;
308
+ scheduledReads.delete(position);
309
+ scheduleReads();
310
+ if ('error' in settledRead) {
311
+ throw settledRead.error;
312
+ }
313
+
314
+ const {
315
+ rowGroupIndex,
316
+ columns: materializedColumns,
317
+ rowCount,
318
+ rowIndices,
319
+ workerResult
320
+ } = settledRead.result;
321
+ if (workerResult) {
322
+ for (const workerBatch of workerResult.batches) {
323
+ throwIfAborted(readContext.abortController.signal);
324
+ const deserializationStartTime = getCurrentTime();
325
+ const arrowTable = hydrateArrowTable(workerBatch.arrowTable);
326
+ const deserializationDurationMs = getCurrentTime() - deserializationStartTime;
327
+ this.recordTelemetry(
328
+ 'arrow-conversion',
329
+ {arrowConversionDurationMs: deserializationDurationMs},
330
+ {rowGroupIndex, durationMs: deserializationDurationMs}
331
+ );
332
+ const batch = createParquetBatchFromArrow(
333
+ initialization.metadata,
334
+ projectedSchema,
335
+ rowGroupIndex,
336
+ workerBatch.rowGroupRowOffset,
337
+ arrowTable,
338
+ workerBatch.rowCount,
339
+ workerBatch.rowGroupRowIndices
340
+ );
341
+ this.recordTelemetry(
342
+ 'batch',
343
+ {batchesEmitted: 1, rowsEmitted: workerBatch.rowCount},
344
+ {rowGroupIndex, rowCount: workerBatch.rowCount}
345
+ );
346
+ yield batch;
347
+ }
348
+ continue;
349
+ }
350
+
351
+ const outputRowCount = rowCount;
352
+ const outputBatchSize = batchSize || Math.max(outputRowCount, 1);
353
+ for (
354
+ let outputRowOffset = 0;
355
+ outputRowOffset < outputRowCount;
356
+ outputRowOffset += outputBatchSize
357
+ ) {
358
+ throwIfAborted(readContext.abortController.signal);
359
+ const batchRowCount = Math.min(outputBatchSize, outputRowCount - outputRowOffset);
360
+ const batchRowIndices = rowIndices
361
+ ? rowIndices!.slice(outputRowOffset, outputRowOffset + batchRowCount)
362
+ : undefined;
363
+ const rowGroupRowOffset = batchRowIndices?.[0] ?? outputRowOffset;
364
+ const batchColumns = sliceColumns(
365
+ materializedColumns!,
366
+ outputRowOffset,
367
+ outputRowOffset + batchRowCount
368
+ );
369
+ const conversionStartTime = getCurrentTime();
370
+ const batch = createParquetBatch(
371
+ initialization.metadata,
372
+ projectedSchema,
373
+ rowGroupIndex,
374
+ rowGroupRowOffset,
375
+ batchColumns,
376
+ batchRowCount,
377
+ batchRowIndices
378
+ );
379
+ const conversionDurationMs = getCurrentTime() - conversionStartTime;
380
+ this.recordTelemetry(
381
+ 'arrow-conversion',
382
+ {arrowConversionDurationMs: conversionDurationMs},
383
+ {rowGroupIndex, durationMs: conversionDurationMs}
384
+ );
385
+ this.recordTelemetry(
386
+ 'batch',
387
+ {batchesEmitted: 1, rowsEmitted: batchRowCount},
388
+ {rowGroupIndex, rowCount: batchRowCount}
389
+ );
390
+ yield batch;
391
+ }
392
+ }
393
+ completed = true;
394
+ } catch (error) {
395
+ readError = error;
396
+ if (readContext.abortController.signal.aborted) {
397
+ this.recordTelemetry('cancel', {cancellationCount: 1}, {error});
398
+ } else {
399
+ this.recordTelemetry('read-error', {failedReadCount: 1}, {error});
400
+ }
401
+ throw error;
402
+ } finally {
403
+ if (!completed && readError === undefined) {
404
+ this.recordTelemetry('cancel', {cancellationCount: 1}, {});
405
+ }
406
+ readContext.abortController.abort();
407
+ readContext.removeSignalListener();
408
+ this.activeReadControllers.delete(readContext.abortController);
409
+ await Promise.allSettled([...inFlightReads]);
410
+ }
411
+ }
412
+
413
+ /** Closes the underlying readable file and aborts active remote requests. */
414
+ async close(): Promise<void> {
415
+ if (this.closed) {
416
+ return;
417
+ }
418
+ this.closed = true;
419
+ for (const abortController of this.activeReadControllers) {
420
+ abortController.abort();
421
+ }
422
+ await this.readableFile?.close();
423
+ const initialization = await this.initializationPromise?.catch(() => null);
424
+ if (initialization?.file !== this.readableFile) {
425
+ await initialization?.file.close();
426
+ }
427
+ }
428
+
429
+ /** Returns cached initialization, resetting the cache when initialization fails. */
430
+ private getInitialization(signal?: AbortSignal): Promise<ParquetSourceInitialization> {
431
+ if (this.closed) {
432
+ return Promise.reject(new Error('ParquetSource is closed'));
433
+ }
434
+ if (!this.initializationPromise) {
435
+ this.initializationPromise = this.initialize(signal).catch(error => {
436
+ this.initializationPromise = null;
437
+ throw error;
438
+ });
439
+ }
440
+ return this.initializationPromise;
441
+ }
442
+
443
+ /** Preloads TypeScript decoder compression modules once and permits retry after failure. */
444
+ private getCompressionInitialization(): Promise<void> {
445
+ if (!this.compressionPromise) {
446
+ this.compressionPromise = preloadCompressions()
447
+ .then(() => undefined)
448
+ .catch(error => {
449
+ this.compressionPromise = null;
450
+ throw error;
451
+ });
452
+ }
453
+ return this.compressionPromise;
454
+ }
455
+
456
+ /** Snapshots source defaults and per-read overrides before asynchronous iteration begins. */
457
+ private getReadOptions(options: ParquetSourceReadOptions): ParquetSourceReadOptions {
458
+ const rowGroups = options.rowGroups ?? this.options.parquet?.rowGroups;
459
+ const columns = options.columns ?? this.options.parquet?.columns;
460
+ const predicate = options.predicate ?? this.options.parquet?.predicate;
461
+ return {
462
+ rowGroups: rowGroups && [...rowGroups],
463
+ columns: columns && [...columns],
464
+ rowGroupFilter: options.rowGroupFilter ?? this.options.parquet?.rowGroupFilter,
465
+ predicate: predicate ? copyParquetPredicate(predicate) : undefined,
466
+ batchSize: options.batchSize ?? this.options.parquet?.batchSize,
467
+ concurrency: options.concurrency ?? this.options.parquet?.concurrency,
468
+ signal: options.signal
469
+ };
470
+ }
471
+
472
+ /** Creates loader-utils worker options for one selective source read. */
473
+ private getWorkerOptions(concurrency: number, signal: AbortSignal): ParquetSourceWorkerOptions {
474
+ return {
475
+ core: {
476
+ worker: this.options.core?.worker ?? true,
477
+ maxConcurrency: concurrency,
478
+ maxMobileConcurrency: this.options.core?.maxMobileConcurrency ?? concurrency,
479
+ reuseWorkers: this.options.core?.reuseWorkers ?? isBrowser,
480
+ _workerType: this.options.core?._workerType
481
+ },
482
+ 'parquet-source': {
483
+ workerUrl: this.options.parquet?.workerUrl
484
+ },
485
+ parquet: {
486
+ signal
487
+ }
488
+ };
489
+ }
490
+
491
+ /** Fetches and decodes one selected row group using the cached footer and schema. */
492
+ private async readRowGroup(
493
+ initialization: ParquetSourceInitialization,
494
+ rowGroupIndex: number,
495
+ columnList: string[][],
496
+ projectedSchema: Schema,
497
+ batchSize: number | undefined,
498
+ predicate: ParquetPredicate | undefined,
499
+ projectedColumnNames: ReadonlySet<string> | undefined,
500
+ workerOptions: ParquetSourceWorkerOptions | undefined,
501
+ signal: AbortSignal
502
+ ): Promise<ParquetRowGroupReadResult> {
503
+ const rowGroup = initialization.fileMetadata.row_groups[rowGroupIndex];
504
+ const pagePlan = predicate
505
+ ? await createParquetPagePruningPlan(
506
+ initialization.file,
507
+ rowGroup,
508
+ initialization.parquetSchema,
509
+ columnList,
510
+ predicate,
511
+ signal
512
+ )
513
+ : undefined;
514
+ if (pagePlan) {
515
+ this.recordPagePruningTelemetry(rowGroupIndex, pagePlan);
516
+ if (pagePlan.rowRanges.length === 0) {
517
+ return {rowGroupIndex, columns: {}, rowCount: 0, rowIndices: []};
518
+ }
519
+ }
520
+
521
+ if (workerOptions) {
522
+ return await this.readRowGroupOnWorker(
523
+ initialization,
524
+ rowGroupIndex,
525
+ columnList,
526
+ projectedSchema,
527
+ batchSize,
528
+ predicate,
529
+ pagePlan,
530
+ workerOptions,
531
+ signal
532
+ );
533
+ }
534
+
535
+ const decodeStartTime = getCurrentTime();
536
+ const decodedRowGroups = pagePlan
537
+ ? await Promise.all(
538
+ pagePlan.rowRanges.map(rowRange =>
539
+ initialization.reader.readRowGroupRange(
540
+ initialization.parquetSchema,
541
+ rowGroup,
542
+ columnList,
543
+ rowRange,
544
+ pagePlan.pageLocations,
545
+ signal
546
+ )
547
+ )
548
+ )
549
+ : [
550
+ await initialization.reader.readRowGroup(
551
+ initialization.parquetSchema,
552
+ rowGroup,
553
+ columnList,
554
+ signal
555
+ )
556
+ ];
557
+ throwIfAborted(signal);
558
+ const columns = concatenateMaterializedColumns(
559
+ decodedRowGroups.map(decodedRowGroup =>
560
+ initialization.parquetSchema.materializeColumns(decodedRowGroup)
561
+ )
562
+ );
563
+ const sourceRowIndices = pagePlan
564
+ ? pagePlan.rowRanges.flatMap(rowRange =>
565
+ Array.from({length: rowRange.end - rowRange.start}, (_, index) => rowRange.start + index)
566
+ )
567
+ : undefined;
568
+ const localRowCount = sourceRowIndices?.length ?? Number(rowGroup.num_rows);
569
+ const localRowIndices = predicate
570
+ ? filterParquetRowIndices(predicate, columns, localRowCount)
571
+ : undefined;
572
+ const rowIndices = localRowIndices?.map(rowIndex => sourceRowIndices?.[rowIndex] ?? rowIndex);
573
+ const outputColumns = localRowIndices
574
+ ? gatherParquetColumns(columns, localRowIndices, projectedColumnNames)
575
+ : columns;
576
+ const decodeDurationMs = getCurrentTime() - decodeStartTime;
577
+ this.recordTelemetry(
578
+ 'decode',
579
+ {decodeDurationMs, rowGroupsDecoded: 1},
580
+ {rowGroupIndex, durationMs: decodeDurationMs}
581
+ );
582
+ if (predicate) {
583
+ this.recordTelemetry(
584
+ 'predicate-filter',
585
+ {
586
+ predicateRowsTested: localRowCount,
587
+ predicateRowsMatched: rowIndices!.length
588
+ },
589
+ {rowGroupIndex, rowCount: rowIndices!.length}
590
+ );
591
+ }
592
+ return {
593
+ rowGroupIndex,
594
+ columns: outputColumns,
595
+ rowCount: rowIndices?.length ?? localRowCount,
596
+ rowIndices
597
+ };
598
+ }
599
+
600
+ /** Fetches selected chunks and transfers their decompression and Arrow conversion to a worker. */
601
+ private async readRowGroupOnWorker(
602
+ initialization: ParquetSourceInitialization,
603
+ rowGroupIndex: number,
604
+ columnList: string[][],
605
+ projectedSchema: Schema,
606
+ batchSize: number | undefined,
607
+ predicate: ParquetPredicate | undefined,
608
+ pagePlan: ParquetPagePruningPlan | undefined,
609
+ workerOptions: ParquetSourceWorkerOptions,
610
+ signal: AbortSignal
611
+ ): Promise<ParquetRowGroupReadResult> {
612
+ const rowGroup = initialization.fileMetadata.row_groups[rowGroupIndex];
613
+ const selectedColumnChunks = rowGroup.columns.filter(columnChunk => {
614
+ const path = columnChunk.meta_data?.path_in_schema;
615
+ return Boolean(path && (columnList.length === 0 || fieldIndexOf(columnList, path) >= 0));
616
+ });
617
+ const rangeDescriptors = pagePlan
618
+ ? getParquetPageReadRanges(rowGroup, columnList, pagePlan)
619
+ : selectedColumnChunks.map(getColumnChunkRange);
620
+ const ranges = await Promise.all(
621
+ rangeDescriptors.map(async ({offset, length}) => {
622
+ return {offset, data: await initialization.file.read(offset, length, signal)};
623
+ })
624
+ );
625
+ throwIfAborted(signal);
626
+
627
+ let workerResult: ParquetSourceWorkerResult;
628
+ try {
629
+ workerResult = await decodeParquetSourceRowGroupOnWorker(
630
+ {
631
+ fileByteLength: initialization.file.size,
632
+ rowCount: Number(rowGroup.num_rows),
633
+ uncompressedByteLength: Number(rowGroup.total_byte_size),
634
+ schemaDefinition: initialization.parquetSchema.schema,
635
+ projectedSchema,
636
+ columnChunks: selectedColumnChunks.map(createParquetSourceWorkerColumnChunk),
637
+ ranges,
638
+ batchSize: batchSize || Math.max(Number(rowGroup.num_rows), 1),
639
+ predicate: predicate ? copyParquetPredicate(predicate) : undefined,
640
+ pagePlan,
641
+ preserveBinary: Boolean(this.options.parquet?.preserveBinary)
642
+ },
643
+ workerOptions
644
+ );
645
+ } catch (error) {
646
+ throwIfAborted(signal);
647
+ throw error;
648
+ }
649
+ throwIfAborted(signal);
650
+ this.recordTelemetry(
651
+ 'decode',
652
+ {decodeDurationMs: workerResult.decodeDurationMs, rowGroupsDecoded: 1},
653
+ {rowGroupIndex, durationMs: workerResult.decodeDurationMs}
654
+ );
655
+ this.recordTelemetry(
656
+ 'arrow-conversion',
657
+ {arrowConversionDurationMs: workerResult.arrowConversionDurationMs},
658
+ {rowGroupIndex, durationMs: workerResult.arrowConversionDurationMs}
659
+ );
660
+ if (predicate) {
661
+ this.recordTelemetry(
662
+ 'predicate-filter',
663
+ {
664
+ predicateRowsTested: workerResult.sourceRowCount,
665
+ predicateRowsMatched: workerResult.rowCount
666
+ },
667
+ {rowGroupIndex, rowCount: workerResult.rowCount}
668
+ );
669
+ }
670
+ return {rowGroupIndex, rowCount: workerResult.rowCount, workerResult};
671
+ }
672
+
673
+ /** Records the rows and pages avoided by one conservative page-index plan. */
674
+ private recordPagePruningTelemetry(rowGroupIndex: number, plan: ParquetPagePruningPlan): void {
675
+ this.recordTelemetry(
676
+ 'page-index-prune',
677
+ {
678
+ pageIndexesRead: plan.indexCount,
679
+ pagesRead: plan.selectedPageCount,
680
+ pagesPruned: plan.totalPageCount - plan.selectedPageCount,
681
+ rowsPrunedByPageIndex: plan.prunedRowCount,
682
+ rowGroupsPrunedByPageIndex: plan.rowRanges.length === 0 ? 1 : 0,
683
+ rowGroupsPruned: plan.rowRanges.length === 0 ? 1 : 0
684
+ },
685
+ {rowGroupIndex, rowCount: plan.prunedRowCount}
686
+ );
687
+ }
688
+
689
+ /** Opens the readable file and decodes its footer and schema once. */
690
+ private async initialize(signal?: AbortSignal): Promise<ParquetSourceInitialization> {
691
+ const file = await this.openFile(signal);
692
+ try {
693
+ const reader = new ParquetReader(file, {
694
+ preserveBinary: this.options.parquet?.preserveBinary,
695
+ signal
696
+ });
697
+ const fileMetadata = await reader.getFileMetadata();
698
+ const parquetSchema = await reader.getSchema();
699
+ const schema = deepFreeze(await getSchemaFromParquetReader(reader));
700
+ const metadata = createParquetSourceMetadata(
701
+ this.data,
702
+ this.url,
703
+ file,
704
+ fileMetadata,
705
+ schema,
706
+ parquetSchema,
707
+ file instanceof ParquetRangeFile ? file.objectVersion : undefined
708
+ );
709
+ reader.props.signal = undefined;
710
+ return {file, reader, schema, parquetSchema, fileMetadata, metadata};
711
+ } catch (error) {
712
+ await file.close();
713
+ throw error;
714
+ }
715
+ }
716
+
717
+ /** Opens a Blob file or probes a remote object with one bounded range request. */
718
+ private async openFile(signal?: AbortSignal): Promise<ReadableFile> {
719
+ if (typeof this.data !== 'string') {
720
+ this.readableFile = new BlobFile(this.data);
721
+ return this.readableFile;
722
+ }
723
+ const file = new ParquetRangeFile(this.url, {
724
+ fetch: this.fetch,
725
+ headers: this.options.parquet?.headers,
726
+ rangeRequests: this.options.rangeRequests,
727
+ onTelemetry: event =>
728
+ this.recordTelemetry(
729
+ event.type,
730
+ {
731
+ rangeRequestCount: event.rangeRequestCount,
732
+ requestedBytes: event.requestedBytes,
733
+ downloadedBytes: event.downloadedBytes,
734
+ cacheHits: event.cacheHits,
735
+ networkDurationMs: event.networkDurationMs,
736
+ failedRangeRequestCount: event.failedRangeRequestCount,
737
+ abortedRangeRequestCount: event.abortedRangeRequestCount
738
+ },
739
+ {durationMs: event.networkDurationMs, error: event.error}
740
+ )
741
+ });
742
+ this.readableFile = file;
743
+ return await file.open(signal);
744
+ }
745
+
746
+ /** Applies telemetry deltas and emits a callback with the resulting cumulative snapshot. */
747
+ private recordTelemetry(
748
+ type: ParquetTelemetryEvent['type'],
749
+ delta: Partial<ParquetTelemetry>,
750
+ details: Omit<ParquetTelemetryEvent, 'type' | 'telemetry'>
751
+ ): void {
752
+ for (const [key, value] of Object.entries(delta) as Array<
753
+ [keyof ParquetTelemetry, number | undefined]
754
+ >) {
755
+ if (value !== undefined) {
756
+ this.telemetry[key] += value;
757
+ }
758
+ }
759
+ try {
760
+ this.options.parquet?.onTelemetry?.({type, telemetry: this.getTelemetry(), ...details});
761
+ } catch {
762
+ // Telemetry must never change source read behavior.
763
+ }
764
+ }
765
+ }
766
+
767
+ /** Normalizes a decoded Parquet footer into source metadata. */
768
+ function createParquetSourceMetadata(
769
+ data: string | Blob,
770
+ url: string,
771
+ file: ReadableFile,
772
+ fileMetadata: FileMetaData,
773
+ schema: Schema,
774
+ parquetSchema: ParquetSchema,
775
+ objectVersion?: ParquetObjectVersion
776
+ ): ParquetSourceMetadata {
777
+ let rowOffset = 0;
778
+ const rowGroups = fileMetadata.row_groups.map((rowGroup, index) => {
779
+ const columns = rowGroup.columns
780
+ .filter(columnChunk => Boolean(columnChunk.meta_data))
781
+ .map(columnChunk => createColumnChunkMetadata(columnChunk, parquetSchema));
782
+ const normalizedRowGroup = createRowGroupMetadata(
783
+ index,
784
+ rowOffset,
785
+ Number(rowGroup.num_rows),
786
+ Number(rowGroup.total_byte_size),
787
+ columns
788
+ );
789
+ rowOffset += normalizedRowGroup.rowCount;
790
+ return normalizedRowGroup;
791
+ });
792
+
793
+ return Object.freeze({
794
+ schema,
795
+ name: getSourceName(data, url),
796
+ url: url || undefined,
797
+ fileByteLength: file.size,
798
+ version: fileMetadata.version,
799
+ formatVersion: fileMetadata.version,
800
+ createdBy: fileMetadata.created_by,
801
+ rowCount: Number(fileMetadata.num_rows),
802
+ rowGroupCount: rowGroups.length,
803
+ keyValueMetadata: Object.freeze(getKeyValueMetadata(fileMetadata)),
804
+ rowGroups: Object.freeze(rowGroups),
805
+ objectVersion: hasObjectVersion(objectVersion) ? Object.freeze({...objectVersion}) : undefined
806
+ });
807
+ }
808
+
809
+ /** Normalizes a decoded Parquet column chunk. */
810
+ function createColumnChunkMetadata(
811
+ columnChunk: FileMetaData['row_groups'][number]['columns'][number],
812
+ parquetSchema: ParquetSchema
813
+ ): ParquetColumnChunkMetadata {
814
+ const columnMetadata = columnChunk.meta_data!;
815
+ const dataPageOffset = Number(columnMetadata.data_page_offset);
816
+ const dictionaryPageOffset =
817
+ columnMetadata.dictionary_page_offset === undefined
818
+ ? undefined
819
+ : Number(columnMetadata.dictionary_page_offset);
820
+ const statistics = createColumnChunkStatistics(
821
+ columnMetadata.statistics,
822
+ parquetSchema.findField(columnMetadata.path_in_schema)
823
+ );
824
+ const compressedByteLength = Number(columnMetadata.total_compressed_size);
825
+ const uncompressedByteLength = Number(columnMetadata.total_uncompressed_size);
826
+ return Object.freeze({
827
+ path: Object.freeze([...columnMetadata.path_in_schema]),
828
+ filePath: columnChunk.file_path || undefined,
829
+ compression: CompressionCodec[columnMetadata.codec] || String(columnMetadata.codec),
830
+ encodings: Object.freeze(
831
+ columnMetadata.encodings.map(encoding => Encoding[encoding] || String(encoding))
832
+ ),
833
+ valueCount: Number(columnMetadata.num_values),
834
+ fileOffset: Math.min(
835
+ dataPageOffset,
836
+ dictionaryPageOffset && dictionaryPageOffset > 0 ? dictionaryPageOffset : dataPageOffset
837
+ ),
838
+ compressedByteLength,
839
+ compressedSize: compressedByteLength,
840
+ uncompressedByteLength,
841
+ uncompressedSize: uncompressedByteLength,
842
+ dataPageOffset,
843
+ dictionaryPageOffset,
844
+ columnIndexOffset:
845
+ columnChunk.column_index_offset === undefined
846
+ ? undefined
847
+ : Number(columnChunk.column_index_offset),
848
+ columnIndexByteLength: columnChunk.column_index_length,
849
+ offsetIndexOffset:
850
+ columnChunk.offset_index_offset === undefined
851
+ ? undefined
852
+ : Number(columnChunk.offset_index_offset),
853
+ offsetIndexByteLength: columnChunk.offset_index_length,
854
+ statistics
855
+ });
856
+ }
857
+
858
+ /** Decodes optional footer statistics into the column's logical value representation. */
859
+ function createColumnChunkStatistics(
860
+ statistics: ParquetThriftStatistics | undefined,
861
+ field: ParquetField
862
+ ): ParquetColumnChunkStatistics | undefined {
863
+ if (!statistics) {
864
+ return undefined;
865
+ }
866
+ const minBytes = statistics.min_value ?? statistics.min;
867
+ const maxBytes = statistics.max_value ?? statistics.max;
868
+ const result: ParquetColumnChunkStatistics = {
869
+ nullCount: statistics.null_count === undefined ? undefined : Number(statistics.null_count),
870
+ distinctCount:
871
+ statistics.distinct_count === undefined ? undefined : Number(statistics.distinct_count),
872
+ minIsExact: statistics.is_min_value_exact,
873
+ maxIsExact: statistics.is_max_value_exact
874
+ };
875
+ if (minBytes) {
876
+ result.min = decodeStatisticsValueSafely(toUint8Array(minBytes), field);
877
+ }
878
+ if (maxBytes) {
879
+ result.max = decodeStatisticsValueSafely(toUint8Array(maxBytes), field);
880
+ }
881
+ if (
882
+ result.min === undefined &&
883
+ result.max === undefined &&
884
+ result.nullCount === undefined &&
885
+ result.distinctCount === undefined &&
886
+ result.minIsExact === undefined &&
887
+ result.maxIsExact === undefined
888
+ ) {
889
+ return undefined;
890
+ }
891
+ return Object.freeze(result);
892
+ }
893
+
894
+ /** Decodes one footer statistic and returns undefined for malformed or unsupported values. */
895
+ function decodeStatisticsValueSafely(bytes: Uint8Array, field: ParquetField): unknown {
896
+ try {
897
+ let primitiveValue: unknown;
898
+ switch (field.primitiveType) {
899
+ case 'BOOLEAN':
900
+ primitiveValue = Boolean(bytes[0]);
901
+ break;
902
+ case 'INT32':
903
+ primitiveValue =
904
+ field.originalType === 'UINT_32' ? readUInt32LE(bytes, 0) : readInt32LE(bytes, 0);
905
+ break;
906
+ case 'INT64':
907
+ primitiveValue =
908
+ field.originalType === 'UINT_64' ? readUInt64LE(bytes, 0) : readInt64LE(bytes, 0);
909
+ break;
910
+ case 'FLOAT':
911
+ primitiveValue = readFloatLE(bytes, 0);
912
+ break;
913
+ case 'DOUBLE':
914
+ primitiveValue = readDoubleLE(bytes, 0);
915
+ break;
916
+ case 'INT96':
917
+ case 'BYTE_ARRAY':
918
+ case 'FIXED_LEN_BYTE_ARRAY':
919
+ primitiveValue = copyUint8Array(bytes);
920
+ break;
921
+ default:
922
+ return undefined;
923
+ }
924
+ return Types.fromPrimitive(field.originalType || field.primitiveType, primitiveValue, field);
925
+ } catch {
926
+ return undefined;
927
+ }
928
+ }
929
+
930
+ /** Normalizes one decoded row group and derives its compressed byte length. */
931
+ function createRowGroupMetadata(
932
+ index: number,
933
+ rowOffset: number,
934
+ rowCount: number,
935
+ uncompressedByteLength: number,
936
+ columns: ParquetColumnChunkMetadata[]
937
+ ): ParquetRowGroupMetadata {
938
+ const compressedByteLength = columns.reduce(
939
+ (sum, column) => sum + column.compressedByteLength,
940
+ 0
941
+ );
942
+ return Object.freeze({
943
+ index,
944
+ rowOffset,
945
+ rowCount,
946
+ uncompressedByteLength,
947
+ uncompressedSize: uncompressedByteLength,
948
+ compressedByteLength,
949
+ compressedSize: compressedByteLength,
950
+ columns: Object.freeze(columns)
951
+ });
952
+ }
953
+
954
+ /** Returns the complete contiguous byte range occupied by one Parquet column chunk. */
955
+ function getColumnChunkRange(columnChunk: ColumnChunk): {offset: number; length: number} {
956
+ if (columnChunk.file_path) {
957
+ throw new Error('Parquet worker decoding does not support external column chunk files');
958
+ }
959
+ const columnMetadata = columnChunk.meta_data;
960
+ if (!columnMetadata) {
961
+ throw new Error('Parquet column chunk is missing metadata');
962
+ }
963
+ const dataPageOffset = Number(columnMetadata.data_page_offset);
964
+ const dictionaryPageOffset =
965
+ columnMetadata.dictionary_page_offset === undefined
966
+ ? undefined
967
+ : Number(columnMetadata.dictionary_page_offset);
968
+ const offset = Math.min(
969
+ dataPageOffset,
970
+ dictionaryPageOffset && dictionaryPageOffset > 0 ? dictionaryPageOffset : dataPageOffset
971
+ );
972
+ const length = Number(columnMetadata.total_compressed_size);
973
+ if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(length) || offset < 0 || length < 0) {
974
+ throw new Error('Parquet column chunk range must use non-negative safe integers');
975
+ }
976
+ return {offset, length};
977
+ }
978
+
979
+ /** Copies one selected Thrift column chunk into a structured-cloneable worker descriptor. */
980
+ function createParquetSourceWorkerColumnChunk(
981
+ columnChunk: ColumnChunk
982
+ ): ParquetSourceWorkerColumnChunk {
983
+ const columnMetadata = columnChunk.meta_data;
984
+ if (!columnMetadata) {
985
+ throw new Error('Parquet column chunk is missing metadata');
986
+ }
987
+ return {
988
+ filePath: columnChunk.file_path || undefined,
989
+ physicalType: columnMetadata.type,
990
+ compressionCodec: columnMetadata.codec,
991
+ path: [...columnMetadata.path_in_schema],
992
+ valueCount: Number(columnMetadata.num_values),
993
+ compressedByteLength: Number(columnMetadata.total_compressed_size),
994
+ uncompressedByteLength: Number(columnMetadata.total_uncompressed_size),
995
+ dataPageOffset: Number(columnMetadata.data_page_offset),
996
+ dictionaryPageOffset:
997
+ columnMetadata.dictionary_page_offset === undefined
998
+ ? undefined
999
+ : Number(columnMetadata.dictionary_page_offset)
1000
+ };
1001
+ }
1002
+
1003
+ /** Converts decoded columns into one Arrow batch and attaches stable source provenance. */
1004
+ function createParquetBatch(
1005
+ metadata: ParquetSourceMetadata,
1006
+ schema: Schema,
1007
+ rowGroupIndex: number,
1008
+ rowGroupRowOffset: number,
1009
+ columns: Record<string, ArrayType>,
1010
+ rowCount: number,
1011
+ rowGroupRowIndices?: readonly number[]
1012
+ ): ParquetBatch {
1013
+ const arrowTable = convertTable({shape: 'columnar-table', schema, data: columns}, 'arrow-table');
1014
+ return createParquetBatchFromArrow(
1015
+ metadata,
1016
+ schema,
1017
+ rowGroupIndex,
1018
+ rowGroupRowOffset,
1019
+ arrowTable.data,
1020
+ rowCount,
1021
+ rowGroupRowIndices
1022
+ );
1023
+ }
1024
+
1025
+ /** Wraps a worker-transferred or locally converted Arrow table with source provenance. */
1026
+ function createParquetBatchFromArrow(
1027
+ metadata: ParquetSourceMetadata,
1028
+ schema: Schema,
1029
+ rowGroupIndex: number,
1030
+ rowGroupRowOffset: number,
1031
+ data: ArrowTable['data'],
1032
+ rowCount: number,
1033
+ rowGroupRowIndices?: readonly number[]
1034
+ ): ParquetBatch {
1035
+ const rowGroup = metadata.rowGroups[rowGroupIndex];
1036
+ const sourceId = metadata.url || metadata.name;
1037
+ const provenance = Object.freeze({
1038
+ sourceId,
1039
+ sourceUrl: metadata.url,
1040
+ source: sourceId,
1041
+ rowGroupIndex,
1042
+ rowOffset: rowGroup.rowOffset + rowGroupRowOffset,
1043
+ rowGroupRowOffset,
1044
+ rowCount,
1045
+ rowGroupRowIndices: rowGroupRowIndices ? Object.freeze([...rowGroupRowIndices]) : undefined,
1046
+ rowIndices: rowGroupRowIndices
1047
+ ? Object.freeze(rowGroupRowIndices.map(rowIndex => rowGroup.rowOffset + rowIndex))
1048
+ : undefined
1049
+ });
1050
+ return {
1051
+ batchType: 'data',
1052
+ shape: 'arrow-table',
1053
+ schemaType: 'explicit',
1054
+ schema,
1055
+ data,
1056
+ length: rowCount,
1057
+ metadata: provenance,
1058
+ ...provenance
1059
+ };
1060
+ }
1061
+
1062
+ /** Returns a contiguous row slice of every decoded column without constructing row objects. */
1063
+ function sliceColumns(
1064
+ columns: Record<string, ArrayType>,
1065
+ start: number,
1066
+ end: number
1067
+ ): Record<string, ArrayType> {
1068
+ const slicedColumns: Record<string, ArrayType> = {};
1069
+ for (const [name, column] of Object.entries(columns)) {
1070
+ const slice = (column as ArrayType & {slice?: (start: number, end: number) => ArrayType}).slice;
1071
+ slicedColumns[name] = slice
1072
+ ? slice.call(column, start, end)
1073
+ : Array.prototype.slice.call(column, start, end);
1074
+ }
1075
+ return slicedColumns;
1076
+ }
1077
+
1078
+ /** Concatenates materialized page-range fragments without constructing row objects. */
1079
+ function concatenateMaterializedColumns(
1080
+ fragments: readonly Record<string, ArrayType>[]
1081
+ ): Record<string, ArrayType> {
1082
+ const columns: Record<string, unknown[]> = {};
1083
+ for (const fragment of fragments) {
1084
+ for (const [name, values] of Object.entries(fragment)) {
1085
+ columns[name] ||= [];
1086
+ const destination = columns[name];
1087
+ for (let index = 0; index < values.length; index++) {
1088
+ destination.push(values[index]);
1089
+ }
1090
+ }
1091
+ }
1092
+ return columns as Record<string, ArrayType>;
1093
+ }
1094
+
1095
+ /** Validates and normalizes requested row-group indexes. */
1096
+ function normalizeRowGroupIndices(
1097
+ rowGroups: readonly number[] | undefined,
1098
+ rowGroupCount: number
1099
+ ): number[] {
1100
+ const rowGroupIndices = rowGroups || Array.from({length: rowGroupCount}, (_, index) => index);
1101
+ const seenIndices = new Set<number>();
1102
+ for (const rowGroupIndex of rowGroupIndices) {
1103
+ if (!Number.isInteger(rowGroupIndex) || rowGroupIndex < 0 || rowGroupIndex >= rowGroupCount) {
1104
+ throw new Error(`Invalid Parquet row-group index ${rowGroupIndex}`);
1105
+ }
1106
+ if (seenIndices.has(rowGroupIndex)) {
1107
+ throw new Error(`Duplicate Parquet row-group index ${rowGroupIndex}`);
1108
+ }
1109
+ seenIndices.add(rowGroupIndex);
1110
+ }
1111
+ return [...rowGroupIndices];
1112
+ }
1113
+
1114
+ /** Validates selected top-level columns against the source schema. */
1115
+ function normalizeColumns(columns: readonly string[] | undefined, schema: Schema): string[] {
1116
+ if (!columns?.length) {
1117
+ return [];
1118
+ }
1119
+ const availableColumns = new Set(schema.fields.map(field => field.name));
1120
+ const normalizedColumns: string[] = [];
1121
+ for (const column of columns) {
1122
+ if (!availableColumns.has(column)) {
1123
+ throw new Error(`Parquet column not found: ${column}`);
1124
+ }
1125
+ if (!normalizedColumns.includes(column)) {
1126
+ normalizedColumns.push(column);
1127
+ }
1128
+ }
1129
+ return normalizedColumns;
1130
+ }
1131
+
1132
+ /** Returns a schema containing only explicitly selected top-level fields. */
1133
+ function projectSchema(schema: Schema, columns: string[]): Schema {
1134
+ if (columns.length === 0) {
1135
+ return schema;
1136
+ }
1137
+ const selectedColumns = new Set(columns);
1138
+ return {...schema, fields: schema.fields.filter(field => selectedColumns.has(field.name))};
1139
+ }
1140
+
1141
+ /** Validates an optional output batch size. */
1142
+ function normalizeBatchSize(batchSize?: number): number | undefined {
1143
+ if (batchSize === undefined) {
1144
+ return undefined;
1145
+ }
1146
+ if (!Number.isInteger(batchSize) || batchSize <= 0) {
1147
+ throw new Error(`Invalid Parquet batch size ${batchSize}`);
1148
+ }
1149
+ return batchSize;
1150
+ }
1151
+
1152
+ /** Validates the row-group decode concurrency limit. */
1153
+ function normalizeConcurrency(concurrency = 1): number {
1154
+ if (!Number.isInteger(concurrency) || concurrency <= 0) {
1155
+ throw new Error(`Invalid Parquet concurrency ${concurrency}`);
1156
+ }
1157
+ return concurrency;
1158
+ }
1159
+
1160
+ /** Creates a zero-filled telemetry snapshot for one Parquet source. */
1161
+ function createParquetTelemetry(): ParquetTelemetry {
1162
+ return {
1163
+ rangeRequestCount: 0,
1164
+ requestedBytes: 0,
1165
+ downloadedBytes: 0,
1166
+ cacheHits: 0,
1167
+ networkDurationMs: 0,
1168
+ failedRangeRequestCount: 0,
1169
+ abortedRangeRequestCount: 0,
1170
+ retryCount: 0,
1171
+ decodeDurationMs: 0,
1172
+ arrowConversionDurationMs: 0,
1173
+ rowGroupsRequested: 0,
1174
+ rowGroupsPruned: 0,
1175
+ rowGroupsPrunedByStatistics: 0,
1176
+ rowGroupsPrunedByPageIndex: 0,
1177
+ pageIndexesRead: 0,
1178
+ pagesRead: 0,
1179
+ pagesPruned: 0,
1180
+ rowsPrunedByPageIndex: 0,
1181
+ rowGroupsDecoded: 0,
1182
+ batchesEmitted: 0,
1183
+ rowsEmitted: 0,
1184
+ predicateRowsTested: 0,
1185
+ predicateRowsMatched: 0,
1186
+ cancellationCount: 0,
1187
+ failedReadCount: 0
1188
+ };
1189
+ }
1190
+
1191
+ /** Returns a monotonic timestamp when available and falls back to wall-clock time. */
1192
+ function getCurrentTime(): number {
1193
+ return globalThis.performance?.now() ?? Date.now();
1194
+ }
1195
+
1196
+ /** Creates a read-scoped abort controller linked to the caller signal. */
1197
+ function createReadAbortContext(signal?: AbortSignal): {
1198
+ /** Controller owned by the source read operation. */
1199
+ abortController: AbortController;
1200
+ /** Removes the caller-signal listener after the read settles. */
1201
+ removeSignalListener: () => void;
1202
+ } {
1203
+ const abortController = new AbortController();
1204
+ const abortRead = (): void => abortController.abort(signal?.reason);
1205
+ if (signal?.aborted) {
1206
+ abortRead();
1207
+ } else {
1208
+ signal?.addEventListener('abort', abortRead, {once: true});
1209
+ }
1210
+ return {
1211
+ abortController,
1212
+ removeSignalListener: () => signal?.removeEventListener('abort', abortRead)
1213
+ };
1214
+ }
1215
+
1216
+ /** Throws a cross-runtime AbortError when a signal has been aborted. */
1217
+ function throwIfAborted(signal: AbortSignal): void {
1218
+ if (!signal.aborted) {
1219
+ return;
1220
+ }
1221
+ if (signal.reason !== undefined) {
1222
+ throw signal.reason;
1223
+ }
1224
+ const error = new Error('Parquet read aborted');
1225
+ error.name = 'AbortError';
1226
+ throw error;
1227
+ }
1228
+
1229
+ /** Recursively freezes the plain schema tree cached by a source. */
1230
+ function deepFreeze<T>(value: T): T {
1231
+ if (!value || typeof value !== 'object' || Object.isFrozen(value)) {
1232
+ return value;
1233
+ }
1234
+ for (const nestedValue of Object.values(value)) {
1235
+ deepFreeze(nestedValue);
1236
+ }
1237
+ return Object.freeze(value);
1238
+ }
1239
+
1240
+ /** Converts footer key/value pairs into an object. */
1241
+ function getKeyValueMetadata(fileMetadata: FileMetaData): Record<string, string> {
1242
+ const result: Record<string, string> = {};
1243
+ for (const entry of fileMetadata.key_value_metadata || []) {
1244
+ if (entry.value !== undefined) {
1245
+ result[entry.key] = entry.value;
1246
+ }
1247
+ }
1248
+ return result;
1249
+ }
1250
+
1251
+ /** Infers a stable display name from URL or File input. */
1252
+ function getSourceName(data: string | Blob, url: string): string {
1253
+ const sourceName =
1254
+ typeof data !== 'string' && 'name' in data && typeof data.name === 'string'
1255
+ ? data.name
1256
+ : typeof data === 'string'
1257
+ ? url.split(/[?#]/)[0].split('/').pop() || 'parquet'
1258
+ : 'parquet';
1259
+ return sourceName.replace(/\.parquet$/i, '') || 'parquet';
1260
+ }
1261
+
1262
+ /** Returns true when at least one HTTP object validator was captured. */
1263
+ function hasObjectVersion(version?: ParquetObjectVersion): version is ParquetObjectVersion {
1264
+ return Boolean(version?.etag || version?.lastModified);
1265
+ }