@loaders.gl/parquet 4.4.5 → 5.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/index.cjs +25873 -4776
- package/dist/index.cjs.map +3 -4
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -11
- 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.map +1 -1
- package/dist/lib/arrow/convert-schema-from-parquet.js +86 -26
- 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 +396 -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 +199 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.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 +338 -0
- package/dist/lib/geo/geospatial-metadata.js.map +1 -0
- package/dist/lib/parquet-page-index.d.ts +62 -0
- package/dist/lib/parquet-page-index.d.ts.map +1 -0
- package/dist/lib/parquet-page-index.js +377 -0
- package/dist/lib/parquet-page-index.js.map +1 -0
- package/dist/lib/parquet-predicate.d.ts +17 -0
- package/dist/lib/parquet-predicate.d.ts.map +1 -0
- package/dist/lib/parquet-predicate.js +300 -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 +22 -0
- package/dist/lib/parquet-source-worker-client.js.map +1 -0
- package/dist/lib/parquet-source-worker-decoder.d.ts +4 -0
- package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -0
- package/dist/lib/parquet-source-worker-decoder.js +115 -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 +97 -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 +3 -1
- 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 +608 -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 +1 -4
- 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 +77 -26
- package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
- 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 +261 -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 +11 -0
- package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
- package/dist/parquet-dataset-source.cjs +26413 -0
- package/dist/parquet-dataset-source.cjs.map +6 -0
- package/dist/parquet-dataset-source.d.ts +54 -0
- package/dist/parquet-dataset-source.d.ts.map +1 -0
- package/dist/parquet-dataset-source.js +380 -0
- package/dist/parquet-dataset-source.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 +57 -0
- package/dist/parquet-js-loader-types.d.ts.map +1 -0
- package/dist/parquet-js-loader-types.js +33 -0
- package/dist/parquet-js-loader-types.js.map +1 -0
- package/dist/parquet-js-loader.d.ts +32 -0
- package/dist/parquet-js-loader.d.ts.map +1 -0
- package/dist/parquet-js-loader.js +58 -0
- package/dist/parquet-js-loader.js.map +1 -0
- package/dist/parquet-js-writer.d.ts +44 -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 +44 -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 +36 -0
- package/dist/parquet-source-capabilities.d.ts.map +1 -0
- package/dist/parquet-source-capabilities.js +22 -0
- package/dist/parquet-source-capabilities.js.map +1 -0
- package/dist/parquet-source-loader-types.d.ts +72 -0
- package/dist/parquet-source-loader-types.d.ts.map +1 -0
- package/dist/parquet-source-loader-types.js +74 -0
- package/dist/parquet-source-loader-types.js.map +1 -0
- package/dist/parquet-source-loader.cjs +25975 -0
- package/dist/parquet-source-loader.cjs.map +6 -0
- package/dist/parquet-source-loader.d.ts +120 -0
- package/dist/parquet-source-loader.d.ts.map +1 -0
- package/dist/parquet-source-loader.js +812 -0
- package/dist/parquet-source-loader.js.map +1 -0
- package/dist/parquet-source-types.d.ts +384 -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-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 +38491 -0
- package/dist/parquet-source-worker.js.map +7 -0
- package/dist/parquet-worker-node.cjs +54779 -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 +15 -0
- package/dist/parquet-worker-url.js.map +1 -0
- package/dist/parquet-worker.js +19920 -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 +20 -3
- package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
- package/dist/parquetjs/codecs/declare.js +7 -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 +439 -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 +18 -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 +88 -76
- package/dist/parquetjs/codecs/plain.js.map +1 -1
- package/dist/parquetjs/codecs/rle.d.ts +3 -3
- package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
- package/dist/parquetjs/codecs/rle.js +196 -68
- package/dist/parquetjs/codecs/rle.js.map +1 -1
- package/dist/parquetjs/compression.d.ts +7 -8
- package/dist/parquetjs/compression.d.ts.map +1 -1
- package/dist/parquetjs/compression.js +95 -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 +64 -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 +11 -4
- package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.js +259 -52
- package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
- 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 +2 -2
- package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js +2 -2
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
- 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 +2 -2
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +2 -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/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/FileMetaData.d.ts +2 -2
- package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/FileMetaData.js +2 -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/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/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 +6 -2
- package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.js +6 -2
- package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
- package/dist/parquetjs/parser/decoders.d.ts +14 -3
- package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
- package/dist/parquetjs/parser/decoders.js +381 -117
- package/dist/parquetjs/parser/decoders.js.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.d.ts +35 -10
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +179 -59
- package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
- package/dist/parquetjs/schema/declare.d.ts +62 -8
- 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 +21 -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 +71 -23
- 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 +272 -51
- package/dist/parquetjs/schema/types.js.map +1 -1
- 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/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 +14 -6
- package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/read-utils.js +46 -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 +9 -0
- package/dist/unbundled.d.ts.map +1 -0
- package/dist/unbundled.js +10 -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 +63 -33
- package/src/bundled.ts +33 -0
- package/src/geoparquet-loader-with-parser.ts +95 -0
- package/src/geoparquet-loader.ts +54 -0
- package/src/index.ts +49 -23
- package/src/lib/arrow/convert-columns-to-row-group.ts +3 -0
- package/src/lib/arrow/convert-schema-from-parquet.ts +97 -30
- package/src/lib/arrow/convert-schema-to-parquet.ts +16 -7
- package/src/lib/arrow/create-nested-arrow-vector.ts +589 -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 +261 -0
- package/src/lib/geo/geospatial-metadata.ts +457 -0
- package/src/lib/parquet-page-index.ts +581 -0
- package/src/lib/parquet-predicate.ts +374 -0
- package/src/lib/parquet-source-worker-client.ts +39 -0
- package/src/lib/parquet-source-worker-decoder.ts +156 -0
- package/src/lib/parquet-source-worker-file.ts +56 -0
- package/src/lib/parquet-source-worker-types.ts +107 -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 +3 -1
- 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 +829 -0
- package/src/lib/parsers/parse-parquet-to-arrow.ts +63 -36
- package/src/lib/parsers/parse-parquet-to-columns.ts +6 -7
- package/src/lib/parsers/parse-parquet-to-json.ts +101 -33
- package/src/lib/sources/parquet-range-file.ts +359 -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 +14 -0
- package/src/parquet-dataset-source.ts +488 -0
- package/src/parquet-format.ts +2 -0
- package/src/parquet-js-loader-types.ts +52 -0
- package/src/parquet-js-loader.ts +83 -0
- package/src/parquet-js-writer.ts +68 -0
- package/src/parquet-loader-base.ts +34 -0
- package/src/parquet-loader-options.ts +51 -0
- package/src/parquet-loader-types.ts +35 -0
- package/src/parquet-loader.ts +115 -0
- package/src/parquet-source-capabilities.ts +56 -0
- package/src/parquet-source-loader-types.ts +87 -0
- package/src/parquet-source-loader.ts +1265 -0
- package/src/parquet-source-types.ts +458 -0
- package/src/parquet-source-worker-url.ts +23 -0
- package/src/parquet-worker-url.ts +18 -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 +35 -3
- package/src/parquetjs/codecs/delta.ts +587 -0
- package/src/parquetjs/codecs/dictionary.ts +22 -4
- package/src/parquetjs/codecs/index.ts +18 -0
- package/src/parquetjs/codecs/plain.ts +149 -87
- package/src/parquetjs/codecs/rle.ts +268 -82
- package/src/parquetjs/compression.ts +110 -155
- package/src/parquetjs/encoder/dictionary-planner.ts +99 -0
- package/src/parquetjs/encoder/page-planner.ts +83 -0
- package/src/parquetjs/encoder/parquet-encoder.ts +378 -77
- package/src/parquetjs/parquet-thrift/BsonType.ts +1 -1
- package/src/parquetjs/parquet-thrift/ColumnChunk.ts +2 -2
- package/src/parquetjs/parquet-thrift/ColumnIndex.ts +13 -13
- package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +2 -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/EnumType.ts +1 -1
- package/src/parquetjs/parquet-thrift/FileMetaData.ts +2 -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/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/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 +6 -4
- package/src/parquetjs/parser/decoders.ts +487 -133
- package/src/parquetjs/parser/parquet-reader.ts +297 -71
- package/src/parquetjs/schema/declare.ts +99 -7
- package/src/parquetjs/schema/schema.ts +23 -3
- package/src/parquetjs/schema/shred.ts +112 -35
- package/src/parquetjs/schema/types.ts +294 -61
- package/src/parquetjs/utils/binary-utils.ts +132 -0
- package/src/parquetjs/utils/file-utils.ts +4 -4
- package/src/parquetjs/utils/read-utils.ts +56 -55
- 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 +33 -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
|
@@ -7,6 +7,8 @@ import {isBrowser} from '@loaders.gl/loader-utils';
|
|
|
7
7
|
|
|
8
8
|
export type StreamIteratorOptions = {
|
|
9
9
|
_streamReadAhead?: boolean;
|
|
10
|
+
/** Cancels the active stream read and rejects iteration with the signal reason. */
|
|
11
|
+
signal?: AbortSignal;
|
|
10
12
|
};
|
|
11
13
|
|
|
12
14
|
/**
|
|
@@ -17,11 +19,16 @@ export function makeStreamIterator<T>(
|
|
|
17
19
|
stream: ReadableStream<T> | Readable,
|
|
18
20
|
options?: StreamIteratorOptions
|
|
19
21
|
): AsyncIterable<T> {
|
|
20
|
-
return isBrowser
|
|
22
|
+
return isBrowser || isReadableStream(stream)
|
|
21
23
|
? makeBrowserStreamIterator(stream as ReadableStream<T>, options)
|
|
22
24
|
: makeNodeStreamIterator(stream as Readable, options);
|
|
23
25
|
}
|
|
24
26
|
|
|
27
|
+
/** Detects WHATWG streams in Node.js as well as in browsers. */
|
|
28
|
+
function isReadableStream<T>(stream: ReadableStream<T> | Readable): stream is ReadableStream<T> {
|
|
29
|
+
return typeof (stream as ReadableStream<T>).getReader === 'function';
|
|
30
|
+
}
|
|
31
|
+
|
|
25
32
|
/**
|
|
26
33
|
* Returns an async iterable that reads from a DOM (browser) stream
|
|
27
34
|
* @param stream stream to iterate from
|
|
@@ -41,34 +48,76 @@ async function* makeBrowserStreamIterator<T>(
|
|
|
41
48
|
|
|
42
49
|
// In the browser, we first need to get a lock on the stream
|
|
43
50
|
const reader = stream.getReader();
|
|
51
|
+
const signal = options?.signal;
|
|
52
|
+
const abortListener = () => {
|
|
53
|
+
// Canceling the reader settles a pending read. The loop then throws the signal reason.
|
|
54
|
+
void reader.cancel(signal?.reason).catch(() => {});
|
|
55
|
+
};
|
|
44
56
|
|
|
45
57
|
let nextBatchPromise: Promise<{done?: boolean; value?: T}> | undefined;
|
|
58
|
+
let streamFinished = false;
|
|
59
|
+
let streamReadFailed = false;
|
|
60
|
+
let iteratorFailed = false;
|
|
46
61
|
|
|
47
62
|
try {
|
|
63
|
+
throwIfAborted(signal);
|
|
64
|
+
signal?.addEventListener('abort', abortListener, {once: true});
|
|
65
|
+
|
|
48
66
|
// eslint-disable-next-line no-constant-condition
|
|
49
67
|
while (true) {
|
|
50
68
|
const currentBatchPromise = nextBatchPromise || reader.read();
|
|
51
|
-
|
|
52
|
-
// Idea is to make fetching happen in parallel with processing / parsing
|
|
53
|
-
if (options?._streamReadAhead) {
|
|
54
|
-
nextBatchPromise = reader.read();
|
|
55
|
-
}
|
|
69
|
+
nextBatchPromise = undefined;
|
|
56
70
|
// Read from the stream
|
|
57
|
-
|
|
58
|
-
|
|
71
|
+
let batch;
|
|
72
|
+
try {
|
|
73
|
+
batch = await currentBatchPromise;
|
|
74
|
+
} catch (error) {
|
|
75
|
+
streamReadFailed = true;
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
throwIfAborted(signal);
|
|
79
|
+
const {done, value} = batch;
|
|
59
80
|
// Exit if we're done
|
|
60
81
|
if (done) {
|
|
82
|
+
streamFinished = true;
|
|
61
83
|
return;
|
|
62
84
|
}
|
|
85
|
+
// Issue a read for an additional batch while the current batch is processed
|
|
86
|
+
if (options?._streamReadAhead) {
|
|
87
|
+
nextBatchPromise = reader.read();
|
|
88
|
+
// Observe a prefetched rejection even if the consumer stops before requesting it
|
|
89
|
+
void nextBatchPromise.catch(() => {});
|
|
90
|
+
}
|
|
63
91
|
// Else yield the chunk
|
|
64
92
|
if (value) {
|
|
65
93
|
yield value;
|
|
66
94
|
}
|
|
67
95
|
}
|
|
68
96
|
} catch (error) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
iteratorFailed = true;
|
|
98
|
+
throw error;
|
|
99
|
+
} finally {
|
|
100
|
+
signal?.removeEventListener('abort', abortListener);
|
|
101
|
+
let cleanupError: unknown;
|
|
102
|
+
|
|
103
|
+
if (!streamFinished && !streamReadFailed) {
|
|
104
|
+
try {
|
|
105
|
+
await reader.cancel();
|
|
106
|
+
} catch (error) {
|
|
107
|
+
cleanupError = error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
reader.releaseLock();
|
|
113
|
+
} catch (error) {
|
|
114
|
+
cleanupError ||= error;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Preserve iteration errors instead of replacing them with cleanup errors
|
|
118
|
+
if (!iteratorFailed && cleanupError) {
|
|
119
|
+
throw cleanupError;
|
|
120
|
+
}
|
|
72
121
|
}
|
|
73
122
|
}
|
|
74
123
|
|
|
@@ -81,7 +130,70 @@ async function* makeNodeStreamIterator<T>(
|
|
|
81
130
|
stream: Readable,
|
|
82
131
|
options?: StreamIteratorOptions
|
|
83
132
|
): AsyncIterable<T> {
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
133
|
+
// Node streams and modern Node.js Web streams both expose an async iterator.
|
|
134
|
+
const iterator = stream[Symbol.asyncIterator]();
|
|
135
|
+
const signal = options?.signal;
|
|
136
|
+
let abortListener: (() => void) | undefined;
|
|
137
|
+
const abortPromise = signal
|
|
138
|
+
? new Promise<never>((_resolve, reject) => {
|
|
139
|
+
abortListener = () => reject(getAbortReason(signal));
|
|
140
|
+
signal.addEventListener('abort', abortListener, {once: true});
|
|
141
|
+
})
|
|
142
|
+
: null;
|
|
143
|
+
let iteratorFailed = false;
|
|
144
|
+
let streamFinished = false;
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
throwIfAborted(signal);
|
|
148
|
+
// eslint-disable-next-line no-constant-condition
|
|
149
|
+
while (true) {
|
|
150
|
+
const nextPromise = iterator.next();
|
|
151
|
+
if (abortPromise) {
|
|
152
|
+
// Observe a late failure if cancellation wins the race.
|
|
153
|
+
void nextPromise.catch(() => {});
|
|
154
|
+
}
|
|
155
|
+
const result = abortPromise
|
|
156
|
+
? await Promise.race([nextPromise, abortPromise])
|
|
157
|
+
: await nextPromise;
|
|
158
|
+
throwIfAborted(signal);
|
|
159
|
+
if (result.done) {
|
|
160
|
+
streamFinished = true;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
yield result.value;
|
|
164
|
+
}
|
|
165
|
+
} catch (error) {
|
|
166
|
+
iteratorFailed = true;
|
|
167
|
+
throw error;
|
|
168
|
+
} finally {
|
|
169
|
+
if (abortListener) {
|
|
170
|
+
signal?.removeEventListener('abort', abortListener);
|
|
171
|
+
}
|
|
172
|
+
if (!streamFinished) {
|
|
173
|
+
try {
|
|
174
|
+
await iterator.return?.();
|
|
175
|
+
} catch (error) {
|
|
176
|
+
if (!iteratorFailed) {
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Returns the standard AbortSignal reason, including a fallback for older runtimes. */
|
|
185
|
+
function getAbortReason(signal: AbortSignal): unknown {
|
|
186
|
+
if (signal.reason !== undefined) {
|
|
187
|
+
return signal.reason;
|
|
188
|
+
}
|
|
189
|
+
const error = new Error('The operation was aborted');
|
|
190
|
+
error.name = 'AbortError';
|
|
191
|
+
return error;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Throws at a cancellation checkpoint. */
|
|
195
|
+
function throwIfAborted(signal?: AbortSignal): void {
|
|
196
|
+
if (signal?.aborted) {
|
|
197
|
+
throw getAbortReason(signal);
|
|
198
|
+
}
|
|
87
199
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
/** Merge caller options with default parquet options while preserving top-level option bags. */
|
|
6
|
+
export function normalizeParquetOptions<OptionsT extends {parquet?: unknown}>(
|
|
7
|
+
options: OptionsT | undefined,
|
|
8
|
+
parquetDefaults: Record<string, unknown>
|
|
9
|
+
): OptionsT {
|
|
10
|
+
return {
|
|
11
|
+
...options,
|
|
12
|
+
parquet: {...parquetDefaults, ...(options?.parquet as Record<string, unknown> | undefined)}
|
|
13
|
+
} as unknown as OptionsT;
|
|
14
|
+
}
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {CoreAPI} from '@loaders.gl/loader-utils';
|
|
6
|
+
import type {Schema} from '@loaders.gl/schema';
|
|
7
|
+
|
|
8
|
+
import {SingleBatchQueue} from './lib/sources/single-batch-queue';
|
|
9
|
+
import {ParquetSource} from './parquet-source-loader';
|
|
10
|
+
import type {
|
|
11
|
+
ParquetDatasetBatch,
|
|
12
|
+
ParquetDatasetBatchProvenance,
|
|
13
|
+
ParquetDatasetBoundingBox,
|
|
14
|
+
ParquetDatasetFile,
|
|
15
|
+
ParquetDatasetFileCollection,
|
|
16
|
+
ParquetDatasetFileQuery,
|
|
17
|
+
ParquetDatasetFiles,
|
|
18
|
+
ParquetDatasetPartitionValue,
|
|
19
|
+
ParquetDatasetReadOptions,
|
|
20
|
+
ParquetDatasetSourceOptions,
|
|
21
|
+
ParquetDatasetTelemetry,
|
|
22
|
+
ParquetSourceBatch,
|
|
23
|
+
ParquetTelemetry
|
|
24
|
+
} from './parquet-source-types';
|
|
25
|
+
|
|
26
|
+
export type {
|
|
27
|
+
ParquetDatasetBatch,
|
|
28
|
+
ParquetDatasetBatchProvenance,
|
|
29
|
+
ParquetDatasetBoundingBox,
|
|
30
|
+
ParquetDatasetFile,
|
|
31
|
+
ParquetDatasetFileCollection,
|
|
32
|
+
ParquetDatasetFileProvider,
|
|
33
|
+
ParquetDatasetFileQuery,
|
|
34
|
+
ParquetDatasetFiles,
|
|
35
|
+
ParquetDatasetPartitionValue,
|
|
36
|
+
ParquetDatasetReadOptions,
|
|
37
|
+
ParquetDatasetSourceOptions,
|
|
38
|
+
ParquetDatasetTelemetry
|
|
39
|
+
} from './parquet-source-types';
|
|
40
|
+
|
|
41
|
+
const DEFAULT_FILE_CONCURRENCY = 4;
|
|
42
|
+
|
|
43
|
+
type IndexedParquetDatasetFile = {
|
|
44
|
+
/** Descriptor returned by the provider. */
|
|
45
|
+
file: ParquetDatasetFile;
|
|
46
|
+
/** Position in provider output before local pruning. */
|
|
47
|
+
index: number;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
type ScheduledFileRead = {
|
|
51
|
+
/** Bounded batch queue for this file. */
|
|
52
|
+
queue: SingleBatchQueue<ParquetDatasetBatch>;
|
|
53
|
+
/** File task used for deterministic cleanup. */
|
|
54
|
+
task: Promise<void>;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Multi-file Parquet source that composes catalog discovery with selective `ParquetSource` reads.
|
|
59
|
+
*
|
|
60
|
+
* The source accepts static descriptors or a lazy provider, allowing STAC and other catalogs to be
|
|
61
|
+
* injected without coupling `@loaders.gl/parquet` to a catalog protocol.
|
|
62
|
+
*/
|
|
63
|
+
export class ParquetDatasetSource {
|
|
64
|
+
/** Static descriptors or lazy catalog-backed file provider. */
|
|
65
|
+
readonly files: ParquetDatasetFiles;
|
|
66
|
+
/** Child-source and dataset orchestration options. */
|
|
67
|
+
readonly options: ParquetDatasetSourceOptions;
|
|
68
|
+
/** Runtime hooks forwarded to child Parquet sources. */
|
|
69
|
+
readonly coreApi?: CoreAPI;
|
|
70
|
+
|
|
71
|
+
/** Abort controllers for active dataset reads. */
|
|
72
|
+
private readonly activeReadControllers = new Set<AbortController>();
|
|
73
|
+
/** Whether the dataset source has been permanently closed. */
|
|
74
|
+
private closed = false;
|
|
75
|
+
/** Cumulative dataset and child-source telemetry. */
|
|
76
|
+
private readonly telemetry = createParquetDatasetTelemetry();
|
|
77
|
+
|
|
78
|
+
/** Creates a logical dataset over static or lazily discovered Parquet files. */
|
|
79
|
+
constructor(
|
|
80
|
+
files: ParquetDatasetFiles,
|
|
81
|
+
options: ParquetDatasetSourceOptions = {},
|
|
82
|
+
coreApi?: CoreAPI
|
|
83
|
+
) {
|
|
84
|
+
if (!Array.isArray(files) && typeof files !== 'function') {
|
|
85
|
+
throw new Error(
|
|
86
|
+
'ParquetDatasetSource files must be a reusable descriptor array or a provider function'
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
this.files = files;
|
|
90
|
+
this.options = options;
|
|
91
|
+
this.coreApi = coreApi;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Returns the schema of the first selected file, closing its temporary child source afterward. */
|
|
95
|
+
async getSchema(query: ParquetDatasetFileQuery = {}): Promise<Schema> {
|
|
96
|
+
this.assertOpen();
|
|
97
|
+
const iterator = this.getSelectedFiles(query)[Symbol.asyncIterator]();
|
|
98
|
+
try {
|
|
99
|
+
const first = await iterator.next();
|
|
100
|
+
if (first.done) {
|
|
101
|
+
throw new Error('ParquetDatasetSource query selected no files');
|
|
102
|
+
}
|
|
103
|
+
const source = this.createSource(first.value.file);
|
|
104
|
+
this.telemetry.filesOpened++;
|
|
105
|
+
try {
|
|
106
|
+
return await source.getSchema({signal: query.signal});
|
|
107
|
+
} finally {
|
|
108
|
+
await source.close();
|
|
109
|
+
this.addParquetTelemetry(source.getTelemetry());
|
|
110
|
+
}
|
|
111
|
+
} finally {
|
|
112
|
+
await iterator.return?.();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Returns an immutable snapshot of cumulative dataset and child-source telemetry. */
|
|
117
|
+
getTelemetry(): ParquetDatasetTelemetry {
|
|
118
|
+
return Object.freeze({
|
|
119
|
+
...this.telemetry,
|
|
120
|
+
parquet: Object.freeze({...this.telemetry.parquet})
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Reads selected files as deterministic, file-ordered Arrow batches.
|
|
126
|
+
*
|
|
127
|
+
* Files are decoded concurrently. Each later file is limited to one buffered batch until all
|
|
128
|
+
* earlier files have been yielded, bounding memory while retaining stable provider order.
|
|
129
|
+
*/
|
|
130
|
+
async *read(options: ParquetDatasetReadOptions = {}): AsyncIterable<ParquetDatasetBatch> {
|
|
131
|
+
this.assertOpen();
|
|
132
|
+
const readContext = createDatasetAbortContext(options.signal);
|
|
133
|
+
this.activeReadControllers.add(readContext.abortController);
|
|
134
|
+
const selectedFiles = this.getSelectedFiles({
|
|
135
|
+
...options,
|
|
136
|
+
signal: readContext.abortController.signal
|
|
137
|
+
});
|
|
138
|
+
const iterator = selectedFiles[Symbol.asyncIterator]();
|
|
139
|
+
const scheduledReads = new Map<number, ScheduledFileRead>();
|
|
140
|
+
let nextSchedulePosition = 0;
|
|
141
|
+
let nextYieldPosition = 0;
|
|
142
|
+
let providerComplete = false;
|
|
143
|
+
let discoveryError: unknown;
|
|
144
|
+
const fileConcurrency = normalizeFileConcurrency(
|
|
145
|
+
options.fileConcurrency ?? this.options.parquetDataset?.fileConcurrency
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const scheduleNext = async (): Promise<void> => {
|
|
149
|
+
if (providerComplete) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const next = await iterator.next();
|
|
153
|
+
if (next.done) {
|
|
154
|
+
providerComplete = true;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const position = nextSchedulePosition++;
|
|
158
|
+
const queue = new SingleBatchQueue<ParquetDatasetBatch>();
|
|
159
|
+
const task = this.readFile(next.value, options, queue, readContext.abortController.signal);
|
|
160
|
+
scheduledReads.set(position, {queue, task});
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const fillAvailableSlots = async (): Promise<void> => {
|
|
164
|
+
try {
|
|
165
|
+
while (scheduledReads.size < fileConcurrency && !providerComplete) {
|
|
166
|
+
await scheduleNext();
|
|
167
|
+
}
|
|
168
|
+
} catch (error) {
|
|
169
|
+
discoveryError = error;
|
|
170
|
+
providerComplete = true;
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
await scheduleNext();
|
|
176
|
+
let discoveryPromise = fillAvailableSlots();
|
|
177
|
+
|
|
178
|
+
while (scheduledReads.size > 0) {
|
|
179
|
+
const scheduledRead = scheduledReads.get(nextYieldPosition);
|
|
180
|
+
if (!scheduledRead) {
|
|
181
|
+
throw new Error('ParquetDatasetSource internal file ordering error');
|
|
182
|
+
}
|
|
183
|
+
for await (const batch of scheduledRead.queue) {
|
|
184
|
+
throwIfAborted(readContext.abortController.signal);
|
|
185
|
+
this.telemetry.batchesEmitted++;
|
|
186
|
+
this.telemetry.rowsEmitted += batch.length;
|
|
187
|
+
yield batch;
|
|
188
|
+
}
|
|
189
|
+
await scheduledRead.task;
|
|
190
|
+
scheduledReads.delete(nextYieldPosition++);
|
|
191
|
+
await discoveryPromise;
|
|
192
|
+
if (discoveryError !== undefined) {
|
|
193
|
+
throw discoveryError;
|
|
194
|
+
}
|
|
195
|
+
discoveryPromise = fillAvailableSlots();
|
|
196
|
+
}
|
|
197
|
+
await discoveryPromise;
|
|
198
|
+
if (discoveryError !== undefined) {
|
|
199
|
+
throw discoveryError;
|
|
200
|
+
}
|
|
201
|
+
} finally {
|
|
202
|
+
readContext.abortController.abort();
|
|
203
|
+
readContext.removeSignalListener();
|
|
204
|
+
this.activeReadControllers.delete(readContext.abortController);
|
|
205
|
+
await iterator.return?.();
|
|
206
|
+
await Promise.allSettled([...scheduledReads.values()].map(read => read.task));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Permanently closes this dataset source and aborts every active read. */
|
|
211
|
+
async close(): Promise<void> {
|
|
212
|
+
if (this.closed) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.closed = true;
|
|
216
|
+
for (const abortController of this.activeReadControllers) {
|
|
217
|
+
abortController.abort();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Reads one child source into its bounded file-order queue. */
|
|
222
|
+
private async readFile(
|
|
223
|
+
indexedFile: IndexedParquetDatasetFile,
|
|
224
|
+
options: ParquetDatasetReadOptions,
|
|
225
|
+
queue: SingleBatchQueue<ParquetDatasetBatch>,
|
|
226
|
+
signal: AbortSignal
|
|
227
|
+
): Promise<void> {
|
|
228
|
+
const source = this.createSource(indexedFile.file);
|
|
229
|
+
this.telemetry.filesOpened++;
|
|
230
|
+
try {
|
|
231
|
+
if (this.options.parquetDataset?.validateSchema !== false) {
|
|
232
|
+
await this.validateFileSchema(source, indexedFile, signal);
|
|
233
|
+
}
|
|
234
|
+
for await (const batch of source.read({
|
|
235
|
+
columns: options.columns,
|
|
236
|
+
batchSize: options.batchSize,
|
|
237
|
+
concurrency: options.concurrency,
|
|
238
|
+
rowGroupFilter: options.rowGroupFilter,
|
|
239
|
+
predicate: options.predicate,
|
|
240
|
+
signal
|
|
241
|
+
})) {
|
|
242
|
+
await queue.push(createDatasetBatch(batch, indexedFile), signal);
|
|
243
|
+
}
|
|
244
|
+
queue.finish();
|
|
245
|
+
} catch (error) {
|
|
246
|
+
queue.fail(error);
|
|
247
|
+
} finally {
|
|
248
|
+
await source.close();
|
|
249
|
+
this.addParquetTelemetry(source.getTelemetry());
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Establishes and validates a stable field schema for concurrently opened files. */
|
|
254
|
+
private schemaFingerprintPromise: Promise<string> | null = null;
|
|
255
|
+
|
|
256
|
+
/** Validates one child schema against the first file schema observed by this source. */
|
|
257
|
+
private async validateFileSchema(
|
|
258
|
+
source: ParquetSource,
|
|
259
|
+
indexedFile: IndexedParquetDatasetFile,
|
|
260
|
+
signal: AbortSignal
|
|
261
|
+
): Promise<void> {
|
|
262
|
+
const schema = await source.getSchema({signal});
|
|
263
|
+
const fingerprint = getSchemaFingerprint(schema);
|
|
264
|
+
if (!this.schemaFingerprintPromise) {
|
|
265
|
+
this.schemaFingerprintPromise = Promise.resolve(fingerprint);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const expectedFingerprint = await this.schemaFingerprintPromise;
|
|
269
|
+
if (fingerprint !== expectedFingerprint) {
|
|
270
|
+
throw new Error(
|
|
271
|
+
`Parquet dataset file ${getDatasetFileId(indexedFile.file, indexedFile.index)} has an incompatible schema`
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Creates a child source while preserving caller fetch, worker, range, and decode options. */
|
|
277
|
+
private createSource(file: ParquetDatasetFile): ParquetSource {
|
|
278
|
+
return new ParquetSource(file.data, this.options, this.coreApi);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** Lazily discovers descriptors and applies conservative local pruning. */
|
|
282
|
+
private async *getSelectedFiles(
|
|
283
|
+
query: ParquetDatasetFileQuery
|
|
284
|
+
): AsyncIterable<IndexedParquetDatasetFile> {
|
|
285
|
+
throwIfAborted(query.signal);
|
|
286
|
+
const collection = await getFileCollection(this.files, query);
|
|
287
|
+
let index = 0;
|
|
288
|
+
for await (const file of collection) {
|
|
289
|
+
throwIfAborted(query.signal);
|
|
290
|
+
validateDatasetFile(file, index);
|
|
291
|
+
this.telemetry.filesDiscovered++;
|
|
292
|
+
if (query.bbox && file.bbox && !doBoundingBoxesIntersect(query.bbox, file.bbox)) {
|
|
293
|
+
this.telemetry.filesPrunedByBoundingBox++;
|
|
294
|
+
index++;
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
if (query.partitions && !matchesPartitions(file.partitions, query.partitions)) {
|
|
298
|
+
this.telemetry.filesPrunedByPartitions++;
|
|
299
|
+
index++;
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
this.telemetry.filesSelected++;
|
|
303
|
+
yield {file, index: index++};
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** Adds a final child-source telemetry snapshot exactly once. */
|
|
308
|
+
private addParquetTelemetry(telemetry: ParquetTelemetry): void {
|
|
309
|
+
for (const key of Object.keys(telemetry) as Array<keyof ParquetTelemetry>) {
|
|
310
|
+
this.telemetry.parquet[key] += telemetry[key];
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/** Throws when an operation is attempted after `close()`. */
|
|
315
|
+
private assertOpen(): void {
|
|
316
|
+
if (this.closed) {
|
|
317
|
+
throw new Error('ParquetDatasetSource is closed');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/** Normalizes static descriptors and lazy providers into one file collection. */
|
|
323
|
+
async function getFileCollection(
|
|
324
|
+
files: ParquetDatasetFiles,
|
|
325
|
+
query: ParquetDatasetFileQuery
|
|
326
|
+
): Promise<ParquetDatasetFileCollection> {
|
|
327
|
+
return typeof files === 'function' ? await files(query) : files;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/** Attaches dataset-level descriptor provenance without copying Arrow buffers. */
|
|
331
|
+
function createDatasetBatch(
|
|
332
|
+
batch: ParquetSourceBatch,
|
|
333
|
+
indexedFile: IndexedParquetDatasetFile
|
|
334
|
+
): ParquetDatasetBatch {
|
|
335
|
+
const datasetProvenance = {
|
|
336
|
+
datasetFileIndex: indexedFile.index,
|
|
337
|
+
datasetFileId: getDatasetFileId(indexedFile.file, indexedFile.index),
|
|
338
|
+
datasetPartitions: indexedFile.file.partitions,
|
|
339
|
+
datasetFileMetadata: indexedFile.file.metadata
|
|
340
|
+
};
|
|
341
|
+
const provenance: ParquetDatasetBatchProvenance = Object.freeze({
|
|
342
|
+
sourceId: batch.sourceId,
|
|
343
|
+
sourceUrl: batch.sourceUrl,
|
|
344
|
+
source: batch.source,
|
|
345
|
+
rowGroupIndex: batch.rowGroupIndex,
|
|
346
|
+
rowOffset: batch.rowOffset,
|
|
347
|
+
rowGroupRowOffset: batch.rowGroupRowOffset,
|
|
348
|
+
rowCount: batch.rowCount,
|
|
349
|
+
rowGroupRowIndices: batch.rowGroupRowIndices,
|
|
350
|
+
rowIndices: batch.rowIndices,
|
|
351
|
+
...datasetProvenance
|
|
352
|
+
});
|
|
353
|
+
return {...batch, metadata: provenance, ...datasetProvenance};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** Returns a stable descriptor identity for batch provenance and diagnostics. */
|
|
357
|
+
function getDatasetFileId(file: ParquetDatasetFile, index: number): string {
|
|
358
|
+
if (file.id) {
|
|
359
|
+
return file.id;
|
|
360
|
+
}
|
|
361
|
+
if (typeof file.data === 'string') {
|
|
362
|
+
return file.data;
|
|
363
|
+
}
|
|
364
|
+
return typeof File !== 'undefined' && file.data instanceof File && file.data.name
|
|
365
|
+
? file.data.name
|
|
366
|
+
: `blob-${index}`;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/** Validates a provider descriptor before opening a child source. */
|
|
370
|
+
function validateDatasetFile(file: ParquetDatasetFile, index: number): void {
|
|
371
|
+
if (!file || (typeof file.data !== 'string' && !(file.data instanceof Blob))) {
|
|
372
|
+
throw new Error(`Invalid Parquet dataset file descriptor at index ${index}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/** Tests 2D intersection while conservatively accepting additional dimensions. */
|
|
377
|
+
function doBoundingBoxesIntersect(
|
|
378
|
+
left: ParquetDatasetBoundingBox,
|
|
379
|
+
right: ParquetDatasetBoundingBox
|
|
380
|
+
): boolean {
|
|
381
|
+
const leftMaximumX = left.length === 6 ? left[3] : left[2];
|
|
382
|
+
const leftMaximumY = left.length === 6 ? left[4] : left[3];
|
|
383
|
+
const rightMaximumX = right.length === 6 ? right[3] : right[2];
|
|
384
|
+
const rightMaximumY = right.length === 6 ? right[4] : right[3];
|
|
385
|
+
return (
|
|
386
|
+
left[0] <= rightMaximumX &&
|
|
387
|
+
leftMaximumX >= right[0] &&
|
|
388
|
+
left[1] <= rightMaximumY &&
|
|
389
|
+
leftMaximumY >= right[1]
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/** Tests exact partition constraints without rejecting files that omit a requested key. */
|
|
394
|
+
function matchesPartitions(
|
|
395
|
+
partitions: Readonly<Record<string, ParquetDatasetPartitionValue>> | undefined,
|
|
396
|
+
query: NonNullable<ParquetDatasetFileQuery['partitions']>
|
|
397
|
+
): boolean {
|
|
398
|
+
for (const [key, requested] of Object.entries(query)) {
|
|
399
|
+
const actual = partitions?.[key];
|
|
400
|
+
if (actual === undefined) {
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
const accepted = Array.isArray(requested) ? requested : [requested];
|
|
404
|
+
if (!accepted.includes(actual)) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return true;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** Creates a deterministic field-only schema fingerprint for cross-file validation. */
|
|
412
|
+
function getSchemaFingerprint(schema: Schema): string {
|
|
413
|
+
return JSON.stringify(schema.fields);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/** Validates and normalizes dataset-level file concurrency. */
|
|
417
|
+
function normalizeFileConcurrency(value: number | undefined): number {
|
|
418
|
+
const concurrency = value ?? DEFAULT_FILE_CONCURRENCY;
|
|
419
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) {
|
|
420
|
+
throw new Error(`parquetDataset.fileConcurrency must be a positive integer, received ${value}`);
|
|
421
|
+
}
|
|
422
|
+
return concurrency;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** Creates linked cancellation for one dataset read. */
|
|
426
|
+
function createDatasetAbortContext(signal?: AbortSignal): {
|
|
427
|
+
abortController: AbortController;
|
|
428
|
+
removeSignalListener: () => void;
|
|
429
|
+
} {
|
|
430
|
+
const abortController = new AbortController();
|
|
431
|
+
const abort = (): void => abortController.abort(signal?.reason);
|
|
432
|
+
if (signal?.aborted) {
|
|
433
|
+
abort();
|
|
434
|
+
} else {
|
|
435
|
+
signal?.addEventListener('abort', abort, {once: true});
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
abortController,
|
|
439
|
+
removeSignalListener: () => signal?.removeEventListener('abort', abort)
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** Throws a standard abort failure when a dataset read has been cancelled. */
|
|
444
|
+
function throwIfAborted(signal?: AbortSignal): void {
|
|
445
|
+
if (signal?.aborted) {
|
|
446
|
+
throw signal.reason || new DOMException('Aborted', 'AbortError');
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** Creates zeroed cumulative dataset and child-source telemetry. */
|
|
451
|
+
function createParquetDatasetTelemetry(): ParquetDatasetTelemetry {
|
|
452
|
+
return {
|
|
453
|
+
filesDiscovered: 0,
|
|
454
|
+
filesSelected: 0,
|
|
455
|
+
filesPrunedByBoundingBox: 0,
|
|
456
|
+
filesPrunedByPartitions: 0,
|
|
457
|
+
filesOpened: 0,
|
|
458
|
+
batchesEmitted: 0,
|
|
459
|
+
rowsEmitted: 0,
|
|
460
|
+
parquet: {
|
|
461
|
+
rangeRequestCount: 0,
|
|
462
|
+
requestedBytes: 0,
|
|
463
|
+
downloadedBytes: 0,
|
|
464
|
+
cacheHits: 0,
|
|
465
|
+
networkDurationMs: 0,
|
|
466
|
+
failedRangeRequestCount: 0,
|
|
467
|
+
abortedRangeRequestCount: 0,
|
|
468
|
+
retryCount: 0,
|
|
469
|
+
decodeDurationMs: 0,
|
|
470
|
+
arrowConversionDurationMs: 0,
|
|
471
|
+
rowGroupsRequested: 0,
|
|
472
|
+
rowGroupsPruned: 0,
|
|
473
|
+
rowGroupsPrunedByStatistics: 0,
|
|
474
|
+
rowGroupsPrunedByPageIndex: 0,
|
|
475
|
+
pageIndexesRead: 0,
|
|
476
|
+
pagesRead: 0,
|
|
477
|
+
pagesPruned: 0,
|
|
478
|
+
rowsPrunedByPageIndex: 0,
|
|
479
|
+
rowGroupsDecoded: 0,
|
|
480
|
+
batchesEmitted: 0,
|
|
481
|
+
rowsEmitted: 0,
|
|
482
|
+
predicateRowsTested: 0,
|
|
483
|
+
predicateRowsMatched: 0,
|
|
484
|
+
cancellationCount: 0,
|
|
485
|
+
failedReadCount: 0
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
}
|
package/src/parquet-format.ts
CHANGED
|
@@ -7,6 +7,8 @@ import type {Format} from '@loaders.gl/loader-utils';
|
|
|
7
7
|
export const ParquetFormat = {
|
|
8
8
|
name: 'Apache Parquet',
|
|
9
9
|
category: 'table',
|
|
10
|
+
encoding: 'parquet',
|
|
11
|
+
format: 'parquet',
|
|
10
12
|
extensions: ['parquet'],
|
|
11
13
|
mimeTypes: ['application/octet-stream'],
|
|
12
14
|
binary: true,
|