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

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 (326) hide show
  1. package/LICENSE +1 -1
  2. package/dist/bundled.d.ts +1 -1
  3. package/dist/bundled.d.ts.map +1 -1
  4. package/dist/bundled.js.map +1 -1
  5. package/dist/delta-format.d.ts +9 -0
  6. package/dist/delta-format.d.ts.map +1 -0
  7. package/dist/delta-format.js +12 -0
  8. package/dist/delta-format.js.map +1 -0
  9. package/dist/delta-source-loader-types.d.ts +27 -0
  10. package/dist/delta-source-loader-types.d.ts.map +1 -0
  11. package/dist/delta-source-loader-types.js +28 -0
  12. package/dist/delta-source-loader-types.js.map +1 -0
  13. package/dist/delta-source.d.ts +48 -0
  14. package/dist/delta-source.d.ts.map +1 -0
  15. package/dist/delta-source.js +222 -0
  16. package/dist/delta-source.js.map +1 -0
  17. package/dist/delta-types.d.ts +38 -0
  18. package/dist/delta-types.d.ts.map +1 -0
  19. package/dist/delta-types.js +5 -0
  20. package/dist/delta-types.js.map +1 -0
  21. package/dist/geoparquet-loader.js +1 -1
  22. package/dist/iceberg-rest-catalog.d.ts +49 -0
  23. package/dist/iceberg-rest-catalog.d.ts.map +1 -0
  24. package/dist/iceberg-rest-catalog.js +78 -0
  25. package/dist/iceberg-rest-catalog.js.map +1 -0
  26. package/dist/iceberg-table-source.d.ts +63 -0
  27. package/dist/iceberg-table-source.d.ts.map +1 -0
  28. package/dist/iceberg-table-source.js +797 -0
  29. package/dist/iceberg-table-source.js.map +1 -0
  30. package/dist/iceberg-types.d.ts +150 -0
  31. package/dist/iceberg-types.d.ts.map +1 -0
  32. package/dist/iceberg-types.js +5 -0
  33. package/dist/iceberg-types.js.map +1 -0
  34. package/dist/index.cjs +15005 -3143
  35. package/dist/index.cjs.map +3 -3
  36. package/dist/index.d.ts +7 -3
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +5 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/arrow/convert-schema-from-parquet.d.ts +3 -1
  41. package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
  42. package/dist/lib/arrow/convert-schema-from-parquet.js +94 -19
  43. package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
  44. package/dist/lib/arrow/create-nested-arrow-vector.js +89 -0
  45. package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -1
  46. package/dist/lib/constants.js +1 -1
  47. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -1
  48. package/dist/lib/encoders/encode-table-to-parquet-js.js +202 -7
  49. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -1
  50. package/dist/lib/geo/geoparquet-covering.d.ts +19 -0
  51. package/dist/lib/geo/geoparquet-covering.d.ts.map +1 -0
  52. package/dist/lib/geo/geoparquet-covering.js +137 -0
  53. package/dist/lib/geo/geoparquet-covering.js.map +1 -0
  54. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -1
  55. package/dist/lib/geo/geospatial-metadata.js +39 -13
  56. package/dist/lib/geo/geospatial-metadata.js.map +1 -1
  57. package/dist/lib/parquet-bloom-filter-planner.d.ts +16 -0
  58. package/dist/lib/parquet-bloom-filter-planner.d.ts.map +1 -0
  59. package/dist/lib/parquet-bloom-filter-planner.js +57 -0
  60. package/dist/lib/parquet-bloom-filter-planner.js.map +1 -0
  61. package/dist/lib/parquet-bloom-filter.d.ts +30 -0
  62. package/dist/lib/parquet-bloom-filter.d.ts.map +1 -0
  63. package/dist/lib/parquet-bloom-filter.js +289 -0
  64. package/dist/lib/parquet-bloom-filter.js.map +1 -0
  65. package/dist/lib/parquet-encryption.d.ts +80 -0
  66. package/dist/lib/parquet-encryption.d.ts.map +1 -0
  67. package/dist/lib/parquet-encryption.js +190 -0
  68. package/dist/lib/parquet-encryption.js.map +1 -0
  69. package/dist/lib/parquet-page-index.d.ts +34 -5
  70. package/dist/lib/parquet-page-index.d.ts.map +1 -1
  71. package/dist/lib/parquet-page-index.js +114 -28
  72. package/dist/lib/parquet-page-index.js.map +1 -1
  73. package/dist/lib/parquet-predicate.d.ts +5 -1
  74. package/dist/lib/parquet-predicate.d.ts.map +1 -1
  75. package/dist/lib/parquet-predicate.js +42 -14
  76. package/dist/lib/parquet-predicate.js.map +1 -1
  77. package/dist/lib/parquet-source-worker-decoder.d.ts +4 -1
  78. package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -1
  79. package/dist/lib/parquet-source-worker-decoder.js +83 -17
  80. package/dist/lib/parquet-source-worker-decoder.js.map +1 -1
  81. package/dist/lib/parquet-source-worker-types.d.ts +24 -0
  82. package/dist/lib/parquet-source-worker-types.d.ts.map +1 -1
  83. package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
  84. package/dist/lib/parsers/get-parquet-schema.js +3 -1
  85. package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
  86. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -1
  87. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +327 -18
  88. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -1
  89. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
  90. package/dist/lib/parsers/parse-parquet-to-arrow.js +5 -5
  91. package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
  92. package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
  93. package/dist/lib/parsers/parse-parquet-to-columns.js +3 -1
  94. package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
  95. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  96. package/dist/lib/parsers/parse-parquet-to-json.js +18 -2
  97. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  98. package/dist/lib/slice-parquet-batch.d.ts +9 -0
  99. package/dist/lib/slice-parquet-batch.d.ts.map +1 -0
  100. package/dist/lib/slice-parquet-batch.js +28 -0
  101. package/dist/lib/slice-parquet-batch.js.map +1 -0
  102. package/dist/lib/sources/parquet-range-file.d.ts +1 -1
  103. package/dist/lib/sources/parquet-range-file.d.ts.map +1 -1
  104. package/dist/lib/sources/parquet-range-file.js +28 -22
  105. package/dist/lib/sources/parquet-range-file.js.map +1 -1
  106. package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -1
  107. package/dist/lib/utils/normalize-parquet-options.js +15 -1
  108. package/dist/lib/utils/normalize-parquet-options.js.map +1 -1
  109. package/dist/parquet-dataset-source.cjs +15766 -4896
  110. package/dist/parquet-dataset-source.cjs.map +3 -3
  111. package/dist/parquet-dataset-source.d.ts +31 -4
  112. package/dist/parquet-dataset-source.d.ts.map +1 -1
  113. package/dist/parquet-dataset-source.js +296 -74
  114. package/dist/parquet-dataset-source.js.map +1 -1
  115. package/dist/parquet-js-loader-types.d.ts +2 -0
  116. package/dist/parquet-js-loader-types.d.ts.map +1 -1
  117. package/dist/parquet-js-loader-types.js +2 -1
  118. package/dist/parquet-js-loader-types.js.map +1 -1
  119. package/dist/parquet-js-loader.d.ts +1 -0
  120. package/dist/parquet-js-loader.d.ts.map +1 -1
  121. package/dist/parquet-js-loader.js +2 -1
  122. package/dist/parquet-js-loader.js.map +1 -1
  123. package/dist/parquet-js-writer.d.ts +23 -2
  124. package/dist/parquet-js-writer.d.ts.map +1 -1
  125. package/dist/parquet-js-writer.js +1 -1
  126. package/dist/parquet-js-writer.js.map +1 -1
  127. package/dist/parquet-loader-base.js +1 -1
  128. package/dist/parquet-loader-options.d.ts +11 -0
  129. package/dist/parquet-loader-options.d.ts.map +1 -1
  130. package/dist/parquet-loader-options.js.map +1 -1
  131. package/dist/parquet-source-capabilities.d.ts +8 -1
  132. package/dist/parquet-source-capabilities.d.ts.map +1 -1
  133. package/dist/parquet-source-capabilities.js +10 -0
  134. package/dist/parquet-source-capabilities.js.map +1 -1
  135. package/dist/parquet-source-loader-types.d.ts +10 -0
  136. package/dist/parquet-source-loader-types.d.ts.map +1 -1
  137. package/dist/parquet-source-loader-types.js +11 -1
  138. package/dist/parquet-source-loader-types.js.map +1 -1
  139. package/dist/parquet-source-loader.cjs +14911 -4316
  140. package/dist/parquet-source-loader.cjs.map +3 -3
  141. package/dist/parquet-source-loader.d.ts +42 -4
  142. package/dist/parquet-source-loader.d.ts.map +1 -1
  143. package/dist/parquet-source-loader.js +585 -38
  144. package/dist/parquet-source-loader.js.map +1 -1
  145. package/dist/parquet-source-types.d.ts +180 -30
  146. package/dist/parquet-source-types.d.ts.map +1 -1
  147. package/dist/parquet-source-worker.js +7055 -6989
  148. package/dist/parquet-source-worker.js.map +4 -4
  149. package/dist/parquet-worker-node.cjs +8505 -1041
  150. package/dist/parquet-worker-node.cjs.map +4 -4
  151. package/dist/parquet-worker-url.js +5 -1
  152. package/dist/parquet-worker-url.js.map +1 -1
  153. package/dist/parquet-worker.js +289 -218
  154. package/dist/parquet-worker.js.map +4 -4
  155. package/dist/parquetjs/codecs/declare.d.ts +15 -0
  156. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  157. package/dist/parquetjs/codecs/declare.js +10 -0
  158. package/dist/parquetjs/codecs/declare.js.map +1 -1
  159. package/dist/parquetjs/codecs/delta.d.ts.map +1 -1
  160. package/dist/parquetjs/codecs/delta.js +356 -7
  161. package/dist/parquetjs/codecs/delta.js.map +1 -1
  162. package/dist/parquetjs/codecs/index.d.ts.map +1 -1
  163. package/dist/parquetjs/codecs/index.js +4 -0
  164. package/dist/parquetjs/codecs/index.js.map +1 -1
  165. package/dist/parquetjs/codecs/plain.d.ts +1 -1
  166. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  167. package/dist/parquetjs/codecs/plain.js +153 -12
  168. package/dist/parquetjs/codecs/plain.js.map +1 -1
  169. package/dist/parquetjs/codecs/rle.d.ts +4 -0
  170. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  171. package/dist/parquetjs/codecs/rle.js +406 -3
  172. package/dist/parquetjs/codecs/rle.js.map +1 -1
  173. package/dist/parquetjs/compression.d.ts +9 -0
  174. package/dist/parquetjs/compression.d.ts.map +1 -1
  175. package/dist/parquetjs/compression.js +86 -67
  176. package/dist/parquetjs/compression.js.map +1 -1
  177. package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -1
  178. package/dist/parquetjs/encoder/dictionary-planner.js +5 -2
  179. package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -1
  180. package/dist/parquetjs/encoder/parquet-encoder.d.ts +43 -1
  181. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  182. package/dist/parquetjs/encoder/parquet-encoder.js +691 -34
  183. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  184. package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts +29 -0
  185. package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts.map +1 -0
  186. package/dist/parquetjs/parquet-thrift/BoundingBox.js +85 -0
  187. package/dist/parquetjs/parquet-thrift/BoundingBox.js.map +1 -0
  188. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +5 -0
  189. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
  190. package/dist/parquetjs/parquet-thrift/ColumnChunk.js +35 -0
  191. package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
  192. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts +35 -0
  193. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts.map +1 -0
  194. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js +135 -0
  195. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js.map +1 -0
  196. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +10 -0
  197. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
  198. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +73 -0
  199. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
  200. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts +22 -0
  201. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts.map +1 -0
  202. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js +111 -0
  203. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js.map +1 -0
  204. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts +16 -0
  205. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts.map +1 -0
  206. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js +57 -0
  207. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js.map +1 -0
  208. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +5 -0
  209. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
  210. package/dist/parquetjs/parquet-thrift/FileMetaData.js +35 -0
  211. package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
  212. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts +18 -0
  213. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts.map +1 -0
  214. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js +62 -0
  215. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js.map +1 -0
  216. package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts +26 -0
  217. package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts.map +1 -0
  218. package/dist/parquetjs/parquet-thrift/SizeStatistics.js +85 -0
  219. package/dist/parquetjs/parquet-thrift/SizeStatistics.js.map +1 -0
  220. package/dist/parquetjs/parquet-thrift/index.d.ts +6 -0
  221. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  222. package/dist/parquetjs/parquet-thrift/index.js +6 -0
  223. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  224. package/dist/parquetjs/parser/decoders.d.ts +10 -1
  225. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  226. package/dist/parquetjs/parser/decoders.js +318 -14
  227. package/dist/parquetjs/parser/decoders.js.map +1 -1
  228. package/dist/parquetjs/parser/parquet-reader.d.ts +78 -12
  229. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  230. package/dist/parquetjs/parser/parquet-reader.js +605 -66
  231. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  232. package/dist/parquetjs/schema/declare.d.ts +22 -3
  233. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  234. package/dist/parquetjs/schema/declare.js.map +1 -1
  235. package/dist/parquetjs/schema/schema.d.ts.map +1 -1
  236. package/dist/parquetjs/schema/schema.js +10 -0
  237. package/dist/parquetjs/schema/schema.js.map +1 -1
  238. package/dist/parquetjs/schema/shred.d.ts.map +1 -1
  239. package/dist/parquetjs/schema/shred.js +219 -11
  240. package/dist/parquetjs/schema/shred.js.map +1 -1
  241. package/dist/parquetjs/schema/types.js +19 -21
  242. package/dist/parquetjs/schema/types.js.map +1 -1
  243. package/dist/parquetjs/schema/variant.d.ts +3 -0
  244. package/dist/parquetjs/schema/variant.d.ts.map +1 -0
  245. package/dist/parquetjs/schema/variant.js +248 -0
  246. package/dist/parquetjs/schema/variant.js.map +1 -0
  247. package/dist/parquetjs/utils/crc32.d.ts +3 -0
  248. package/dist/parquetjs/utils/crc32.d.ts.map +1 -0
  249. package/dist/parquetjs/utils/crc32.js +15 -0
  250. package/dist/parquetjs/utils/crc32.js.map +1 -0
  251. package/dist/parquetjs/utils/read-utils.d.ts +11 -1
  252. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  253. package/dist/parquetjs/utils/read-utils.js +21 -1
  254. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  255. package/dist/unbundled.d.ts +2 -1
  256. package/dist/unbundled.d.ts.map +1 -1
  257. package/dist/unbundled.js +1 -0
  258. package/dist/unbundled.js.map +1 -1
  259. package/package.json +36 -11
  260. package/src/bundled.ts +3 -0
  261. package/src/delta-format.ts +12 -0
  262. package/src/delta-source-loader-types.ts +40 -0
  263. package/src/delta-source.ts +305 -0
  264. package/src/delta-types.ts +40 -0
  265. package/src/iceberg-rest-catalog.ts +122 -0
  266. package/src/iceberg-table-source.ts +1037 -0
  267. package/src/iceberg-types.ts +165 -0
  268. package/src/index.ts +50 -1
  269. package/src/lib/arrow/convert-schema-from-parquet.ts +113 -19
  270. package/src/lib/arrow/create-nested-arrow-vector.ts +116 -0
  271. package/src/lib/encoders/encode-table-to-parquet-js.ts +268 -7
  272. package/src/lib/geo/geoparquet-covering.ts +201 -0
  273. package/src/lib/geo/geospatial-metadata.ts +42 -15
  274. package/src/lib/parquet-bloom-filter-planner.ts +86 -0
  275. package/src/lib/parquet-bloom-filter.ts +345 -0
  276. package/src/lib/parquet-encryption.ts +344 -0
  277. package/src/lib/parquet-page-index.ts +180 -34
  278. package/src/lib/parquet-predicate.ts +52 -16
  279. package/src/lib/parquet-source-worker-decoder.ts +116 -20
  280. package/src/lib/parquet-source-worker-types.ts +25 -0
  281. package/src/lib/parsers/get-parquet-schema.ts +3 -1
  282. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +397 -17
  283. package/src/lib/parsers/parse-parquet-to-arrow.ts +4 -5
  284. package/src/lib/parsers/parse-parquet-to-columns.ts +3 -1
  285. package/src/lib/parsers/parse-parquet-to-json.ts +18 -2
  286. package/src/lib/slice-parquet-batch.ts +32 -0
  287. package/src/lib/sources/parquet-range-file.ts +35 -29
  288. package/src/lib/utils/normalize-parquet-options.ts +17 -1
  289. package/src/parquet-dataset-source.ts +397 -85
  290. package/src/parquet-js-loader-types.ts +1 -0
  291. package/src/parquet-js-loader.ts +2 -1
  292. package/src/parquet-js-writer.ts +30 -0
  293. package/src/parquet-loader-options.ts +11 -0
  294. package/src/parquet-source-capabilities.ts +18 -1
  295. package/src/parquet-source-loader-types.ts +10 -0
  296. package/src/parquet-source-loader.ts +929 -52
  297. package/src/parquet-source-types.ts +197 -28
  298. package/src/parquet-worker-url.ts +6 -1
  299. package/src/parquetjs/codecs/declare.ts +27 -0
  300. package/src/parquetjs/codecs/delta.ts +466 -6
  301. package/src/parquetjs/codecs/index.ts +4 -0
  302. package/src/parquetjs/codecs/plain.ts +177 -11
  303. package/src/parquetjs/codecs/rle.ts +573 -3
  304. package/src/parquetjs/compression.ts +102 -76
  305. package/src/parquetjs/encoder/dictionary-planner.ts +7 -2
  306. package/src/parquetjs/encoder/parquet-encoder.ts +1016 -38
  307. package/src/parquetjs/parquet-thrift/BoundingBox.ts +108 -0
  308. package/src/parquetjs/parquet-thrift/ColumnChunk.ts +35 -0
  309. package/src/parquetjs/parquet-thrift/ColumnCryptoMetaData.ts +139 -0
  310. package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +73 -0
  311. package/src/parquetjs/parquet-thrift/EncryptionAlgorithm.ts +127 -0
  312. package/src/parquetjs/parquet-thrift/FileCryptoMetaData.ts +60 -0
  313. package/src/parquetjs/parquet-thrift/FileMetaData.ts +35 -0
  314. package/src/parquetjs/parquet-thrift/GeospatialStatistics.ts +68 -0
  315. package/src/parquetjs/parquet-thrift/SizeStatistics.ts +98 -0
  316. package/src/parquetjs/parquet-thrift/index.ts +6 -0
  317. package/src/parquetjs/parser/decoders.ts +451 -26
  318. package/src/parquetjs/parser/parquet-reader.ts +935 -87
  319. package/src/parquetjs/schema/declare.ts +22 -2
  320. package/src/parquetjs/schema/schema.ts +10 -0
  321. package/src/parquetjs/schema/shred.ts +238 -11
  322. package/src/parquetjs/schema/types.ts +16 -25
  323. package/src/parquetjs/schema/variant.ts +313 -0
  324. package/src/parquetjs/utils/crc32.ts +15 -0
  325. package/src/parquetjs/utils/read-utils.ts +26 -1
  326. package/src/unbundled.ts +14 -0
@@ -0,0 +1,165 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ /** Minimal Iceberg table metadata shape needed for read-only table discovery. */
6
+ export type IcebergTableMetadata = {
7
+ /** Iceberg metadata format version. */
8
+ readonly 'format-version': 1 | 2 | 3;
9
+ /** Table UUID when supplied by the writer. */
10
+ readonly 'table-uuid'?: string;
11
+ /** Root location used to resolve manifest and data-file paths. */
12
+ readonly location: string;
13
+ /** Current snapshot identifier, or `-1` when the table has no snapshot. */
14
+ readonly 'current-snapshot-id'?: number;
15
+ /** Snapshot sequence number. */
16
+ readonly 'last-sequence-number'?: number;
17
+ /** Metadata update time in milliseconds since the Unix epoch. */
18
+ readonly 'last-updated-ms'?: number;
19
+ /** Current schema identifier. */
20
+ readonly 'current-schema-id'?: number;
21
+ /** Schemas declared by the table metadata. */
22
+ readonly schemas?: readonly IcebergSchema[];
23
+ /** Partition specifications declared by the table metadata. */
24
+ readonly 'partition-specs'?: readonly IcebergPartitionSpec[];
25
+ /** Default partition specification identifier. */
26
+ readonly 'default-spec-id'?: number;
27
+ /** Table snapshots. */
28
+ readonly snapshots?: readonly IcebergSnapshot[];
29
+ /** Named snapshot references such as `main`, branches, and tags. */
30
+ readonly refs?: Readonly<Record<string, IcebergSnapshotReference>>;
31
+ /** Table properties. */
32
+ readonly properties?: Readonly<Record<string, string>>;
33
+ /** Additional Iceberg metadata fields retained for forward compatibility. */
34
+ readonly [key: string]: unknown;
35
+ };
36
+
37
+ /** Named Iceberg branch or tag reference. */
38
+ export type IcebergSnapshotReference = Readonly<Record<string, unknown>> & {
39
+ readonly 'snapshot-id': number;
40
+ readonly type?: 'branch' | 'tag' | string;
41
+ };
42
+
43
+ /** Iceberg schema metadata retained without imposing a schema-model dependency. */
44
+ export type IcebergSchema = Readonly<Record<string, unknown>> & {
45
+ readonly 'schema-id'?: number;
46
+ readonly fields?: readonly Readonly<Record<string, unknown>>[];
47
+ };
48
+
49
+ /** Iceberg partition specification metadata. */
50
+ export type IcebergPartitionSpec = Readonly<Record<string, unknown>> & {
51
+ readonly 'spec-id'?: number;
52
+ readonly fields?: readonly Readonly<Record<string, unknown>>[];
53
+ };
54
+
55
+ /** Iceberg snapshot metadata used to select a manifest list. */
56
+ export type IcebergSnapshot = Readonly<Record<string, unknown>> & {
57
+ readonly 'snapshot-id': number;
58
+ readonly 'sequence-number'?: number;
59
+ readonly 'manifest-list'?: string;
60
+ readonly 'schema-id'?: number;
61
+ readonly summary?: Readonly<Record<string, string>>;
62
+ };
63
+
64
+ /** One data or delete manifest referenced by an Iceberg manifest list. */
65
+ export type IcebergManifestFile = Readonly<Record<string, unknown>> & {
66
+ readonly manifest_path: string;
67
+ readonly manifest_length?: number;
68
+ readonly partition_spec_id?: number;
69
+ readonly content?: number | string;
70
+ };
71
+
72
+ /** One data or delete file entry decoded from an Iceberg manifest. */
73
+ export type IcebergDataFile = Readonly<Record<string, unknown>> & {
74
+ readonly file_path: string;
75
+ readonly file_format: string;
76
+ readonly file_size_in_bytes?: number;
77
+ readonly record_count?: number;
78
+ readonly partition?: Readonly<Record<string, unknown>>;
79
+ readonly lower_bounds?: Readonly<Record<string, unknown>>;
80
+ readonly upper_bounds?: Readonly<Record<string, unknown>>;
81
+ readonly content?: number | string;
82
+ readonly referenced_data_file?: string;
83
+ readonly equality_ids?: readonly number[];
84
+ readonly sort_order_id?: number;
85
+ readonly data_sequence_number?: number;
86
+ };
87
+
88
+ /** Parquet data-file plan produced by the Iceberg manifest reader. */
89
+ export type IcebergParquetFile = {
90
+ readonly data: string;
91
+ readonly fileSize?: number;
92
+ readonly recordCount?: number;
93
+ readonly partition?: Readonly<Record<string, unknown>>;
94
+ readonly lowerBounds?: Readonly<Record<string, unknown>>;
95
+ readonly upperBounds?: Readonly<Record<string, unknown>>;
96
+ /** Manifest path that contributed this file. */
97
+ readonly manifestPath?: string;
98
+ /** Partition specification identifier for this manifest. */
99
+ readonly partitionSpecId?: number;
100
+ /** Snapshot used to produce this plan. */
101
+ readonly snapshotId?: number;
102
+ /** Iceberg data sequence number when supplied by the manifest entry. */
103
+ readonly dataSequenceNumber?: number;
104
+ /** Schema identifier used by the snapshot that contributed this file. */
105
+ readonly schemaId?: number;
106
+ };
107
+
108
+ /** Planned Iceberg delete file retained for optional delete application during a scan. */
109
+ export type IcebergDeleteFile = {
110
+ /** URL or path of the delete file. */
111
+ readonly data: string;
112
+ /** Iceberg delete-file format, commonly `avro` or `puffin`. */
113
+ readonly format: string;
114
+ /** Delete content kind, such as position or equality deletes. */
115
+ readonly content?: number | string;
116
+ /** Referenced data file for a position delete file. */
117
+ readonly referencedDataFile?: string;
118
+ /** Field IDs used by an equality delete file. */
119
+ readonly equalityFieldIds?: readonly number[];
120
+ /** File size from the manifest. */
121
+ readonly fileSize?: number;
122
+ /** Record count from the manifest. */
123
+ readonly recordCount?: number;
124
+ /** Partition values from the manifest. */
125
+ readonly partition?: Readonly<Record<string, unknown>>;
126
+ /** Manifest path that contributed this delete file. */
127
+ readonly manifestPath?: string;
128
+ /** Partition specification identifier for this manifest. */
129
+ readonly partitionSpecId?: number;
130
+ /** Snapshot used to produce this plan. */
131
+ readonly snapshotId?: number;
132
+ /** Schema identifier used by the snapshot that contributed this delete file. */
133
+ readonly schemaId?: number;
134
+ /** Iceberg data sequence number associated with this delete file. */
135
+ readonly dataSequenceNumber?: number;
136
+ };
137
+
138
+ /** Files selected from one Iceberg snapshot before delete application. */
139
+ export type IcebergScanPlan = {
140
+ /** Active Parquet data files selected from data manifests. */
141
+ readonly dataFiles: readonly IcebergParquetFile[];
142
+ /** Delete files discovered from delete manifests. */
143
+ readonly deleteFiles: readonly IcebergDeleteFile[];
144
+ /** Snapshot identifier used to build the plan. */
145
+ readonly snapshotId?: number;
146
+ /** Named snapshot reference used to build this plan, when supplied. */
147
+ readonly snapshotRef?: string;
148
+ };
149
+
150
+ /** Axis-aligned geographic bounds in `[minX, minY, maxX, maxY]` order. */
151
+ export type IcebergBoundingBox = readonly [number, number, number, number];
152
+
153
+ /** Conservative spatial filter used for Iceberg file-level pruning. */
154
+ export type IcebergSpatialFilter = {
155
+ /** Top-level geometry column or Iceberg field name whose bounds are being queried. */
156
+ readonly column: string;
157
+ /** Query envelope in `[minX, minY, maxX, maxY]` order. */
158
+ readonly bbox: IcebergBoundingBox;
159
+ };
160
+
161
+ /** Options for constructing a read-only Iceberg table source. */
162
+ export type IcebergTableSourceOptions = {
163
+ /** HTTP headers forwarded to metadata requests. */
164
+ readonly headers?: HeadersInit;
165
+ };
package/src/index.ts CHANGED
@@ -16,13 +16,19 @@ export type {
16
16
  ParquetBatch,
17
17
  ParquetBatchMetadata,
18
18
  ParquetBatchProvenance,
19
+ ParquetBoundingBox,
19
20
  ParquetColumnChunkMetadata,
20
21
  ParquetColumnChunkStatistics,
22
+ ParquetColumnChunkSizeStatistics,
23
+ ParquetGeospatialBoundingBox,
24
+ ParquetGeospatialStatistics,
21
25
  ParquetDatasetBatch,
22
26
  ParquetDatasetBatchProvenance,
23
27
  ParquetDatasetBoundingBox,
28
+ ParquetDatasetExplain,
24
29
  ParquetDatasetFile,
25
30
  ParquetDatasetFileCollection,
31
+ ParquetDatasetFileScanPlan,
26
32
  ParquetDatasetFileProvider,
27
33
  ParquetDatasetFileQuery,
28
34
  ParquetDatasetFiles,
@@ -32,6 +38,7 @@ export type {
32
38
  ParquetDatasetTelemetry,
33
39
  ParquetMetadataRequestOptions,
34
40
  ParquetObjectVersion,
41
+ ParquetPageScanPlan,
35
42
  ParquetComparisonPredicate,
36
43
  ParquetInPredicate,
37
44
  ParquetLogicalPredicate,
@@ -43,22 +50,49 @@ export type {
43
50
  ParquetRangeRequestOptions,
44
51
  ParquetReadOptions,
45
52
  ParquetRowGroupMetadata,
53
+ ParquetSortingColumn,
46
54
  ParquetSourceBatch,
47
55
  ParquetSourceLoaderOptions,
48
56
  ParquetSourceMetadata,
49
57
  ParquetSourceReadOptions,
58
+ ParquetSourceExplain,
50
59
  ParquetTelemetry,
51
60
  ParquetTelemetryEvent
52
61
  } from './parquet-source-types';
53
62
  export {
63
+ PARQUET_TABLE_QUERY_CAPABILITIES,
54
64
  PARQUET_SOURCE_CAPABILITIES,
55
65
  type ParquetSourceCapabilities
56
66
  } from './parquet-source-capabilities';
57
67
 
58
68
  export {ParquetWriter} from './parquet-writer';
59
- export type {ParquetJSWriterEncoding, ParquetJSWriterOptions} from './parquet-js-writer';
69
+ export type {
70
+ ParquetJSWriterEncoding,
71
+ ParquetJSWriterOptions,
72
+ ParquetSortingColumnOption,
73
+ ParquetWriterEncryptionOptions,
74
+ ParquetWriterFooterSignatureOptions
75
+ } from './parquet-js-writer';
60
76
  export {ParquetJSWriter} from './parquet-js-writer';
61
77
 
78
+ export {
79
+ decodeParquetColumnIndex,
80
+ decodeParquetPageStatisticsValue,
81
+ canUseParquetPageIndexForColumn,
82
+ type ParquetPageStatistics
83
+ } from './lib/parquet-page-index';
84
+ export {
85
+ createParquetModuleAad,
86
+ decryptParquetModule,
87
+ encryptParquetModule,
88
+ createParquetFooterSignature,
89
+ readParquetEncryptedModule,
90
+ verifyParquetFooterSignature,
91
+ type ParquetDecryptModuleOptions,
92
+ type ParquetEncryptionAlgorithm,
93
+ type ParquetKeyRetriever
94
+ } from './lib/parquet-encryption';
95
+
62
96
  // EXPERIMENTAL - expose the internal parquetjs API
63
97
 
64
98
  export {preloadCompressions} from './parquetjs/compression';
@@ -71,3 +105,18 @@ export {
71
105
  convertParquetSchema,
72
106
  convertParquetSchema as convertParquetToArrowSchema
73
107
  } from './lib/arrow/convert-schema-from-parquet';
108
+
109
+ export {
110
+ checkParquetSplitBlockBloomFilter,
111
+ decodeParquetSplitBlockBloomFilter,
112
+ encodeParquetBloomFilterValue,
113
+ encodeParquetSplitBlockBloomFilter,
114
+ hashParquetBloomFilterValue,
115
+ insertParquetSplitBlockBloomFilter,
116
+ type ParquetBloomFilterPhysicalType,
117
+ type ParquetSplitBlockBloomFilter
118
+ } from './lib/parquet-bloom-filter';
119
+ export {
120
+ getParquetBloomFilterProbes,
121
+ type ParquetBloomFilterProbe
122
+ } from './lib/parquet-bloom-filter-planner';
@@ -52,9 +52,10 @@ export const PARQUET_TYPE_MAPPING: {[type in ParquetType]: DataType} = {
52
52
 
53
53
  export function convertParquetSchema(
54
54
  parquetSchema: ParquetSchema,
55
- parquetMetadata: FileMetaData | null
55
+ parquetMetadata: FileMetaData | null,
56
+ options?: {int96AsTimestamp?: boolean}
56
57
  ): Schema {
57
- const fields = getFields(parquetSchema.schema);
58
+ const fields = getFields(parquetSchema.schema, options);
58
59
  const metadata = parquetMetadata && getSchemaMetadata(parquetMetadata);
59
60
 
60
61
  const schema: Schema = {
@@ -65,31 +66,28 @@ export function convertParquetSchema(
65
66
  return schema;
66
67
  }
67
68
 
68
- function getFields(schema: SchemaDefinition): Field[] {
69
+ function getFields(schema: SchemaDefinition, options?: {int96AsTimestamp?: boolean}): Field[] {
69
70
  const fields: Field[] = [];
70
71
 
71
72
  for (const name in schema) {
72
- fields.push(getField(name, schema[name]));
73
+ fields.push(getField(name, schema[name], options));
73
74
  }
74
75
 
75
76
  return fields;
76
77
  }
77
78
 
78
79
  /** Converts one Parquet field, preserving repeated values as Arrow lists. */
79
- function getField(name: string, field: FieldDefinition): Field {
80
- const elementField: Field = field.fields
81
- ? {
82
- name,
83
- type: {type: 'struct', children: getFields(field.fields)},
84
- nullable: Boolean(field.optional),
85
- metadata: getFieldMetadata(field)
86
- }
87
- : {
88
- name,
89
- type: getFieldType(field),
90
- nullable: Boolean(field.optional),
91
- metadata: getFieldMetadata(field)
92
- };
80
+ function getField(
81
+ name: string,
82
+ field: FieldDefinition,
83
+ options?: {int96AsTimestamp?: boolean}
84
+ ): Field {
85
+ const elementField: Field = {
86
+ name,
87
+ type: getFieldValueType(field, options),
88
+ nullable: Boolean(field.optional),
89
+ metadata: getFieldMetadata(field)
90
+ };
93
91
 
94
92
  if (!field.repeated) {
95
93
  return elementField;
@@ -106,8 +104,95 @@ function getField(name: string, field: FieldDefinition): Field {
106
104
  };
107
105
  }
108
106
 
107
+ /** Converts a nested Parquet definition into its corresponding Arrow data type. */
108
+ function getFieldValueType(
109
+ field: FieldDefinition,
110
+ options?: {int96AsTimestamp?: boolean}
111
+ ): DataType {
112
+ if (!field.fields) {
113
+ return getFieldType(field, options);
114
+ }
115
+
116
+ if (field.logicalType?.type === 'LIST') {
117
+ const element = field.fields.list?.fields?.element || field.fields.element;
118
+ if (!element) {
119
+ // Preserve unusual legacy LIST layouts as structs. Their group names and
120
+ // repetition levels are still available to the row-materialization path.
121
+ return {type: 'struct', children: getFields(field.fields, options)};
122
+ }
123
+ if (
124
+ (element.logicalType?.type === 'LIST' &&
125
+ (!isStandardListDefinition(element) || element.optional !== false)) ||
126
+ (element.logicalType?.type === 'MAP' &&
127
+ (!isStandardMapDefinition(element) || element.optional !== false))
128
+ ) {
129
+ // Preserve nested legacy wrappers. Arrow's high-level List/Map type
130
+ // cannot describe the historical wrapper shape without changing the
131
+ // object-row contract used by existing callers.
132
+ return {type: 'struct', children: getFields(field.fields, options)};
133
+ }
134
+ return {
135
+ type: 'list',
136
+ children: [
137
+ {
138
+ name: 'element',
139
+ type: getFieldValueType(element, options),
140
+ nullable: Boolean(element.optional)
141
+ }
142
+ ]
143
+ };
144
+ }
145
+
146
+ if (field.logicalType?.type === 'MAP') {
147
+ const entry = field.fields.key_value?.fields || field.fields;
148
+ const key = entry?.key;
149
+ const value = entry?.value;
150
+ if (!key || !value) {
151
+ // Preserve unusual legacy MAP layouts as structs rather than rejecting a
152
+ // file whose converted annotation does not follow the standard wrapper.
153
+ return {type: 'struct', children: getFields(field.fields, options)};
154
+ }
155
+ return {
156
+ type: 'map',
157
+ keysSorted: false,
158
+ children: [
159
+ {
160
+ name: 'entries',
161
+ type: {
162
+ type: 'struct',
163
+ children: [
164
+ {name: 'key', type: getFieldValueType(key, options), nullable: false},
165
+ {
166
+ name: 'value',
167
+ type: getFieldValueType(value, options),
168
+ nullable: Boolean(value.optional)
169
+ }
170
+ ]
171
+ },
172
+ nullable: false
173
+ }
174
+ ]
175
+ };
176
+ }
177
+
178
+ return {type: 'struct', children: getFields(field.fields, options)};
179
+ }
180
+
181
+ /** Returns whether a nested LIST follows the standard list/list/element wrapper. */
182
+ function isStandardListDefinition(field: FieldDefinition): boolean {
183
+ return Boolean(field.fields?.list?.fields?.element);
184
+ }
185
+
186
+ /** Returns whether a nested MAP follows the standard map/key_value/key/value wrapper. */
187
+ function isStandardMapDefinition(field: FieldDefinition): boolean {
188
+ return Boolean(field.fields?.key_value?.fields?.key && field.fields.key_value.fields.value);
189
+ }
190
+
109
191
  /** Returns the exact serialized Arrow type for one decoded Parquet field. */
110
- function getFieldType(field: FieldDefinition): DataType {
192
+ function getFieldType(field: FieldDefinition, options?: {int96AsTimestamp?: boolean}): DataType {
193
+ if (field.type === 'INT96' && options?.int96AsTimestamp) {
194
+ return 'timestamp-nanosecond';
195
+ }
111
196
  if (field.logicalType?.type === 'DECIMAL') {
112
197
  const precision = field.precision ?? field.presision;
113
198
  const scale = field.scale;
@@ -129,6 +214,15 @@ function getFieldType(field: FieldDefinition): DataType {
129
214
  function getFieldMetadata(field: FieldDefinition): Record<string, string> | undefined {
130
215
  let metadata: Record<string, string> | undefined;
131
216
 
217
+ if (
218
+ field.logicalType?.type === 'VARIANT' &&
219
+ field.logicalType.specificationVersion !== undefined
220
+ ) {
221
+ metadata = {
222
+ 'parquet.variant.specification_version': String(field.logicalType.specificationVersion)
223
+ };
224
+ }
225
+
132
226
  for (const key in field) {
133
227
  const fieldValue = field[key];
134
228
  if (
@@ -416,6 +416,16 @@ function createSelectedPrimitiveData(
416
416
  columnData: ParquetColumnChunk,
417
417
  selected: SelectedLeafValues
418
418
  ): arrow.Data | undefined {
419
+ const directData = createSelectedPrimitiveArrayView(
420
+ arrowType,
421
+ parquetField,
422
+ columnData,
423
+ selected
424
+ );
425
+ if (directData) {
426
+ return arrow.makeData({type: arrowType, data: directData, nullCount: 0} as any);
427
+ }
428
+
419
429
  const data = createNestedPrimitiveArray(arrowType, parquetField, selected.length);
420
430
  if (!data) {
421
431
  return undefined;
@@ -437,6 +447,75 @@ function createSelectedPrimitiveData(
437
447
  } as any);
438
448
  }
439
449
 
450
+ /** Reuses a contiguous decoded primitive range when nested selection needs no null expansion. */
451
+ function createSelectedPrimitiveArrayView(
452
+ arrowType: arrow.DataType,
453
+ parquetField: ParquetField,
454
+ columnData: ParquetColumnChunk,
455
+ selected: SelectedLeafValues
456
+ ): NestedPrimitiveArrowArray | undefined {
457
+ if (selected.nullCount || selected.length !== selected.valueCount) {
458
+ return undefined;
459
+ }
460
+ const values = getMatchingNestedPrimitiveArray(arrowType, parquetField, columnData.values);
461
+ return values?.subarray(
462
+ selected.firstValueIndex,
463
+ selected.firstValueIndex + selected.valueCount
464
+ ) as NestedPrimitiveArrowArray | undefined;
465
+ }
466
+
467
+ /** Returns decoded nested values when their physical array exactly matches the Arrow type. */
468
+ function getMatchingNestedPrimitiveArray(
469
+ arrowType: arrow.DataType,
470
+ parquetField: ParquetField,
471
+ values: ParquetColumnChunk['values']
472
+ ): NestedPrimitiveArrowArray | undefined {
473
+ if (
474
+ parquetField.primitiveType === 'FLOAT' &&
475
+ arrowType instanceof arrow.Float32 &&
476
+ values instanceof Float32Array
477
+ ) {
478
+ return values;
479
+ }
480
+ if (
481
+ parquetField.primitiveType === 'DOUBLE' &&
482
+ arrowType instanceof arrow.Float64 &&
483
+ values instanceof Float64Array
484
+ ) {
485
+ return values;
486
+ }
487
+ if (parquetField.primitiveType === 'INT32') {
488
+ if (arrowType instanceof arrow.Int8 && values instanceof Int8Array) return values;
489
+ if (arrowType instanceof arrow.Int16 && values instanceof Int16Array) return values;
490
+ if (
491
+ (arrowType instanceof arrow.Int32 ||
492
+ arrowType instanceof arrow.DateDay ||
493
+ arrowType instanceof arrow.TimeMillisecond) &&
494
+ values instanceof Int32Array
495
+ ) {
496
+ return values;
497
+ }
498
+ if (arrowType instanceof arrow.Uint8 && values instanceof Uint8Array) return values;
499
+ if (arrowType instanceof arrow.Uint16 && values instanceof Uint16Array) return values;
500
+ if (arrowType instanceof arrow.Uint32 && values instanceof Uint32Array) return values;
501
+ }
502
+ if (parquetField.primitiveType === 'INT64') {
503
+ if (
504
+ (arrowType instanceof arrow.Int64 ||
505
+ arrowType instanceof arrow.TimeMicrosecond ||
506
+ arrowType instanceof arrow.TimeNanosecond ||
507
+ arrowType instanceof arrow.TimestampMillisecond ||
508
+ arrowType instanceof arrow.TimestampMicrosecond ||
509
+ arrowType instanceof arrow.TimestampNanosecond) &&
510
+ values instanceof BigInt64Array
511
+ ) {
512
+ return values;
513
+ }
514
+ if (arrowType instanceof arrow.Uint64 && values instanceof BigUint64Array) return values;
515
+ }
516
+ return undefined;
517
+ }
518
+
440
519
  /** Allocates the Arrow array matching an unconverted physical Parquet primitive. */
441
520
  function createNestedPrimitiveArray(
442
521
  arrowType: arrow.DataType,
@@ -517,6 +596,9 @@ function createSelectedByteData(
517
596
  if (!supportsNestedByteData(arrowType, parquetField)) {
518
597
  return undefined;
519
598
  }
599
+ if (columnData.byteArrayData) {
600
+ return createSelectedBufferedByteData(arrowType, columnData, selected);
601
+ }
520
602
 
521
603
  const byteValues = columnData.values as Uint8Array[];
522
604
  const valueOffsets = new Int32Array(selected.length + 1);
@@ -556,6 +638,36 @@ function createSelectedByteData(
556
638
  } as any);
557
639
  }
558
640
 
641
+ /** Creates selected nested Arrow bytes from the decoder's compact physical value buffer. */
642
+ function createSelectedBufferedByteData(
643
+ arrowType: arrow.DataType,
644
+ columnData: ParquetColumnChunk,
645
+ selected: SelectedLeafValues
646
+ ): arrow.Data {
647
+ const byteArrayData = columnData.byteArrayData!;
648
+ const valueOffsets = new Int32Array(selected.length + 1);
649
+ let sourceValueIndex = selected.firstValueIndex;
650
+ let dataByteLength = 0;
651
+ for (let outputIndex = 0; outputIndex < selected.length; outputIndex++) {
652
+ if (!selected.nullBitmap || selected.nullBitmap[outputIndex >> 3] & (1 << (outputIndex & 7))) {
653
+ dataByteLength +=
654
+ byteArrayData.valueOffsets[sourceValueIndex + 1] -
655
+ byteArrayData.valueOffsets[sourceValueIndex];
656
+ sourceValueIndex++;
657
+ }
658
+ valueOffsets[outputIndex + 1] = dataByteLength;
659
+ }
660
+ const firstByteOffset = byteArrayData.valueOffsets[selected.firstValueIndex];
661
+ const lastByteOffset = byteArrayData.valueOffsets[selected.firstValueIndex + selected.valueCount];
662
+ return arrow.makeData({
663
+ type: arrowType,
664
+ valueOffsets,
665
+ data: byteArrayData.data.subarray(firstByteOffset, lastByteOffset),
666
+ nullBitmap: selected.nullBitmap,
667
+ nullCount: selected.nullCount
668
+ } as any);
669
+ }
670
+
559
671
  /** Returns whether one Parquet byte leaf maps directly to Arrow Utf8 or Binary. */
560
672
  function supportsNestedByteData(arrowType: arrow.DataType, parquetField: ParquetField): boolean {
561
673
  if (arrowType instanceof arrow.Utf8) {
@@ -564,6 +676,10 @@ function supportsNestedByteData(arrowType: arrow.DataType, parquetField: Parquet
564
676
  return (
565
677
  arrowType instanceof arrow.Binary &&
566
678
  (!parquetField.originalType ||
679
+ parquetField.originalType === 'JSON' ||
680
+ parquetField.originalType === 'BSON' ||
681
+ parquetField.originalType === 'INTERVAL' ||
682
+ parquetField.originalType === 'VARIANT' ||
567
683
  parquetField.originalType === 'GEOMETRY' ||
568
684
  parquetField.originalType === 'GEOGRAPHY') &&
569
685
  (parquetField.primitiveType === 'BYTE_ARRAY' ||