@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,727 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {ReadableFile} from '@loaders.gl/loader-utils';
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
ParquetComparisonPredicate,
|
|
9
|
+
ParquetInPredicate,
|
|
10
|
+
ParquetNullPredicate,
|
|
11
|
+
ParquetPredicate
|
|
12
|
+
} from '../parquet-source-types';
|
|
13
|
+
import {
|
|
14
|
+
ColumnIndex,
|
|
15
|
+
Encoding,
|
|
16
|
+
OffsetIndex,
|
|
17
|
+
type ColumnChunk,
|
|
18
|
+
type RowGroup
|
|
19
|
+
} from '../parquetjs/parquet-thrift/index';
|
|
20
|
+
import type {ParquetField} from '../parquetjs/schema/declare';
|
|
21
|
+
import type {ParquetSchema} from '../parquetjs/schema/schema';
|
|
22
|
+
import * as Types from '../parquetjs/schema/types';
|
|
23
|
+
import {
|
|
24
|
+
copyUint8Array,
|
|
25
|
+
readDoubleLE,
|
|
26
|
+
readFloatLE,
|
|
27
|
+
readInt32LE,
|
|
28
|
+
readInt64LE,
|
|
29
|
+
readUInt32LE,
|
|
30
|
+
readUInt64LE,
|
|
31
|
+
toUint8Array
|
|
32
|
+
} from '../parquetjs/utils/binary-utils';
|
|
33
|
+
import {Uint8ArrayCompactProtocol} from '../parquetjs/utils/uint8-array-compact-protocol';
|
|
34
|
+
import {Uint8ArrayTransport} from '../parquetjs/utils/uint8-array-transport';
|
|
35
|
+
import {
|
|
36
|
+
canParquetStatisticsMatch,
|
|
37
|
+
getParquetPredicatePath,
|
|
38
|
+
getParquetPredicatePaths
|
|
39
|
+
} from './parquet-predicate';
|
|
40
|
+
|
|
41
|
+
/** Half-open logical row range relative to one Parquet row group. */
|
|
42
|
+
export type ParquetRowRange = {
|
|
43
|
+
/** First included row. */
|
|
44
|
+
start: number;
|
|
45
|
+
/** First excluded row. */
|
|
46
|
+
end: number;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** One data-page location decoded from a Parquet offset index. */
|
|
50
|
+
export type ParquetDataPageLocation = {
|
|
51
|
+
/** Absolute page-header offset in the source object. */
|
|
52
|
+
offset: number;
|
|
53
|
+
/** Page header plus compressed body byte length. */
|
|
54
|
+
compressedByteLength: number;
|
|
55
|
+
/** First logical row represented by the page. */
|
|
56
|
+
firstRowIndex: number;
|
|
57
|
+
/** First logical row represented by the next page. */
|
|
58
|
+
endRowIndex: number;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/** Page locations keyed by the physical Parquet column path. */
|
|
62
|
+
export type ParquetPageLocations = Record<string, ParquetDataPageLocation[]>;
|
|
63
|
+
|
|
64
|
+
/** Selective page plan for one row group. */
|
|
65
|
+
export type ParquetPagePruningPlan = {
|
|
66
|
+
/** Candidate row ranges after conservative page-statistics pruning. */
|
|
67
|
+
rowRanges: ParquetRowRange[];
|
|
68
|
+
/** Offset-index page locations for every decoded column. */
|
|
69
|
+
pageLocations: ParquetPageLocations;
|
|
70
|
+
/** Number of column and offset index blobs decoded. */
|
|
71
|
+
indexCount: number;
|
|
72
|
+
/** Data pages in all decoded column chunks. */
|
|
73
|
+
totalPageCount: number;
|
|
74
|
+
/** Data pages required by the candidate ranges. */
|
|
75
|
+
selectedPageCount: number;
|
|
76
|
+
/** Logical rows eliminated before data-page reads. */
|
|
77
|
+
prunedRowCount: number;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/** Decrypts an encrypted page-index module before Thrift decoding. */
|
|
81
|
+
export type ParquetPageIndexDecryptor = (
|
|
82
|
+
bytes: Uint8Array,
|
|
83
|
+
module: 'column-index' | 'offset-index',
|
|
84
|
+
rowGroupOrdinal: number,
|
|
85
|
+
columnOrdinal: number,
|
|
86
|
+
columnChunk: ColumnChunk
|
|
87
|
+
) => Promise<Uint8Array>;
|
|
88
|
+
|
|
89
|
+
/** Optional controls for reading page indexes from a Parquet source. */
|
|
90
|
+
export type ParquetPagePruningOptions = {
|
|
91
|
+
/** Row-group ordinal used when constructing encrypted-module AAD. */
|
|
92
|
+
rowGroupOrdinal?: number;
|
|
93
|
+
/** Decode legacy INT96 page statistics as epoch nanoseconds. */
|
|
94
|
+
int96AsTimestamp?: boolean;
|
|
95
|
+
/** Decrypts encrypted index modules; omitted for plaintext files. */
|
|
96
|
+
decryptModule?: ParquetPageIndexDecryptor;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/** Logical statistics attached to one data page. */
|
|
100
|
+
export type ParquetPageStatistics = {
|
|
101
|
+
min?: unknown;
|
|
102
|
+
max?: unknown;
|
|
103
|
+
nullCount?: number;
|
|
104
|
+
minIsExact?: boolean;
|
|
105
|
+
maxIsExact?: boolean;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
type ParquetColumnPageStatistics = {
|
|
109
|
+
pages: ParquetDataPageLocation[];
|
|
110
|
+
statistics: ParquetPageStatistics[];
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Builds a conservative selective-page plan from Parquet column and offset indexes.
|
|
115
|
+
*
|
|
116
|
+
* Returns `undefined` when indexes or the selected decoder cannot safely avoid full column-chunk
|
|
117
|
+
* reads. Repeated leaves are selected only when every decoded column uses the same page row
|
|
118
|
+
* boundaries, so ranges begin and end on complete logical rows. An empty `rowRanges` array means
|
|
119
|
+
* the indexes prove the predicate cannot match.
|
|
120
|
+
*/
|
|
121
|
+
export async function createParquetPagePruningPlan(
|
|
122
|
+
file: ReadableFile,
|
|
123
|
+
rowGroup: RowGroup,
|
|
124
|
+
schema: ParquetSchema,
|
|
125
|
+
selectedColumnPaths: readonly string[][],
|
|
126
|
+
predicate: ParquetPredicate,
|
|
127
|
+
signal?: AbortSignal,
|
|
128
|
+
options?: ParquetPagePruningOptions
|
|
129
|
+
): Promise<ParquetPagePruningPlan | undefined> {
|
|
130
|
+
const rowCount = Number(rowGroup.num_rows);
|
|
131
|
+
const selectedColumnChunks = getSelectedColumnChunks(rowGroup, selectedColumnPaths);
|
|
132
|
+
if (!isSafePageSelection(schema, selectedColumnChunks) || rowCount <= 0) {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const pageLocations: ParquetPageLocations = {};
|
|
137
|
+
const pageStatistics: Record<string, ParquetColumnPageStatistics> = {};
|
|
138
|
+
const predicatePaths = new Set(
|
|
139
|
+
getParquetPredicatePaths(predicate).map(path => JSON.stringify(path))
|
|
140
|
+
);
|
|
141
|
+
let indexCount = 0;
|
|
142
|
+
|
|
143
|
+
await Promise.all(
|
|
144
|
+
selectedColumnChunks.map(async columnChunk => {
|
|
145
|
+
const columnOrdinal = rowGroup.columns.indexOf(columnChunk);
|
|
146
|
+
const path = columnChunk.meta_data!.path_in_schema;
|
|
147
|
+
const pathKey = JSON.stringify(path);
|
|
148
|
+
const offsetIndexRange = getParquetIndexRange(
|
|
149
|
+
columnChunk.offset_index_offset,
|
|
150
|
+
columnChunk.offset_index_length,
|
|
151
|
+
file.size
|
|
152
|
+
);
|
|
153
|
+
if (!offsetIndexRange) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const offsetIndexBytes = await file.read(
|
|
157
|
+
offsetIndexRange.offset,
|
|
158
|
+
offsetIndexRange.length,
|
|
159
|
+
signal
|
|
160
|
+
);
|
|
161
|
+
let pages: ParquetDataPageLocation[];
|
|
162
|
+
try {
|
|
163
|
+
const decryptedBytes = options?.decryptModule
|
|
164
|
+
? await options.decryptModule(
|
|
165
|
+
toUint8Array(offsetIndexBytes),
|
|
166
|
+
'offset-index',
|
|
167
|
+
options.rowGroupOrdinal ?? 0,
|
|
168
|
+
columnOrdinal,
|
|
169
|
+
columnChunk
|
|
170
|
+
)
|
|
171
|
+
: toUint8Array(offsetIndexBytes);
|
|
172
|
+
pages = decodeOffsetIndex(decryptedBytes, rowCount);
|
|
173
|
+
} catch {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
pageLocations[pathKey] = pages;
|
|
177
|
+
indexCount++;
|
|
178
|
+
|
|
179
|
+
if (!predicatePaths.has(pathKey)) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const columnIndexRange = getParquetIndexRange(
|
|
183
|
+
columnChunk.column_index_offset,
|
|
184
|
+
columnChunk.column_index_length,
|
|
185
|
+
file.size
|
|
186
|
+
);
|
|
187
|
+
if (!columnIndexRange) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const columnIndexBytes = await file.read(
|
|
191
|
+
columnIndexRange.offset,
|
|
192
|
+
columnIndexRange.length,
|
|
193
|
+
signal
|
|
194
|
+
);
|
|
195
|
+
const field = schema.findField(path);
|
|
196
|
+
try {
|
|
197
|
+
const decryptedBytes = options?.decryptModule
|
|
198
|
+
? await options.decryptModule(
|
|
199
|
+
toUint8Array(columnIndexBytes),
|
|
200
|
+
'column-index',
|
|
201
|
+
options.rowGroupOrdinal ?? 0,
|
|
202
|
+
columnOrdinal,
|
|
203
|
+
columnChunk
|
|
204
|
+
)
|
|
205
|
+
: toUint8Array(columnIndexBytes);
|
|
206
|
+
pageStatistics[pathKey] = {
|
|
207
|
+
pages,
|
|
208
|
+
statistics: decodeParquetColumnIndex(decryptedBytes, pages, field, options)
|
|
209
|
+
};
|
|
210
|
+
} catch {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
indexCount++;
|
|
214
|
+
})
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
if (
|
|
218
|
+
selectedColumnChunks.some(
|
|
219
|
+
columnChunk => !pageLocations[JSON.stringify(columnChunk.meta_data!.path_in_schema)]
|
|
220
|
+
)
|
|
221
|
+
) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (!hasCompatiblePageBoundaries(schema, selectedColumnChunks, pageLocations)) {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const candidateRanges = getPredicateRowRanges(predicate, pageStatistics, rowCount);
|
|
230
|
+
if (candidateRanges === undefined) {
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
const rowRanges = expandAndMergeRowRanges(candidateRanges, pageLocations, rowCount);
|
|
234
|
+
const prunedRowCount = rowCount - getRowRangeCount(rowRanges);
|
|
235
|
+
if (prunedRowCount <= 0) {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const totalPageCount = Object.values(pageLocations).reduce(
|
|
240
|
+
(count, pages) => count + pages.length,
|
|
241
|
+
0
|
|
242
|
+
);
|
|
243
|
+
const selectedPageCount = Object.values(pageLocations).reduce(
|
|
244
|
+
(count, pages) => count + countSelectedPages(pages, rowRanges),
|
|
245
|
+
0
|
|
246
|
+
);
|
|
247
|
+
return {
|
|
248
|
+
rowRanges,
|
|
249
|
+
pageLocations,
|
|
250
|
+
indexCount,
|
|
251
|
+
totalPageCount,
|
|
252
|
+
selectedPageCount,
|
|
253
|
+
prunedRowCount
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** Returns data-page byte ranges needed to decode a selective row-group plan. */
|
|
258
|
+
export function getParquetPageReadRanges(
|
|
259
|
+
rowGroup: RowGroup,
|
|
260
|
+
selectedColumnPaths: readonly string[][],
|
|
261
|
+
plan: ParquetPagePruningPlan,
|
|
262
|
+
schema: ParquetSchema
|
|
263
|
+
): Array<{offset: number; length: number}> {
|
|
264
|
+
const ranges: Array<{offset: number; length: number}> = [];
|
|
265
|
+
for (const columnChunk of getSelectedColumnChunks(rowGroup, selectedColumnPaths)) {
|
|
266
|
+
const columnMetadata = columnChunk.meta_data!;
|
|
267
|
+
const pages = plan.pageLocations[JSON.stringify(columnMetadata.path_in_schema)];
|
|
268
|
+
const selectedPages = pages.filter(page =>
|
|
269
|
+
plan.rowRanges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end)
|
|
270
|
+
);
|
|
271
|
+
if (!selectedPages.length) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const field = schema.findField(columnMetadata.path_in_schema);
|
|
275
|
+
const repeated = field.rLevelMax > 0 || field.repetitionType === 'REPEATED';
|
|
276
|
+
const dictionaryPageOffset = Number(columnMetadata.dictionary_page_offset);
|
|
277
|
+
if (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0) {
|
|
278
|
+
ranges.push({
|
|
279
|
+
offset: dictionaryPageOffset,
|
|
280
|
+
length: Math.max(0, pages[0].offset - dictionaryPageOffset)
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
for (const rowRange of plan.rowRanges) {
|
|
284
|
+
const overlappingPages = pages.filter(
|
|
285
|
+
page => page.endRowIndex > rowRange.start && page.firstRowIndex < rowRange.end
|
|
286
|
+
);
|
|
287
|
+
if (!overlappingPages.length) {
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
// A repeated page may begin with a continuation level. Transfer the complete prefix so
|
|
291
|
+
// worker-backed readers can probe predecessor pages before decoding the selected range.
|
|
292
|
+
const firstPage = repeated ? pages[0] : overlappingPages[0];
|
|
293
|
+
const lastPage = overlappingPages[overlappingPages.length - 1];
|
|
294
|
+
ranges.push({
|
|
295
|
+
offset: firstPage.offset,
|
|
296
|
+
length: lastPage.offset + lastPage.compressedByteLength - firstPage.offset
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return mergeByteRanges(ranges.filter(range => range.length > 0));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Decodes one compact-protocol Parquet offset index. */
|
|
304
|
+
export function decodeOffsetIndex(bytes: Uint8Array, rowCount: number): ParquetDataPageLocation[] {
|
|
305
|
+
const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
|
|
306
|
+
const offsetIndex = OffsetIndex.read(protocol as any);
|
|
307
|
+
if (
|
|
308
|
+
offsetIndex.page_locations.length === 0 ||
|
|
309
|
+
Number(offsetIndex.page_locations[0].first_row_index) !== 0
|
|
310
|
+
) {
|
|
311
|
+
throw new Error('Invalid Parquet offset index page locations');
|
|
312
|
+
}
|
|
313
|
+
let previousFirstRowIndex = -1;
|
|
314
|
+
for (const location of offsetIndex.page_locations) {
|
|
315
|
+
const firstRowIndex = Number(location.first_row_index);
|
|
316
|
+
if (!Number.isSafeInteger(firstRowIndex) || firstRowIndex < previousFirstRowIndex) {
|
|
317
|
+
throw new Error('Invalid Parquet offset index page locations');
|
|
318
|
+
}
|
|
319
|
+
previousFirstRowIndex = firstRowIndex;
|
|
320
|
+
}
|
|
321
|
+
return offsetIndex.page_locations.map((location, index, locations) => {
|
|
322
|
+
const firstRowIndex = Number(location.first_row_index);
|
|
323
|
+
// A repeated row may continue on one or more pages. In that case the offset index
|
|
324
|
+
// legitimately repeats first_row_index. Extend each continuation page to the next
|
|
325
|
+
// strictly larger row start so selecting the row includes the complete continuation.
|
|
326
|
+
let endRowIndex = rowCount;
|
|
327
|
+
for (let nextIndex = index + 1; nextIndex < locations.length; nextIndex++) {
|
|
328
|
+
const nextFirstRowIndex = Number(locations[nextIndex].first_row_index);
|
|
329
|
+
if (nextFirstRowIndex > firstRowIndex) {
|
|
330
|
+
endRowIndex = nextFirstRowIndex;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const offset = Number(location.offset);
|
|
335
|
+
const compressedByteLength = location.compressed_page_size;
|
|
336
|
+
if (
|
|
337
|
+
!Number.isSafeInteger(offset) ||
|
|
338
|
+
!Number.isSafeInteger(compressedByteLength) ||
|
|
339
|
+
!Number.isSafeInteger(firstRowIndex) ||
|
|
340
|
+
!Number.isSafeInteger(endRowIndex) ||
|
|
341
|
+
offset < 0 ||
|
|
342
|
+
compressedByteLength <= 0 ||
|
|
343
|
+
firstRowIndex < 0 ||
|
|
344
|
+
endRowIndex <= firstRowIndex ||
|
|
345
|
+
endRowIndex > rowCount
|
|
346
|
+
) {
|
|
347
|
+
throw new Error('Invalid Parquet offset index page location');
|
|
348
|
+
}
|
|
349
|
+
return {offset, compressedByteLength, firstRowIndex, endRowIndex};
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/** Returns whether one predicate leaf can match supplied page statistics. */
|
|
354
|
+
function getPredicateRowRanges(
|
|
355
|
+
predicate: ParquetPredicate,
|
|
356
|
+
columns: Record<string, ParquetColumnPageStatistics>,
|
|
357
|
+
rowCount: number
|
|
358
|
+
): ParquetRowRange[] | undefined {
|
|
359
|
+
if (predicate.op === 'and' || predicate.op === 'or') {
|
|
360
|
+
if (predicate.op === 'and') {
|
|
361
|
+
let ranges: ParquetRowRange[] | undefined;
|
|
362
|
+
for (const child of predicate.args) {
|
|
363
|
+
ranges = intersectRowRanges(ranges, getPredicateRowRanges(child, columns, rowCount));
|
|
364
|
+
}
|
|
365
|
+
return ranges;
|
|
366
|
+
}
|
|
367
|
+
let ranges: ParquetRowRange[] = [];
|
|
368
|
+
for (const child of predicate.args) {
|
|
369
|
+
const childRanges = getPredicateRowRanges(child, columns, rowCount);
|
|
370
|
+
if (childRanges === undefined) {
|
|
371
|
+
return undefined;
|
|
372
|
+
}
|
|
373
|
+
ranges = unionRowRanges(ranges, childRanges);
|
|
374
|
+
}
|
|
375
|
+
return ranges;
|
|
376
|
+
}
|
|
377
|
+
if (predicate.op === 'not') {
|
|
378
|
+
return undefined;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const leafPredicate = predicate as
|
|
382
|
+
| ParquetComparisonPredicate
|
|
383
|
+
| ParquetInPredicate
|
|
384
|
+
| ParquetNullPredicate;
|
|
385
|
+
const column = columns[JSON.stringify(getParquetPredicatePath(leafPredicate.args[0]))];
|
|
386
|
+
if (!column) {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
const ranges: ParquetRowRange[] = [];
|
|
390
|
+
for (let pageIndex = 0; pageIndex < column.pages.length; pageIndex++) {
|
|
391
|
+
const page = column.pages[pageIndex];
|
|
392
|
+
if (
|
|
393
|
+
canParquetStatisticsMatch(
|
|
394
|
+
leafPredicate,
|
|
395
|
+
column.statistics[pageIndex],
|
|
396
|
+
page.endRowIndex - page.firstRowIndex
|
|
397
|
+
)
|
|
398
|
+
) {
|
|
399
|
+
ranges.push({start: page.firstRowIndex, end: page.endRowIndex});
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return mergeRowRanges(ranges);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/** Decodes column-index values into logical per-page statistics. */
|
|
406
|
+
export function decodeParquetColumnIndex(
|
|
407
|
+
bytes: Uint8Array,
|
|
408
|
+
pages: readonly ParquetDataPageLocation[],
|
|
409
|
+
field: ParquetField,
|
|
410
|
+
options?: Pick<ParquetPagePruningOptions, 'int96AsTimestamp'>
|
|
411
|
+
): ParquetPageStatistics[] {
|
|
412
|
+
const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
|
|
413
|
+
const columnIndex = ColumnIndex.read(protocol as any);
|
|
414
|
+
if (
|
|
415
|
+
columnIndex.null_pages.length !== pages.length ||
|
|
416
|
+
columnIndex.min_values.length !== pages.length ||
|
|
417
|
+
columnIndex.max_values.length !== pages.length ||
|
|
418
|
+
(columnIndex.null_counts !== undefined && columnIndex.null_counts.length !== pages.length)
|
|
419
|
+
) {
|
|
420
|
+
throw new Error('Parquet column and offset indexes contain different page counts');
|
|
421
|
+
}
|
|
422
|
+
return pages.map((_page, pageIndex) => ({
|
|
423
|
+
min: columnIndex.null_pages[pageIndex]
|
|
424
|
+
? undefined
|
|
425
|
+
: decodeParquetPageStatisticsValue(columnIndex.min_values[pageIndex], field, options),
|
|
426
|
+
max: columnIndex.null_pages[pageIndex]
|
|
427
|
+
? undefined
|
|
428
|
+
: decodeParquetPageStatisticsValue(columnIndex.max_values[pageIndex], field, options),
|
|
429
|
+
nullCount:
|
|
430
|
+
columnIndex.null_counts?.[pageIndex] !== undefined
|
|
431
|
+
? Number(columnIndex.null_counts[pageIndex])
|
|
432
|
+
: columnIndex.null_pages[pageIndex]
|
|
433
|
+
? pages[pageIndex].endRowIndex - pages[pageIndex].firstRowIndex
|
|
434
|
+
: undefined,
|
|
435
|
+
minIsExact: true,
|
|
436
|
+
maxIsExact: true
|
|
437
|
+
}));
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/** Decodes one physical page-index statistic and applies its Parquet logical annotation. */
|
|
441
|
+
export function decodeParquetPageStatisticsValue(
|
|
442
|
+
bytes: Uint8Array,
|
|
443
|
+
field: ParquetField,
|
|
444
|
+
options?: Pick<ParquetPagePruningOptions, 'int96AsTimestamp'>
|
|
445
|
+
): unknown {
|
|
446
|
+
let primitiveValue: unknown;
|
|
447
|
+
switch (field.primitiveType) {
|
|
448
|
+
case 'BOOLEAN':
|
|
449
|
+
primitiveValue = Boolean(bytes[0]);
|
|
450
|
+
break;
|
|
451
|
+
case 'INT32':
|
|
452
|
+
primitiveValue =
|
|
453
|
+
field.originalType === 'UINT_32' ? readUInt32LE(bytes, 0) : readInt32LE(bytes, 0);
|
|
454
|
+
break;
|
|
455
|
+
case 'INT64':
|
|
456
|
+
primitiveValue =
|
|
457
|
+
field.originalType === 'UINT_64' ? readUInt64LE(bytes, 0) : readInt64LE(bytes, 0);
|
|
458
|
+
break;
|
|
459
|
+
case 'FLOAT':
|
|
460
|
+
primitiveValue = readFloatLE(bytes, 0);
|
|
461
|
+
break;
|
|
462
|
+
case 'DOUBLE':
|
|
463
|
+
primitiveValue = readDoubleLE(bytes, 0);
|
|
464
|
+
break;
|
|
465
|
+
case 'INT96':
|
|
466
|
+
if (options?.int96AsTimestamp && bytes.byteLength >= 12) {
|
|
467
|
+
const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
468
|
+
const nanosecondsOfDay = dataView.getBigUint64(0, true);
|
|
469
|
+
if (nanosecondsOfDay < 86_400_000_000_000n) {
|
|
470
|
+
primitiveValue =
|
|
471
|
+
(BigInt(dataView.getInt32(8, true)) - 2440588n) * 86_400_000_000_000n +
|
|
472
|
+
nanosecondsOfDay;
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
primitiveValue = copyUint8Array(bytes);
|
|
477
|
+
break;
|
|
478
|
+
case 'BYTE_ARRAY':
|
|
479
|
+
case 'FIXED_LEN_BYTE_ARRAY':
|
|
480
|
+
primitiveValue = copyUint8Array(bytes);
|
|
481
|
+
break;
|
|
482
|
+
default:
|
|
483
|
+
return undefined;
|
|
484
|
+
}
|
|
485
|
+
return Types.fromPrimitive(field.originalType || field.primitiveType, primitiveValue, field);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/** Returns selected physical chunks, using an empty path list as the all-column sentinel. */
|
|
489
|
+
function getSelectedColumnChunks(
|
|
490
|
+
rowGroup: RowGroup,
|
|
491
|
+
selectedColumnPaths: readonly string[][]
|
|
492
|
+
): ColumnChunk[] {
|
|
493
|
+
return rowGroup.columns.filter(columnChunk => {
|
|
494
|
+
const path = columnChunk.meta_data?.path_in_schema;
|
|
495
|
+
return Boolean(
|
|
496
|
+
path &&
|
|
497
|
+
(selectedColumnPaths.length === 0 ||
|
|
498
|
+
selectedColumnPaths.some(selectedPath => selectedPath[0] === path[0]))
|
|
499
|
+
);
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/** Restricts selective page reads to primitive leaves with safe page boundaries. */
|
|
504
|
+
function isSafePageSelection(schema: ParquetSchema, columnChunks: readonly ColumnChunk[]): boolean {
|
|
505
|
+
return (
|
|
506
|
+
columnChunks.length > 0 &&
|
|
507
|
+
columnChunks.every(columnChunk => {
|
|
508
|
+
const path = columnChunk.meta_data?.path_in_schema;
|
|
509
|
+
if (!path) {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
const field = schema.findField(path);
|
|
513
|
+
const dictionaryEncoded = columnChunk.meta_data!.encodings.some(
|
|
514
|
+
encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY
|
|
515
|
+
);
|
|
516
|
+
const dictionaryPageOffset = Number(columnChunk.meta_data!.dictionary_page_offset);
|
|
517
|
+
return (
|
|
518
|
+
field.primitiveType !== undefined &&
|
|
519
|
+
(!dictionaryEncoded ||
|
|
520
|
+
(Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0))
|
|
521
|
+
);
|
|
522
|
+
})
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Returns whether a column can be decoded from selected page ranges without changing row shape.
|
|
528
|
+
*
|
|
529
|
+
* Repeated leaves are safe only when the selected columns share complete logical-row boundaries.
|
|
530
|
+
*/
|
|
531
|
+
export function canUseParquetPageIndexForColumn(
|
|
532
|
+
schema: ParquetSchema,
|
|
533
|
+
columnChunk: ColumnChunk
|
|
534
|
+
): boolean {
|
|
535
|
+
const path = columnChunk.meta_data?.path_in_schema;
|
|
536
|
+
if (!path) {
|
|
537
|
+
return false;
|
|
538
|
+
}
|
|
539
|
+
const field = schema.findField(path);
|
|
540
|
+
const dictionaryEncoded = columnChunk.meta_data!.encodings.some(
|
|
541
|
+
encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY
|
|
542
|
+
);
|
|
543
|
+
const dictionaryPageOffset = Number(columnChunk.meta_data!.dictionary_page_offset);
|
|
544
|
+
return (
|
|
545
|
+
field.primitiveType !== undefined &&
|
|
546
|
+
field.repetitionType !== 'REPEATED' &&
|
|
547
|
+
field.rLevelMax === 0 &&
|
|
548
|
+
(!dictionaryEncoded || (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0))
|
|
549
|
+
);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/** Ensures repeated selective reads keep every selected column on identical row boundaries. */
|
|
553
|
+
function hasCompatiblePageBoundaries(
|
|
554
|
+
schema: ParquetSchema,
|
|
555
|
+
columnChunks: readonly ColumnChunk[],
|
|
556
|
+
pageLocations: ParquetPageLocations
|
|
557
|
+
): boolean {
|
|
558
|
+
const hasRepeatedLeaf = columnChunks.some(columnChunk => {
|
|
559
|
+
const field = schema.findField(columnChunk.meta_data!.path_in_schema);
|
|
560
|
+
return field.rLevelMax > 0 || field.repetitionType === 'REPEATED';
|
|
561
|
+
});
|
|
562
|
+
if (!hasRepeatedLeaf) {
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
// Offset indexes identify the first logical row represented by each page, but do not
|
|
566
|
+
// expose repetition levels. Equal starts therefore indicate a continuation page whose
|
|
567
|
+
// boundary cannot be proven safe for a selective read; retain the full-column fallback.
|
|
568
|
+
if (
|
|
569
|
+
columnChunks.some(columnChunk => {
|
|
570
|
+
const pages = pageLocations[JSON.stringify(columnChunk.meta_data!.path_in_schema)];
|
|
571
|
+
return pages.some(
|
|
572
|
+
(page, pageIndex) =>
|
|
573
|
+
pageIndex > 0 && page.firstRowIndex === pages[pageIndex - 1].firstRowIndex
|
|
574
|
+
);
|
|
575
|
+
})
|
|
576
|
+
) {
|
|
577
|
+
return false;
|
|
578
|
+
}
|
|
579
|
+
const signatures = columnChunks.map(columnChunk => {
|
|
580
|
+
const pages = pageLocations[JSON.stringify(columnChunk.meta_data!.path_in_schema)];
|
|
581
|
+
return pages.map(page => `${page.firstRowIndex}:${page.endRowIndex}`).join('|');
|
|
582
|
+
});
|
|
583
|
+
return signatures.every(signature => signature === signatures[0]);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/** Validates one optional footer index byte range against the containing file. */
|
|
587
|
+
export function getParquetIndexRange(
|
|
588
|
+
offsetValue: ColumnChunk['offset_index_offset'],
|
|
589
|
+
lengthValue: number | undefined,
|
|
590
|
+
fileSize: number
|
|
591
|
+
): {offset: number; length: number} | undefined {
|
|
592
|
+
if (offsetValue === undefined || lengthValue === undefined) {
|
|
593
|
+
return undefined;
|
|
594
|
+
}
|
|
595
|
+
const offset = Number(offsetValue);
|
|
596
|
+
if (
|
|
597
|
+
!Number.isSafeInteger(offset) ||
|
|
598
|
+
!Number.isSafeInteger(lengthValue) ||
|
|
599
|
+
!Number.isSafeInteger(fileSize) ||
|
|
600
|
+
offset < 0 ||
|
|
601
|
+
lengthValue <= 0 ||
|
|
602
|
+
fileSize < 0 ||
|
|
603
|
+
offset > fileSize - lengthValue
|
|
604
|
+
) {
|
|
605
|
+
return undefined;
|
|
606
|
+
}
|
|
607
|
+
return {offset, length: lengthValue};
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/** Expands ranges to selected-column page boundaries until all columns agree, then merges them. */
|
|
611
|
+
function expandAndMergeRowRanges(
|
|
612
|
+
ranges: readonly ParquetRowRange[],
|
|
613
|
+
pageLocations: ParquetPageLocations,
|
|
614
|
+
rowCount: number
|
|
615
|
+
): ParquetRowRange[] {
|
|
616
|
+
const pagesByColumn = Object.values(pageLocations);
|
|
617
|
+
const expanded = ranges.map(range => {
|
|
618
|
+
let current = {...range};
|
|
619
|
+
let changed = true;
|
|
620
|
+
while (changed) {
|
|
621
|
+
changed = false;
|
|
622
|
+
for (const pages of pagesByColumn) {
|
|
623
|
+
const overlapping = pages.filter(
|
|
624
|
+
page => page.endRowIndex > current.start && page.firstRowIndex < current.end
|
|
625
|
+
);
|
|
626
|
+
if (!overlapping.length) {
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
const start = Math.min(current.start, overlapping[0].firstRowIndex);
|
|
630
|
+
const end = Math.max(current.end, overlapping[overlapping.length - 1].endRowIndex);
|
|
631
|
+
if (start !== current.start || end !== current.end) {
|
|
632
|
+
current = {start, end};
|
|
633
|
+
changed = true;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
return {start: Math.max(0, current.start), end: Math.min(rowCount, current.end)};
|
|
638
|
+
});
|
|
639
|
+
return mergeRowRanges(expanded);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/** Intersects sorted row ranges; `undefined` represents every row. */
|
|
643
|
+
function intersectRowRanges(
|
|
644
|
+
left: ParquetRowRange[] | undefined,
|
|
645
|
+
right: ParquetRowRange[] | undefined
|
|
646
|
+
): ParquetRowRange[] | undefined {
|
|
647
|
+
if (left === undefined) {
|
|
648
|
+
return right;
|
|
649
|
+
}
|
|
650
|
+
if (right === undefined) {
|
|
651
|
+
return left;
|
|
652
|
+
}
|
|
653
|
+
const ranges: ParquetRowRange[] = [];
|
|
654
|
+
let leftIndex = 0;
|
|
655
|
+
let rightIndex = 0;
|
|
656
|
+
while (leftIndex < left.length && rightIndex < right.length) {
|
|
657
|
+
const start = Math.max(left[leftIndex].start, right[rightIndex].start);
|
|
658
|
+
const end = Math.min(left[leftIndex].end, right[rightIndex].end);
|
|
659
|
+
if (start < end) {
|
|
660
|
+
ranges.push({start, end});
|
|
661
|
+
}
|
|
662
|
+
if (left[leftIndex].end < right[rightIndex].end) {
|
|
663
|
+
leftIndex++;
|
|
664
|
+
} else {
|
|
665
|
+
rightIndex++;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return ranges;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/** Unions two sorted row-range sets. */
|
|
672
|
+
function unionRowRanges(
|
|
673
|
+
left: readonly ParquetRowRange[],
|
|
674
|
+
right: readonly ParquetRowRange[]
|
|
675
|
+
): ParquetRowRange[] {
|
|
676
|
+
return mergeRowRanges([...left, ...right]);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/** Sorts and merges overlapping or touching logical row ranges. */
|
|
680
|
+
function mergeRowRanges(ranges: readonly ParquetRowRange[]): ParquetRowRange[] {
|
|
681
|
+
const sorted = [...ranges].sort(
|
|
682
|
+
(left, right) => left.start - right.start || left.end - right.end
|
|
683
|
+
);
|
|
684
|
+
const merged: ParquetRowRange[] = [];
|
|
685
|
+
for (const range of sorted) {
|
|
686
|
+
const previous = merged[merged.length - 1];
|
|
687
|
+
if (previous && range.start <= previous.end) {
|
|
688
|
+
previous.end = Math.max(previous.end, range.end);
|
|
689
|
+
} else {
|
|
690
|
+
merged.push({...range});
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
return merged;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
/** Counts logical rows represented by disjoint ranges. */
|
|
697
|
+
function getRowRangeCount(ranges: readonly ParquetRowRange[]): number {
|
|
698
|
+
return ranges.reduce((count, range) => count + range.end - range.start, 0);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
/** Counts unique pages overlapping at least one selected row range. */
|
|
702
|
+
function countSelectedPages(
|
|
703
|
+
pages: readonly ParquetDataPageLocation[],
|
|
704
|
+
ranges: readonly ParquetRowRange[]
|
|
705
|
+
): number {
|
|
706
|
+
return pages.filter(page =>
|
|
707
|
+
ranges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end)
|
|
708
|
+
).length;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/** Sorts and merges overlapping or touching byte ranges without overfetch gaps. */
|
|
712
|
+
function mergeByteRanges(
|
|
713
|
+
ranges: readonly {offset: number; length: number}[]
|
|
714
|
+
): Array<{offset: number; length: number}> {
|
|
715
|
+
const sorted = [...ranges].sort((left, right) => left.offset - right.offset);
|
|
716
|
+
const merged: Array<{offset: number; length: number}> = [];
|
|
717
|
+
for (const range of sorted) {
|
|
718
|
+
const previous = merged[merged.length - 1];
|
|
719
|
+
const end = range.offset + range.length;
|
|
720
|
+
if (previous && range.offset <= previous.offset + previous.length) {
|
|
721
|
+
previous.length = Math.max(previous.offset + previous.length, end) - previous.offset;
|
|
722
|
+
} else {
|
|
723
|
+
merged.push({...range});
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
return merged;
|
|
727
|
+
}
|