@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
@@ -9,13 +9,18 @@ import {
9
9
  ParquetColumnChunk,
10
10
  ParquetReaderContext,
11
11
  ParquetPageData,
12
+ ParquetLogicalType,
13
+ ParquetLevelBuffer,
14
+ ParquetTimeUnit,
12
15
  ParquetType,
13
16
  PrimitiveType,
14
17
  SchemaDefinition
15
18
  } from '../schema/declare';
16
19
  import {CursorBuffer, ParquetCodecOptions, PARQUET_CODECS} from '../codecs/index';
20
+ import type {ParquetValueBuffer} from '../codecs/declare';
17
21
  import {
18
22
  ConvertedType,
23
+ EdgeInterpolationAlgorithm,
19
24
  Encoding,
20
25
  FieldRepetitionType,
21
26
  PageHeader,
@@ -24,9 +29,20 @@ import {
24
29
  Type
25
30
  } from '../parquet-thrift/index';
26
31
  import {decompress} from '../compression';
32
+ import type {TimeUnit as ParquetThriftTimeUnit} from '../parquet-thrift/TimeUnit';
27
33
  import {PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING} from '../../lib/constants';
28
34
  import {decodePageHeader, getThriftEnum, getBitWidth} from '../utils/read-utils';
29
35
 
36
+ /** Preallocated column destination used to bypass page-local value and level arrays. */
37
+ type ParquetPageDecodeTarget = {
38
+ values: ParquetValueBuffer;
39
+ valueOffset: number;
40
+ dictionary: readonly unknown[];
41
+ rlevels: ParquetLevelBuffer;
42
+ dlevels: ParquetLevelBuffer;
43
+ levelOffset: number;
44
+ };
45
+
30
46
  /**
31
47
  * Decode data pages
32
48
  * @param buffer - input data
@@ -35,7 +51,7 @@ import {decodePageHeader, getThriftEnum, getBitWidth} from '../utils/read-utils'
35
51
  * @returns parquet data page data
36
52
  */
37
53
  export async function decodeDataPages(
38
- buffer: Buffer,
54
+ buffer: Uint8Array,
39
55
  context: ParquetReaderContext
40
56
  ): Promise<ParquetColumnChunk> {
41
57
  const cursor: CursorBuffer = {
@@ -44,23 +60,42 @@ export async function decodeDataPages(
44
60
  size: buffer.length
45
61
  };
46
62
 
63
+ const expectedLevelCount =
64
+ context.numValues === undefined ? undefined : Number(context.numValues);
65
+ if (
66
+ expectedLevelCount !== undefined &&
67
+ (!Number.isSafeInteger(expectedLevelCount) || expectedLevelCount < 0)
68
+ ) {
69
+ throw new Error(`Invalid Parquet column value count ${expectedLevelCount}`);
70
+ }
71
+
72
+ const outputCapacity = expectedLevelCount ?? 0;
47
73
  const data: ParquetColumnChunk = {
48
- rlevels: [],
49
- dlevels: [],
50
- values: [],
74
+ rlevels: createParquetLevelBuffer(context, outputCapacity, context.rLevelMax),
75
+ dlevels: createParquetLevelBuffer(context, outputCapacity, context.dLevelMax),
76
+ values: createParquetColumnValueBuffer(context, outputCapacity),
51
77
  pageHeaders: [],
52
78
  count: 0
53
79
  };
54
80
 
55
81
  let dictionary = context.dictionary || [];
82
+ let levelOffset = 0;
83
+ let valueOffset = 0;
56
84
 
57
85
  while (
58
86
  // @ts-ignore size can be undefined
59
87
  cursor.offset < cursor.size &&
60
- (!context.numValues || data.dlevels.length < Number(context.numValues))
88
+ (expectedLevelCount === undefined || levelOffset < expectedLevelCount)
61
89
  ) {
62
90
  // Looks like we have to decode these in sequence due to cursor updates?
63
- const page = await decodePage(cursor, context);
91
+ const page = await decodePage(cursor, context, {
92
+ values: data.values,
93
+ valueOffset,
94
+ dictionary,
95
+ rlevels: data.rlevels,
96
+ dlevels: data.dlevels,
97
+ levelOffset
98
+ });
64
99
 
65
100
  if (page.dictionary) {
66
101
  dictionary = page.dictionary;
@@ -68,24 +103,23 @@ export async function decodeDataPages(
68
103
  continue;
69
104
  }
70
105
 
71
- const valueEncoding = getThriftEnum(
72
- Encoding,
73
- page.pageHeader.data_page_header?.encoding!
74
- ) as ParquetCodec;
75
- // Pages might be in different encodings. We don't need to decode in case
76
- // of 'PLAIN' encoding because all values are already in place
77
- if (dictionary.length && valueEncoding !== 'PLAIN') {
78
- // eslint-disable-next-line no-loop-func
79
- page.values = page.values.map((value) => dictionary[value]);
80
- }
81
-
82
- for (let index = 0; index < page.rlevels.length; index++) {
83
- data.rlevels.push(page.rlevels[index]);
84
- data.dlevels.push(page.dlevels[index]);
85
- const value = page.values[index];
106
+ levelOffset += page.count;
86
107
 
87
- if (value !== undefined) {
88
- data.values.push(value);
108
+ if (page.directValuesWritten !== undefined) {
109
+ valueOffset += page.directValuesWritten;
110
+ } else {
111
+ const valueEncoding = getThriftEnum(
112
+ Encoding,
113
+ page.pageHeader.data_page_header?.encoding ?? page.pageHeader.data_page_header_v2?.encoding!
114
+ ) as ParquetCodec;
115
+ const usesDictionary =
116
+ dictionary.length &&
117
+ (valueEncoding === 'PLAIN_DICTIONARY' || valueEncoding === 'RLE_DICTIONARY');
118
+ for (let index = 0; index < page.values.length; index++) {
119
+ const value = usesDictionary ? dictionary[Number(page.values[index])] : page.values[index];
120
+ if (value !== undefined) {
121
+ data.values[valueOffset++] = value;
122
+ }
89
123
  }
90
124
  }
91
125
 
@@ -93,6 +127,10 @@ export async function decodeDataPages(
93
127
  data.pageHeaders.push(page.pageHeader);
94
128
  }
95
129
 
130
+ data.rlevels = trimParquetLevelBuffer(data.rlevels, levelOffset);
131
+ data.dlevels = trimParquetLevelBuffer(data.dlevels, levelOffset);
132
+ data.values = trimParquetValueBuffer(data.values, valueOffset);
133
+
96
134
  return data;
97
135
  }
98
136
 
@@ -103,7 +141,8 @@ export async function decodeDataPages(
103
141
  */
104
142
  export async function decodePage(
105
143
  cursor: CursorBuffer,
106
- context: ParquetReaderContext
144
+ context: ParquetReaderContext,
145
+ target?: ParquetPageDecodeTarget
107
146
  ): Promise<ParquetPageData> {
108
147
  let page;
109
148
 
@@ -114,10 +153,10 @@ export async function decodePage(
114
153
 
115
154
  switch (pageType) {
116
155
  case 'DATA_PAGE':
117
- page = await decodeDataPage(cursor, pageHeader, context);
156
+ page = await decodeDataPage(cursor, pageHeader, context, target);
118
157
  break;
119
158
  case 'DATA_PAGE_V2':
120
- page = await decodeDataPageV2(cursor, pageHeader, context);
159
+ page = await decodeDataPageV2(cursor, pageHeader, context, target);
121
160
  break;
122
161
  case 'DICTIONARY_PAGE':
123
162
  page = {
@@ -178,31 +217,28 @@ export function decodeSchema(
178
217
  const res = decodeSchema(schemaElements, next + 1, schemaElement.num_children!);
179
218
  next = res.next;
180
219
  schema[schemaElement.name] = {
181
- // type: undefined,
182
220
  optional,
183
221
  repeated,
222
+ logicalType: decodeSchemaLogicalType(schemaElement),
223
+ fieldId: schemaElement.field_id,
184
224
  fields: res.schema
185
225
  };
186
226
  } else {
187
- const type = getThriftEnum(Type, schemaElement.type!);
188
- let logicalType = type;
189
-
190
- if (schemaElement.converted_type) {
191
- logicalType = getThriftEnum(ConvertedType, schemaElement.converted_type);
192
- }
193
-
194
- switch (logicalType) {
195
- case 'DECIMAL':
196
- logicalType = `${logicalType}_${type}` as ParquetType;
197
- break;
198
- default:
199
- }
227
+ const physicalType = getThriftEnum(Type, schemaElement.type!) as PrimitiveType;
228
+ const logicalType = decodeSchemaLogicalType(schemaElement);
229
+ const parquetType = getSchemaParquetType(schemaElement, physicalType, logicalType);
230
+ const precision = logicalType?.precision ?? schemaElement.precision;
231
+ const scale = logicalType?.scale ?? schemaElement.scale;
200
232
 
201
233
  schema[schemaElement.name] = {
202
- type: logicalType as ParquetType,
234
+ type: parquetType,
235
+ physicalType,
203
236
  typeLength: schemaElement.type_length,
204
- presision: schemaElement.precision,
205
- scale: schemaElement.scale,
237
+ presision: precision,
238
+ precision,
239
+ scale,
240
+ logicalType,
241
+ fieldId: schemaElement.field_id,
206
242
  optional,
207
243
  repeated
208
244
  };
@@ -212,6 +248,166 @@ export function decodeSchema(
212
248
  return {schema, offset, next};
213
249
  }
214
250
 
251
+ /** Decodes the parameterized Parquet LogicalType union, falling back to ConvertedType metadata. */
252
+ function decodeSchemaLogicalType(schemaElement: SchemaElement): ParquetLogicalType | undefined {
253
+ const logicalType = schemaElement.logicalType;
254
+ if (logicalType?.STRING) return {type: 'STRING'};
255
+ if (logicalType?.MAP) return {type: 'MAP'};
256
+ if (logicalType?.LIST) return {type: 'LIST'};
257
+ if (logicalType?.ENUM) return {type: 'ENUM'};
258
+ if (logicalType?.DECIMAL) {
259
+ return {
260
+ type: 'DECIMAL',
261
+ precision: logicalType.DECIMAL.precision,
262
+ scale: logicalType.DECIMAL.scale
263
+ };
264
+ }
265
+ if (logicalType?.DATE) return {type: 'DATE'};
266
+ if (logicalType?.TIME) {
267
+ return {
268
+ type: 'TIME',
269
+ unit: decodeTimeUnit(logicalType.TIME.unit),
270
+ isAdjustedToUTC: logicalType.TIME.isAdjustedToUTC
271
+ };
272
+ }
273
+ if (logicalType?.TIMESTAMP) {
274
+ return {
275
+ type: 'TIMESTAMP',
276
+ unit: decodeTimeUnit(logicalType.TIMESTAMP.unit),
277
+ isAdjustedToUTC: logicalType.TIMESTAMP.isAdjustedToUTC
278
+ };
279
+ }
280
+ if (logicalType?.INTEGER) {
281
+ const bitWidth = logicalType.INTEGER.bitWidth;
282
+ if (bitWidth !== 8 && bitWidth !== 16 && bitWidth !== 32 && bitWidth !== 64) {
283
+ throw new Error(`parquet: invalid INTEGER bit width ${bitWidth}`);
284
+ }
285
+ return {type: 'INTEGER', bitWidth, isSigned: logicalType.INTEGER.isSigned};
286
+ }
287
+ if (logicalType?.UNKNOWN) return {type: 'UNKNOWN'};
288
+ if (logicalType?.JSON) return {type: 'JSON'};
289
+ if (logicalType?.BSON) return {type: 'BSON'};
290
+ if (logicalType?.UUID) return {type: 'UUID'};
291
+ if (logicalType?.FLOAT16) return {type: 'FLOAT16'};
292
+ if (logicalType?.VARIANT) {
293
+ return {type: 'VARIANT', specificationVersion: logicalType.VARIANT.specification_version};
294
+ }
295
+ if (logicalType?.GEOMETRY) return {type: 'GEOMETRY', crs: logicalType.GEOMETRY.crs};
296
+ if (logicalType?.GEOGRAPHY) {
297
+ return {
298
+ type: 'GEOGRAPHY',
299
+ crs: logicalType.GEOGRAPHY.crs,
300
+ algorithm:
301
+ logicalType.GEOGRAPHY.algorithm === undefined
302
+ ? undefined
303
+ : getThriftEnum(EdgeInterpolationAlgorithm, logicalType.GEOGRAPHY.algorithm)
304
+ };
305
+ }
306
+
307
+ if (schemaElement.converted_type === undefined || schemaElement.converted_type === null) {
308
+ return undefined;
309
+ }
310
+ const convertedType = getThriftEnum(ConvertedType, schemaElement.converted_type);
311
+ switch (convertedType) {
312
+ case 'UTF8':
313
+ return {type: 'STRING'};
314
+ case 'MAP':
315
+ case 'MAP_KEY_VALUE':
316
+ return {type: 'MAP'};
317
+ case 'LIST':
318
+ return {type: 'LIST'};
319
+ case 'ENUM':
320
+ return {type: 'ENUM'};
321
+ case 'DECIMAL':
322
+ return {type: 'DECIMAL', precision: schemaElement.precision, scale: schemaElement.scale};
323
+ case 'DATE':
324
+ return {type: 'DATE'};
325
+ case 'TIME_MILLIS':
326
+ return {type: 'TIME', unit: 'MILLIS', isAdjustedToUTC: true};
327
+ case 'TIME_MICROS':
328
+ return {type: 'TIME', unit: 'MICROS', isAdjustedToUTC: true};
329
+ case 'TIMESTAMP_MILLIS':
330
+ return {type: 'TIMESTAMP', unit: 'MILLIS', isAdjustedToUTC: true};
331
+ case 'TIMESTAMP_MICROS':
332
+ return {type: 'TIMESTAMP', unit: 'MICROS', isAdjustedToUTC: true};
333
+ case 'UINT_8':
334
+ case 'UINT_16':
335
+ case 'UINT_32':
336
+ case 'UINT_64':
337
+ return {
338
+ type: 'INTEGER',
339
+ bitWidth: Number(convertedType.slice(5)) as 8 | 16 | 32 | 64,
340
+ isSigned: false
341
+ };
342
+ case 'INT_8':
343
+ case 'INT_16':
344
+ case 'INT_32':
345
+ case 'INT_64':
346
+ return {
347
+ type: 'INTEGER',
348
+ bitWidth: Number(convertedType.slice(4)) as 8 | 16 | 32 | 64,
349
+ isSigned: true
350
+ };
351
+ case 'JSON':
352
+ return {type: 'JSON'};
353
+ case 'BSON':
354
+ return {type: 'BSON'};
355
+ default:
356
+ return undefined;
357
+ }
358
+ }
359
+
360
+ /** Resolves one physical/logical pair to the internal Parquet value converter. */
361
+ function getSchemaParquetType(
362
+ schemaElement: SchemaElement,
363
+ physicalType: PrimitiveType,
364
+ logicalType?: ParquetLogicalType
365
+ ): ParquetType {
366
+ if (!logicalType) {
367
+ return schemaElement.converted_type === undefined || schemaElement.converted_type === null
368
+ ? physicalType
369
+ : (getThriftEnum(ConvertedType, schemaElement.converted_type) as ParquetType);
370
+ }
371
+ switch (logicalType.type) {
372
+ case 'STRING':
373
+ return 'UTF8';
374
+ case 'ENUM':
375
+ return 'ENUM';
376
+ case 'DECIMAL':
377
+ return `DECIMAL_${physicalType}` as ParquetType;
378
+ case 'DATE':
379
+ return 'DATE';
380
+ case 'TIME':
381
+ return `TIME_${logicalType.unit}` as ParquetType;
382
+ case 'TIMESTAMP':
383
+ return `TIMESTAMP_${logicalType.unit}` as ParquetType;
384
+ case 'INTEGER':
385
+ return `${logicalType.isSigned ? 'INT' : 'UINT'}_${logicalType.bitWidth}` as ParquetType;
386
+ case 'UNKNOWN':
387
+ case 'JSON':
388
+ case 'BSON':
389
+ case 'UUID':
390
+ case 'FLOAT16':
391
+ case 'VARIANT':
392
+ case 'GEOMETRY':
393
+ case 'GEOGRAPHY':
394
+ return logicalType.type;
395
+ default:
396
+ if (schemaElement.converted_type !== undefined && schemaElement.converted_type !== null) {
397
+ return getThriftEnum(ConvertedType, schemaElement.converted_type) as ParquetType;
398
+ }
399
+ return physicalType;
400
+ }
401
+ }
402
+
403
+ /** Returns the selected member of the Parquet TimeUnit union. */
404
+ function decodeTimeUnit(timeUnit: ParquetThriftTimeUnit): ParquetTimeUnit {
405
+ if (timeUnit?.MILLIS) return 'MILLIS';
406
+ if (timeUnit?.MICROS) return 'MICROS';
407
+ if (timeUnit?.NANOS) return 'NANOS';
408
+ throw new Error('parquet: TIME or TIMESTAMP logical type is missing its unit');
409
+ }
410
+
215
411
  /**
216
412
  * Decode a consecutive array of data using one of the parquet encodings
217
413
  */
@@ -221,7 +417,7 @@ function decodeValues(
221
417
  cursor: CursorBuffer,
222
418
  count: number,
223
419
  opts: ParquetCodecOptions
224
- ): any[] {
420
+ ): ParquetValueBuffer {
225
421
  if (!(encoding in PARQUET_CODECS)) {
226
422
  throw new Error(`invalid encoding: ${encoding}`);
227
423
  }
@@ -237,7 +433,8 @@ function decodeValues(
237
433
  async function decodeDataPage(
238
434
  cursor: CursorBuffer,
239
435
  header: PageHeader,
240
- context: ParquetReaderContext
436
+ context: ParquetReaderContext,
437
+ target?: ParquetPageDecodeTarget
241
438
  ): Promise<ParquetPageData> {
242
439
  const cursorEnd = cursor.offset + header.compressed_page_size;
243
440
  const valueCount = header.data_page_header?.num_values;
@@ -264,39 +461,39 @@ async function decodeDataPage(
264
461
  Encoding,
265
462
  header.data_page_header?.repetition_level_encoding!
266
463
  ) as ParquetCodec;
267
- // tslint:disable-next-line:prefer-array-literal
268
- let rLevels = new Array(valueCount);
269
-
270
- if (context.column.rLevelMax > 0) {
271
- rLevels = decodeValues(PARQUET_RDLVL_TYPE, rLevelEncoding, dataCursor, valueCount!, {
272
- bitWidth: getBitWidth(context.column.rLevelMax),
273
- disableEnvelope: false
274
- // column: opts.column
275
- });
276
- } else {
277
- rLevels.fill(0);
278
- }
464
+ const rLevels = decodeLevels(
465
+ dataCursor,
466
+ valueCount!,
467
+ context.column.rLevelMax,
468
+ rLevelEncoding,
469
+ false,
470
+ target?.rlevels,
471
+ target?.levelOffset
472
+ );
279
473
 
280
474
  /* read definition levels */
281
475
  const dLevelEncoding = getThriftEnum(
282
476
  Encoding,
283
477
  header.data_page_header?.definition_level_encoding!
284
478
  ) as ParquetCodec;
285
- // tslint:disable-next-line:prefer-array-literal
286
- let dLevels = new Array(valueCount);
479
+ const dLevels = decodeLevels(
480
+ dataCursor,
481
+ valueCount!,
482
+ context.column.dLevelMax,
483
+ dLevelEncoding,
484
+ false,
485
+ target?.dlevels,
486
+ target?.levelOffset
487
+ );
488
+ let valueCountNonNull = valueCount!;
287
489
  if (context.column.dLevelMax > 0) {
288
- dLevels = decodeValues(PARQUET_RDLVL_TYPE, dLevelEncoding, dataCursor, valueCount!, {
289
- bitWidth: getBitWidth(context.column.dLevelMax),
290
- disableEnvelope: false
291
- // column: opts.column
292
- });
293
- } else {
294
- dLevels.fill(0);
295
- }
296
- let valueCountNonNull = 0;
297
- for (const dlvl of dLevels) {
298
- if (dlvl === context.column.dLevelMax) {
299
- valueCountNonNull++;
490
+ valueCountNonNull = 0;
491
+ const decodedDefinitionLevels = target?.dlevels || dLevels;
492
+ const definitionLevelOffset = target?.levelOffset || 0;
493
+ for (let index = 0; index < valueCount!; index++) {
494
+ if (decodedDefinitionLevels[definitionLevelOffset + index] === context.column.dLevelMax) {
495
+ valueCountNonNull++;
496
+ }
300
497
  }
301
498
  }
302
499
 
@@ -304,7 +501,12 @@ async function decodeDataPage(
304
501
  const valueEncoding = getThriftEnum(Encoding, header.data_page_header?.encoding!) as ParquetCodec;
305
502
  const decodeOptions: ParquetCodecOptions = {
306
503
  typeLength: context.column.typeLength,
307
- bitWidth: context.column.typeLength
504
+ bitWidth: getValueBitWidth(context, valueEncoding),
505
+ retainByteArrayViews: context.retainByteArrayViews,
506
+ output: target?.values,
507
+ outputOffset: target?.valueOffset,
508
+ dictionary: isDictionaryEncoding(valueEncoding) ? target?.dictionary : undefined,
509
+ int64AsBigInt: shouldDecodeInt64AsBigInt(context)
308
510
  };
309
511
 
310
512
  const values = decodeValues(
@@ -319,6 +521,7 @@ async function decodeDataPage(
319
521
  dlevels: dLevels,
320
522
  rlevels: rLevels,
321
523
  values,
524
+ directValuesWritten: target ? valueCountNonNull : undefined,
322
525
  count: valueCount!,
323
526
  pageHeader: header
324
527
  };
@@ -334,64 +537,101 @@ async function decodeDataPage(
334
537
  async function decodeDataPageV2(
335
538
  cursor: CursorBuffer,
336
539
  header: PageHeader,
337
- context: ParquetReaderContext
540
+ context: ParquetReaderContext,
541
+ target?: ParquetPageDecodeTarget
338
542
  ): Promise<ParquetPageData> {
543
+ const dataPageHeader = header.data_page_header_v2;
544
+ if (!dataPageHeader) {
545
+ throw new Error('Missing Parquet data page v2 header');
546
+ }
339
547
  const cursorEnd = cursor.offset + header.compressed_page_size;
340
-
341
- const valueCount = header.data_page_header_v2?.num_values;
342
- // @ts-ignore
343
- const valueCountNonNull = valueCount - header.data_page_header_v2?.num_nulls;
344
- const valueEncoding = getThriftEnum(
345
- Encoding,
346
- header.data_page_header_v2?.encoding!
347
- ) as ParquetCodec;
548
+ const levelsOffset = cursor.offset;
549
+ const valueCount = dataPageHeader.num_values;
550
+ const valueCountNonNull = valueCount - dataPageHeader.num_nulls;
551
+ const valueEncoding = getThriftEnum(Encoding, dataPageHeader.encoding) as ParquetCodec;
552
+ if (
553
+ header.compressed_page_size < 0 ||
554
+ cursorEnd > (cursor.size ?? cursor.buffer.length) ||
555
+ valueCountNonNull < 0
556
+ ) {
557
+ throw new Error('Invalid Parquet data page v2 header');
558
+ }
348
559
 
349
560
  /* read repetition levels */
350
- // tslint:disable-next-line:prefer-array-literal
351
- let rLevels = new Array(valueCount);
561
+ let rLevels: number[] = [];
352
562
  if (context.column.rLevelMax > 0) {
353
- rLevels = decodeValues(PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING, cursor, valueCount!, {
354
- bitWidth: getBitWidth(context.column.rLevelMax),
355
- disableEnvelope: true
356
- });
357
- } else {
563
+ const repetitionLevelCursor = createPageSliceCursor(
564
+ cursor,
565
+ levelsOffset,
566
+ dataPageHeader.repetition_levels_byte_length
567
+ );
568
+ rLevels = decodeLevels(
569
+ repetitionLevelCursor,
570
+ valueCount,
571
+ context.column.rLevelMax,
572
+ PARQUET_RDLVL_ENCODING,
573
+ true,
574
+ target?.rlevels,
575
+ target?.levelOffset
576
+ );
577
+ } else if (!target) {
578
+ rLevels = new Array(valueCount);
358
579
  rLevels.fill(0);
359
580
  }
581
+ const definitionLevelsOffset = levelsOffset + dataPageHeader.repetition_levels_byte_length;
360
582
 
361
583
  /* read definition levels */
362
- // tslint:disable-next-line:prefer-array-literal
363
- let dLevels = new Array(valueCount);
584
+ let dLevels: number[] = [];
364
585
  if (context.column.dLevelMax > 0) {
365
- dLevels = decodeValues(PARQUET_RDLVL_TYPE, PARQUET_RDLVL_ENCODING, cursor, valueCount!, {
366
- bitWidth: getBitWidth(context.column.dLevelMax),
367
- disableEnvelope: true
368
- });
369
- } else {
586
+ const definitionLevelCursor = createPageSliceCursor(
587
+ cursor,
588
+ definitionLevelsOffset,
589
+ dataPageHeader.definition_levels_byte_length
590
+ );
591
+ dLevels = decodeLevels(
592
+ definitionLevelCursor,
593
+ valueCount,
594
+ context.column.dLevelMax,
595
+ PARQUET_RDLVL_ENCODING,
596
+ true,
597
+ target?.dlevels,
598
+ target?.levelOffset
599
+ );
600
+ } else if (!target) {
601
+ dLevels = new Array(valueCount);
370
602
  dLevels.fill(0);
371
603
  }
372
604
 
373
605
  /* read values */
374
- let valuesBufCursor = cursor;
606
+ const valuesOffset = definitionLevelsOffset + dataPageHeader.definition_levels_byte_length;
607
+ const valuesCompressedByteLength = cursorEnd - valuesOffset;
608
+ const valuesUncompressedByteLength =
609
+ header.uncompressed_page_size -
610
+ dataPageHeader.repetition_levels_byte_length -
611
+ dataPageHeader.definition_levels_byte_length;
612
+ if (valuesCompressedByteLength < 0 || valuesUncompressedByteLength < 0) {
613
+ throw new Error('Invalid Parquet data page v2 level lengths');
614
+ }
615
+ let valuesBuffer = cursor.buffer.subarray(valuesOffset, cursorEnd);
375
616
 
376
- if (header.data_page_header_v2?.is_compressed) {
377
- const valuesBuf = await decompress(
617
+ if (dataPageHeader.is_compressed !== false && context.compression !== 'UNCOMPRESSED') {
618
+ valuesBuffer = await decompress(
378
619
  context.compression,
379
- cursor.buffer.slice(cursor.offset, cursorEnd),
380
- header.uncompressed_page_size
620
+ valuesBuffer,
621
+ valuesUncompressedByteLength
381
622
  );
382
-
383
- valuesBufCursor = {
384
- buffer: valuesBuf,
385
- offset: 0,
386
- size: valuesBuf.length
387
- };
388
-
389
- cursor.offset = cursorEnd;
390
623
  }
624
+ const valuesBufCursor = {buffer: valuesBuffer, offset: 0, size: valuesBuffer.length};
625
+ cursor.offset = cursorEnd;
391
626
 
392
627
  const decodeOptions = {
393
628
  typeLength: context.column.typeLength,
394
- bitWidth: context.column.typeLength
629
+ bitWidth: getValueBitWidth(context, valueEncoding),
630
+ retainByteArrayViews: context.retainByteArrayViews,
631
+ output: target?.values,
632
+ outputOffset: target?.valueOffset,
633
+ dictionary: isDictionaryEncoding(valueEncoding) ? target?.dictionary : undefined,
634
+ int64AsBigInt: shouldDecodeInt64AsBigInt(context)
395
635
  };
396
636
 
397
637
  const values = decodeValues(
@@ -406,11 +646,130 @@ async function decodeDataPageV2(
406
646
  dlevels: dLevels,
407
647
  rlevels: rLevels,
408
648
  values,
409
- count: valueCount!,
649
+ directValuesWritten: target ? valueCountNonNull : undefined,
650
+ count: valueCount,
410
651
  pageHeader: header
411
652
  };
412
653
  }
413
654
 
655
+ /** Decodes repetition or definition levels into an optional column-level destination. */
656
+ function decodeLevels(
657
+ cursor: CursorBuffer,
658
+ count: number,
659
+ levelMax: number,
660
+ encoding: ParquetCodec,
661
+ disableEnvelope: boolean,
662
+ output?: ParquetLevelBuffer,
663
+ outputOffset = 0
664
+ ): number[] {
665
+ if (levelMax === 0) {
666
+ return output ? [] : new Array<number>(count).fill(0);
667
+ }
668
+ const levels = decodeValues(PARQUET_RDLVL_TYPE, encoding, cursor, count, {
669
+ bitWidth: getBitWidth(levelMax),
670
+ disableEnvelope,
671
+ output,
672
+ outputOffset
673
+ }) as number[];
674
+ return output ? [] : levels;
675
+ }
676
+
677
+ /** Allocates compact unsigned storage for repetition and definition levels. */
678
+ function createParquetLevelBuffer(
679
+ context: ParquetReaderContext,
680
+ capacity: number,
681
+ levelMax: number
682
+ ): ParquetLevelBuffer {
683
+ if (!context.useTypedLevelBuffers || capacity === 0) {
684
+ return levelMax > 0 ? new Array<number>(capacity) : new Array<number>(capacity).fill(0);
685
+ }
686
+ if (levelMax <= 0xff) {
687
+ return new Uint8Array(capacity);
688
+ }
689
+ if (levelMax <= 0xffff) {
690
+ return new Uint16Array(capacity);
691
+ }
692
+ return new Uint32Array(capacity);
693
+ }
694
+
695
+ /** Restricts an overallocated level buffer to the number of decoded levels. */
696
+ function trimParquetLevelBuffer(levels: ParquetLevelBuffer, length: number): ParquetLevelBuffer {
697
+ if (Array.isArray(levels)) {
698
+ levels.length = length;
699
+ return levels;
700
+ }
701
+ return levels.subarray(0, length) as ParquetLevelBuffer;
702
+ }
703
+
704
+ /** Returns whether an encoding stores RLE dictionary indices instead of physical values. */
705
+ function isDictionaryEncoding(encoding: ParquetCodec): boolean {
706
+ return encoding === 'PLAIN_DICTIONARY' || encoding === 'RLE_DICTIONARY';
707
+ }
708
+
709
+ /** Preserves exact physical signed INT64 values in every output shape. */
710
+ function shouldDecodeInt64AsBigInt(context: ParquetReaderContext): boolean {
711
+ return context.column.primitiveType === 'INT64';
712
+ }
713
+
714
+ /** Allocates the narrowest lossless column buffer supported by the current JavaScript decoder. */
715
+ function createParquetColumnValueBuffer(
716
+ context: ParquetReaderContext,
717
+ capacity: number
718
+ ): ParquetValueBuffer {
719
+ if (!context.useTypedValueBuffers || capacity === 0) {
720
+ return new Array<unknown>(capacity);
721
+ }
722
+ switch (context.column.primitiveType) {
723
+ case 'BOOLEAN':
724
+ return new Uint8Array(capacity);
725
+ case 'INT32':
726
+ return new Int32Array(capacity);
727
+ case 'INT64':
728
+ return new BigInt64Array(capacity);
729
+ case 'INT96':
730
+ case 'DOUBLE':
731
+ return new Float64Array(capacity);
732
+ case 'FLOAT':
733
+ return new Float32Array(capacity);
734
+ default:
735
+ return new Array<unknown>(capacity);
736
+ }
737
+ }
738
+
739
+ /** Restricts an overallocated typed column buffer to its decoded non-null values. */
740
+ function trimParquetValueBuffer(values: ParquetValueBuffer, length: number): ParquetValueBuffer {
741
+ if (Array.isArray(values)) {
742
+ values.length = length;
743
+ return values;
744
+ }
745
+ return values.subarray(0, length) as ParquetValueBuffer;
746
+ }
747
+
748
+ /** Returns the physical value bit width required by encodings such as RLE BOOLEAN. */
749
+ function getValueBitWidth(
750
+ context: ParquetReaderContext,
751
+ encoding: ParquetCodec
752
+ ): number | undefined {
753
+ if (encoding === 'RLE' && context.column.primitiveType === 'BOOLEAN') {
754
+ return 1;
755
+ }
756
+ return context.column.typeLength;
757
+ }
758
+
759
+ /** Creates a bounded cursor over one uncompressed data page v2 level section. */
760
+ function createPageSliceCursor(
761
+ cursor: CursorBuffer,
762
+ offset: number,
763
+ byteLength: number
764
+ ): CursorBuffer {
765
+ const end = offset + byteLength;
766
+ if (byteLength < 0 || end > (cursor.size ?? cursor.buffer.length)) {
767
+ throw new Error('Invalid Parquet data page v2 level lengths');
768
+ }
769
+ const buffer = cursor.buffer.subarray(offset, end);
770
+ return {buffer, offset: 0, size: buffer.length};
771
+ }
772
+
414
773
  /**
415
774
  * Do decoding of dictionary page which helps to iterate over all indexes and get dataPage values.
416
775
  * @param cursor
@@ -435,7 +794,7 @@ async function decodeDictionaryPage(
435
794
  if (context.compression !== 'UNCOMPRESSED') {
436
795
  const valuesBuf = await decompress(
437
796
  context.compression,
438
- dictCursor.buffer.slice(dictCursor.offset, cursorEnd),
797
+ dictCursor.buffer.subarray(dictCursor.offset),
439
798
  pageHeader.uncompressed_page_size
440
799
  );
441
800
 
@@ -449,33 +808,28 @@ async function decodeDictionaryPage(
449
808
  }
450
809
 
451
810
  const numValues = pageHeader?.dictionary_page_header?.num_values || 0;
811
+ const declaredEncoding = getThriftEnum(
812
+ Encoding,
813
+ pageHeader.dictionary_page_header?.encoding!
814
+ ) as ParquetCodec;
815
+ // Some established writers put the data-page dictionary encoding in this field even though
816
+ // dictionary values themselves use PLAIN. Preserve compatibility with those files.
817
+ const dictionaryValueEncoding =
818
+ declaredEncoding === 'PLAIN_DICTIONARY' || declaredEncoding === 'RLE_DICTIONARY'
819
+ ? 'PLAIN'
820
+ : declaredEncoding;
452
821
 
453
822
  const decodedDictionaryValues = decodeValues(
454
823
  context.column.primitiveType!,
455
- context.column.encoding!,
824
+ dictionaryValueEncoding,
456
825
  dictCursor,
457
826
  numValues,
458
- // TODO - this looks wrong?
459
- context as ParquetCodecOptions
827
+ {
828
+ ...context,
829
+ typeLength: context.column.typeLength,
830
+ int64AsBigInt: shouldDecodeInt64AsBigInt(context)
831
+ } as ParquetCodecOptions
460
832
  );
461
833
 
462
- // Makes it look a little easier
463
- let values: any[];
464
- if (context?.preserveBinary) {
465
- values = decodedDictionaryValues.map((d) => preserveBinary(d));
466
- } else {
467
- values = decodedDictionaryValues.map((d) => d.toString());
468
- }
469
- return values;
470
- }
471
-
472
- function preserveBinary(d: any): ArrayBuffer | ArrayBufferView | string {
473
- if (ArrayBuffer.isView(d)) {
474
- return d;
475
- }
476
- // Convert to ArrayBuffer
477
- if (Buffer.isBuffer(d)) {
478
- return new Uint8Array(d.buffer, d.byteOffset, d.byteLength).slice().buffer;
479
- }
480
- return d.toString();
834
+ return decodedDictionaryValues as (string | ArrayBuffer)[];
481
835
  }