@loaders.gl/parquet 4.5.3 → 5.0.0-alpha.10
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.
- package/LICENSE +14 -3
- package/dist/bundled.d.ts +9 -0
- package/dist/bundled.d.ts.map +1 -0
- package/dist/bundled.js +10 -0
- package/dist/bundled.js.map +1 -0
- package/dist/delta-format.d.ts +9 -0
- package/dist/delta-format.d.ts.map +1 -0
- package/dist/delta-format.js +12 -0
- package/dist/delta-format.js.map +1 -0
- package/dist/delta-source-loader-types.d.ts +27 -0
- package/dist/delta-source-loader-types.d.ts.map +1 -0
- package/dist/delta-source-loader-types.js +28 -0
- package/dist/delta-source-loader-types.js.map +1 -0
- package/dist/delta-source.d.ts +48 -0
- package/dist/delta-source.d.ts.map +1 -0
- package/dist/delta-source.js +222 -0
- package/dist/delta-source.js.map +1 -0
- package/dist/delta-types.d.ts +38 -0
- package/dist/delta-types.d.ts.map +1 -0
- package/dist/delta-types.js +5 -0
- package/dist/delta-types.js.map +1 -0
- package/dist/geoparquet-loader-with-parser.d.ts +33 -0
- package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
- package/dist/geoparquet-loader-with-parser.js +52 -0
- package/dist/geoparquet-loader-with-parser.js.map +1 -0
- package/dist/geoparquet-loader.d.ts +59 -0
- package/dist/geoparquet-loader.d.ts.map +1 -0
- package/dist/geoparquet-loader.js +30 -0
- package/dist/geoparquet-loader.js.map +1 -0
- package/dist/iceberg-rest-catalog.d.ts +49 -0
- package/dist/iceberg-rest-catalog.d.ts.map +1 -0
- package/dist/iceberg-rest-catalog.js +78 -0
- package/dist/iceberg-rest-catalog.js.map +1 -0
- package/dist/iceberg-table-source.d.ts +63 -0
- package/dist/iceberg-table-source.d.ts.map +1 -0
- package/dist/iceberg-table-source.js +797 -0
- package/dist/iceberg-table-source.js.map +1 -0
- package/dist/iceberg-types.d.ts +150 -0
- package/dist/iceberg-types.d.ts.map +1 -0
- package/dist/iceberg-types.js +5 -0
- package/dist/iceberg-types.js.map +1 -0
- package/dist/index.cjs +41568 -6781
- package/dist/index.cjs.map +3 -4
- package/dist/index.d.ts +15 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/arrow/convert-columns-to-row-group.js +3 -0
- package/dist/lib/arrow/convert-columns-to-row-group.js.map +1 -1
- package/dist/lib/arrow/convert-schema-from-parquet.d.ts +3 -1
- package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
- package/dist/lib/arrow/convert-schema-from-parquet.js +164 -29
- package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
- package/dist/lib/arrow/convert-schema-to-parquet.d.ts.map +1 -1
- package/dist/lib/arrow/convert-schema-to-parquet.js +16 -7
- package/dist/lib/arrow/convert-schema-to-parquet.js.map +1 -1
- package/dist/lib/arrow/create-nested-arrow-vector.d.ts +8 -0
- package/dist/lib/arrow/create-nested-arrow-vector.d.ts.map +1 -0
- package/dist/lib/arrow/create-nested-arrow-vector.js +485 -0
- package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -0
- package/dist/lib/constants.d.ts +0 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +1 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
- package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
- package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
- package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.js +394 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
- package/dist/lib/geo/geoparquet-covering.d.ts +19 -0
- package/dist/lib/geo/geoparquet-covering.d.ts.map +1 -0
- package/dist/lib/geo/geoparquet-covering.js +137 -0
- package/dist/lib/geo/geoparquet-covering.js.map +1 -0
- package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
- package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
- package/dist/lib/geo/geospatial-metadata.js +412 -0
- package/dist/lib/geo/geospatial-metadata.js.map +1 -0
- package/dist/lib/parquet-bloom-filter-planner.d.ts +16 -0
- package/dist/lib/parquet-bloom-filter-planner.d.ts.map +1 -0
- package/dist/lib/parquet-bloom-filter-planner.js +57 -0
- package/dist/lib/parquet-bloom-filter-planner.js.map +1 -0
- package/dist/lib/parquet-bloom-filter.d.ts +30 -0
- package/dist/lib/parquet-bloom-filter.d.ts.map +1 -0
- package/dist/lib/parquet-bloom-filter.js +289 -0
- package/dist/lib/parquet-bloom-filter.js.map +1 -0
- package/dist/lib/parquet-encryption.d.ts +80 -0
- package/dist/lib/parquet-encryption.d.ts.map +1 -0
- package/dist/lib/parquet-encryption.js +190 -0
- package/dist/lib/parquet-encryption.js.map +1 -0
- package/dist/lib/parquet-page-index.d.ts +91 -0
- package/dist/lib/parquet-page-index.d.ts.map +1 -0
- package/dist/lib/parquet-page-index.js +463 -0
- package/dist/lib/parquet-page-index.js.map +1 -0
- package/dist/lib/parquet-predicate.d.ts +21 -0
- package/dist/lib/parquet-predicate.d.ts.map +1 -0
- package/dist/lib/parquet-predicate.js +328 -0
- package/dist/lib/parquet-predicate.js.map +1 -0
- package/dist/lib/parquet-source-worker-client.d.ts +6 -0
- package/dist/lib/parquet-source-worker-client.d.ts.map +1 -0
- package/dist/lib/parquet-source-worker-client.js +24 -0
- package/dist/lib/parquet-source-worker-client.js.map +1 -0
- package/dist/lib/parquet-source-worker-decoder.d.ts +7 -0
- package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -0
- package/dist/lib/parquet-source-worker-decoder.js +181 -0
- package/dist/lib/parquet-source-worker-decoder.js.map +1 -0
- package/dist/lib/parquet-source-worker-file.d.ts +24 -0
- package/dist/lib/parquet-source-worker-file.d.ts.map +1 -0
- package/dist/lib/parquet-source-worker-file.js +40 -0
- package/dist/lib/parquet-source-worker-file.js.map +1 -0
- package/dist/lib/parquet-source-worker-types.d.ts +121 -0
- package/dist/lib/parquet-source-worker-types.d.ts.map +1 -0
- package/dist/lib/parquet-source-worker-types.js +5 -0
- package/dist/lib/parquet-source-worker-types.js.map +1 -0
- package/dist/lib/parquet-worker-transport.d.ts +8 -0
- package/dist/lib/parquet-worker-transport.d.ts.map +1 -0
- package/dist/lib/parquet-worker-transport.js +40 -0
- package/dist/lib/parquet-worker-transport.js.map +1 -0
- package/dist/lib/parsers/convert-parquet-tables.d.ts +16 -0
- package/dist/lib/parsers/convert-parquet-tables.d.ts.map +1 -0
- package/dist/lib/parsers/convert-parquet-tables.js +30 -0
- package/dist/lib/parsers/convert-parquet-tables.js.map +1 -0
- package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
- package/dist/lib/parsers/get-parquet-schema.js +6 -2
- package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
- package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
- package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
- package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
- package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-tables.d.ts +37 -0
- package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
- package/dist/lib/parsers/parse-parquet-tables.js +50 -0
- package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +19 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js +921 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
- package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js +4 -5
- package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
- package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.js +95 -28
- package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
- package/dist/lib/slice-parquet-batch.d.ts +9 -0
- package/dist/lib/slice-parquet-batch.d.ts.map +1 -0
- package/dist/lib/slice-parquet-batch.js +28 -0
- package/dist/lib/slice-parquet-batch.js.map +1 -0
- package/dist/lib/sources/parquet-range-file.d.ts +80 -0
- package/dist/lib/sources/parquet-range-file.d.ts.map +1 -0
- package/dist/lib/sources/parquet-range-file.js +267 -0
- package/dist/lib/sources/parquet-range-file.js.map +1 -0
- package/dist/lib/sources/single-batch-queue.d.ts +24 -0
- package/dist/lib/sources/single-batch-queue.d.ts.map +1 -0
- package/dist/lib/sources/single-batch-queue.js +91 -0
- package/dist/lib/sources/single-batch-queue.js.map +1 -0
- package/dist/lib/utils/load-wasm-node.d.ts +3 -0
- package/dist/lib/utils/load-wasm-node.d.ts.map +1 -0
- package/dist/lib/utils/load-wasm-node.js +23 -0
- package/dist/lib/utils/load-wasm-node.js.map +1 -0
- package/dist/lib/utils/load-wasm.d.ts +2 -2
- package/dist/lib/utils/load-wasm.d.ts.map +1 -1
- package/dist/lib/utils/load-wasm.js +28 -12
- package/dist/lib/utils/load-wasm.js.map +1 -1
- package/dist/lib/utils/make-stream-iterator.d.ts +2 -0
- package/dist/lib/utils/make-stream-iterator.d.ts.map +1 -1
- package/dist/lib/utils/make-stream-iterator.js +123 -14
- package/dist/lib/utils/make-stream-iterator.js.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
- package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
- package/dist/lib/utils/normalize-parquet-options.js +25 -0
- package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
- package/dist/parquet-dataset-source.cjs +38974 -0
- package/dist/parquet-dataset-source.cjs.map +6 -0
- package/dist/parquet-dataset-source.d.ts +81 -0
- package/dist/parquet-dataset-source.d.ts.map +1 -0
- package/dist/parquet-dataset-source.js +602 -0
- package/dist/parquet-dataset-source.js.map +1 -0
- package/dist/parquet-encoded-page-types.d.ts +108 -0
- package/dist/parquet-encoded-page-types.d.ts.map +1 -0
- package/dist/parquet-encoded-page-types.js +5 -0
- package/dist/parquet-encoded-page-types.js.map +1 -0
- package/dist/parquet-format.d.ts +2 -0
- package/dist/parquet-format.d.ts.map +1 -1
- package/dist/parquet-format.js +2 -0
- package/dist/parquet-format.js.map +1 -1
- package/dist/parquet-js-loader-types.d.ts +59 -0
- package/dist/parquet-js-loader-types.d.ts.map +1 -0
- package/dist/parquet-js-loader-types.js +34 -0
- package/dist/parquet-js-loader-types.js.map +1 -0
- package/dist/parquet-js-loader.d.ts +18 -22
- package/dist/parquet-js-loader.d.ts.map +1 -1
- package/dist/parquet-js-loader.js +53 -14
- package/dist/parquet-js-loader.js.map +1 -1
- package/dist/parquet-js-writer.d.ts +65 -0
- package/dist/parquet-js-writer.d.ts.map +1 -0
- package/dist/parquet-js-writer.js +28 -0
- package/dist/parquet-js-writer.js.map +1 -0
- package/dist/parquet-loader-base.d.ts +25 -0
- package/dist/parquet-loader-base.d.ts.map +1 -0
- package/dist/parquet-loader-base.js +23 -0
- package/dist/parquet-loader-base.js.map +1 -0
- package/dist/parquet-loader-options.d.ts +55 -0
- package/dist/parquet-loader-options.d.ts.map +1 -0
- package/dist/parquet-loader-options.js +10 -0
- package/dist/parquet-loader-options.js.map +1 -0
- package/dist/parquet-loader-types.d.ts +61 -0
- package/dist/parquet-loader-types.d.ts.map +1 -0
- package/dist/parquet-loader-types.js +17 -0
- package/dist/parquet-loader-types.js.map +1 -0
- package/dist/parquet-loader.d.ts +42 -0
- package/dist/parquet-loader.d.ts.map +1 -0
- package/dist/parquet-loader.js +68 -0
- package/dist/parquet-loader.js.map +1 -0
- package/dist/parquet-source-capabilities.d.ts +43 -0
- package/dist/parquet-source-capabilities.d.ts.map +1 -0
- package/dist/parquet-source-capabilities.js +32 -0
- package/dist/parquet-source-capabilities.js.map +1 -0
- package/dist/parquet-source-loader-types.d.ts +82 -0
- package/dist/parquet-source-loader-types.d.ts.map +1 -0
- package/dist/parquet-source-loader-types.js +84 -0
- package/dist/parquet-source-loader-types.js.map +1 -0
- package/dist/parquet-source-loader.cjs +38261 -0
- package/dist/parquet-source-loader.cjs.map +6 -0
- package/dist/parquet-source-loader.d.ts +167 -0
- package/dist/parquet-source-loader.d.ts.map +1 -0
- package/dist/parquet-source-loader.js +1438 -0
- package/dist/parquet-source-loader.js.map +1 -0
- package/dist/parquet-source-types.d.ts +534 -0
- package/dist/parquet-source-types.d.ts.map +1 -0
- package/dist/parquet-source-types.js +5 -0
- package/dist/parquet-source-types.js.map +1 -0
- package/dist/parquet-source-worker-factory.d.ts +4 -0
- package/dist/parquet-source-worker-factory.d.ts.map +1 -0
- package/dist/parquet-source-worker-factory.js +6 -0
- package/dist/parquet-source-worker-factory.js.map +1 -0
- package/dist/parquet-source-worker-url.d.ts +3 -0
- package/dist/parquet-source-worker-url.d.ts.map +1 -0
- package/dist/parquet-source-worker-url.js +22 -0
- package/dist/parquet-source-worker-url.js.map +1 -0
- package/dist/parquet-source-worker.js +38871 -0
- package/dist/parquet-source-worker.js.map +7 -0
- package/dist/parquet-worker-node.cjs +78507 -0
- package/dist/parquet-worker-node.cjs.map +7 -0
- package/dist/parquet-worker-url.d.ts +3 -0
- package/dist/parquet-worker-url.d.ts.map +1 -0
- package/dist/parquet-worker-url.js +19 -0
- package/dist/parquet-worker-url.js.map +1 -0
- package/dist/parquet-worker.js +20094 -0
- package/dist/parquet-worker.js.map +7 -0
- package/dist/parquet-writer.d.ts +10 -0
- package/dist/parquet-writer.d.ts.map +1 -0
- package/dist/parquet-writer.js +27 -0
- package/dist/parquet-writer.js.map +1 -0
- package/dist/parquet_wasm_bg.wasm +0 -0
- package/dist/parquetjs/codecs/byte-stream-split.d.ts +9 -0
- package/dist/parquetjs/codecs/byte-stream-split.d.ts.map +1 -0
- package/dist/parquetjs/codecs/byte-stream-split.js +159 -0
- package/dist/parquetjs/codecs/byte-stream-split.js.map +1 -0
- package/dist/parquetjs/codecs/declare.d.ts +35 -3
- package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
- package/dist/parquetjs/codecs/declare.js +17 -1
- package/dist/parquetjs/codecs/declare.js.map +1 -1
- package/dist/parquetjs/codecs/delta.d.ts +17 -0
- package/dist/parquetjs/codecs/delta.d.ts.map +1 -0
- package/dist/parquetjs/codecs/delta.js +788 -0
- package/dist/parquetjs/codecs/delta.js.map +1 -0
- package/dist/parquetjs/codecs/dictionary.d.ts +5 -2
- package/dist/parquetjs/codecs/dictionary.d.ts.map +1 -1
- package/dist/parquetjs/codecs/dictionary.js +16 -4
- package/dist/parquetjs/codecs/dictionary.js.map +1 -1
- package/dist/parquetjs/codecs/index.d.ts.map +1 -1
- package/dist/parquetjs/codecs/index.js +22 -0
- package/dist/parquetjs/codecs/index.js.map +1 -1
- package/dist/parquetjs/codecs/plain.d.ts +3 -3
- package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
- package/dist/parquetjs/codecs/plain.js +231 -78
- package/dist/parquetjs/codecs/plain.js.map +1 -1
- package/dist/parquetjs/codecs/rle.d.ts +7 -3
- package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
- package/dist/parquetjs/codecs/rle.js +613 -69
- package/dist/parquetjs/codecs/rle.js.map +1 -1
- package/dist/parquetjs/compression.d.ts +16 -8
- package/dist/parquetjs/compression.d.ts.map +1 -1
- package/dist/parquetjs/compression.js +114 -141
- package/dist/parquetjs/compression.js.map +1 -1
- package/dist/parquetjs/encoder/dictionary-planner.d.ts +17 -0
- package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -0
- package/dist/parquetjs/encoder/dictionary-planner.js +67 -0
- package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -0
- package/dist/parquetjs/encoder/page-planner.d.ts +11 -0
- package/dist/parquetjs/encoder/page-planner.d.ts.map +1 -0
- package/dist/parquetjs/encoder/page-planner.js +60 -0
- package/dist/parquetjs/encoder/page-planner.js.map +1 -0
- package/dist/parquetjs/encoder/parquet-encoder.d.ts +54 -5
- package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.js +930 -66
- package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts +29 -0
- package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/BoundingBox.js +85 -0
- package/dist/parquetjs/parquet-thrift/BoundingBox.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/BsonType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/BsonType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/BsonType.js +1 -1
- package/dist/parquetjs/parquet-thrift/BsonType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +7 -2
- package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js +37 -2
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts +35 -0
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js +135 -0
- package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts +6 -6
- package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnIndex.js +3 -3
- package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +12 -2
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +75 -2
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnOrder.js +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnOrder.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeader.js +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeader.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js +1 -1
- package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/DateType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/DateType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/DateType.js +1 -1
- package/dist/parquetjs/parquet-thrift/DateType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/DecimalType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/DecimalType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/DecimalType.js +1 -1
- package/dist/parquetjs/parquet-thrift/DecimalType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js +1 -1
- package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts +8 -0
- package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js +14 -0
- package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/Encoding.d.ts +2 -1
- package/dist/parquetjs/parquet-thrift/Encoding.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/Encoding.js +1 -0
- package/dist/parquetjs/parquet-thrift/Encoding.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts +22 -0
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js +111 -0
- package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/EnumType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/EnumType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/EnumType.js +1 -1
- package/dist/parquetjs/parquet-thrift/EnumType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts +16 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js +57 -0
- package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +7 -2
- package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/FileMetaData.js +37 -2
- package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/Float16Type.d.ts +9 -0
- package/dist/parquetjs/parquet-thrift/Float16Type.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/Float16Type.js +27 -0
- package/dist/parquetjs/parquet-thrift/Float16Type.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeographyType.d.ts +14 -0
- package/dist/parquetjs/parquet-thrift/GeographyType.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeographyType.js +51 -0
- package/dist/parquetjs/parquet-thrift/GeographyType.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeometryType.d.ts +11 -0
- package/dist/parquetjs/parquet-thrift/GeometryType.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeometryType.js +41 -0
- package/dist/parquetjs/parquet-thrift/GeometryType.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts +18 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js +62 -0
- package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/IndexPageHeader.js +1 -1
- package/dist/parquetjs/parquet-thrift/IndexPageHeader.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/IntType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/IntType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/IntType.js +1 -1
- package/dist/parquetjs/parquet-thrift/IntType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/JsonType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/JsonType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/JsonType.js +1 -1
- package/dist/parquetjs/parquet-thrift/JsonType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/KeyValue.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/KeyValue.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/KeyValue.js +1 -1
- package/dist/parquetjs/parquet-thrift/KeyValue.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ListType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/ListType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ListType.js +1 -1
- package/dist/parquetjs/parquet-thrift/ListType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/LogicalType.d.ts +17 -1
- package/dist/parquetjs/parquet-thrift/LogicalType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/LogicalType.js +97 -1
- package/dist/parquetjs/parquet-thrift/LogicalType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/MapType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/MapType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/MapType.js +1 -1
- package/dist/parquetjs/parquet-thrift/MapType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/MicroSeconds.js +1 -1
- package/dist/parquetjs/parquet-thrift/MicroSeconds.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/MilliSeconds.js +1 -1
- package/dist/parquetjs/parquet-thrift/MilliSeconds.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts +9 -0
- package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/NanoSeconds.js +27 -0
- package/dist/parquetjs/parquet-thrift/NanoSeconds.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/NullType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/NullType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/NullType.js +1 -1
- package/dist/parquetjs/parquet-thrift/NullType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/OffsetIndex.js +1 -1
- package/dist/parquetjs/parquet-thrift/OffsetIndex.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/PageEncodingStats.js +1 -1
- package/dist/parquetjs/parquet-thrift/PageEncodingStats.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/PageHeader.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/PageHeader.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/PageHeader.js +1 -1
- package/dist/parquetjs/parquet-thrift/PageHeader.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/PageLocation.d.ts +2 -2
- package/dist/parquetjs/parquet-thrift/PageLocation.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/PageLocation.js +2 -2
- package/dist/parquetjs/parquet-thrift/PageLocation.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/RowGroup.d.ts +2 -2
- package/dist/parquetjs/parquet-thrift/RowGroup.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/RowGroup.js +2 -2
- package/dist/parquetjs/parquet-thrift/RowGroup.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/SchemaElement.js +1 -1
- package/dist/parquetjs/parquet-thrift/SchemaElement.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts +26 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.js +85 -0
- package/dist/parquetjs/parquet-thrift/SizeStatistics.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/SortingColumn.js +1 -1
- package/dist/parquetjs/parquet-thrift/SortingColumn.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/Statistics.d.ts +14 -10
- package/dist/parquetjs/parquet-thrift/Statistics.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/Statistics.js +38 -2
- package/dist/parquetjs/parquet-thrift/Statistics.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/StringType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/StringType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/StringType.js +1 -1
- package/dist/parquetjs/parquet-thrift/StringType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/TimeType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/TimeType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/TimeType.js +1 -1
- package/dist/parquetjs/parquet-thrift/TimeType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts +5 -1
- package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/TimeUnit.js +25 -1
- package/dist/parquetjs/parquet-thrift/TimeUnit.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/TimestampType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/TimestampType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/TimestampType.js +1 -1
- package/dist/parquetjs/parquet-thrift/TimestampType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js +1 -1
- package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/UUIDType.d.ts +1 -1
- package/dist/parquetjs/parquet-thrift/UUIDType.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/UUIDType.js +1 -1
- package/dist/parquetjs/parquet-thrift/UUIDType.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/VariantType.d.ts +11 -0
- package/dist/parquetjs/parquet-thrift/VariantType.d.ts.map +1 -0
- package/dist/parquetjs/parquet-thrift/VariantType.js +41 -0
- package/dist/parquetjs/parquet-thrift/VariantType.js.map +1 -0
- package/dist/parquetjs/parquet-thrift/index.d.ts +12 -2
- package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.js +12 -2
- package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
- package/dist/parquetjs/parser/decoders.d.ts +23 -3
- package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
- package/dist/parquetjs/parser/decoders.js +687 -119
- package/dist/parquetjs/parser/decoders.js.map +1 -1
- package/dist/parquetjs/parser/encoded-pages.d.ts +24 -0
- package/dist/parquetjs/parser/encoded-pages.d.ts.map +1 -0
- package/dist/parquetjs/parser/encoded-pages.js +206 -0
- package/dist/parquetjs/parser/encoded-pages.js.map +1 -0
- package/dist/parquetjs/parser/parquet-reader.d.ts +111 -10
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +836 -69
- package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
- package/dist/parquetjs/schema/declare.d.ts +83 -10
- package/dist/parquetjs/schema/declare.d.ts.map +1 -1
- package/dist/parquetjs/schema/declare.js.map +1 -1
- package/dist/parquetjs/schema/schema.d.ts +3 -0
- package/dist/parquetjs/schema/schema.d.ts.map +1 -1
- package/dist/parquetjs/schema/schema.js +31 -3
- package/dist/parquetjs/schema/schema.js.map +1 -1
- package/dist/parquetjs/schema/shred.d.ts +2 -0
- package/dist/parquetjs/schema/shred.d.ts.map +1 -1
- package/dist/parquetjs/schema/shred.js +285 -29
- package/dist/parquetjs/schema/shred.js.map +1 -1
- package/dist/parquetjs/schema/types.d.ts.map +1 -1
- package/dist/parquetjs/schema/types.js +290 -71
- package/dist/parquetjs/schema/types.js.map +1 -1
- package/dist/parquetjs/schema/variant.d.ts +3 -0
- package/dist/parquetjs/schema/variant.d.ts.map +1 -0
- package/dist/parquetjs/schema/variant.js +248 -0
- package/dist/parquetjs/schema/variant.js.map +1 -0
- package/dist/parquetjs/utils/binary-utils.d.ts +41 -0
- package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
- package/dist/parquetjs/utils/binary-utils.js +106 -0
- package/dist/parquetjs/utils/binary-utils.js.map +1 -0
- package/dist/parquetjs/utils/crc32.d.ts +3 -0
- package/dist/parquetjs/utils/crc32.d.ts.map +1 -0
- package/dist/parquetjs/utils/crc32.js +15 -0
- package/dist/parquetjs/utils/crc32.js.map +1 -0
- package/dist/parquetjs/utils/file-utils.d.ts +1 -1
- package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/file-utils.js +3 -3
- package/dist/parquetjs/utils/file-utils.js.map +1 -1
- package/dist/parquetjs/utils/read-utils.d.ts +25 -7
- package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/read-utils.js +66 -39
- package/dist/parquetjs/utils/read-utils.js.map +1 -1
- package/dist/parquetjs/utils/thrift-runtime.d.ts +106 -0
- package/dist/parquetjs/utils/thrift-runtime.d.ts.map +1 -0
- package/dist/parquetjs/utils/thrift-runtime.js +50 -0
- package/dist/parquetjs/utils/thrift-runtime.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +80 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
- package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
- package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
- package/dist/polyfills/process.d.ts +12 -0
- package/dist/polyfills/process.d.ts.map +1 -0
- package/dist/polyfills/process.js +17 -0
- package/dist/polyfills/process.js.map +1 -0
- package/dist/unbundled.d.ts +10 -0
- package/dist/unbundled.d.ts.map +1 -0
- package/dist/unbundled.js +11 -0
- package/dist/unbundled.js.map +1 -0
- package/dist/wasm.d.ts +3 -0
- package/dist/wasm.d.ts.map +1 -0
- package/dist/wasm.js +6 -0
- package/dist/wasm.js.map +1 -0
- package/dist/workers/parquet-source-worker.d.ts +2 -0
- package/dist/workers/parquet-source-worker.d.ts.map +1 -0
- package/dist/workers/parquet-source-worker.js +17 -0
- package/dist/workers/parquet-source-worker.js.map +1 -0
- package/dist/workers/parquet-worker-node.d.ts +2 -0
- package/dist/workers/parquet-worker-node.d.ts.map +1 -0
- package/dist/workers/parquet-worker-node.js +5 -0
- package/dist/workers/parquet-worker-node.js.map +1 -0
- package/dist/workers/parquet-worker.d.ts +2 -0
- package/dist/workers/parquet-worker.d.ts.map +1 -0
- package/dist/workers/parquet-worker.js +27 -0
- package/dist/workers/parquet-worker.js.map +1 -0
- package/package.json +84 -40
- package/src/bundled.ts +43 -0
- package/src/delta-format.ts +12 -0
- package/src/delta-source-loader-types.ts +40 -0
- package/src/delta-source.ts +305 -0
- package/src/delta-types.ts +40 -0
- package/src/geoparquet-loader-with-parser.ts +95 -0
- package/src/geoparquet-loader.ts +54 -0
- package/src/iceberg-rest-catalog.ts +122 -0
- package/src/iceberg-table-source.ts +1037 -0
- package/src/iceberg-types.ts +165 -0
- package/src/index.ts +105 -26
- package/src/lib/arrow/convert-columns-to-row-group.ts +3 -0
- package/src/lib/arrow/convert-schema-from-parquet.ts +193 -32
- package/src/lib/arrow/convert-schema-to-parquet.ts +16 -7
- package/src/lib/arrow/create-nested-arrow-vector.ts +705 -0
- package/src/lib/constants.ts +0 -2
- package/src/lib/encoders/encode-arrow-to-parquet.ts +10 -16
- package/src/lib/encoders/encode-table-to-parquet-js.ts +526 -0
- package/src/lib/geo/geoparquet-covering.ts +201 -0
- package/src/lib/geo/geospatial-metadata.ts +547 -0
- package/src/lib/parquet-bloom-filter-planner.ts +86 -0
- package/src/lib/parquet-bloom-filter.ts +345 -0
- package/src/lib/parquet-encryption.ts +344 -0
- package/src/lib/parquet-page-index.ts +727 -0
- package/src/lib/parquet-predicate.ts +410 -0
- package/src/lib/parquet-source-worker-client.ts +41 -0
- package/src/lib/parquet-source-worker-decoder.ts +252 -0
- package/src/lib/parquet-source-worker-file.ts +56 -0
- package/src/lib/parquet-source-worker-types.ts +132 -0
- package/src/lib/parquet-worker-transport.ts +57 -0
- package/src/lib/parsers/convert-parquet-tables.ts +39 -0
- package/src/lib/parsers/get-parquet-schema.ts +6 -2
- package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
- package/src/lib/parsers/parse-parquet-tables.ts +82 -0
- package/src/lib/parsers/parse-parquet-to-arrow-js.ts +1213 -0
- package/src/lib/parsers/parse-parquet-to-arrow.ts +62 -36
- package/src/lib/parsers/parse-parquet-to-columns.ts +9 -8
- package/src/lib/parsers/parse-parquet-to-json.ts +119 -35
- package/src/lib/slice-parquet-batch.ts +32 -0
- package/src/lib/sources/parquet-range-file.ts +365 -0
- package/src/lib/sources/single-batch-queue.ts +95 -0
- package/src/lib/utils/load-wasm-node.ts +25 -0
- package/src/lib/utils/load-wasm.ts +36 -13
- package/src/lib/utils/make-stream-iterator.ts +126 -14
- package/src/lib/utils/normalize-parquet-options.ts +30 -0
- package/src/parquet-dataset-source.ts +800 -0
- package/src/parquet-encoded-page-types.ts +122 -0
- package/src/parquet-format.ts +2 -0
- package/src/parquet-js-loader-types.ts +53 -0
- package/src/parquet-js-loader.ts +76 -19
- package/src/parquet-js-writer.ts +98 -0
- package/src/parquet-loader-base.ts +34 -0
- package/src/parquet-loader-options.ts +62 -0
- package/src/parquet-loader-types.ts +35 -0
- package/src/parquet-loader.ts +115 -0
- package/src/parquet-source-capabilities.ts +73 -0
- package/src/parquet-source-loader-types.ts +97 -0
- package/src/parquet-source-loader.ts +2254 -0
- package/src/parquet-source-types.ts +627 -0
- package/src/parquet-source-worker-factory.ts +8 -0
- package/src/parquet-source-worker-url.ts +23 -0
- package/src/parquet-worker-url.ts +23 -0
- package/src/parquet-writer.ts +42 -0
- package/src/parquetjs/LICENSE +23 -1
- package/src/parquetjs/codecs/byte-stream-split.ts +221 -0
- package/src/parquetjs/codecs/declare.ts +62 -3
- package/src/parquetjs/codecs/delta.ts +1047 -0
- package/src/parquetjs/codecs/dictionary.ts +22 -4
- package/src/parquetjs/codecs/index.ts +22 -0
- package/src/parquetjs/codecs/plain.ts +317 -89
- package/src/parquetjs/codecs/rle.ts +852 -82
- package/src/parquetjs/compression.ts +137 -156
- package/src/parquetjs/encoder/dictionary-planner.ts +104 -0
- package/src/parquetjs/encoder/page-planner.ts +83 -0
- package/src/parquetjs/encoder/parquet-encoder.ts +1374 -95
- package/src/parquetjs/parquet-thrift/BoundingBox.ts +108 -0
- package/src/parquetjs/parquet-thrift/BsonType.ts +1 -1
- package/src/parquetjs/parquet-thrift/ColumnChunk.ts +37 -2
- package/src/parquetjs/parquet-thrift/ColumnCryptoMetaData.ts +139 -0
- package/src/parquetjs/parquet-thrift/ColumnIndex.ts +13 -13
- package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +75 -2
- package/src/parquetjs/parquet-thrift/ColumnOrder.ts +1 -1
- package/src/parquetjs/parquet-thrift/DataPageHeader.ts +1 -1
- package/src/parquetjs/parquet-thrift/DataPageHeaderV2.ts +1 -1
- package/src/parquetjs/parquet-thrift/DateType.ts +1 -1
- package/src/parquetjs/parquet-thrift/DecimalType.ts +1 -1
- package/src/parquetjs/parquet-thrift/DictionaryPageHeader.ts +1 -1
- package/src/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.ts +13 -0
- package/src/parquetjs/parquet-thrift/Encoding.ts +2 -1
- package/src/parquetjs/parquet-thrift/EncryptionAlgorithm.ts +127 -0
- package/src/parquetjs/parquet-thrift/EnumType.ts +1 -1
- package/src/parquetjs/parquet-thrift/FileCryptoMetaData.ts +60 -0
- package/src/parquetjs/parquet-thrift/FileMetaData.ts +37 -2
- package/src/parquetjs/parquet-thrift/Float16Type.ts +28 -0
- package/src/parquetjs/parquet-thrift/GeographyType.ts +54 -0
- package/src/parquetjs/parquet-thrift/GeometryType.ts +43 -0
- package/src/parquetjs/parquet-thrift/GeospatialStatistics.ts +68 -0
- package/src/parquetjs/parquet-thrift/IndexPageHeader.ts +1 -1
- package/src/parquetjs/parquet-thrift/IntType.ts +1 -1
- package/src/parquetjs/parquet-thrift/JsonType.ts +1 -1
- package/src/parquetjs/parquet-thrift/KeyValue.ts +1 -1
- package/src/parquetjs/parquet-thrift/ListType.ts +1 -1
- package/src/parquetjs/parquet-thrift/LogicalType.ts +97 -1
- package/src/parquetjs/parquet-thrift/MapType.ts +1 -1
- package/src/parquetjs/parquet-thrift/MicroSeconds.ts +1 -1
- package/src/parquetjs/parquet-thrift/MilliSeconds.ts +1 -1
- package/src/parquetjs/parquet-thrift/NanoSeconds.ts +28 -0
- package/src/parquetjs/parquet-thrift/NullType.ts +1 -1
- package/src/parquetjs/parquet-thrift/OffsetIndex.ts +1 -1
- package/src/parquetjs/parquet-thrift/PageEncodingStats.ts +1 -1
- package/src/parquetjs/parquet-thrift/PageHeader.ts +1 -1
- package/src/parquetjs/parquet-thrift/PageLocation.ts +2 -2
- package/src/parquetjs/parquet-thrift/RowGroup.ts +2 -2
- package/src/parquetjs/parquet-thrift/SchemaElement.ts +1 -1
- package/src/parquetjs/parquet-thrift/SizeStatistics.ts +98 -0
- package/src/parquetjs/parquet-thrift/SortingColumn.ts +1 -1
- package/src/parquetjs/parquet-thrift/Statistics.ts +50 -14
- package/src/parquetjs/parquet-thrift/StringType.ts +1 -1
- package/src/parquetjs/parquet-thrift/TimeType.ts +1 -1
- package/src/parquetjs/parquet-thrift/TimeUnit.ts +25 -1
- package/src/parquetjs/parquet-thrift/TimestampType.ts +1 -1
- package/src/parquetjs/parquet-thrift/TypeDefinedOrder.ts +1 -1
- package/src/parquetjs/parquet-thrift/UUIDType.ts +1 -1
- package/src/parquetjs/parquet-thrift/VariantType.ts +43 -0
- package/src/parquetjs/parquet-thrift/index.ts +12 -4
- package/src/parquetjs/parser/decoders.ts +922 -143
- package/src/parquetjs/parser/encoded-pages.ts +278 -0
- package/src/parquetjs/parser/parquet-reader.ts +1334 -83
- package/src/parquetjs/schema/declare.ts +121 -9
- package/src/parquetjs/schema/schema.ts +33 -3
- package/src/parquetjs/schema/shred.ts +345 -41
- package/src/parquetjs/schema/types.ts +308 -84
- package/src/parquetjs/schema/variant.ts +313 -0
- package/src/parquetjs/utils/binary-utils.ts +132 -0
- package/src/parquetjs/utils/crc32.ts +15 -0
- package/src/parquetjs/utils/file-utils.ts +4 -4
- package/src/parquetjs/utils/read-utils.ts +77 -51
- package/src/parquetjs/utils/thrift-runtime.ts +109 -0
- package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
- package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
- package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
- package/src/polyfills/process.ts +17 -0
- package/src/unbundled.ts +47 -0
- package/src/wasm.ts +6 -0
- package/src/workers/parquet-source-worker.ts +21 -0
- package/src/workers/parquet-worker-node.ts +5 -0
- package/src/workers/parquet-worker.ts +31 -0
- package/dist/parquet-arrow-loader.d.ts +0 -43
- package/dist/parquet-arrow-loader.d.ts.map +0 -1
- package/dist/parquet-arrow-loader.js +0 -49
- package/dist/parquet-arrow-loader.js.map +0 -1
- package/dist/parquet-arrow-writer.d.ts +0 -9
- package/dist/parquet-arrow-writer.d.ts.map +0 -1
- package/dist/parquet-arrow-writer.js +0 -23
- package/dist/parquet-arrow-writer.js.map +0 -1
- package/dist/parquet-json-loader.d.ts +0 -148
- package/dist/parquet-json-loader.d.ts.map +0 -1
- package/dist/parquet-json-loader.js +0 -106
- package/dist/parquet-json-loader.js.map +0 -1
- package/dist/parquet-json-writer.d.ts +0 -19
- package/dist/parquet-json-writer.d.ts.map +0 -1
- package/dist/parquet-json-writer.js +0 -20
- package/dist/parquet-json-writer.js.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
- package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
- package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
- package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
- package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
- package/dist/polyfills/buffer/buffer.d.ts +0 -222
- package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer.js +0 -1868
- package/dist/polyfills/buffer/buffer.js.map +0 -1
- package/dist/polyfills/buffer/index.d.ts +0 -4
- package/dist/polyfills/buffer/index.d.ts.map +0 -1
- package/dist/polyfills/buffer/index.js +0 -9
- package/dist/polyfills/buffer/index.js.map +0 -1
- package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
- package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
- package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
- package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
- package/dist/workers/parquet-json-worker.d.ts +0 -2
- package/dist/workers/parquet-json-worker.d.ts.map +0 -1
- package/dist/workers/parquet-json-worker.js +0 -7
- package/dist/workers/parquet-json-worker.js.map +0 -1
- package/src/parquet-arrow-loader.ts +0 -74
- package/src/parquet-arrow-writer.ts +0 -33
- package/src/parquet-json-loader.ts +0 -160
- package/src/parquet-json-writer.ts +0 -27
- package/src/parquetjs/modules.d.ts +0 -25
- package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
- package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
- package/src/polyfills/buffer/buffer.ts +0 -2205
- package/src/polyfills/buffer/index.ts +0 -11
- package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
- package/src/workers/parquet-json-worker.ts +0 -8
|
@@ -0,0 +1,788 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
// Portions adapted from hyparquet, Copyright (c) Hyperparam contributors
|
|
5
|
+
import { concatUint8Arrays, copyUint8Array, toUint8Array } from "../utils/binary-utils.js";
|
|
6
|
+
import { getParquetValueOutput, reserveParquetByteArrayOutput } from "./declare.js";
|
|
7
|
+
const DELTA_BLOCK_SIZE = 128;
|
|
8
|
+
const DELTA_MINI_BLOCK_COUNT = 4;
|
|
9
|
+
const DELTA_VALUES_PER_MINI_BLOCK = DELTA_BLOCK_SIZE / DELTA_MINI_BLOCK_COUNT;
|
|
10
|
+
const UINT32_BASE = 0x1_0000_0000;
|
|
11
|
+
const IS_LITTLE_ENDIAN = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
|
|
12
|
+
/** Encodes INT32 or INT64 values using Parquet DELTA_BINARY_PACKED. */
|
|
13
|
+
export function encodeDeltaBinaryPackedValues(type, values, _options) {
|
|
14
|
+
if (type !== 'INT32' && type !== 'INT64') {
|
|
15
|
+
throw new Error(`DELTA_BINARY_PACKED does not support Parquet type ${type}`);
|
|
16
|
+
}
|
|
17
|
+
if (values.length === 0) {
|
|
18
|
+
return new Uint8Array(0);
|
|
19
|
+
}
|
|
20
|
+
const integerValues = values.map(value => getSignedInteger(type, value));
|
|
21
|
+
const output = [
|
|
22
|
+
encodeUnsignedVarInt(BigInt(DELTA_BLOCK_SIZE)),
|
|
23
|
+
encodeUnsignedVarInt(BigInt(DELTA_MINI_BLOCK_COUNT)),
|
|
24
|
+
encodeUnsignedVarInt(BigInt(integerValues.length)),
|
|
25
|
+
encodeZigZagVarInt(integerValues[0])
|
|
26
|
+
];
|
|
27
|
+
const deltas = [];
|
|
28
|
+
for (let valueIndex = 1; valueIndex < integerValues.length; valueIndex++) {
|
|
29
|
+
const delta = integerValues[valueIndex] - integerValues[valueIndex - 1];
|
|
30
|
+
deltas.push(type === 'INT32' ? BigInt.asIntN(32, delta) : BigInt.asIntN(64, delta));
|
|
31
|
+
}
|
|
32
|
+
for (let blockOffset = 0; blockOffset < deltas.length; blockOffset += DELTA_BLOCK_SIZE) {
|
|
33
|
+
const block = deltas.slice(blockOffset, blockOffset + DELTA_BLOCK_SIZE);
|
|
34
|
+
const minimumDelta = block.reduce((minimum, delta) => (delta < minimum ? delta : minimum), block[0]);
|
|
35
|
+
output.push(encodeZigZagVarInt(minimumDelta));
|
|
36
|
+
const miniBlocks = [];
|
|
37
|
+
const bitWidths = new Uint8Array(DELTA_MINI_BLOCK_COUNT);
|
|
38
|
+
for (let miniBlockIndex = 0; miniBlockIndex < DELTA_MINI_BLOCK_COUNT; miniBlockIndex++) {
|
|
39
|
+
const miniBlockOffset = miniBlockIndex * DELTA_VALUES_PER_MINI_BLOCK;
|
|
40
|
+
const adjustedDeltas = block
|
|
41
|
+
.slice(miniBlockOffset, miniBlockOffset + DELTA_VALUES_PER_MINI_BLOCK)
|
|
42
|
+
.map(delta => delta - minimumDelta);
|
|
43
|
+
while (adjustedDeltas.length < DELTA_VALUES_PER_MINI_BLOCK) {
|
|
44
|
+
adjustedDeltas.push(0n);
|
|
45
|
+
}
|
|
46
|
+
miniBlocks.push(adjustedDeltas);
|
|
47
|
+
bitWidths[miniBlockIndex] = adjustedDeltas.reduce((bitWidth, delta) => Math.max(bitWidth, getUnsignedBitWidth(delta)), 0);
|
|
48
|
+
}
|
|
49
|
+
output.push(bitWidths);
|
|
50
|
+
for (let miniBlockIndex = 0; miniBlockIndex < DELTA_MINI_BLOCK_COUNT; miniBlockIndex++) {
|
|
51
|
+
output.push(packUnsignedValues(miniBlocks[miniBlockIndex], bitWidths[miniBlockIndex]));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return concatUint8Arrays(output);
|
|
55
|
+
}
|
|
56
|
+
/** Encodes BYTE_ARRAY values as delta-packed lengths followed by their contiguous payloads. */
|
|
57
|
+
export function encodeDeltaLengthByteArrayValues(type, values, _options) {
|
|
58
|
+
if (type !== 'BYTE_ARRAY') {
|
|
59
|
+
throw new Error(`DELTA_LENGTH_BYTE_ARRAY does not support Parquet type ${type}`);
|
|
60
|
+
}
|
|
61
|
+
const byteArrays = values.map(value => toUint8Array(value));
|
|
62
|
+
const encodedLengths = encodeDeltaBinaryPackedValues('INT32', byteArrays.map(value => value.byteLength), {});
|
|
63
|
+
return concatUint8Arrays([encodedLengths, ...byteArrays]);
|
|
64
|
+
}
|
|
65
|
+
/** Encodes byte arrays as delta-packed prefix lengths and delta-length suffixes. */
|
|
66
|
+
export function encodeDeltaByteArrayValues(type, values, _options) {
|
|
67
|
+
assertByteArrayType(type, 'DELTA_BYTE_ARRAY');
|
|
68
|
+
const byteArrays = values.map(value => toUint8Array(value));
|
|
69
|
+
const prefixLengths = [];
|
|
70
|
+
const suffixes = [];
|
|
71
|
+
let previousValue = new Uint8Array(0);
|
|
72
|
+
for (const value of byteArrays) {
|
|
73
|
+
const prefixLength = getCommonPrefixLength(previousValue, value);
|
|
74
|
+
prefixLengths.push(prefixLength);
|
|
75
|
+
suffixes.push(value.subarray(prefixLength));
|
|
76
|
+
previousValue = value;
|
|
77
|
+
}
|
|
78
|
+
return concatUint8Arrays([
|
|
79
|
+
encodeDeltaBinaryPackedValues('INT32', prefixLengths, {}),
|
|
80
|
+
encodeDeltaLengthByteArrayValues('BYTE_ARRAY', suffixes, {})
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
/** Returns whether an encoding is valid for a physical Parquet type. */
|
|
84
|
+
export function isDeltaEncodingType(encoding, type) {
|
|
85
|
+
switch (encoding) {
|
|
86
|
+
case 'DELTA_BINARY_PACKED':
|
|
87
|
+
return type === 'INT32' || type === 'INT64';
|
|
88
|
+
case 'DELTA_LENGTH_BYTE_ARRAY':
|
|
89
|
+
return type === 'BYTE_ARRAY';
|
|
90
|
+
case 'DELTA_BYTE_ARRAY':
|
|
91
|
+
return type === 'BYTE_ARRAY' || type === 'FIXED_LEN_BYTE_ARRAY';
|
|
92
|
+
default:
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Converts one writer value to its exact signed physical integer. */
|
|
97
|
+
function getSignedInteger(type, value) {
|
|
98
|
+
let integerValue;
|
|
99
|
+
try {
|
|
100
|
+
integerValue = BigInt(value);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
throw new Error(`Invalid ${type} value ${value}`);
|
|
104
|
+
}
|
|
105
|
+
const bitWidth = type === 'INT32' ? 32 : 64;
|
|
106
|
+
if (integerValue !== BigInt.asIntN(bitWidth, integerValue)) {
|
|
107
|
+
throw new Error(`${type} value ${value} is out of range`);
|
|
108
|
+
}
|
|
109
|
+
return integerValue;
|
|
110
|
+
}
|
|
111
|
+
/** Encodes a non-negative integer as an unsigned base-128 variable integer. */
|
|
112
|
+
function encodeUnsignedVarInt(value) {
|
|
113
|
+
if (value < 0n) {
|
|
114
|
+
throw new Error(`Cannot encode negative unsigned variable integer ${value}`);
|
|
115
|
+
}
|
|
116
|
+
const bytes = [];
|
|
117
|
+
let remainingValue = value;
|
|
118
|
+
do {
|
|
119
|
+
const byte = Number(remainingValue & 0x7fn);
|
|
120
|
+
remainingValue >>= 7n;
|
|
121
|
+
bytes.push(remainingValue === 0n ? byte : byte | 0x80);
|
|
122
|
+
} while (remainingValue !== 0n);
|
|
123
|
+
return Uint8Array.from(bytes);
|
|
124
|
+
}
|
|
125
|
+
/** Encodes a signed integer using zig-zag base-128 variable integer representation. */
|
|
126
|
+
function encodeZigZagVarInt(value) {
|
|
127
|
+
const zigZagValue = value >= 0n ? value * 2n : -value * 2n - 1n;
|
|
128
|
+
return encodeUnsignedVarInt(zigZagValue);
|
|
129
|
+
}
|
|
130
|
+
/** Returns the minimum unsigned bit width needed for a non-negative integer. */
|
|
131
|
+
function getUnsignedBitWidth(value) {
|
|
132
|
+
if (value < 0n) {
|
|
133
|
+
throw new Error(`Cannot bit-pack negative value ${value}`);
|
|
134
|
+
}
|
|
135
|
+
return value === 0n ? 0 : value.toString(2).length;
|
|
136
|
+
}
|
|
137
|
+
/** Bit-packs unsigned values least-significant bit first as required by Parquet. */
|
|
138
|
+
function packUnsignedValues(values, bitWidth) {
|
|
139
|
+
if (bitWidth === 0) {
|
|
140
|
+
return new Uint8Array(0);
|
|
141
|
+
}
|
|
142
|
+
const output = new Uint8Array((values.length * bitWidth) / 8);
|
|
143
|
+
const mask = (1n << BigInt(bitWidth)) - 1n;
|
|
144
|
+
let packedBits = 0n;
|
|
145
|
+
let packedBitCount = 0;
|
|
146
|
+
let outputOffset = 0;
|
|
147
|
+
for (const value of values) {
|
|
148
|
+
packedBits |= (value & mask) << BigInt(packedBitCount);
|
|
149
|
+
packedBitCount += bitWidth;
|
|
150
|
+
while (packedBitCount >= 8) {
|
|
151
|
+
output[outputOffset++] = Number(packedBits & 0xffn);
|
|
152
|
+
packedBits >>= 8n;
|
|
153
|
+
packedBitCount -= 8;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return output;
|
|
157
|
+
}
|
|
158
|
+
/** Returns the common leading byte count of two byte arrays. */
|
|
159
|
+
function getCommonPrefixLength(left, right) {
|
|
160
|
+
const maximumLength = Math.min(left.length, right.length);
|
|
161
|
+
let prefixLength = 0;
|
|
162
|
+
while (prefixLength < maximumLength && left[prefixLength] === right[prefixLength]) {
|
|
163
|
+
prefixLength++;
|
|
164
|
+
}
|
|
165
|
+
return prefixLength;
|
|
166
|
+
}
|
|
167
|
+
/** Decodes one Parquet delta encoding based on its registered codec name. */
|
|
168
|
+
export function decodeDeltaBinaryPackedValues(type, cursor, count, options) {
|
|
169
|
+
if (type !== 'INT32' && type !== 'INT64') {
|
|
170
|
+
throw new Error(`DELTA_BINARY_PACKED does not support Parquet type ${type}`);
|
|
171
|
+
}
|
|
172
|
+
if (count === 0) {
|
|
173
|
+
return getParquetValueOutput(options, 0).output;
|
|
174
|
+
}
|
|
175
|
+
const blockSize = readUnsignedVarIntNumber(cursor);
|
|
176
|
+
const miniBlockCount = readUnsignedVarIntNumber(cursor);
|
|
177
|
+
const totalValueCount = readUnsignedVarIntNumber(cursor);
|
|
178
|
+
if (blockSize <= 0 || miniBlockCount <= 0 || blockSize % miniBlockCount !== 0) {
|
|
179
|
+
throw new Error('Invalid DELTA_BINARY_PACKED block header');
|
|
180
|
+
}
|
|
181
|
+
if (totalValueCount < count) {
|
|
182
|
+
throw new Error(`DELTA_BINARY_PACKED contains ${totalValueCount} values, expected at least ${count}`);
|
|
183
|
+
}
|
|
184
|
+
const valuesPerMiniBlock = blockSize / miniBlockCount;
|
|
185
|
+
if (valuesPerMiniBlock % 8 !== 0) {
|
|
186
|
+
throw new Error('Invalid DELTA_BINARY_PACKED mini-block size');
|
|
187
|
+
}
|
|
188
|
+
return type === 'INT32'
|
|
189
|
+
? decodeDeltaBinaryPackedInt32Values(cursor, count, miniBlockCount, valuesPerMiniBlock, options)
|
|
190
|
+
: decodeDeltaBinaryPackedInt64Values(cursor, count, miniBlockCount, valuesPerMiniBlock, options);
|
|
191
|
+
}
|
|
192
|
+
/** Decodes DELTA_BINARY_PACKED INT32 values without entering the BigInt hot path. */
|
|
193
|
+
function decodeDeltaBinaryPackedInt32Values(cursor, count, miniBlockCount, valuesPerMiniBlock, options) {
|
|
194
|
+
const { output, outputOffset } = getParquetValueOutput(options, count);
|
|
195
|
+
let value = readZigZagVarInt32(cursor);
|
|
196
|
+
let outputIndex = 0;
|
|
197
|
+
output[outputOffset + outputIndex++] = value;
|
|
198
|
+
while (outputIndex < count) {
|
|
199
|
+
const minimumDelta = readZigZagVarInt32(cursor);
|
|
200
|
+
const bitWidths = readBitWidths(cursor, miniBlockCount, 32);
|
|
201
|
+
const activeMiniBlockCount = Math.min(miniBlockCount, Math.ceil((count - outputIndex) / valuesPerMiniBlock));
|
|
202
|
+
// Writers commonly select one width for every mini-block in a block. Fuse that contiguous
|
|
203
|
+
// bitstream so the decoder pays call/state setup once instead of once per 32 values.
|
|
204
|
+
if (haveEqualBitWidths(bitWidths, activeMiniBlockCount)) {
|
|
205
|
+
const bitWidth = bitWidths[0];
|
|
206
|
+
const valueCount = Math.min(valuesPerMiniBlock * activeMiniBlockCount, count - outputIndex);
|
|
207
|
+
const packedByteLength = (valuesPerMiniBlock * activeMiniBlockCount * bitWidth) / 8;
|
|
208
|
+
assertReadable(cursor, packedByteLength);
|
|
209
|
+
value = decodeInt32MiniBlock(cursor.buffer, cursor.offset, bitWidth, valueCount, minimumDelta, value, output, outputOffset + outputIndex);
|
|
210
|
+
outputIndex += valueCount;
|
|
211
|
+
cursor.offset += packedByteLength;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
for (const bitWidth of bitWidths) {
|
|
215
|
+
const packedOffset = cursor.offset;
|
|
216
|
+
const packedByteLength = (valuesPerMiniBlock * bitWidth) / 8;
|
|
217
|
+
assertReadable(cursor, packedByteLength);
|
|
218
|
+
const valueCount = Math.min(valuesPerMiniBlock, count - outputIndex);
|
|
219
|
+
value = decodeInt32MiniBlock(cursor.buffer, packedOffset, bitWidth, valueCount, minimumDelta, value, output, outputOffset + outputIndex);
|
|
220
|
+
outputIndex += valueCount;
|
|
221
|
+
cursor.offset += packedByteLength;
|
|
222
|
+
if (outputIndex === count) {
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return output;
|
|
228
|
+
}
|
|
229
|
+
/** Decodes one INT32 mini-block with an exact number-based bit reservoir. */
|
|
230
|
+
function decodeInt32MiniBlock(buffer, packedOffset, bitWidth, count, minimumDelta, initialValue, output, outputOffset) {
|
|
231
|
+
let value = initialValue;
|
|
232
|
+
if (bitWidth === 0) {
|
|
233
|
+
for (let index = 0; index < count; index++) {
|
|
234
|
+
value = (value + minimumDelta) | 0;
|
|
235
|
+
output[outputOffset + index] = value;
|
|
236
|
+
}
|
|
237
|
+
return value;
|
|
238
|
+
}
|
|
239
|
+
if (bitWidth <= 24) {
|
|
240
|
+
// Bitwise reservoirs stay exact through 24 bits and are substantially cheaper than the
|
|
241
|
+
// division-based reservoir required for wider INT32 deltas.
|
|
242
|
+
const mask = 2 ** bitWidth - 1;
|
|
243
|
+
let packedBits = 0;
|
|
244
|
+
let packedBitCount = 0;
|
|
245
|
+
let byteOffset = packedOffset;
|
|
246
|
+
for (let index = 0; index < count; index++) {
|
|
247
|
+
while (packedBitCount < bitWidth) {
|
|
248
|
+
packedBits |= buffer[byteOffset++] << packedBitCount;
|
|
249
|
+
packedBitCount += 8;
|
|
250
|
+
}
|
|
251
|
+
value = (value + minimumDelta + (packedBits & mask)) | 0;
|
|
252
|
+
output[outputOffset + index] = value;
|
|
253
|
+
packedBits >>>= bitWidth;
|
|
254
|
+
packedBitCount -= bitWidth;
|
|
255
|
+
}
|
|
256
|
+
return value;
|
|
257
|
+
}
|
|
258
|
+
const divisor = 2 ** bitWidth;
|
|
259
|
+
let packedBits = 0;
|
|
260
|
+
let packedBitCount = 0;
|
|
261
|
+
let byteOffset = packedOffset;
|
|
262
|
+
for (let index = 0; index < count; index++) {
|
|
263
|
+
while (packedBitCount < bitWidth) {
|
|
264
|
+
packedBits += buffer[byteOffset++] * 2 ** packedBitCount;
|
|
265
|
+
packedBitCount += 8;
|
|
266
|
+
}
|
|
267
|
+
const packedDelta = packedBits % divisor;
|
|
268
|
+
packedBits = Math.floor(packedBits / divisor);
|
|
269
|
+
packedBitCount -= bitWidth;
|
|
270
|
+
value = (value + minimumDelta + packedDelta) | 0;
|
|
271
|
+
output[outputOffset + index] = value;
|
|
272
|
+
}
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
/** Decodes DELTA_BINARY_PACKED INT64 values with width-specialized bit reservoirs. */
|
|
276
|
+
function decodeDeltaBinaryPackedInt64Values(cursor, count, miniBlockCount, valuesPerMiniBlock, options) {
|
|
277
|
+
const { output, outputOffset } = getParquetValueOutput(options, count);
|
|
278
|
+
if (options.int64AsBigInt && output instanceof BigInt64Array) {
|
|
279
|
+
// BigInt arithmetic per value is expensive in V8. Decode into the two uint32 words backing
|
|
280
|
+
// Arrow Int64 instead; modulo-64 addition preserves every signed INT64 bit pattern exactly.
|
|
281
|
+
const state = new Uint32Array(2);
|
|
282
|
+
readZigZagVarIntWords(cursor, state);
|
|
283
|
+
return decodeDeltaBinaryPackedInt64ArrowValues(cursor, count, miniBlockCount, valuesPerMiniBlock, output, outputOffset, state);
|
|
284
|
+
}
|
|
285
|
+
let value = readZigZagVarInt(cursor);
|
|
286
|
+
let outputIndex = 0;
|
|
287
|
+
writeInt64Output(output, outputOffset + outputIndex++, value, options.int64AsBigInt);
|
|
288
|
+
while (outputIndex < count) {
|
|
289
|
+
const minimumDelta = readZigZagVarInt(cursor);
|
|
290
|
+
const bitWidths = readBitWidths(cursor, miniBlockCount, 64);
|
|
291
|
+
for (const bitWidth of bitWidths) {
|
|
292
|
+
const packedOffset = cursor.offset;
|
|
293
|
+
const packedByteLength = (valuesPerMiniBlock * bitWidth) / 8;
|
|
294
|
+
assertReadable(cursor, packedByteLength);
|
|
295
|
+
const valueCount = Math.min(valuesPerMiniBlock, count - outputIndex);
|
|
296
|
+
value = decodeInt64MiniBlock(cursor.buffer, packedOffset, bitWidth, valueCount, minimumDelta, value, output, outputOffset + outputIndex, options.int64AsBigInt);
|
|
297
|
+
outputIndex += valueCount;
|
|
298
|
+
cursor.offset += packedByteLength;
|
|
299
|
+
if (outputIndex === count) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return output;
|
|
305
|
+
}
|
|
306
|
+
/** Decodes INT64 directly into Arrow storage with modulo-64 two-word arithmetic. */
|
|
307
|
+
function decodeDeltaBinaryPackedInt64ArrowValues(cursor, count, miniBlockCount, valuesPerMiniBlock, output, outputOffset, state) {
|
|
308
|
+
const outputWords = new Uint32Array(output.buffer, output.byteOffset, output.length * 2);
|
|
309
|
+
const minimumDeltaWords = new Uint32Array(2);
|
|
310
|
+
let outputIndex = 0;
|
|
311
|
+
writeInt64Words(outputWords, outputOffset + outputIndex++, state[0], state[1]);
|
|
312
|
+
while (outputIndex < count) {
|
|
313
|
+
readZigZagVarIntWords(cursor, minimumDeltaWords);
|
|
314
|
+
const bitWidths = readBitWidths(cursor, miniBlockCount, 64);
|
|
315
|
+
const activeMiniBlockCount = Math.min(miniBlockCount, Math.ceil((count - outputIndex) / valuesPerMiniBlock));
|
|
316
|
+
// Preserve the equal-width fusion used by the wide-column benchmark. Splitting this back into
|
|
317
|
+
// four mini-block calls repeats state loads/stores and loses measurable throughput.
|
|
318
|
+
if (haveEqualBitWidths(bitWidths, activeMiniBlockCount)) {
|
|
319
|
+
const bitWidth = bitWidths[0];
|
|
320
|
+
const valueCount = Math.min(valuesPerMiniBlock * activeMiniBlockCount, count - outputIndex);
|
|
321
|
+
const packedByteLength = (valuesPerMiniBlock * activeMiniBlockCount * bitWidth) / 8;
|
|
322
|
+
assertReadable(cursor, packedByteLength);
|
|
323
|
+
decodeInt64ArrowMiniBlock(cursor.buffer, cursor.offset, bitWidth, valueCount, minimumDeltaWords[0], minimumDeltaWords[1], state, outputWords, outputOffset + outputIndex);
|
|
324
|
+
outputIndex += valueCount;
|
|
325
|
+
cursor.offset += packedByteLength;
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
for (const bitWidth of bitWidths) {
|
|
329
|
+
const packedOffset = cursor.offset;
|
|
330
|
+
const packedByteLength = (valuesPerMiniBlock * bitWidth) / 8;
|
|
331
|
+
assertReadable(cursor, packedByteLength);
|
|
332
|
+
const valueCount = Math.min(valuesPerMiniBlock, count - outputIndex);
|
|
333
|
+
decodeInt64ArrowMiniBlock(cursor.buffer, packedOffset, bitWidth, valueCount, minimumDeltaWords[0], minimumDeltaWords[1], state, outputWords, outputOffset + outputIndex);
|
|
334
|
+
outputIndex += valueCount;
|
|
335
|
+
cursor.offset += packedByteLength;
|
|
336
|
+
if (outputIndex === count)
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return output;
|
|
341
|
+
}
|
|
342
|
+
/** Returns whether all mini-blocks in one DELTA_BINARY_PACKED block use one bit width. */
|
|
343
|
+
function haveEqualBitWidths(bitWidths, count) {
|
|
344
|
+
const firstBitWidth = bitWidths[0];
|
|
345
|
+
for (let index = 1; index < count; index++) {
|
|
346
|
+
if (bitWidths[index] !== firstBitWidth)
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
/** Decodes one INT64 mini-block directly into the two 32-bit words backing Arrow Int64. */
|
|
352
|
+
function decodeInt64ArrowMiniBlock(buffer, packedOffset, bitWidth, count, minimumDeltaLow, minimumDeltaHigh, state, outputWords, outputOffset) {
|
|
353
|
+
let stateLow = state[0];
|
|
354
|
+
let stateHigh = state[1];
|
|
355
|
+
const lowWordOffset = IS_LITTLE_ENDIAN ? 0 : 1;
|
|
356
|
+
const highWordOffset = IS_LITTLE_ENDIAN ? 1 : 0;
|
|
357
|
+
if (bitWidth === 0) {
|
|
358
|
+
for (let index = 0; index < count; index++) {
|
|
359
|
+
const lowSum = stateLow + minimumDeltaLow;
|
|
360
|
+
stateLow = lowSum >>> 0;
|
|
361
|
+
// V8 strength-reduces division by this constant; explicit carry branches benchmark slower.
|
|
362
|
+
stateHigh = (stateHigh + minimumDeltaHigh + Math.floor(lowSum / UINT32_BASE)) >>> 0;
|
|
363
|
+
const wordOffset = (outputOffset + index) * 2;
|
|
364
|
+
outputWords[wordOffset + lowWordOffset] = stateLow;
|
|
365
|
+
outputWords[wordOffset + highWordOffset] = stateHigh;
|
|
366
|
+
}
|
|
367
|
+
state[0] = stateLow;
|
|
368
|
+
state[1] = stateHigh;
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
if (bitWidth <= 24) {
|
|
372
|
+
decodeNarrowInt64ArrowMiniBlock(buffer, packedOffset, bitWidth, count, minimumDeltaLow, minimumDeltaHigh, state, outputWords, outputOffset);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (bitWidth <= 45) {
|
|
376
|
+
const divisor = 2 ** bitWidth;
|
|
377
|
+
let packedBits = 0;
|
|
378
|
+
let packedBitCount = 0;
|
|
379
|
+
let byteOffset = packedOffset;
|
|
380
|
+
for (let index = 0; index < count; index++) {
|
|
381
|
+
while (packedBitCount < bitWidth) {
|
|
382
|
+
packedBits += buffer[byteOffset++] * 2 ** packedBitCount;
|
|
383
|
+
packedBitCount += 8;
|
|
384
|
+
}
|
|
385
|
+
const packedDelta = packedBits % divisor;
|
|
386
|
+
packedBits = Math.floor(packedBits / divisor);
|
|
387
|
+
packedBitCount -= bitWidth;
|
|
388
|
+
const packedDeltaLow = packedDelta >>> 0;
|
|
389
|
+
const packedDeltaHigh = Math.floor(packedDelta / UINT32_BASE);
|
|
390
|
+
const lowSum = stateLow + minimumDeltaLow + packedDeltaLow;
|
|
391
|
+
stateLow = lowSum >>> 0;
|
|
392
|
+
// V8 strength-reduces division by this constant; explicit carry branches benchmark slower.
|
|
393
|
+
stateHigh =
|
|
394
|
+
(stateHigh + minimumDeltaHigh + packedDeltaHigh + Math.floor(lowSum / UINT32_BASE)) >>> 0;
|
|
395
|
+
const wordOffset = (outputOffset + index) * 2;
|
|
396
|
+
outputWords[wordOffset + lowWordOffset] = stateLow;
|
|
397
|
+
outputWords[wordOffset + highWordOffset] = stateHigh;
|
|
398
|
+
}
|
|
399
|
+
state[0] = stateLow;
|
|
400
|
+
state[1] = stateHigh;
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const highBitWidth = bitWidth - 32;
|
|
404
|
+
const highMask = highBitWidth === 32 ? 0xffff_ffff : 2 ** highBitWidth - 1;
|
|
405
|
+
for (let index = 0; index < count; index++) {
|
|
406
|
+
const packedBitOffset = index * bitWidth;
|
|
407
|
+
const byteOffset = packedOffset + Math.floor(packedBitOffset / 8);
|
|
408
|
+
const shift = packedBitOffset & 7;
|
|
409
|
+
const lowerWord = readUint32LELoose(buffer, byteOffset);
|
|
410
|
+
const middleWord = readUint32LELoose(buffer, byteOffset + 4);
|
|
411
|
+
let packedDeltaLow;
|
|
412
|
+
let packedDeltaHigh;
|
|
413
|
+
if (shift === 0) {
|
|
414
|
+
packedDeltaLow = lowerWord;
|
|
415
|
+
packedDeltaHigh = middleWord & highMask;
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
const upperByte = buffer[byteOffset + 8] ?? 0;
|
|
419
|
+
packedDeltaLow = ((lowerWord >>> shift) | (middleWord << (32 - shift))) >>> 0;
|
|
420
|
+
packedDeltaHigh = ((middleWord >>> shift) | (upperByte << (32 - shift))) & highMask;
|
|
421
|
+
}
|
|
422
|
+
const lowSum = stateLow + minimumDeltaLow + packedDeltaLow;
|
|
423
|
+
stateLow = lowSum >>> 0;
|
|
424
|
+
// V8 strength-reduces division by this constant; explicit carry branches benchmark slower.
|
|
425
|
+
stateHigh =
|
|
426
|
+
(stateHigh + minimumDeltaHigh + packedDeltaHigh + Math.floor(lowSum / UINT32_BASE)) >>> 0;
|
|
427
|
+
const wordOffset = (outputOffset + index) * 2;
|
|
428
|
+
outputWords[wordOffset + lowWordOffset] = stateLow;
|
|
429
|
+
outputWords[wordOffset + highWordOffset] = stateHigh;
|
|
430
|
+
}
|
|
431
|
+
state[0] = stateLow;
|
|
432
|
+
state[1] = stateHigh;
|
|
433
|
+
}
|
|
434
|
+
/** Decodes an INT64 mini-block whose packed deltas fit a 32-bit bit reservoir. */
|
|
435
|
+
function decodeNarrowInt64ArrowMiniBlock(buffer, packedOffset, bitWidth, count, minimumDeltaLow, minimumDeltaHigh, state, outputWords, outputOffset) {
|
|
436
|
+
const mask = 2 ** bitWidth - 1;
|
|
437
|
+
const lowWordOffset = IS_LITTLE_ENDIAN ? 0 : 1;
|
|
438
|
+
const highWordOffset = IS_LITTLE_ENDIAN ? 1 : 0;
|
|
439
|
+
let stateLow = state[0];
|
|
440
|
+
let stateHigh = state[1];
|
|
441
|
+
let packedBits = 0;
|
|
442
|
+
let packedBitCount = 0;
|
|
443
|
+
let byteOffset = packedOffset;
|
|
444
|
+
for (let index = 0; index < count; index++) {
|
|
445
|
+
while (packedBitCount < bitWidth) {
|
|
446
|
+
packedBits |= buffer[byteOffset++] << packedBitCount;
|
|
447
|
+
packedBitCount += 8;
|
|
448
|
+
}
|
|
449
|
+
const packedDelta = packedBits & mask;
|
|
450
|
+
packedBits >>>= bitWidth;
|
|
451
|
+
packedBitCount -= bitWidth;
|
|
452
|
+
const lowSum = stateLow + minimumDeltaLow + packedDelta;
|
|
453
|
+
stateLow = lowSum >>> 0;
|
|
454
|
+
// V8 strength-reduces division by this constant; explicit carry branches benchmark slower.
|
|
455
|
+
stateHigh = (stateHigh + minimumDeltaHigh + Math.floor(lowSum / UINT32_BASE)) >>> 0;
|
|
456
|
+
const wordOffset = (outputOffset + index) * 2;
|
|
457
|
+
outputWords[wordOffset + lowWordOffset] = stateLow;
|
|
458
|
+
outputWords[wordOffset + highWordOffset] = stateHigh;
|
|
459
|
+
}
|
|
460
|
+
state[0] = stateLow;
|
|
461
|
+
state[1] = stateHigh;
|
|
462
|
+
}
|
|
463
|
+
/** Reads an unaligned little-endian word, treating bytes beyond a mini-block as zero. */
|
|
464
|
+
function readUint32LELoose(buffer, offset) {
|
|
465
|
+
return (((buffer[offset] ?? 0) |
|
|
466
|
+
((buffer[offset + 1] ?? 0) << 8) |
|
|
467
|
+
((buffer[offset + 2] ?? 0) << 16) |
|
|
468
|
+
((buffer[offset + 3] ?? 0) << 24)) >>>
|
|
469
|
+
0);
|
|
470
|
+
}
|
|
471
|
+
/** Writes one pair of 32-bit words into a platform-endian BigInt64Array backing buffer. */
|
|
472
|
+
function writeInt64Words(outputWords, outputIndex, low, high) {
|
|
473
|
+
const wordOffset = outputIndex * 2;
|
|
474
|
+
outputWords[wordOffset + (IS_LITTLE_ENDIAN ? 0 : 1)] = low;
|
|
475
|
+
outputWords[wordOffset + (IS_LITTLE_ENDIAN ? 1 : 0)] = high;
|
|
476
|
+
}
|
|
477
|
+
/** Decodes one INT64 mini-block, using numbers whenever the packed value remains exact. */
|
|
478
|
+
function decodeInt64MiniBlock(buffer, packedOffset, bitWidth, count, minimumDelta, initialValue, output, outputOffset, int64AsBigInt) {
|
|
479
|
+
let value = initialValue;
|
|
480
|
+
if (bitWidth === 0) {
|
|
481
|
+
for (let index = 0; index < count; index++) {
|
|
482
|
+
value += minimumDelta;
|
|
483
|
+
writeInt64Output(output, outputOffset + index, value, int64AsBigInt);
|
|
484
|
+
}
|
|
485
|
+
return value;
|
|
486
|
+
}
|
|
487
|
+
if (bitWidth <= 45) {
|
|
488
|
+
const divisor = 2 ** bitWidth;
|
|
489
|
+
let packedBits = 0;
|
|
490
|
+
let packedBitCount = 0;
|
|
491
|
+
let byteOffset = packedOffset;
|
|
492
|
+
for (let index = 0; index < count; index++) {
|
|
493
|
+
while (packedBitCount < bitWidth) {
|
|
494
|
+
packedBits += buffer[byteOffset++] * 2 ** packedBitCount;
|
|
495
|
+
packedBitCount += 8;
|
|
496
|
+
}
|
|
497
|
+
const packedDelta = packedBits % divisor;
|
|
498
|
+
packedBits = Math.floor(packedBits / divisor);
|
|
499
|
+
packedBitCount -= bitWidth;
|
|
500
|
+
value += minimumDelta + BigInt(packedDelta);
|
|
501
|
+
writeInt64Output(output, outputOffset + index, value, int64AsBigInt);
|
|
502
|
+
}
|
|
503
|
+
return value;
|
|
504
|
+
}
|
|
505
|
+
const bitWidthBigInt = BigInt(bitWidth);
|
|
506
|
+
const mask = (1n << bitWidthBigInt) - 1n;
|
|
507
|
+
let packedBits = 0n;
|
|
508
|
+
let packedBitCount = 0;
|
|
509
|
+
let byteOffset = packedOffset;
|
|
510
|
+
for (let index = 0; index < count; index++) {
|
|
511
|
+
while (packedBitCount < bitWidth) {
|
|
512
|
+
const byteCount = Math.min(6, Math.ceil((bitWidth - packedBitCount) / 8));
|
|
513
|
+
let chunk = 0;
|
|
514
|
+
let multiplier = 1;
|
|
515
|
+
for (let byteIndex = 0; byteIndex < byteCount; byteIndex++) {
|
|
516
|
+
chunk += buffer[byteOffset++] * multiplier;
|
|
517
|
+
multiplier *= 256;
|
|
518
|
+
}
|
|
519
|
+
packedBits |= BigInt(chunk) << BigInt(packedBitCount);
|
|
520
|
+
packedBitCount += byteCount * 8;
|
|
521
|
+
}
|
|
522
|
+
const packedDelta = packedBits & mask;
|
|
523
|
+
packedBits >>= bitWidthBigInt;
|
|
524
|
+
packedBitCount -= bitWidth;
|
|
525
|
+
value += minimumDelta + packedDelta;
|
|
526
|
+
writeInt64Output(output, outputOffset + index, value, int64AsBigInt);
|
|
527
|
+
}
|
|
528
|
+
return value;
|
|
529
|
+
}
|
|
530
|
+
/** Writes one signed INT64 without a bigint-to-number round trip for Arrow destinations. */
|
|
531
|
+
function writeInt64Output(output, outputIndex, value, int64AsBigInt) {
|
|
532
|
+
output[outputIndex] = int64AsBigInt
|
|
533
|
+
? BigInt.asIntN(64, value)
|
|
534
|
+
: Number(BigInt.asIntN(64, value));
|
|
535
|
+
}
|
|
536
|
+
/** Decodes lengths with delta packing followed by contiguous byte-array payloads. */
|
|
537
|
+
export function decodeDeltaLengthByteArrayValues(type, cursor, count, options) {
|
|
538
|
+
assertByteArrayType(type, 'DELTA_LENGTH_BYTE_ARRAY');
|
|
539
|
+
const lengths = new Int32Array(count);
|
|
540
|
+
decodeDeltaBinaryPackedValues('INT32', cursor, count, { output: lengths });
|
|
541
|
+
if (options.byteArrayOutput) {
|
|
542
|
+
return decodeDeltaLengthByteArraysToContiguousOutput(cursor, lengths, options);
|
|
543
|
+
}
|
|
544
|
+
const { output, outputOffset } = getParquetValueOutput(options, count);
|
|
545
|
+
for (let index = 0; index < count; index++) {
|
|
546
|
+
output[outputOffset + index] = readByteArray(cursor, lengths[index]);
|
|
547
|
+
}
|
|
548
|
+
return output;
|
|
549
|
+
}
|
|
550
|
+
/** Copies DELTA_LENGTH_BYTE_ARRAY's contiguous payload directly into an Arrow byte buffer. */
|
|
551
|
+
function decodeDeltaLengthByteArraysToContiguousOutput(cursor, lengths, options) {
|
|
552
|
+
const byteArrayOutput = options.byteArrayOutput;
|
|
553
|
+
const outputOffset = options.outputOffset || 0;
|
|
554
|
+
let payloadByteLength = 0;
|
|
555
|
+
for (const length of lengths) {
|
|
556
|
+
if (length < 0) {
|
|
557
|
+
throw new Error(`Invalid delta byte-array length ${length}`);
|
|
558
|
+
}
|
|
559
|
+
payloadByteLength += length;
|
|
560
|
+
}
|
|
561
|
+
assertReadable(cursor, payloadByteLength);
|
|
562
|
+
reserveParquetByteArrayOutput(byteArrayOutput, payloadByteLength);
|
|
563
|
+
let byteOffset = byteArrayOutput.byteLength;
|
|
564
|
+
byteArrayOutput.valueOffsets[outputOffset] = byteOffset;
|
|
565
|
+
const payloadEnd = cursor.offset + payloadByteLength;
|
|
566
|
+
byteArrayOutput.data.set(cursor.buffer.subarray(cursor.offset, payloadEnd), byteOffset);
|
|
567
|
+
cursor.offset = payloadEnd;
|
|
568
|
+
for (let valueIndex = 0; valueIndex < lengths.length; valueIndex++) {
|
|
569
|
+
byteOffset += lengths[valueIndex];
|
|
570
|
+
byteArrayOutput.valueOffsets[outputOffset + valueIndex + 1] = byteOffset;
|
|
571
|
+
}
|
|
572
|
+
byteArrayOutput.byteLength = byteOffset;
|
|
573
|
+
return options.output || [];
|
|
574
|
+
}
|
|
575
|
+
/** Decodes prefix lengths and delta-length suffixes into complete byte-array values. */
|
|
576
|
+
export function decodeDeltaByteArrayValues(type, cursor, count, options) {
|
|
577
|
+
assertByteArrayType(type, 'DELTA_BYTE_ARRAY');
|
|
578
|
+
// One combined allocation is faster than separate prefix/suffix buffers in V8. Keep the two
|
|
579
|
+
// subarray views: reusing Arrow offsets as scratch storage deoptimizes reconstruction.
|
|
580
|
+
const lengths = new Int32Array(count * 2);
|
|
581
|
+
const prefixLengths = lengths.subarray(0, count);
|
|
582
|
+
const suffixLengths = lengths.subarray(count);
|
|
583
|
+
decodeDeltaBinaryPackedValues('INT32', cursor, count, { output: prefixLengths });
|
|
584
|
+
decodeDeltaBinaryPackedValues('INT32', cursor, count, { output: suffixLengths });
|
|
585
|
+
if (options.byteArrayOutput) {
|
|
586
|
+
return decodeDeltaByteArraysToContiguousOutput(cursor, prefixLengths, suffixLengths, options);
|
|
587
|
+
}
|
|
588
|
+
const { output, outputOffset } = getParquetValueOutput(options, count);
|
|
589
|
+
let previousValue;
|
|
590
|
+
for (let index = 0; index < count; index++) {
|
|
591
|
+
const prefixLength = prefixLengths[index];
|
|
592
|
+
if (prefixLength < 0 || (prefixLength > 0 && prefixLength > (previousValue?.length || 0))) {
|
|
593
|
+
throw new Error(`Invalid DELTA_BYTE_ARRAY prefix length ${prefixLength}`);
|
|
594
|
+
}
|
|
595
|
+
const suffix = readByteArray(cursor, suffixLengths[index]);
|
|
596
|
+
if (prefixLength === 0) {
|
|
597
|
+
output[outputOffset + index] = suffix;
|
|
598
|
+
previousValue = suffix;
|
|
599
|
+
continue;
|
|
600
|
+
}
|
|
601
|
+
const value = new Uint8Array(prefixLength + suffix.length);
|
|
602
|
+
value.set(previousValue.subarray(0, prefixLength));
|
|
603
|
+
value.set(suffix, prefixLength);
|
|
604
|
+
output[outputOffset + index] = value;
|
|
605
|
+
previousValue = value;
|
|
606
|
+
}
|
|
607
|
+
return output;
|
|
608
|
+
}
|
|
609
|
+
/** Reconstructs DELTA_BYTE_ARRAY values directly in one Arrow-compatible byte buffer. */
|
|
610
|
+
function decodeDeltaByteArraysToContiguousOutput(cursor, prefixLengths, suffixLengths, options) {
|
|
611
|
+
const byteArrayOutput = options.byteArrayOutput;
|
|
612
|
+
const outputOffset = options.outputOffset || 0;
|
|
613
|
+
let byteOffset = byteArrayOutput.byteLength;
|
|
614
|
+
let previousValueOffset = byteOffset;
|
|
615
|
+
let previousValueLength = 0;
|
|
616
|
+
byteArrayOutput.valueOffsets[outputOffset] = byteOffset;
|
|
617
|
+
let requiredByteLength = 0;
|
|
618
|
+
let requiredSuffixByteLength = 0;
|
|
619
|
+
for (let valueIndex = 0; valueIndex < prefixLengths.length; valueIndex++) {
|
|
620
|
+
const prefixLength = prefixLengths[valueIndex];
|
|
621
|
+
const suffixLength = suffixLengths[valueIndex];
|
|
622
|
+
if (prefixLength < 0 || prefixLength > previousValueLength) {
|
|
623
|
+
throw new Error(`Invalid DELTA_BYTE_ARRAY prefix length ${prefixLength}`);
|
|
624
|
+
}
|
|
625
|
+
if (suffixLength < 0) {
|
|
626
|
+
throw new Error(`Invalid delta byte-array length ${suffixLength}`);
|
|
627
|
+
}
|
|
628
|
+
previousValueLength = prefixLength + suffixLength;
|
|
629
|
+
requiredByteLength += previousValueLength;
|
|
630
|
+
requiredSuffixByteLength += suffixLength;
|
|
631
|
+
}
|
|
632
|
+
assertReadable(cursor, requiredSuffixByteLength);
|
|
633
|
+
reserveParquetByteArrayOutput(byteArrayOutput, requiredByteLength);
|
|
634
|
+
const data = byteArrayOutput.data;
|
|
635
|
+
const valueOffsets = byteArrayOutput.valueOffsets;
|
|
636
|
+
const inputBuffer = cursor.buffer;
|
|
637
|
+
let inputOffset = cursor.offset;
|
|
638
|
+
previousValueLength = 0;
|
|
639
|
+
for (let valueIndex = 0; valueIndex < prefixLengths.length; valueIndex++) {
|
|
640
|
+
const prefixLength = prefixLengths[valueIndex];
|
|
641
|
+
const suffixLength = suffixLengths[valueIndex];
|
|
642
|
+
const valueLength = prefixLength + suffixLength;
|
|
643
|
+
if (prefixLength > 0) {
|
|
644
|
+
if (prefixLength <= 15) {
|
|
645
|
+
for (let byteIndex = 0; byteIndex < prefixLength; byteIndex++) {
|
|
646
|
+
data[byteOffset + byteIndex] = data[previousValueOffset + byteIndex];
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
else {
|
|
650
|
+
data.copyWithin(byteOffset, previousValueOffset, previousValueOffset + prefixLength);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
const suffixEnd = inputOffset + suffixLength;
|
|
654
|
+
if (suffixLength <= 15) {
|
|
655
|
+
let suffixOutputOffset = byteOffset + prefixLength;
|
|
656
|
+
while (inputOffset < suffixEnd) {
|
|
657
|
+
data[suffixOutputOffset++] = inputBuffer[inputOffset++];
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
data.set(inputBuffer.subarray(inputOffset, suffixEnd), byteOffset + prefixLength);
|
|
662
|
+
inputOffset = suffixEnd;
|
|
663
|
+
}
|
|
664
|
+
previousValueOffset = byteOffset;
|
|
665
|
+
previousValueLength = valueLength;
|
|
666
|
+
byteOffset += valueLength;
|
|
667
|
+
valueOffsets[outputOffset + valueIndex + 1] = byteOffset;
|
|
668
|
+
}
|
|
669
|
+
cursor.offset = inputOffset;
|
|
670
|
+
byteArrayOutput.byteLength = byteOffset;
|
|
671
|
+
return options.output || [];
|
|
672
|
+
}
|
|
673
|
+
/** Reads and validates a sequence of one-byte mini-block bit widths. */
|
|
674
|
+
function readBitWidths(cursor, count, maximumBitWidth) {
|
|
675
|
+
assertReadable(cursor, count);
|
|
676
|
+
const bitWidths = cursor.buffer.subarray(cursor.offset, cursor.offset + count);
|
|
677
|
+
cursor.offset += count;
|
|
678
|
+
for (const bitWidth of bitWidths) {
|
|
679
|
+
if (bitWidth > maximumBitWidth) {
|
|
680
|
+
throw new Error('Invalid DELTA_BINARY_PACKED bit width');
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
return bitWidths;
|
|
684
|
+
}
|
|
685
|
+
/** Reads one signed zig-zag INT64 directly into its low and high two's-complement words. */
|
|
686
|
+
function readZigZagVarIntWords(cursor, words) {
|
|
687
|
+
let low = 0;
|
|
688
|
+
let high = 0;
|
|
689
|
+
for (let byteIndex = 0; byteIndex < 10; byteIndex++) {
|
|
690
|
+
assertReadable(cursor, 1);
|
|
691
|
+
const byte = cursor.buffer[cursor.offset++];
|
|
692
|
+
const payload = byte & 0x7f;
|
|
693
|
+
const bitOffset = byteIndex * 7;
|
|
694
|
+
if (byteIndex === 9 && payload > 1) {
|
|
695
|
+
throw new Error('Invalid Parquet variable-length integer');
|
|
696
|
+
}
|
|
697
|
+
if (bitOffset < 32) {
|
|
698
|
+
low |= payload << bitOffset;
|
|
699
|
+
if (bitOffset > 25) {
|
|
700
|
+
high |= payload >>> (32 - bitOffset);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
high |= payload << (bitOffset - 32);
|
|
705
|
+
}
|
|
706
|
+
if ((byte & 0x80) === 0) {
|
|
707
|
+
const negative = low & 1;
|
|
708
|
+
let decodedLow = ((low >>> 1) | ((high & 1) << 31)) >>> 0;
|
|
709
|
+
let decodedHigh = high >>> 1;
|
|
710
|
+
if (negative) {
|
|
711
|
+
decodedLow = ~decodedLow >>> 0;
|
|
712
|
+
decodedHigh = ~decodedHigh >>> 0;
|
|
713
|
+
}
|
|
714
|
+
words[0] = decodedLow;
|
|
715
|
+
words[1] = decodedHigh;
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
throw new Error('Invalid Parquet variable-length integer');
|
|
720
|
+
}
|
|
721
|
+
/** Reads an unsigned base-128 variable-length integer. */
|
|
722
|
+
function readUnsignedVarInt(cursor) {
|
|
723
|
+
let value = 0n;
|
|
724
|
+
for (let byteIndex = 0; byteIndex < 10; byteIndex++) {
|
|
725
|
+
assertReadable(cursor, 1);
|
|
726
|
+
const byte = cursor.buffer[cursor.offset++];
|
|
727
|
+
value |= BigInt(byte & 0x7f) << BigInt(byteIndex * 7);
|
|
728
|
+
if ((byte & 0x80) === 0) {
|
|
729
|
+
return value;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
throw new Error('Invalid Parquet variable-length integer');
|
|
733
|
+
}
|
|
734
|
+
/** Reads an unsigned variable-length integer that must fit safely in a number. */
|
|
735
|
+
function readUnsignedVarIntNumber(cursor) {
|
|
736
|
+
let value = 0;
|
|
737
|
+
let multiplier = 1;
|
|
738
|
+
for (let byteIndex = 0; byteIndex < 10; byteIndex++) {
|
|
739
|
+
assertReadable(cursor, 1);
|
|
740
|
+
const byte = cursor.buffer[cursor.offset++];
|
|
741
|
+
value += (byte & 0x7f) * multiplier;
|
|
742
|
+
if ((byte & 0x80) === 0) {
|
|
743
|
+
if (!Number.isSafeInteger(value)) {
|
|
744
|
+
throw new Error('Parquet variable-length integer exceeds the safe integer range');
|
|
745
|
+
}
|
|
746
|
+
return value;
|
|
747
|
+
}
|
|
748
|
+
multiplier *= 128;
|
|
749
|
+
}
|
|
750
|
+
throw new Error('Invalid Parquet variable-length integer');
|
|
751
|
+
}
|
|
752
|
+
/** Reads a zig-zag encoded INT32 variable-length integer without allocating BigInts. */
|
|
753
|
+
function readZigZagVarInt32(cursor) {
|
|
754
|
+
const value = readUnsignedVarIntNumber(cursor);
|
|
755
|
+
if (value > 0xffffffff) {
|
|
756
|
+
throw new Error('Parquet INT32 variable-length integer exceeds 32 bits');
|
|
757
|
+
}
|
|
758
|
+
return value % 2 === 0 ? value / 2 : -(value + 1) / 2;
|
|
759
|
+
}
|
|
760
|
+
/** Reads a zig-zag encoded signed variable-length integer. */
|
|
761
|
+
function readZigZagVarInt(cursor) {
|
|
762
|
+
const value = readUnsignedVarInt(cursor);
|
|
763
|
+
return (value >> 1n) ^ -(value & 1n);
|
|
764
|
+
}
|
|
765
|
+
/** Reads and copies one byte array of a validated length. */
|
|
766
|
+
function readByteArray(cursor, length) {
|
|
767
|
+
if (!Number.isInteger(length) || length < 0) {
|
|
768
|
+
throw new Error(`Invalid delta byte-array length ${length}`);
|
|
769
|
+
}
|
|
770
|
+
assertReadable(cursor, length);
|
|
771
|
+
const value = copyUint8Array(cursor.buffer.subarray(cursor.offset, cursor.offset + length));
|
|
772
|
+
cursor.offset += length;
|
|
773
|
+
return value;
|
|
774
|
+
}
|
|
775
|
+
/** Restricts byte-array delta encodings to their Parquet physical types. */
|
|
776
|
+
function assertByteArrayType(type, encoding) {
|
|
777
|
+
if (type !== 'BYTE_ARRAY' && type !== 'FIXED_LEN_BYTE_ARRAY') {
|
|
778
|
+
throw new Error(`${encoding} does not support Parquet type ${type}`);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
/** Ensures a codec read stays inside the current page buffer. */
|
|
782
|
+
function assertReadable(cursor, byteLength) {
|
|
783
|
+
const size = cursor.size ?? cursor.buffer.length;
|
|
784
|
+
if (byteLength < 0 || cursor.offset + byteLength > size) {
|
|
785
|
+
throw new Error('Unexpected end of Parquet delta-encoded data');
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
//# sourceMappingURL=delta.js.map
|