@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
@@ -5,12 +5,22 @@
5
5
  // Forked from https://github.com/kbajalc/parquets under MIT license
6
6
  // Forked from https://github.com/ironSource/parquetjs under MIT license
7
7
 
8
- import type {Compression} from '@loaders.gl/compression';
9
8
  import {
10
- decompressWithNativeDecompressionStream,
11
- type NativeDecompressionFormat
12
- } from '@loaders.gl/compression/native-decompression';
13
- import {getJSModuleOrNull, registerJSModules} from '@loaders.gl/loader-utils';
9
+ BrotliCompressor,
10
+ BrotliDecompressor,
11
+ GZipCompressor,
12
+ GZipDecompressor,
13
+ LZ4Compressor,
14
+ LZ4Decompressor,
15
+ SnappyCompressor,
16
+ SnappyDecompressor,
17
+ ZstdCompressor,
18
+ ZstdDecompressor,
19
+ Decompressor,
20
+ type Compressor
21
+ } from '@loaders.gl/compression';
22
+ import {SnappyHysnappyDecompressor} from '@loaders.gl/compression/snappy-decompressor-hysnappy';
23
+ import {registerJSModules} from '@loaders.gl/loader-utils';
14
24
 
15
25
  import {ParquetCompression} from './schema/declare';
16
26
  import {toArrayBuffer, toUint8Array} from './utils/binary-utils';
@@ -29,17 +39,40 @@ export const PARQUET_COMPRESSION_METHODS: Partial<Record<ParquetCompression, tru
29
39
  ZSTD: true
30
40
  };
31
41
 
32
- /** Native formats available to asynchronous Parquet page decompression. */
33
- const PARQUET_NATIVE_DECOMPRESSION_FORMATS: Partial<
34
- Record<ParquetCompression, NativeDecompressionFormat>
35
- > = {
36
- GZIP: 'gzip',
37
- BROTLI: 'brotli',
38
- ZSTD: 'zstd'
39
- };
42
+ /** Reader-scoped function that decompresses one independently encoded Parquet page. */
43
+ export type ParquetPageDecompressor = (value: Uint8Array, size: number) => Promise<Uint8Array>;
44
+
45
+ /** Fast Snappy decoder that permanently falls back to snappyjs when WASM is unavailable. */
46
+ class ParquetSnappyDecompressor extends Decompressor {
47
+ /** Compression format name. */
48
+ readonly name = 'snappy';
49
+ /** Snappy does not have a standard standalone file extension. */
50
+ readonly extensions: string[] = [];
51
+ /** Snappy does not have a standard HTTP content encoding. */
52
+ readonly contentEncodings: string[] = [];
53
+ /** snappyjs keeps this composite decoder available without WebAssembly. */
54
+ readonly isSupported = true;
55
+ /** Preferred compact WASM decoder for page-sized frames. */
56
+ private readonly hysnappy = new SnappyHysnappyDecompressor();
57
+ /** Always-supported JavaScript decoder. */
58
+ private readonly snappyjs = new SnappyDecompressor();
59
+ /** Whether this instance has selected the JavaScript fallback. */
60
+ private useSnappyjs = !this.hysnappy.isSupported;
40
61
 
41
- /** Lazily constructed codec-backed compression implementations. */
42
- const compressionPromises: Partial<Record<ParquetCompression, Promise<Compression>>> = {};
62
+ /** Decodes with hysnappy, retaining snappyjs after the first WASM setup or runtime failure. */
63
+ override async decompress(input: ArrayBuffer, size?: number): Promise<ArrayBuffer> {
64
+ if (!this.useSnappyjs) {
65
+ try {
66
+ return await this.hysnappy.decompress(input, size);
67
+ } catch {
68
+ // CSP can reject WebAssembly compilation even when the WebAssembly global exists. Once
69
+ // that happens, avoid paying the same rejected initialization cost for every Parquet page.
70
+ this.useSnappyjs = true;
71
+ }
72
+ }
73
+ return await this.snappyjs.decompress(input, size);
74
+ }
75
+ }
43
76
 
44
77
  /**
45
78
  * Registers optional codec modules without eagerly loading codec-backed implementations.
@@ -61,7 +94,7 @@ export async function deflate(method: ParquetCompression, value: Uint8Array): Pr
61
94
  return value;
62
95
  }
63
96
 
64
- const compression = await getParquetCompression(method);
97
+ const compression = await getParquetCompressor(method);
65
98
  const inputArrayBuffer = toArrayBuffer(value);
66
99
  const compressedArrayBuffer = await compression.compress(inputArrayBuffer);
67
100
  return toUint8Array(compressedArrayBuffer);
@@ -83,79 +116,72 @@ export async function decompress(
83
116
  return toUint8Array(inputArrayBuffer);
84
117
  }
85
118
 
86
- const nativeFormat = PARQUET_NATIVE_DECOMPRESSION_FORMATS[method];
87
- if (nativeFormat && shouldUseNativeDecompressionStream(method)) {
88
- const nativeOutput = await decompressWithNativeDecompressionStream(
89
- inputArrayBuffer,
90
- nativeFormat
91
- );
92
- if (nativeOutput) {
93
- return toUint8Array(nativeOutput);
94
- }
95
- }
96
-
97
- const compression = await getParquetCompression(method);
119
+ const compression = await getParquetDecompressor(method);
98
120
  const compressedArrayBuffer = await compression.decompress(inputArrayBuffer, size);
99
121
  return toUint8Array(compressedArrayBuffer);
100
122
  }
101
123
 
102
124
  /**
103
- * Returns whether a native stream can take precedence for one Parquet compression method.
125
+ * Creates a reusable decoder for the independently compressed pages in one Parquet reader.
104
126
  *
105
- * @param method Parquet compression method.
106
- * @returns Whether no explicitly registered codec should take precedence.
127
+ * Reusing the lazy codec preserves its selected backend and avoids repeating dynamic import and
128
+ * preload work for every page while keeping module injection scoped to a reader invocation.
107
129
  */
108
- function shouldUseNativeDecompressionStream(method: ParquetCompression): boolean {
109
- if (method === 'BROTLI') {
110
- return !getJSModuleOrNull('brotli');
111
- }
112
- if (method === 'ZSTD') {
113
- return !getJSModuleOrNull('zstd-codec');
114
- }
115
- return true;
130
+ export function createParquetPageDecompressor(method: ParquetCompression): ParquetPageDecompressor {
131
+ const decompressor = method === 'UNCOMPRESSED' ? null : createParquetDecompressor(method);
132
+ return async (value: Uint8Array, size: number): Promise<Uint8Array> => {
133
+ const inputArrayBuffer = toArrayBuffer(value);
134
+ if (!decompressor) {
135
+ return toUint8Array(inputArrayBuffer);
136
+ }
137
+ const decompressedArrayBuffer = await decompressor.decompress(inputArrayBuffer, size);
138
+ return toUint8Array(decompressedArrayBuffer);
139
+ };
116
140
  }
117
141
 
118
- /**
119
- * Loads one codec-backed implementation only after native decompression is unavailable.
120
- *
121
- * @param method Parquet compression method.
122
- * @returns Codec-backed compression implementation.
123
- */
124
- async function getParquetCompression(method: ParquetCompression): Promise<Compression> {
125
- compressionPromises[method] ||= createParquetCompression(method);
126
- return await compressionPromises[method];
142
+ /** Returns a new lazily selecting compressor for one Parquet method. */
143
+ async function getParquetCompressor(method: ParquetCompression): Promise<Compressor> {
144
+ return createParquetCompressor(method);
127
145
  }
128
146
 
129
- /**
130
- * Creates one lazily loaded codec-backed Parquet compression implementation.
131
- *
132
- * @param method Parquet compression method.
133
- * @returns Codec-backed compression implementation.
134
- */
135
- async function createParquetCompression(method: ParquetCompression): Promise<Compression> {
147
+ /** Returns a new lazily selecting decompressor for one Parquet method. */
148
+ async function getParquetDecompressor(method: ParquetCompression): Promise<Decompressor> {
149
+ return createParquetDecompressor(method);
150
+ }
151
+
152
+ /** Creates the root-level default compressor for one Parquet method. */
153
+ function createParquetCompressor(method: ParquetCompression): Compressor {
136
154
  switch (method) {
137
- case 'GZIP': {
138
- const {GZipCompression} = await import('@loaders.gl/compression/gzip-compression');
139
- return new GZipCompression();
140
- }
141
- case 'SNAPPY': {
142
- const {SnappyCompression} = await import('@loaders.gl/compression/snappy-compression');
143
- return new SnappyCompression();
144
- }
145
- case 'BROTLI': {
146
- const {BrotliCompression} = await import('@loaders.gl/compression/brotli-compression');
147
- return new BrotliCompression();
148
- }
155
+ case 'GZIP':
156
+ return new GZipCompressor();
157
+ case 'SNAPPY':
158
+ return new SnappyCompressor();
159
+ case 'BROTLI':
160
+ return new BrotliCompressor();
149
161
  case 'LZ4':
150
- case 'LZ4_RAW': {
151
- const {LZ4Compression} = await import('@loaders.gl/compression/lz4-compression');
152
- const lz4js = getJSModuleOrNull('lz4js') || (await import('lz4js')).default;
153
- return new LZ4Compression({modules: {lz4js}});
154
- }
155
- case 'ZSTD': {
156
- const {ZstdCompression} = await import('@loaders.gl/compression/zstd-compression');
157
- return new ZstdCompression();
158
- }
162
+ case 'LZ4_RAW':
163
+ return new LZ4Compressor();
164
+ case 'ZSTD':
165
+ return new ZstdCompressor();
166
+ default:
167
+ throw new Error(`parquet: invalid compression method: ${method}`);
168
+ }
169
+ }
170
+
171
+ /** Creates the root-level default decompressor for one Parquet method. */
172
+ function createParquetDecompressor(method: ParquetCompression): Decompressor {
173
+ switch (method) {
174
+ case 'GZIP':
175
+ return new GZipDecompressor();
176
+ case 'SNAPPY':
177
+ return new ParquetSnappyDecompressor();
178
+ case 'BROTLI':
179
+ return new BrotliDecompressor();
180
+ case 'LZ4':
181
+ case 'LZ4_RAW':
182
+ return new LZ4Decompressor();
183
+ case 'ZSTD':
184
+ return new ZstdDecompressor();
159
185
  default:
160
186
  throw new Error(`parquet: invalid compression method: ${method}`);
161
187
  }
@@ -32,7 +32,12 @@ export function planDictionary(
32
32
  `Parquet dictionary page size limit must be a positive integer, received ${dictionaryPageSizeLimit}`
33
33
  );
34
34
  }
35
- if (policy === false || values.length === 0 || isDictionaryEncoding(column.encoding!)) {
35
+ if (policy === false || values.length === 0) {
36
+ if (policy === false && isDictionaryEncoding(column.encoding!)) {
37
+ throw new Error(
38
+ `Parquet column ${column.path.join('.')} requests ${column.encoding} but dictionary encoding is disabled`
39
+ );
40
+ }
36
41
  return undefined;
37
42
  }
38
43
 
@@ -58,7 +63,7 @@ export function planDictionary(
58
63
  return undefined;
59
64
  }
60
65
  const bitWidth = dictionaryValues.length <= 1 ? 0 : Math.ceil(Math.log2(dictionaryValues.length));
61
- if (policy === 'auto') {
66
+ if (policy === 'auto' && !isDictionaryEncoding(column.encoding!)) {
62
67
  const encodedIndices = PARQUET_CODECS.RLE_DICTIONARY.encodeValues(
63
68
  column.primitiveType!,
64
69
  indices,