@loaders.gl/parquet 5.0.0-alpha.1 → 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 (583) hide show
  1. package/LICENSE +14 -3
  2. package/dist/bundled.d.ts +6 -3
  3. package/dist/bundled.d.ts.map +1 -1
  4. package/dist/bundled.js +5 -2
  5. package/dist/bundled.js.map +1 -1
  6. package/dist/geoparquet-loader-with-parser.d.ts +0 -1
  7. package/dist/geoparquet-loader-with-parser.d.ts.map +1 -1
  8. package/dist/geoparquet-loader-with-parser.js +1 -1
  9. package/dist/geoparquet-loader-with-parser.js.map +1 -1
  10. package/dist/geoparquet-loader.d.ts +0 -2
  11. package/dist/geoparquet-loader.d.ts.map +1 -1
  12. package/dist/geoparquet-loader.js +1 -1
  13. package/dist/index.cjs +27979 -7118
  14. package/dist/index.cjs.map +3 -4
  15. package/dist/index.d.ts +6 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +4 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/arrow/convert-columns-to-row-group.js +3 -0
  20. package/dist/lib/arrow/convert-columns-to-row-group.js.map +1 -1
  21. package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
  22. package/dist/lib/arrow/convert-schema-from-parquet.js +86 -26
  23. package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
  24. package/dist/lib/arrow/convert-schema-to-parquet.d.ts.map +1 -1
  25. package/dist/lib/arrow/convert-schema-to-parquet.js +16 -7
  26. package/dist/lib/arrow/convert-schema-to-parquet.js.map +1 -1
  27. package/dist/lib/arrow/create-nested-arrow-vector.d.ts +8 -0
  28. package/dist/lib/arrow/create-nested-arrow-vector.d.ts.map +1 -0
  29. package/dist/lib/arrow/create-nested-arrow-vector.js +396 -0
  30. package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -0
  31. package/dist/lib/constants.d.ts +0 -1
  32. package/dist/lib/constants.d.ts.map +1 -1
  33. package/dist/lib/constants.js +1 -2
  34. package/dist/lib/constants.js.map +1 -1
  35. package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
  36. package/dist/lib/encoders/encode-table-to-parquet-js.js +59 -9
  37. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -1
  38. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -1
  39. package/dist/lib/geo/geospatial-metadata.js +7 -26
  40. package/dist/lib/geo/geospatial-metadata.js.map +1 -1
  41. package/dist/lib/parquet-page-index.d.ts +62 -0
  42. package/dist/lib/parquet-page-index.d.ts.map +1 -0
  43. package/dist/lib/parquet-page-index.js +377 -0
  44. package/dist/lib/parquet-page-index.js.map +1 -0
  45. package/dist/lib/parquet-predicate.d.ts +17 -0
  46. package/dist/lib/parquet-predicate.d.ts.map +1 -0
  47. package/dist/lib/parquet-predicate.js +300 -0
  48. package/dist/lib/parquet-predicate.js.map +1 -0
  49. package/dist/lib/parquet-source-worker-client.d.ts +6 -0
  50. package/dist/lib/parquet-source-worker-client.d.ts.map +1 -0
  51. package/dist/lib/parquet-source-worker-client.js +22 -0
  52. package/dist/lib/parquet-source-worker-client.js.map +1 -0
  53. package/dist/lib/parquet-source-worker-decoder.d.ts +4 -0
  54. package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -0
  55. package/dist/lib/parquet-source-worker-decoder.js +115 -0
  56. package/dist/lib/parquet-source-worker-decoder.js.map +1 -0
  57. package/dist/lib/parquet-source-worker-file.d.ts +24 -0
  58. package/dist/lib/parquet-source-worker-file.d.ts.map +1 -0
  59. package/dist/lib/parquet-source-worker-file.js +40 -0
  60. package/dist/lib/parquet-source-worker-file.js.map +1 -0
  61. package/dist/lib/parquet-source-worker-types.d.ts +97 -0
  62. package/dist/lib/parquet-source-worker-types.d.ts.map +1 -0
  63. package/dist/lib/parquet-source-worker-types.js +5 -0
  64. package/dist/lib/parquet-source-worker-types.js.map +1 -0
  65. package/dist/lib/parquet-worker-transport.d.ts +8 -0
  66. package/dist/lib/parquet-worker-transport.d.ts.map +1 -0
  67. package/dist/lib/parquet-worker-transport.js +40 -0
  68. package/dist/lib/parquet-worker-transport.js.map +1 -0
  69. package/dist/lib/parsers/convert-parquet-tables.d.ts +16 -0
  70. package/dist/lib/parsers/convert-parquet-tables.d.ts.map +1 -0
  71. package/dist/lib/parsers/convert-parquet-tables.js +30 -0
  72. package/dist/lib/parsers/convert-parquet-tables.js.map +1 -0
  73. package/dist/lib/parsers/parse-parquet-tables.d.ts +1 -14
  74. package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -1
  75. package/dist/lib/parsers/parse-parquet-tables.js +4 -55
  76. package/dist/lib/parsers/parse-parquet-tables.js.map +1 -1
  77. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +16 -3
  78. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -1
  79. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +599 -14
  80. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -1
  81. package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
  82. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  83. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  84. package/dist/lib/sources/parquet-range-file.d.ts +80 -0
  85. package/dist/lib/sources/parquet-range-file.d.ts.map +1 -0
  86. package/dist/lib/sources/parquet-range-file.js +261 -0
  87. package/dist/lib/sources/parquet-range-file.js.map +1 -0
  88. package/dist/lib/sources/single-batch-queue.d.ts +24 -0
  89. package/dist/lib/sources/single-batch-queue.d.ts.map +1 -0
  90. package/dist/lib/sources/single-batch-queue.js +91 -0
  91. package/dist/lib/sources/single-batch-queue.js.map +1 -0
  92. package/dist/lib/utils/load-wasm-node.d.ts +3 -0
  93. package/dist/lib/utils/load-wasm-node.d.ts.map +1 -0
  94. package/dist/lib/utils/load-wasm-node.js +23 -0
  95. package/dist/lib/utils/load-wasm-node.js.map +1 -0
  96. package/dist/lib/utils/load-wasm.d.ts.map +1 -1
  97. package/dist/lib/utils/load-wasm.js +23 -7
  98. package/dist/lib/utils/load-wasm.js.map +1 -1
  99. package/dist/lib/utils/make-stream-iterator.d.ts +2 -0
  100. package/dist/lib/utils/make-stream-iterator.d.ts.map +1 -1
  101. package/dist/lib/utils/make-stream-iterator.js +124 -15
  102. package/dist/lib/utils/make-stream-iterator.js.map +1 -1
  103. package/dist/parquet-dataset-source.cjs +26413 -0
  104. package/dist/parquet-dataset-source.cjs.map +6 -0
  105. package/dist/parquet-dataset-source.d.ts +54 -0
  106. package/dist/parquet-dataset-source.d.ts.map +1 -0
  107. package/dist/parquet-dataset-source.js +380 -0
  108. package/dist/parquet-dataset-source.js.map +1 -0
  109. package/dist/parquet-js-loader-types.d.ts +57 -0
  110. package/dist/parquet-js-loader-types.d.ts.map +1 -0
  111. package/dist/parquet-js-loader-types.js +33 -0
  112. package/dist/parquet-js-loader-types.js.map +1 -0
  113. package/dist/parquet-js-loader.d.ts +12 -37
  114. package/dist/parquet-js-loader.d.ts.map +1 -1
  115. package/dist/parquet-js-loader.js +46 -21
  116. package/dist/parquet-js-loader.js.map +1 -1
  117. package/dist/parquet-js-writer.d.ts +10 -0
  118. package/dist/parquet-js-writer.d.ts.map +1 -1
  119. package/dist/parquet-js-writer.js +1 -1
  120. package/dist/parquet-js-writer.js.map +1 -1
  121. package/dist/parquet-loader-base.d.ts +25 -0
  122. package/dist/parquet-loader-base.d.ts.map +1 -0
  123. package/dist/parquet-loader-base.js +23 -0
  124. package/dist/parquet-loader-base.js.map +1 -0
  125. package/dist/parquet-loader-options.d.ts +6 -18
  126. package/dist/parquet-loader-options.d.ts.map +1 -1
  127. package/dist/parquet-loader-options.js +0 -1
  128. package/dist/parquet-loader-options.js.map +1 -1
  129. package/dist/parquet-loader-types.d.ts +61 -0
  130. package/dist/parquet-loader-types.d.ts.map +1 -0
  131. package/dist/parquet-loader-types.js +17 -0
  132. package/dist/parquet-loader-types.js.map +1 -0
  133. package/dist/parquet-loader.d.ts +17 -37
  134. package/dist/parquet-loader.d.ts.map +1 -1
  135. package/dist/parquet-loader.js +59 -44
  136. package/dist/parquet-loader.js.map +1 -1
  137. package/dist/parquet-source-capabilities.d.ts +36 -0
  138. package/dist/parquet-source-capabilities.d.ts.map +1 -0
  139. package/dist/parquet-source-capabilities.js +22 -0
  140. package/dist/parquet-source-capabilities.js.map +1 -0
  141. package/dist/parquet-source-loader-types.d.ts +72 -0
  142. package/dist/parquet-source-loader-types.d.ts.map +1 -0
  143. package/dist/parquet-source-loader-types.js +74 -0
  144. package/dist/parquet-source-loader-types.js.map +1 -0
  145. package/dist/parquet-source-loader.cjs +25975 -0
  146. package/dist/parquet-source-loader.cjs.map +6 -0
  147. package/dist/parquet-source-loader.d.ts +120 -0
  148. package/dist/parquet-source-loader.d.ts.map +1 -0
  149. package/dist/parquet-source-loader.js +812 -0
  150. package/dist/parquet-source-loader.js.map +1 -0
  151. package/dist/parquet-source-types.d.ts +384 -0
  152. package/dist/parquet-source-types.d.ts.map +1 -0
  153. package/dist/parquet-source-types.js +5 -0
  154. package/dist/parquet-source-types.js.map +1 -0
  155. package/dist/parquet-source-worker-url.d.ts +3 -0
  156. package/dist/parquet-source-worker-url.d.ts.map +1 -0
  157. package/dist/parquet-source-worker-url.js +22 -0
  158. package/dist/parquet-source-worker-url.js.map +1 -0
  159. package/dist/parquet-source-worker.js +38491 -0
  160. package/dist/parquet-source-worker.js.map +7 -0
  161. package/dist/parquet-worker-node.cjs +54779 -0
  162. package/dist/parquet-worker-node.cjs.map +7 -0
  163. package/dist/parquet-worker-url.d.ts +3 -0
  164. package/dist/parquet-worker-url.d.ts.map +1 -0
  165. package/dist/parquet-worker-url.js +15 -0
  166. package/dist/parquet-worker-url.js.map +1 -0
  167. package/dist/parquet-worker.js +19920 -0
  168. package/dist/parquet-worker.js.map +7 -0
  169. package/dist/parquet-writer.d.ts.map +1 -1
  170. package/dist/parquet-writer.js +2 -4
  171. package/dist/parquet-writer.js.map +1 -1
  172. package/dist/parquet_wasm_bg.wasm +0 -0
  173. package/dist/parquetjs/codecs/byte-stream-split.d.ts +9 -0
  174. package/dist/parquetjs/codecs/byte-stream-split.d.ts.map +1 -0
  175. package/dist/parquetjs/codecs/byte-stream-split.js +159 -0
  176. package/dist/parquetjs/codecs/byte-stream-split.js.map +1 -0
  177. package/dist/parquetjs/codecs/declare.d.ts +18 -1
  178. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  179. package/dist/parquetjs/codecs/declare.js +7 -1
  180. package/dist/parquetjs/codecs/declare.js.map +1 -1
  181. package/dist/parquetjs/codecs/delta.d.ts +17 -0
  182. package/dist/parquetjs/codecs/delta.d.ts.map +1 -0
  183. package/dist/parquetjs/codecs/delta.js +439 -0
  184. package/dist/parquetjs/codecs/delta.js.map +1 -0
  185. package/dist/parquetjs/codecs/dictionary.d.ts +5 -2
  186. package/dist/parquetjs/codecs/dictionary.d.ts.map +1 -1
  187. package/dist/parquetjs/codecs/dictionary.js +16 -4
  188. package/dist/parquetjs/codecs/dictionary.js.map +1 -1
  189. package/dist/parquetjs/codecs/index.d.ts.map +1 -1
  190. package/dist/parquetjs/codecs/index.js +18 -0
  191. package/dist/parquetjs/codecs/index.js.map +1 -1
  192. package/dist/parquetjs/codecs/plain.d.ts +2 -2
  193. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  194. package/dist/parquetjs/codecs/plain.js +62 -45
  195. package/dist/parquetjs/codecs/plain.js.map +1 -1
  196. package/dist/parquetjs/codecs/rle.d.ts +2 -2
  197. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  198. package/dist/parquetjs/codecs/rle.js +184 -51
  199. package/dist/parquetjs/codecs/rle.js.map +1 -1
  200. package/dist/parquetjs/compression.d.ts +5 -5
  201. package/dist/parquetjs/compression.d.ts.map +1 -1
  202. package/dist/parquetjs/compression.js +97 -42
  203. package/dist/parquetjs/compression.js.map +1 -1
  204. package/dist/parquetjs/encoder/dictionary-planner.d.ts +17 -0
  205. package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -0
  206. package/dist/parquetjs/encoder/dictionary-planner.js +64 -0
  207. package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -0
  208. package/dist/parquetjs/encoder/page-planner.d.ts +11 -0
  209. package/dist/parquetjs/encoder/page-planner.d.ts.map +1 -0
  210. package/dist/parquetjs/encoder/page-planner.js +60 -0
  211. package/dist/parquetjs/encoder/page-planner.js.map +1 -0
  212. package/dist/parquetjs/encoder/parquet-encoder.d.ts +7 -0
  213. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  214. package/dist/parquetjs/encoder/parquet-encoder.js +225 -23
  215. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  216. package/dist/parquetjs/parquet-thrift/BsonType.d.ts +1 -1
  217. package/dist/parquetjs/parquet-thrift/BsonType.d.ts.map +1 -1
  218. package/dist/parquetjs/parquet-thrift/BsonType.js +1 -1
  219. package/dist/parquetjs/parquet-thrift/BsonType.js.map +1 -1
  220. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +2 -2
  221. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
  222. package/dist/parquetjs/parquet-thrift/ColumnChunk.js +2 -2
  223. package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
  224. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts +6 -6
  225. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts.map +1 -1
  226. package/dist/parquetjs/parquet-thrift/ColumnIndex.js +2 -2
  227. package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
  228. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +2 -2
  229. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
  230. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +2 -2
  231. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
  232. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts +1 -1
  233. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts.map +1 -1
  234. package/dist/parquetjs/parquet-thrift/ColumnOrder.js +1 -1
  235. package/dist/parquetjs/parquet-thrift/ColumnOrder.js.map +1 -1
  236. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts +1 -1
  237. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts.map +1 -1
  238. package/dist/parquetjs/parquet-thrift/DataPageHeader.js +1 -1
  239. package/dist/parquetjs/parquet-thrift/DataPageHeader.js.map +1 -1
  240. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts +1 -1
  241. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts.map +1 -1
  242. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js +1 -1
  243. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js.map +1 -1
  244. package/dist/parquetjs/parquet-thrift/DateType.d.ts +1 -1
  245. package/dist/parquetjs/parquet-thrift/DateType.d.ts.map +1 -1
  246. package/dist/parquetjs/parquet-thrift/DateType.js +1 -1
  247. package/dist/parquetjs/parquet-thrift/DateType.js.map +1 -1
  248. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts +1 -1
  249. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts.map +1 -1
  250. package/dist/parquetjs/parquet-thrift/DecimalType.js +1 -1
  251. package/dist/parquetjs/parquet-thrift/DecimalType.js.map +1 -1
  252. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts +1 -1
  253. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts.map +1 -1
  254. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js +1 -1
  255. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js.map +1 -1
  256. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts +8 -0
  257. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts.map +1 -0
  258. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js +14 -0
  259. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js.map +1 -0
  260. package/dist/parquetjs/parquet-thrift/Encoding.d.ts +2 -1
  261. package/dist/parquetjs/parquet-thrift/Encoding.d.ts.map +1 -1
  262. package/dist/parquetjs/parquet-thrift/Encoding.js +1 -0
  263. package/dist/parquetjs/parquet-thrift/Encoding.js.map +1 -1
  264. package/dist/parquetjs/parquet-thrift/EnumType.d.ts +1 -1
  265. package/dist/parquetjs/parquet-thrift/EnumType.d.ts.map +1 -1
  266. package/dist/parquetjs/parquet-thrift/EnumType.js +1 -1
  267. package/dist/parquetjs/parquet-thrift/EnumType.js.map +1 -1
  268. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +2 -2
  269. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
  270. package/dist/parquetjs/parquet-thrift/FileMetaData.js +2 -2
  271. package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
  272. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts +9 -0
  273. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts.map +1 -0
  274. package/dist/parquetjs/parquet-thrift/Float16Type.js +27 -0
  275. package/dist/parquetjs/parquet-thrift/Float16Type.js.map +1 -0
  276. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts +14 -0
  277. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts.map +1 -0
  278. package/dist/parquetjs/parquet-thrift/GeographyType.js +51 -0
  279. package/dist/parquetjs/parquet-thrift/GeographyType.js.map +1 -0
  280. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts +11 -0
  281. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts.map +1 -0
  282. package/dist/parquetjs/parquet-thrift/GeometryType.js +41 -0
  283. package/dist/parquetjs/parquet-thrift/GeometryType.js.map +1 -0
  284. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts +1 -1
  285. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts.map +1 -1
  286. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js +1 -1
  287. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js.map +1 -1
  288. package/dist/parquetjs/parquet-thrift/IntType.d.ts +1 -1
  289. package/dist/parquetjs/parquet-thrift/IntType.d.ts.map +1 -1
  290. package/dist/parquetjs/parquet-thrift/IntType.js +1 -1
  291. package/dist/parquetjs/parquet-thrift/IntType.js.map +1 -1
  292. package/dist/parquetjs/parquet-thrift/JsonType.d.ts +1 -1
  293. package/dist/parquetjs/parquet-thrift/JsonType.d.ts.map +1 -1
  294. package/dist/parquetjs/parquet-thrift/JsonType.js +1 -1
  295. package/dist/parquetjs/parquet-thrift/JsonType.js.map +1 -1
  296. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts +1 -1
  297. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts.map +1 -1
  298. package/dist/parquetjs/parquet-thrift/KeyValue.js +1 -1
  299. package/dist/parquetjs/parquet-thrift/KeyValue.js.map +1 -1
  300. package/dist/parquetjs/parquet-thrift/ListType.d.ts +1 -1
  301. package/dist/parquetjs/parquet-thrift/ListType.d.ts.map +1 -1
  302. package/dist/parquetjs/parquet-thrift/ListType.js +1 -1
  303. package/dist/parquetjs/parquet-thrift/ListType.js.map +1 -1
  304. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts +17 -1
  305. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts.map +1 -1
  306. package/dist/parquetjs/parquet-thrift/LogicalType.js +97 -1
  307. package/dist/parquetjs/parquet-thrift/LogicalType.js.map +1 -1
  308. package/dist/parquetjs/parquet-thrift/MapType.d.ts +1 -1
  309. package/dist/parquetjs/parquet-thrift/MapType.d.ts.map +1 -1
  310. package/dist/parquetjs/parquet-thrift/MapType.js +1 -1
  311. package/dist/parquetjs/parquet-thrift/MapType.js.map +1 -1
  312. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts +1 -1
  313. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts.map +1 -1
  314. package/dist/parquetjs/parquet-thrift/MicroSeconds.js +1 -1
  315. package/dist/parquetjs/parquet-thrift/MicroSeconds.js.map +1 -1
  316. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts +1 -1
  317. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts.map +1 -1
  318. package/dist/parquetjs/parquet-thrift/MilliSeconds.js +1 -1
  319. package/dist/parquetjs/parquet-thrift/MilliSeconds.js.map +1 -1
  320. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts +9 -0
  321. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts.map +1 -0
  322. package/dist/parquetjs/parquet-thrift/NanoSeconds.js +27 -0
  323. package/dist/parquetjs/parquet-thrift/NanoSeconds.js.map +1 -0
  324. package/dist/parquetjs/parquet-thrift/NullType.d.ts +1 -1
  325. package/dist/parquetjs/parquet-thrift/NullType.d.ts.map +1 -1
  326. package/dist/parquetjs/parquet-thrift/NullType.js +1 -1
  327. package/dist/parquetjs/parquet-thrift/NullType.js.map +1 -1
  328. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts +1 -1
  329. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts.map +1 -1
  330. package/dist/parquetjs/parquet-thrift/OffsetIndex.js +1 -1
  331. package/dist/parquetjs/parquet-thrift/OffsetIndex.js.map +1 -1
  332. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts +1 -1
  333. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts.map +1 -1
  334. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js +1 -1
  335. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js.map +1 -1
  336. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts +1 -1
  337. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts.map +1 -1
  338. package/dist/parquetjs/parquet-thrift/PageHeader.js +1 -1
  339. package/dist/parquetjs/parquet-thrift/PageHeader.js.map +1 -1
  340. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts +2 -2
  341. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts.map +1 -1
  342. package/dist/parquetjs/parquet-thrift/PageLocation.js +2 -2
  343. package/dist/parquetjs/parquet-thrift/PageLocation.js.map +1 -1
  344. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts +2 -2
  345. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts.map +1 -1
  346. package/dist/parquetjs/parquet-thrift/RowGroup.js +2 -2
  347. package/dist/parquetjs/parquet-thrift/RowGroup.js.map +1 -1
  348. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts +1 -1
  349. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts.map +1 -1
  350. package/dist/parquetjs/parquet-thrift/SchemaElement.js +1 -1
  351. package/dist/parquetjs/parquet-thrift/SchemaElement.js.map +1 -1
  352. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts +1 -1
  353. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts.map +1 -1
  354. package/dist/parquetjs/parquet-thrift/SortingColumn.js +1 -1
  355. package/dist/parquetjs/parquet-thrift/SortingColumn.js.map +1 -1
  356. package/dist/parquetjs/parquet-thrift/Statistics.d.ts +14 -10
  357. package/dist/parquetjs/parquet-thrift/Statistics.d.ts.map +1 -1
  358. package/dist/parquetjs/parquet-thrift/Statistics.js +38 -2
  359. package/dist/parquetjs/parquet-thrift/Statistics.js.map +1 -1
  360. package/dist/parquetjs/parquet-thrift/StringType.d.ts +1 -1
  361. package/dist/parquetjs/parquet-thrift/StringType.d.ts.map +1 -1
  362. package/dist/parquetjs/parquet-thrift/StringType.js +1 -1
  363. package/dist/parquetjs/parquet-thrift/StringType.js.map +1 -1
  364. package/dist/parquetjs/parquet-thrift/TimeType.d.ts +1 -1
  365. package/dist/parquetjs/parquet-thrift/TimeType.d.ts.map +1 -1
  366. package/dist/parquetjs/parquet-thrift/TimeType.js +1 -1
  367. package/dist/parquetjs/parquet-thrift/TimeType.js.map +1 -1
  368. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts +5 -1
  369. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts.map +1 -1
  370. package/dist/parquetjs/parquet-thrift/TimeUnit.js +25 -1
  371. package/dist/parquetjs/parquet-thrift/TimeUnit.js.map +1 -1
  372. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts +1 -1
  373. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts.map +1 -1
  374. package/dist/parquetjs/parquet-thrift/TimestampType.js +1 -1
  375. package/dist/parquetjs/parquet-thrift/TimestampType.js.map +1 -1
  376. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts +1 -1
  377. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts.map +1 -1
  378. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js +1 -1
  379. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js.map +1 -1
  380. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts +1 -1
  381. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts.map +1 -1
  382. package/dist/parquetjs/parquet-thrift/UUIDType.js +1 -1
  383. package/dist/parquetjs/parquet-thrift/UUIDType.js.map +1 -1
  384. package/dist/parquetjs/parquet-thrift/VariantType.d.ts +11 -0
  385. package/dist/parquetjs/parquet-thrift/VariantType.d.ts.map +1 -0
  386. package/dist/parquetjs/parquet-thrift/VariantType.js +41 -0
  387. package/dist/parquetjs/parquet-thrift/VariantType.js.map +1 -0
  388. package/dist/parquetjs/parquet-thrift/index.d.ts +6 -1
  389. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  390. package/dist/parquetjs/parquet-thrift/index.js +6 -1
  391. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  392. package/dist/parquetjs/parser/decoders.d.ts +13 -2
  393. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  394. package/dist/parquetjs/parser/decoders.js +379 -97
  395. package/dist/parquetjs/parser/decoders.js.map +1 -1
  396. package/dist/parquetjs/parser/parquet-reader.d.ts +35 -10
  397. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  398. package/dist/parquetjs/parser/parquet-reader.js +171 -51
  399. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  400. package/dist/parquetjs/schema/declare.d.ts +61 -7
  401. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  402. package/dist/parquetjs/schema/declare.js.map +1 -1
  403. package/dist/parquetjs/schema/schema.d.ts +3 -0
  404. package/dist/parquetjs/schema/schema.d.ts.map +1 -1
  405. package/dist/parquetjs/schema/schema.js +21 -3
  406. package/dist/parquetjs/schema/schema.js.map +1 -1
  407. package/dist/parquetjs/schema/shred.d.ts +2 -0
  408. package/dist/parquetjs/schema/shred.d.ts.map +1 -1
  409. package/dist/parquetjs/schema/shred.js +71 -23
  410. package/dist/parquetjs/schema/shred.js.map +1 -1
  411. package/dist/parquetjs/schema/types.d.ts.map +1 -1
  412. package/dist/parquetjs/schema/types.js +245 -25
  413. package/dist/parquetjs/schema/types.js.map +1 -1
  414. package/dist/parquetjs/utils/binary-utils.d.ts +4 -2
  415. package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -1
  416. package/dist/parquetjs/utils/binary-utils.js +6 -2
  417. package/dist/parquetjs/utils/binary-utils.js.map +1 -1
  418. package/dist/parquetjs/utils/read-utils.d.ts +10 -2
  419. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  420. package/dist/parquetjs/utils/read-utils.js +34 -22
  421. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  422. package/dist/parquetjs/utils/thrift-runtime.d.ts +106 -0
  423. package/dist/parquetjs/utils/thrift-runtime.d.ts.map +1 -0
  424. package/dist/parquetjs/utils/thrift-runtime.js +50 -0
  425. package/dist/parquetjs/utils/thrift-runtime.js.map +1 -0
  426. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +1 -1
  427. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -1
  428. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +1 -1
  429. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -1
  430. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +4 -2
  431. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -1
  432. package/dist/parquetjs/utils/uint8-array-compact-protocol.js +2 -2
  433. package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -1
  434. package/dist/polyfills/process.d.ts +12 -0
  435. package/dist/polyfills/process.d.ts.map +1 -0
  436. package/dist/polyfills/process.js +17 -0
  437. package/dist/polyfills/process.js.map +1 -0
  438. package/dist/unbundled.d.ts +6 -3
  439. package/dist/unbundled.d.ts.map +1 -1
  440. package/dist/unbundled.js +5 -2
  441. package/dist/unbundled.js.map +1 -1
  442. package/dist/wasm.d.ts +3 -0
  443. package/dist/wasm.d.ts.map +1 -0
  444. package/dist/wasm.js +6 -0
  445. package/dist/wasm.js.map +1 -0
  446. package/dist/workers/parquet-source-worker.d.ts +2 -0
  447. package/dist/workers/parquet-source-worker.d.ts.map +1 -0
  448. package/dist/workers/parquet-source-worker.js +17 -0
  449. package/dist/workers/parquet-source-worker.js.map +1 -0
  450. package/dist/workers/parquet-worker-node.d.ts +2 -0
  451. package/dist/workers/parquet-worker-node.d.ts.map +1 -0
  452. package/dist/workers/parquet-worker-node.js +5 -0
  453. package/dist/workers/parquet-worker-node.js.map +1 -0
  454. package/dist/workers/parquet-worker.d.ts +2 -0
  455. package/dist/workers/parquet-worker.d.ts.map +1 -0
  456. package/dist/workers/parquet-worker.js +27 -0
  457. package/dist/workers/parquet-worker.js.map +1 -0
  458. package/package.json +57 -23
  459. package/src/bundled.ts +27 -3
  460. package/src/geoparquet-loader-with-parser.ts +1 -1
  461. package/src/index.ts +47 -3
  462. package/src/lib/arrow/convert-columns-to-row-group.ts +3 -0
  463. package/src/lib/arrow/convert-schema-from-parquet.ts +97 -30
  464. package/src/lib/arrow/convert-schema-to-parquet.ts +16 -7
  465. package/src/lib/arrow/create-nested-arrow-vector.ts +589 -0
  466. package/src/lib/constants.ts +0 -2
  467. package/src/lib/encoders/encode-arrow-to-parquet.ts +1 -1
  468. package/src/lib/encoders/encode-table-to-parquet-js.ts +71 -9
  469. package/src/lib/geo/geospatial-metadata.ts +15 -65
  470. package/src/lib/parquet-page-index.ts +581 -0
  471. package/src/lib/parquet-predicate.ts +374 -0
  472. package/src/lib/parquet-source-worker-client.ts +39 -0
  473. package/src/lib/parquet-source-worker-decoder.ts +156 -0
  474. package/src/lib/parquet-source-worker-file.ts +56 -0
  475. package/src/lib/parquet-source-worker-types.ts +107 -0
  476. package/src/lib/parquet-worker-transport.ts +57 -0
  477. package/src/lib/parsers/convert-parquet-tables.ts +39 -0
  478. package/src/lib/parsers/parse-parquet-tables.ts +10 -65
  479. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +811 -18
  480. package/src/lib/parsers/parse-parquet-to-json.ts +4 -4
  481. package/src/lib/sources/parquet-range-file.ts +359 -0
  482. package/src/lib/sources/single-batch-queue.ts +95 -0
  483. package/src/lib/utils/load-wasm-node.ts +25 -0
  484. package/src/lib/utils/load-wasm.ts +25 -9
  485. package/src/lib/utils/make-stream-iterator.ts +127 -15
  486. package/src/parquet-dataset-source.ts +488 -0
  487. package/src/parquet-js-loader-types.ts +52 -0
  488. package/src/parquet-js-loader.ts +68 -28
  489. package/src/parquet-js-writer.ts +16 -0
  490. package/src/parquet-loader-base.ts +34 -0
  491. package/src/parquet-loader-options.ts +8 -20
  492. package/src/parquet-loader-types.ts +35 -0
  493. package/src/parquet-loader.ts +91 -55
  494. package/src/parquet-source-capabilities.ts +56 -0
  495. package/src/parquet-source-loader-types.ts +87 -0
  496. package/src/parquet-source-loader.ts +1265 -0
  497. package/src/parquet-source-types.ts +458 -0
  498. package/src/parquet-source-worker-url.ts +23 -0
  499. package/src/parquet-worker-url.ts +18 -0
  500. package/src/parquet-writer.ts +2 -4
  501. package/src/parquetjs/LICENSE +23 -1
  502. package/src/parquetjs/codecs/byte-stream-split.ts +221 -0
  503. package/src/parquetjs/codecs/declare.ts +33 -1
  504. package/src/parquetjs/codecs/delta.ts +587 -0
  505. package/src/parquetjs/codecs/dictionary.ts +22 -4
  506. package/src/parquetjs/codecs/index.ts +18 -0
  507. package/src/parquetjs/codecs/plain.ts +103 -55
  508. package/src/parquetjs/codecs/rle.ts +252 -60
  509. package/src/parquetjs/compression.ts +114 -52
  510. package/src/parquetjs/encoder/dictionary-planner.ts +99 -0
  511. package/src/parquetjs/encoder/page-planner.ts +83 -0
  512. package/src/parquetjs/encoder/parquet-encoder.ts +334 -39
  513. package/src/parquetjs/parquet-thrift/BsonType.ts +1 -1
  514. package/src/parquetjs/parquet-thrift/ColumnChunk.ts +2 -2
  515. package/src/parquetjs/parquet-thrift/ColumnIndex.ts +12 -12
  516. package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +2 -2
  517. package/src/parquetjs/parquet-thrift/ColumnOrder.ts +1 -1
  518. package/src/parquetjs/parquet-thrift/DataPageHeader.ts +1 -1
  519. package/src/parquetjs/parquet-thrift/DataPageHeaderV2.ts +1 -1
  520. package/src/parquetjs/parquet-thrift/DateType.ts +1 -1
  521. package/src/parquetjs/parquet-thrift/DecimalType.ts +1 -1
  522. package/src/parquetjs/parquet-thrift/DictionaryPageHeader.ts +1 -1
  523. package/src/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.ts +13 -0
  524. package/src/parquetjs/parquet-thrift/Encoding.ts +2 -1
  525. package/src/parquetjs/parquet-thrift/EnumType.ts +1 -1
  526. package/src/parquetjs/parquet-thrift/FileMetaData.ts +2 -2
  527. package/src/parquetjs/parquet-thrift/Float16Type.ts +28 -0
  528. package/src/parquetjs/parquet-thrift/GeographyType.ts +54 -0
  529. package/src/parquetjs/parquet-thrift/GeometryType.ts +43 -0
  530. package/src/parquetjs/parquet-thrift/IndexPageHeader.ts +1 -1
  531. package/src/parquetjs/parquet-thrift/IntType.ts +1 -1
  532. package/src/parquetjs/parquet-thrift/JsonType.ts +1 -1
  533. package/src/parquetjs/parquet-thrift/KeyValue.ts +1 -1
  534. package/src/parquetjs/parquet-thrift/ListType.ts +1 -1
  535. package/src/parquetjs/parquet-thrift/LogicalType.ts +97 -1
  536. package/src/parquetjs/parquet-thrift/MapType.ts +1 -1
  537. package/src/parquetjs/parquet-thrift/MicroSeconds.ts +1 -1
  538. package/src/parquetjs/parquet-thrift/MilliSeconds.ts +1 -1
  539. package/src/parquetjs/parquet-thrift/NanoSeconds.ts +28 -0
  540. package/src/parquetjs/parquet-thrift/NullType.ts +1 -1
  541. package/src/parquetjs/parquet-thrift/OffsetIndex.ts +1 -1
  542. package/src/parquetjs/parquet-thrift/PageEncodingStats.ts +1 -1
  543. package/src/parquetjs/parquet-thrift/PageHeader.ts +1 -1
  544. package/src/parquetjs/parquet-thrift/PageLocation.ts +2 -2
  545. package/src/parquetjs/parquet-thrift/RowGroup.ts +2 -2
  546. package/src/parquetjs/parquet-thrift/SchemaElement.ts +1 -1
  547. package/src/parquetjs/parquet-thrift/SortingColumn.ts +1 -1
  548. package/src/parquetjs/parquet-thrift/Statistics.ts +50 -14
  549. package/src/parquetjs/parquet-thrift/StringType.ts +1 -1
  550. package/src/parquetjs/parquet-thrift/TimeType.ts +1 -1
  551. package/src/parquetjs/parquet-thrift/TimeUnit.ts +25 -1
  552. package/src/parquetjs/parquet-thrift/TimestampType.ts +1 -1
  553. package/src/parquetjs/parquet-thrift/TypeDefinedOrder.ts +1 -1
  554. package/src/parquetjs/parquet-thrift/UUIDType.ts +1 -1
  555. package/src/parquetjs/parquet-thrift/VariantType.ts +43 -0
  556. package/src/parquetjs/parquet-thrift/index.ts +6 -2
  557. package/src/parquetjs/parser/decoders.ts +485 -113
  558. package/src/parquetjs/parser/parquet-reader.ts +288 -60
  559. package/src/parquetjs/schema/declare.ts +98 -6
  560. package/src/parquetjs/schema/schema.ts +23 -3
  561. package/src/parquetjs/schema/shred.ts +112 -35
  562. package/src/parquetjs/schema/types.ts +256 -31
  563. package/src/parquetjs/utils/binary-utils.ts +8 -3
  564. package/src/parquetjs/utils/read-utils.ts +37 -21
  565. package/src/parquetjs/utils/thrift-runtime.ts +109 -0
  566. package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +1 -1
  567. package/src/parquetjs/utils/uint8-array-compact-protocol.ts +3 -3
  568. package/src/polyfills/process.ts +17 -0
  569. package/src/unbundled.ts +27 -3
  570. package/src/wasm.ts +6 -0
  571. package/src/workers/parquet-source-worker.ts +21 -0
  572. package/src/workers/parquet-worker-node.ts +5 -0
  573. package/src/workers/parquet-worker.ts +31 -0
  574. package/dist/parquet-loader-with-parser.d.ts +0 -33
  575. package/dist/parquet-loader-with-parser.d.ts.map +0 -1
  576. package/dist/parquet-loader-with-parser.js +0 -40
  577. package/dist/parquet-loader-with-parser.js.map +0 -1
  578. package/dist/parquet-wasm-loader-with-parser.d.ts +0 -40
  579. package/dist/parquet-wasm-loader-with-parser.d.ts.map +0 -1
  580. package/dist/parquet-wasm-loader-with-parser.js +0 -68
  581. package/dist/parquet-wasm-loader-with-parser.js.map +0 -1
  582. package/src/parquet-loader-with-parser.ts +0 -68
  583. package/src/parquet-wasm-loader-with-parser.ts +0 -115
@@ -0,0 +1,581 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {ReadableFile} from '@loaders.gl/loader-utils';
6
+
7
+ import type {
8
+ ParquetComparisonPredicate,
9
+ ParquetInPredicate,
10
+ ParquetNullPredicate,
11
+ ParquetPredicate
12
+ } from '../parquet-source-types';
13
+ import {
14
+ ColumnIndex,
15
+ Encoding,
16
+ OffsetIndex,
17
+ type ColumnChunk,
18
+ type RowGroup
19
+ } from '../parquetjs/parquet-thrift/index';
20
+ import type {ParquetField} from '../parquetjs/schema/declare';
21
+ import type {ParquetSchema} from '../parquetjs/schema/schema';
22
+ import * as Types from '../parquetjs/schema/types';
23
+ import {
24
+ copyUint8Array,
25
+ readDoubleLE,
26
+ readFloatLE,
27
+ readInt32LE,
28
+ readInt64LE,
29
+ readUInt32LE,
30
+ readUInt64LE,
31
+ toUint8Array
32
+ } from '../parquetjs/utils/binary-utils';
33
+ import {Uint8ArrayCompactProtocol} from '../parquetjs/utils/uint8-array-compact-protocol';
34
+ import {Uint8ArrayTransport} from '../parquetjs/utils/uint8-array-transport';
35
+ import {canParquetStatisticsMatch, getParquetPredicateColumns} from './parquet-predicate';
36
+
37
+ /** Half-open logical row range relative to one Parquet row group. */
38
+ export type ParquetRowRange = {
39
+ /** First included row. */
40
+ start: number;
41
+ /** First excluded row. */
42
+ end: number;
43
+ };
44
+
45
+ /** One data-page location decoded from a Parquet offset index. */
46
+ export type ParquetDataPageLocation = {
47
+ /** Absolute page-header offset in the source object. */
48
+ offset: number;
49
+ /** Page header plus compressed body byte length. */
50
+ compressedByteLength: number;
51
+ /** First logical row represented by the page. */
52
+ firstRowIndex: number;
53
+ /** First logical row represented by the next page. */
54
+ endRowIndex: number;
55
+ };
56
+
57
+ /** Page locations keyed by the physical Parquet column path. */
58
+ export type ParquetPageLocations = Record<string, ParquetDataPageLocation[]>;
59
+
60
+ /** Selective page plan for one row group. */
61
+ export type ParquetPagePruningPlan = {
62
+ /** Candidate row ranges after conservative page-statistics pruning. */
63
+ rowRanges: ParquetRowRange[];
64
+ /** Offset-index page locations for every decoded column. */
65
+ pageLocations: ParquetPageLocations;
66
+ /** Number of column and offset index blobs decoded. */
67
+ indexCount: number;
68
+ /** Data pages in all decoded column chunks. */
69
+ totalPageCount: number;
70
+ /** Data pages required by the candidate ranges. */
71
+ selectedPageCount: number;
72
+ /** Logical rows eliminated before data-page reads. */
73
+ prunedRowCount: number;
74
+ };
75
+
76
+ type ParquetPageStatistics = {
77
+ min?: unknown;
78
+ max?: unknown;
79
+ nullCount?: number;
80
+ minIsExact?: boolean;
81
+ maxIsExact?: boolean;
82
+ };
83
+
84
+ type ParquetColumnPageStatistics = {
85
+ pages: ParquetDataPageLocation[];
86
+ statistics: ParquetPageStatistics[];
87
+ };
88
+
89
+ /**
90
+ * Builds a conservative selective-page plan from Parquet column and offset indexes.
91
+ *
92
+ * Returns `undefined` when indexes or the current flat-column decoder cannot safely avoid full
93
+ * column-chunk reads. An empty `rowRanges` array means the indexes prove the predicate cannot match.
94
+ */
95
+ export async function createParquetPagePruningPlan(
96
+ file: ReadableFile,
97
+ rowGroup: RowGroup,
98
+ schema: ParquetSchema,
99
+ selectedColumnPaths: readonly string[][],
100
+ predicate: ParquetPredicate,
101
+ signal?: AbortSignal
102
+ ): Promise<ParquetPagePruningPlan | undefined> {
103
+ const rowCount = Number(rowGroup.num_rows);
104
+ const selectedColumnChunks = getSelectedColumnChunks(rowGroup, selectedColumnPaths);
105
+ if (!isSafeFlatPageSelection(schema, selectedColumnChunks) || rowCount <= 0) {
106
+ return undefined;
107
+ }
108
+
109
+ const pageLocations: ParquetPageLocations = {};
110
+ const pageStatistics: Record<string, ParquetColumnPageStatistics> = {};
111
+ const predicateColumns = new Set(getParquetPredicateColumns(predicate));
112
+ let indexCount = 0;
113
+
114
+ await Promise.all(
115
+ selectedColumnChunks.map(async columnChunk => {
116
+ const path = columnChunk.meta_data!.path_in_schema;
117
+ const pathKey = path.join('.');
118
+ const offsetIndexRange = getParquetIndexRange(
119
+ columnChunk.offset_index_offset,
120
+ columnChunk.offset_index_length,
121
+ file.size
122
+ );
123
+ if (!offsetIndexRange) {
124
+ return;
125
+ }
126
+ const offsetIndexBytes = await file.read(
127
+ offsetIndexRange.offset,
128
+ offsetIndexRange.length,
129
+ signal
130
+ );
131
+ let pages: ParquetDataPageLocation[];
132
+ try {
133
+ pages = decodeOffsetIndex(toUint8Array(offsetIndexBytes), rowCount);
134
+ } catch {
135
+ return;
136
+ }
137
+ pageLocations[pathKey] = pages;
138
+ indexCount++;
139
+
140
+ if (path.length !== 1 || !predicateColumns.has(path[0])) {
141
+ return;
142
+ }
143
+ const columnIndexRange = getParquetIndexRange(
144
+ columnChunk.column_index_offset,
145
+ columnChunk.column_index_length,
146
+ file.size
147
+ );
148
+ if (!columnIndexRange) {
149
+ return;
150
+ }
151
+ const columnIndexBytes = await file.read(
152
+ columnIndexRange.offset,
153
+ columnIndexRange.length,
154
+ signal
155
+ );
156
+ const field = schema.findField(path);
157
+ try {
158
+ pageStatistics[path[0]] = {
159
+ pages,
160
+ statistics: decodeColumnIndex(toUint8Array(columnIndexBytes), pages, field)
161
+ };
162
+ } catch {
163
+ return;
164
+ }
165
+ indexCount++;
166
+ })
167
+ );
168
+
169
+ if (
170
+ selectedColumnChunks.some(
171
+ columnChunk => !pageLocations[columnChunk.meta_data!.path_in_schema.join('.')]
172
+ )
173
+ ) {
174
+ return undefined;
175
+ }
176
+
177
+ const candidateRanges = getPredicateRowRanges(predicate, pageStatistics, rowCount);
178
+ if (candidateRanges === undefined) {
179
+ return undefined;
180
+ }
181
+ const rowRanges = expandAndMergeRowRanges(candidateRanges, pageLocations, rowCount);
182
+ const prunedRowCount = rowCount - getRowRangeCount(rowRanges);
183
+ if (prunedRowCount <= 0) {
184
+ return undefined;
185
+ }
186
+
187
+ const totalPageCount = Object.values(pageLocations).reduce(
188
+ (count, pages) => count + pages.length,
189
+ 0
190
+ );
191
+ const selectedPageCount = Object.values(pageLocations).reduce(
192
+ (count, pages) => count + countSelectedPages(pages, rowRanges),
193
+ 0
194
+ );
195
+ return {
196
+ rowRanges,
197
+ pageLocations,
198
+ indexCount,
199
+ totalPageCount,
200
+ selectedPageCount,
201
+ prunedRowCount
202
+ };
203
+ }
204
+
205
+ /** Returns data-page byte ranges needed to decode a selective row-group plan. */
206
+ export function getParquetPageReadRanges(
207
+ rowGroup: RowGroup,
208
+ selectedColumnPaths: readonly string[][],
209
+ plan: ParquetPagePruningPlan
210
+ ): Array<{offset: number; length: number}> {
211
+ const ranges: Array<{offset: number; length: number}> = [];
212
+ for (const columnChunk of getSelectedColumnChunks(rowGroup, selectedColumnPaths)) {
213
+ const columnMetadata = columnChunk.meta_data!;
214
+ const pages = plan.pageLocations[columnMetadata.path_in_schema.join('.')];
215
+ const selectedPages = pages.filter(page =>
216
+ plan.rowRanges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end)
217
+ );
218
+ if (!selectedPages.length) {
219
+ continue;
220
+ }
221
+ const dictionaryPageOffset = Number(columnMetadata.dictionary_page_offset);
222
+ if (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0) {
223
+ ranges.push({
224
+ offset: dictionaryPageOffset,
225
+ length: Math.max(0, pages[0].offset - dictionaryPageOffset)
226
+ });
227
+ }
228
+ for (const rowRange of plan.rowRanges) {
229
+ const overlappingPages = pages.filter(
230
+ page => page.endRowIndex > rowRange.start && page.firstRowIndex < rowRange.end
231
+ );
232
+ if (!overlappingPages.length) {
233
+ continue;
234
+ }
235
+ const firstPage = overlappingPages[0];
236
+ const lastPage = overlappingPages[overlappingPages.length - 1];
237
+ ranges.push({
238
+ offset: firstPage.offset,
239
+ length: lastPage.offset + lastPage.compressedByteLength - firstPage.offset
240
+ });
241
+ }
242
+ }
243
+ return mergeByteRanges(ranges.filter(range => range.length > 0));
244
+ }
245
+
246
+ /** Decodes one compact-protocol Parquet offset index. */
247
+ export function decodeOffsetIndex(bytes: Uint8Array, rowCount: number): ParquetDataPageLocation[] {
248
+ const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
249
+ const offsetIndex = OffsetIndex.read(protocol as any);
250
+ if (
251
+ offsetIndex.page_locations.length === 0 ||
252
+ Number(offsetIndex.page_locations[0].first_row_index) !== 0
253
+ ) {
254
+ throw new Error('Invalid Parquet offset index page locations');
255
+ }
256
+ return offsetIndex.page_locations.map((location, index, locations) => {
257
+ const firstRowIndex = Number(location.first_row_index);
258
+ const endRowIndex =
259
+ index + 1 < locations.length ? Number(locations[index + 1].first_row_index) : rowCount;
260
+ const offset = Number(location.offset);
261
+ const compressedByteLength = location.compressed_page_size;
262
+ if (
263
+ !Number.isSafeInteger(offset) ||
264
+ !Number.isSafeInteger(compressedByteLength) ||
265
+ !Number.isSafeInteger(firstRowIndex) ||
266
+ !Number.isSafeInteger(endRowIndex) ||
267
+ offset < 0 ||
268
+ compressedByteLength <= 0 ||
269
+ firstRowIndex < 0 ||
270
+ endRowIndex <= firstRowIndex ||
271
+ endRowIndex > rowCount
272
+ ) {
273
+ throw new Error('Invalid Parquet offset index page location');
274
+ }
275
+ return {offset, compressedByteLength, firstRowIndex, endRowIndex};
276
+ });
277
+ }
278
+
279
+ /** Returns whether one predicate leaf can match supplied page statistics. */
280
+ function getPredicateRowRanges(
281
+ predicate: ParquetPredicate,
282
+ columns: Record<string, ParquetColumnPageStatistics>,
283
+ rowCount: number
284
+ ): ParquetRowRange[] | undefined {
285
+ if (predicate.op === 'and' || predicate.op === 'or') {
286
+ if (predicate.op === 'and') {
287
+ let ranges: ParquetRowRange[] | undefined;
288
+ for (const child of predicate.args) {
289
+ ranges = intersectRowRanges(ranges, getPredicateRowRanges(child, columns, rowCount));
290
+ }
291
+ return ranges;
292
+ }
293
+ let ranges: ParquetRowRange[] = [];
294
+ for (const child of predicate.args) {
295
+ const childRanges = getPredicateRowRanges(child, columns, rowCount);
296
+ if (childRanges === undefined) {
297
+ return undefined;
298
+ }
299
+ ranges = unionRowRanges(ranges, childRanges);
300
+ }
301
+ return ranges;
302
+ }
303
+ if (predicate.op === 'not') {
304
+ return undefined;
305
+ }
306
+
307
+ const leafPredicate = predicate as
308
+ | ParquetComparisonPredicate
309
+ | ParquetInPredicate
310
+ | ParquetNullPredicate;
311
+ const column = columns[leafPredicate.args[0].property];
312
+ if (!column) {
313
+ return undefined;
314
+ }
315
+ const ranges: ParquetRowRange[] = [];
316
+ for (let pageIndex = 0; pageIndex < column.pages.length; pageIndex++) {
317
+ const page = column.pages[pageIndex];
318
+ if (
319
+ canParquetStatisticsMatch(
320
+ leafPredicate,
321
+ column.statistics[pageIndex],
322
+ page.endRowIndex - page.firstRowIndex
323
+ )
324
+ ) {
325
+ ranges.push({start: page.firstRowIndex, end: page.endRowIndex});
326
+ }
327
+ }
328
+ return mergeRowRanges(ranges);
329
+ }
330
+
331
+ /** Decodes column-index values into the logical representation used by exact predicates. */
332
+ function decodeColumnIndex(
333
+ bytes: Uint8Array,
334
+ pages: readonly ParquetDataPageLocation[],
335
+ field: ParquetField
336
+ ): ParquetPageStatistics[] {
337
+ const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
338
+ const columnIndex = ColumnIndex.read(protocol as any);
339
+ if (
340
+ columnIndex.null_pages.length !== pages.length ||
341
+ columnIndex.min_values.length !== pages.length ||
342
+ columnIndex.max_values.length !== pages.length ||
343
+ (columnIndex.null_counts !== undefined && columnIndex.null_counts.length !== pages.length)
344
+ ) {
345
+ throw new Error('Parquet column and offset indexes contain different page counts');
346
+ }
347
+ return pages.map((_page, pageIndex) => ({
348
+ min: columnIndex.null_pages[pageIndex]
349
+ ? undefined
350
+ : decodeParquetPageStatisticsValue(columnIndex.min_values[pageIndex], field),
351
+ max: columnIndex.null_pages[pageIndex]
352
+ ? undefined
353
+ : decodeParquetPageStatisticsValue(columnIndex.max_values[pageIndex], field),
354
+ nullCount:
355
+ columnIndex.null_counts?.[pageIndex] !== undefined
356
+ ? Number(columnIndex.null_counts[pageIndex])
357
+ : columnIndex.null_pages[pageIndex]
358
+ ? pages[pageIndex].endRowIndex - pages[pageIndex].firstRowIndex
359
+ : undefined,
360
+ minIsExact: true,
361
+ maxIsExact: true
362
+ }));
363
+ }
364
+
365
+ /** Decodes one physical page-index statistic and applies its Parquet logical annotation. */
366
+ export function decodeParquetPageStatisticsValue(bytes: Uint8Array, field: ParquetField): unknown {
367
+ let primitiveValue: unknown;
368
+ switch (field.primitiveType) {
369
+ case 'BOOLEAN':
370
+ primitiveValue = Boolean(bytes[0]);
371
+ break;
372
+ case 'INT32':
373
+ primitiveValue =
374
+ field.originalType === 'UINT_32' ? readUInt32LE(bytes, 0) : readInt32LE(bytes, 0);
375
+ break;
376
+ case 'INT64':
377
+ primitiveValue =
378
+ field.originalType === 'UINT_64' ? readUInt64LE(bytes, 0) : readInt64LE(bytes, 0);
379
+ break;
380
+ case 'FLOAT':
381
+ primitiveValue = readFloatLE(bytes, 0);
382
+ break;
383
+ case 'DOUBLE':
384
+ primitiveValue = readDoubleLE(bytes, 0);
385
+ break;
386
+ case 'INT96':
387
+ case 'BYTE_ARRAY':
388
+ case 'FIXED_LEN_BYTE_ARRAY':
389
+ primitiveValue = copyUint8Array(bytes);
390
+ break;
391
+ default:
392
+ return undefined;
393
+ }
394
+ return Types.fromPrimitive(field.originalType || field.primitiveType, primitiveValue, field);
395
+ }
396
+
397
+ /** Returns selected physical chunks, using an empty path list as the all-column sentinel. */
398
+ function getSelectedColumnChunks(
399
+ rowGroup: RowGroup,
400
+ selectedColumnPaths: readonly string[][]
401
+ ): ColumnChunk[] {
402
+ return rowGroup.columns.filter(columnChunk => {
403
+ const path = columnChunk.meta_data?.path_in_schema;
404
+ return Boolean(
405
+ path &&
406
+ (selectedColumnPaths.length === 0 ||
407
+ selectedColumnPaths.some(selectedPath => selectedPath[0] === path[0]))
408
+ );
409
+ });
410
+ }
411
+
412
+ /** Restricts selective page reads to independently materializable flat primitive columns. */
413
+ function isSafeFlatPageSelection(
414
+ schema: ParquetSchema,
415
+ columnChunks: readonly ColumnChunk[]
416
+ ): boolean {
417
+ return (
418
+ columnChunks.length > 0 &&
419
+ columnChunks.every(columnChunk => {
420
+ const path = columnChunk.meta_data?.path_in_schema;
421
+ if (!path || path.length !== 1) {
422
+ return false;
423
+ }
424
+ const field = schema.findField(path);
425
+ const dictionaryEncoded = columnChunk.meta_data!.encodings.some(
426
+ encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY
427
+ );
428
+ const dictionaryPageOffset = Number(columnChunk.meta_data!.dictionary_page_offset);
429
+ return (
430
+ field.path.length === 1 &&
431
+ field.repetitionType !== 'REPEATED' &&
432
+ field.rLevelMax === 0 &&
433
+ (!dictionaryEncoded ||
434
+ (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0))
435
+ );
436
+ })
437
+ );
438
+ }
439
+
440
+ /** Validates one optional footer index byte range against the containing file. */
441
+ export function getParquetIndexRange(
442
+ offsetValue: ColumnChunk['offset_index_offset'],
443
+ lengthValue: number | undefined,
444
+ fileSize: number
445
+ ): {offset: number; length: number} | undefined {
446
+ if (offsetValue === undefined || lengthValue === undefined) {
447
+ return undefined;
448
+ }
449
+ const offset = Number(offsetValue);
450
+ if (
451
+ !Number.isSafeInteger(offset) ||
452
+ !Number.isSafeInteger(lengthValue) ||
453
+ !Number.isSafeInteger(fileSize) ||
454
+ offset < 0 ||
455
+ lengthValue <= 0 ||
456
+ fileSize < 0 ||
457
+ offset > fileSize - lengthValue
458
+ ) {
459
+ return undefined;
460
+ }
461
+ return {offset, length: lengthValue};
462
+ }
463
+
464
+ /** Expands ranges to selected-column page boundaries until all columns agree, then merges them. */
465
+ function expandAndMergeRowRanges(
466
+ ranges: readonly ParquetRowRange[],
467
+ pageLocations: ParquetPageLocations,
468
+ rowCount: number
469
+ ): ParquetRowRange[] {
470
+ const pagesByColumn = Object.values(pageLocations);
471
+ const expanded = ranges.map(range => {
472
+ let current = {...range};
473
+ let changed = true;
474
+ while (changed) {
475
+ changed = false;
476
+ for (const pages of pagesByColumn) {
477
+ const overlapping = pages.filter(
478
+ page => page.endRowIndex > current.start && page.firstRowIndex < current.end
479
+ );
480
+ if (!overlapping.length) {
481
+ continue;
482
+ }
483
+ const start = Math.min(current.start, overlapping[0].firstRowIndex);
484
+ const end = Math.max(current.end, overlapping[overlapping.length - 1].endRowIndex);
485
+ if (start !== current.start || end !== current.end) {
486
+ current = {start, end};
487
+ changed = true;
488
+ }
489
+ }
490
+ }
491
+ return {start: Math.max(0, current.start), end: Math.min(rowCount, current.end)};
492
+ });
493
+ return mergeRowRanges(expanded);
494
+ }
495
+
496
+ /** Intersects sorted row ranges; `undefined` represents every row. */
497
+ function intersectRowRanges(
498
+ left: ParquetRowRange[] | undefined,
499
+ right: ParquetRowRange[] | undefined
500
+ ): ParquetRowRange[] | undefined {
501
+ if (left === undefined) {
502
+ return right;
503
+ }
504
+ if (right === undefined) {
505
+ return left;
506
+ }
507
+ const ranges: ParquetRowRange[] = [];
508
+ let leftIndex = 0;
509
+ let rightIndex = 0;
510
+ while (leftIndex < left.length && rightIndex < right.length) {
511
+ const start = Math.max(left[leftIndex].start, right[rightIndex].start);
512
+ const end = Math.min(left[leftIndex].end, right[rightIndex].end);
513
+ if (start < end) {
514
+ ranges.push({start, end});
515
+ }
516
+ if (left[leftIndex].end < right[rightIndex].end) {
517
+ leftIndex++;
518
+ } else {
519
+ rightIndex++;
520
+ }
521
+ }
522
+ return ranges;
523
+ }
524
+
525
+ /** Unions two sorted row-range sets. */
526
+ function unionRowRanges(
527
+ left: readonly ParquetRowRange[],
528
+ right: readonly ParquetRowRange[]
529
+ ): ParquetRowRange[] {
530
+ return mergeRowRanges([...left, ...right]);
531
+ }
532
+
533
+ /** Sorts and merges overlapping or touching logical row ranges. */
534
+ function mergeRowRanges(ranges: readonly ParquetRowRange[]): ParquetRowRange[] {
535
+ const sorted = [...ranges].sort(
536
+ (left, right) => left.start - right.start || left.end - right.end
537
+ );
538
+ const merged: ParquetRowRange[] = [];
539
+ for (const range of sorted) {
540
+ const previous = merged[merged.length - 1];
541
+ if (previous && range.start <= previous.end) {
542
+ previous.end = Math.max(previous.end, range.end);
543
+ } else {
544
+ merged.push({...range});
545
+ }
546
+ }
547
+ return merged;
548
+ }
549
+
550
+ /** Counts logical rows represented by disjoint ranges. */
551
+ function getRowRangeCount(ranges: readonly ParquetRowRange[]): number {
552
+ return ranges.reduce((count, range) => count + range.end - range.start, 0);
553
+ }
554
+
555
+ /** Counts unique pages overlapping at least one selected row range. */
556
+ function countSelectedPages(
557
+ pages: readonly ParquetDataPageLocation[],
558
+ ranges: readonly ParquetRowRange[]
559
+ ): number {
560
+ return pages.filter(page =>
561
+ ranges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end)
562
+ ).length;
563
+ }
564
+
565
+ /** Sorts and merges overlapping or touching byte ranges without overfetch gaps. */
566
+ function mergeByteRanges(
567
+ ranges: readonly {offset: number; length: number}[]
568
+ ): Array<{offset: number; length: number}> {
569
+ const sorted = [...ranges].sort((left, right) => left.offset - right.offset);
570
+ const merged: Array<{offset: number; length: number}> = [];
571
+ for (const range of sorted) {
572
+ const previous = merged[merged.length - 1];
573
+ const end = range.offset + range.length;
574
+ if (previous && range.offset <= previous.offset + previous.length) {
575
+ previous.length = Math.max(previous.offset + previous.length, end) - previous.offset;
576
+ } else {
577
+ merged.push({...range});
578
+ }
579
+ }
580
+ return merged;
581
+ }