@loaders.gl/parquet 5.0.0-alpha.2 → 5.0.0-alpha.4
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 +1 -1
- package/dist/bundled.d.ts +1 -1
- package/dist/bundled.d.ts.map +1 -1
- package/dist/bundled.js.map +1 -1
- 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.js +1 -1
- 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 +15841 -3306
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.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 +94 -19
- package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
- package/dist/lib/arrow/create-nested-arrow-vector.js +89 -0
- package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -1
- package/dist/lib/constants.js +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.js +202 -7
- package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -1
- 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.map +1 -1
- package/dist/lib/geo/geospatial-metadata.js +39 -13
- package/dist/lib/geo/geospatial-metadata.js.map +1 -1
- 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 +34 -5
- package/dist/lib/parquet-page-index.d.ts.map +1 -1
- package/dist/lib/parquet-page-index.js +114 -28
- package/dist/lib/parquet-page-index.js.map +1 -1
- package/dist/lib/parquet-predicate.d.ts +5 -1
- package/dist/lib/parquet-predicate.d.ts.map +1 -1
- package/dist/lib/parquet-predicate.js +42 -14
- package/dist/lib/parquet-predicate.js.map +1 -1
- package/dist/lib/parquet-source-worker-decoder.d.ts +4 -1
- package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -1
- package/dist/lib/parquet-source-worker-decoder.js +83 -17
- package/dist/lib/parquet-source-worker-decoder.js.map +1 -1
- package/dist/lib/parquet-source-worker-types.d.ts +24 -0
- package/dist/lib/parquet-source-worker-types.d.ts.map +1 -1
- 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-parquet-to-arrow-js.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js +327 -18
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.js +5 -5
- package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js +3 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.js +18 -2
- 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 +1 -1
- package/dist/lib/sources/parquet-range-file.d.ts.map +1 -1
- package/dist/lib/sources/parquet-range-file.js +28 -22
- package/dist/lib/sources/parquet-range-file.js.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.js +15 -1
- package/dist/lib/utils/normalize-parquet-options.js.map +1 -1
- package/dist/parquet-dataset-source.cjs +16528 -4928
- package/dist/parquet-dataset-source.cjs.map +3 -3
- package/dist/parquet-dataset-source.d.ts +31 -4
- package/dist/parquet-dataset-source.d.ts.map +1 -1
- package/dist/parquet-dataset-source.js +296 -74
- package/dist/parquet-dataset-source.js.map +1 -1
- 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-js-loader-types.d.ts +2 -0
- package/dist/parquet-js-loader-types.d.ts.map +1 -1
- package/dist/parquet-js-loader-types.js +2 -1
- package/dist/parquet-js-loader-types.js.map +1 -1
- package/dist/parquet-js-loader.d.ts +1 -0
- package/dist/parquet-js-loader.d.ts.map +1 -1
- package/dist/parquet-js-loader.js +2 -1
- package/dist/parquet-js-loader.js.map +1 -1
- package/dist/parquet-js-writer.d.ts +23 -2
- package/dist/parquet-js-writer.d.ts.map +1 -1
- package/dist/parquet-js-writer.js +1 -1
- package/dist/parquet-js-writer.js.map +1 -1
- package/dist/parquet-loader-base.js +1 -1
- package/dist/parquet-loader-options.d.ts +11 -0
- package/dist/parquet-loader-options.d.ts.map +1 -1
- package/dist/parquet-loader-options.js.map +1 -1
- package/dist/parquet-source-capabilities.d.ts +8 -1
- package/dist/parquet-source-capabilities.d.ts.map +1 -1
- package/dist/parquet-source-capabilities.js +10 -0
- package/dist/parquet-source-capabilities.js.map +1 -1
- package/dist/parquet-source-loader-types.d.ts +10 -0
- package/dist/parquet-source-loader-types.d.ts.map +1 -1
- package/dist/parquet-source-loader-types.js +11 -1
- package/dist/parquet-source-loader-types.js.map +1 -1
- package/dist/parquet-source-loader.cjs +14121 -2796
- package/dist/parquet-source-loader.cjs.map +3 -3
- package/dist/parquet-source-loader.d.ts +51 -4
- package/dist/parquet-source-loader.d.ts.map +1 -1
- package/dist/parquet-source-loader.js +651 -38
- package/dist/parquet-source-loader.js.map +1 -1
- package/dist/parquet-source-types.d.ts +180 -30
- package/dist/parquet-source-types.d.ts.map +1 -1
- package/dist/parquet-source-worker.js +7378 -6989
- package/dist/parquet-source-worker.js.map +4 -4
- package/dist/parquet-worker-node.cjs +8501 -1045
- package/dist/parquet-worker-node.cjs.map +4 -4
- package/dist/parquet-worker-url.js +5 -1
- package/dist/parquet-worker-url.js.map +1 -1
- package/dist/parquet-worker.js +289 -218
- package/dist/parquet-worker.js.map +4 -4
- package/dist/parquetjs/codecs/declare.d.ts +15 -0
- package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
- package/dist/parquetjs/codecs/declare.js +10 -0
- package/dist/parquetjs/codecs/declare.js.map +1 -1
- package/dist/parquetjs/codecs/delta.d.ts.map +1 -1
- package/dist/parquetjs/codecs/delta.js +356 -7
- package/dist/parquetjs/codecs/delta.js.map +1 -1
- package/dist/parquetjs/codecs/index.d.ts.map +1 -1
- package/dist/parquetjs/codecs/index.js +4 -0
- package/dist/parquetjs/codecs/index.js.map +1 -1
- package/dist/parquetjs/codecs/plain.d.ts +1 -1
- package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
- package/dist/parquetjs/codecs/plain.js +153 -12
- package/dist/parquetjs/codecs/plain.js.map +1 -1
- package/dist/parquetjs/codecs/rle.d.ts +4 -0
- package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
- package/dist/parquetjs/codecs/rle.js +406 -3
- package/dist/parquetjs/codecs/rle.js.map +1 -1
- package/dist/parquetjs/compression.d.ts +9 -0
- package/dist/parquetjs/compression.d.ts.map +1 -1
- package/dist/parquetjs/compression.js +86 -67
- package/dist/parquetjs/compression.js.map +1 -1
- package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -1
- package/dist/parquetjs/encoder/dictionary-planner.js +5 -2
- package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.d.ts +43 -1
- package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.js +691 -34
- 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/ColumnChunk.d.ts +5 -0
- package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnChunk.js +35 -0
- 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/ColumnMetaData.d.ts +10 -0
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +73 -0
- package/dist/parquetjs/parquet-thrift/ColumnMetaData.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/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 +5 -0
- package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/FileMetaData.js +35 -0
- package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
- 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/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/index.d.ts +6 -0
- package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.js +6 -0
- package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
- package/dist/parquetjs/parser/decoders.d.ts +10 -1
- package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
- package/dist/parquetjs/parser/decoders.js +318 -14
- 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 +88 -12
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +713 -66
- package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
- package/dist/parquetjs/schema/declare.d.ts +22 -3
- 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.map +1 -1
- package/dist/parquetjs/schema/schema.js +10 -0
- package/dist/parquetjs/schema/schema.js.map +1 -1
- package/dist/parquetjs/schema/shred.d.ts.map +1 -1
- package/dist/parquetjs/schema/shred.js +219 -11
- package/dist/parquetjs/schema/shred.js.map +1 -1
- package/dist/parquetjs/schema/types.js +19 -21
- 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/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/read-utils.d.ts +11 -1
- package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/read-utils.js +21 -1
- package/dist/parquetjs/utils/read-utils.js.map +1 -1
- package/dist/unbundled.d.ts +2 -1
- package/dist/unbundled.d.ts.map +1 -1
- package/dist/unbundled.js +1 -0
- package/dist/unbundled.js.map +1 -1
- package/package.json +36 -13
- package/src/bundled.ts +10 -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/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 +59 -1
- package/src/lib/arrow/convert-schema-from-parquet.ts +113 -19
- package/src/lib/arrow/create-nested-arrow-vector.ts +116 -0
- package/src/lib/encoders/encode-table-to-parquet-js.ts +268 -7
- package/src/lib/geo/geoparquet-covering.ts +201 -0
- package/src/lib/geo/geospatial-metadata.ts +42 -15
- 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 +180 -34
- package/src/lib/parquet-predicate.ts +52 -16
- package/src/lib/parquet-source-worker-decoder.ts +116 -20
- package/src/lib/parquet-source-worker-types.ts +25 -0
- package/src/lib/parsers/get-parquet-schema.ts +3 -1
- package/src/lib/parsers/parse-parquet-to-arrow-js.ts +397 -17
- package/src/lib/parsers/parse-parquet-to-arrow.ts +4 -5
- package/src/lib/parsers/parse-parquet-to-columns.ts +3 -1
- package/src/lib/parsers/parse-parquet-to-json.ts +18 -2
- package/src/lib/slice-parquet-batch.ts +32 -0
- package/src/lib/sources/parquet-range-file.ts +35 -29
- package/src/lib/utils/normalize-parquet-options.ts +17 -1
- package/src/parquet-dataset-source.ts +397 -85
- package/src/parquet-encoded-page-types.ts +122 -0
- package/src/parquet-js-loader-types.ts +1 -0
- package/src/parquet-js-loader.ts +2 -1
- package/src/parquet-js-writer.ts +30 -0
- package/src/parquet-loader-options.ts +11 -0
- package/src/parquet-source-capabilities.ts +18 -1
- package/src/parquet-source-loader-types.ts +10 -0
- package/src/parquet-source-loader.ts +1024 -52
- package/src/parquet-source-types.ts +197 -28
- package/src/parquet-worker-url.ts +6 -1
- package/src/parquetjs/codecs/declare.ts +27 -0
- package/src/parquetjs/codecs/delta.ts +466 -6
- package/src/parquetjs/codecs/index.ts +4 -0
- package/src/parquetjs/codecs/plain.ts +177 -11
- package/src/parquetjs/codecs/rle.ts +573 -3
- package/src/parquetjs/compression.ts +102 -76
- package/src/parquetjs/encoder/dictionary-planner.ts +7 -2
- package/src/parquetjs/encoder/parquet-encoder.ts +1016 -38
- package/src/parquetjs/parquet-thrift/BoundingBox.ts +108 -0
- package/src/parquetjs/parquet-thrift/ColumnChunk.ts +35 -0
- package/src/parquetjs/parquet-thrift/ColumnCryptoMetaData.ts +139 -0
- package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +73 -0
- package/src/parquetjs/parquet-thrift/EncryptionAlgorithm.ts +127 -0
- package/src/parquetjs/parquet-thrift/FileCryptoMetaData.ts +60 -0
- package/src/parquetjs/parquet-thrift/FileMetaData.ts +35 -0
- package/src/parquetjs/parquet-thrift/GeospatialStatistics.ts +68 -0
- package/src/parquetjs/parquet-thrift/SizeStatistics.ts +98 -0
- package/src/parquetjs/parquet-thrift/index.ts +6 -0
- package/src/parquetjs/parser/decoders.ts +451 -26
- package/src/parquetjs/parser/encoded-pages.ts +278 -0
- package/src/parquetjs/parser/parquet-reader.ts +1112 -87
- package/src/parquetjs/schema/declare.ts +22 -2
- package/src/parquetjs/schema/schema.ts +10 -0
- package/src/parquetjs/schema/shred.ts +238 -11
- package/src/parquetjs/schema/types.ts +16 -25
- package/src/parquetjs/schema/variant.ts +313 -0
- package/src/parquetjs/utils/crc32.ts +15 -0
- package/src/parquetjs/utils/read-utils.ts +26 -1
- package/src/unbundled.ts +14 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import {decodeUtf8, toUint8Array} from '../utils/binary-utils';
|
|
6
|
+
|
|
7
|
+
const MAXIMUM_VARIANT_NESTING = 1024;
|
|
8
|
+
|
|
9
|
+
/** Decodes the binary metadata/value pair used by the Parquet VARIANT type. */
|
|
10
|
+
export function decodeVariant(
|
|
11
|
+
metadataInput: ArrayBuffer | ArrayBufferView,
|
|
12
|
+
valueInput: ArrayBuffer | ArrayBufferView
|
|
13
|
+
): unknown {
|
|
14
|
+
const metadata = toUint8Array(metadataInput);
|
|
15
|
+
const value = toUint8Array(valueInput);
|
|
16
|
+
const dictionary = decodeVariantMetadata(metadata);
|
|
17
|
+
const decoded = decodeVariantValue(value, 0, value.length, dictionary, 0);
|
|
18
|
+
if (decoded.nextOffset !== value.length) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
`parquet: trailing bytes in VARIANT value (${value.length - decoded.nextOffset})`
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
return decoded.value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface VariantMetadata {
|
|
27
|
+
/** Dictionary strings used by object field IDs. */
|
|
28
|
+
dictionary: string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface DecodedVariantValue {
|
|
32
|
+
/** Decoded JavaScript value. */
|
|
33
|
+
value: unknown;
|
|
34
|
+
/** Offset immediately following the encoded value. */
|
|
35
|
+
nextOffset: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Parses the versioned dictionary at the start of every Variant value. */
|
|
39
|
+
function decodeVariantMetadata(bytes: Uint8Array): VariantMetadata {
|
|
40
|
+
if (bytes.length < 2) {
|
|
41
|
+
throw new Error('parquet: VARIANT metadata is truncated');
|
|
42
|
+
}
|
|
43
|
+
const header = bytes[0];
|
|
44
|
+
const version = header & 0xf;
|
|
45
|
+
if (version !== 1) {
|
|
46
|
+
throw new Error(`parquet: unsupported VARIANT metadata version ${version}`);
|
|
47
|
+
}
|
|
48
|
+
const offsetSize = ((header >> 6) & 0x3) + 1;
|
|
49
|
+
const dictionarySize = readUnsigned(bytes, 1, offsetSize);
|
|
50
|
+
const offsetsStart = 1 + offsetSize;
|
|
51
|
+
const offsetsEnd = offsetsStart + (dictionarySize + 1) * offsetSize;
|
|
52
|
+
if (offsetsEnd > bytes.length) {
|
|
53
|
+
throw new Error('parquet: VARIANT metadata offsets are truncated');
|
|
54
|
+
}
|
|
55
|
+
const dictionaryBytes = bytes.subarray(offsetsEnd);
|
|
56
|
+
const dictionary: string[] = [];
|
|
57
|
+
let previousOffset = 0;
|
|
58
|
+
for (let index = 0; index < dictionarySize + 1; index++) {
|
|
59
|
+
const offset = readUnsigned(bytes, offsetsStart + index * offsetSize, offsetSize);
|
|
60
|
+
if (offset < previousOffset || offset > dictionaryBytes.length) {
|
|
61
|
+
throw new Error('parquet: invalid VARIANT metadata dictionary offset');
|
|
62
|
+
}
|
|
63
|
+
if (index < dictionarySize) {
|
|
64
|
+
dictionary.push(
|
|
65
|
+
decodeUtf8(
|
|
66
|
+
dictionaryBytes.subarray(
|
|
67
|
+
offset,
|
|
68
|
+
readUnsigned(bytes, offsetsStart + (index + 1) * offsetSize, offsetSize)
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
previousOffset = offset;
|
|
74
|
+
}
|
|
75
|
+
if (previousOffset !== dictionaryBytes.length) {
|
|
76
|
+
throw new Error('parquet: VARIANT metadata does not consume its dictionary bytes');
|
|
77
|
+
}
|
|
78
|
+
return {dictionary};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Decodes one self-contained Variant value within the enclosing byte range. */
|
|
82
|
+
function decodeVariantValue(
|
|
83
|
+
bytes: Uint8Array,
|
|
84
|
+
offset: number,
|
|
85
|
+
endOffset: number,
|
|
86
|
+
metadata: VariantMetadata,
|
|
87
|
+
depth: number
|
|
88
|
+
): DecodedVariantValue {
|
|
89
|
+
if (depth > MAXIMUM_VARIANT_NESTING || offset >= endOffset) {
|
|
90
|
+
throw new Error('parquet: invalid or excessively nested VARIANT value');
|
|
91
|
+
}
|
|
92
|
+
const valueMetadata = bytes[offset++];
|
|
93
|
+
const basicType = valueMetadata & 0x3;
|
|
94
|
+
const valueHeader = valueMetadata >> 2;
|
|
95
|
+
switch (basicType) {
|
|
96
|
+
case 0:
|
|
97
|
+
return decodePrimitiveValue(bytes, offset, endOffset, valueHeader);
|
|
98
|
+
case 1: {
|
|
99
|
+
const stringEnd = checkedEnd(offset + valueHeader, endOffset);
|
|
100
|
+
return {value: decodeUtf8(bytes.subarray(offset, stringEnd)), nextOffset: stringEnd};
|
|
101
|
+
}
|
|
102
|
+
case 2:
|
|
103
|
+
return decodeObjectValue(bytes, offset, endOffset, valueHeader, metadata, depth + 1);
|
|
104
|
+
case 3:
|
|
105
|
+
return decodeArrayValue(bytes, offset, endOffset, valueHeader, metadata, depth + 1);
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`parquet: invalid VARIANT basic type ${basicType}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Decodes a Variant primitive identified by its six-bit primitive header. */
|
|
112
|
+
function decodePrimitiveValue(
|
|
113
|
+
bytes: Uint8Array,
|
|
114
|
+
offset: number,
|
|
115
|
+
endOffset: number,
|
|
116
|
+
primitiveType: number
|
|
117
|
+
): DecodedVariantValue {
|
|
118
|
+
switch (primitiveType) {
|
|
119
|
+
case 0:
|
|
120
|
+
return {value: null, nextOffset: offset};
|
|
121
|
+
case 1:
|
|
122
|
+
return {value: true, nextOffset: offset};
|
|
123
|
+
case 2:
|
|
124
|
+
return {value: false, nextOffset: offset};
|
|
125
|
+
case 3:
|
|
126
|
+
return {value: readSigned(bytes, offset, 1), nextOffset: checkedEnd(offset + 1, endOffset)};
|
|
127
|
+
case 4:
|
|
128
|
+
return {value: readSigned(bytes, offset, 2), nextOffset: checkedEnd(offset + 2, endOffset)};
|
|
129
|
+
case 5:
|
|
130
|
+
return {value: readSigned(bytes, offset, 4), nextOffset: checkedEnd(offset + 4, endOffset)};
|
|
131
|
+
case 6:
|
|
132
|
+
return {value: readBigInt(bytes, offset, 8), nextOffset: checkedEnd(offset + 8, endOffset)};
|
|
133
|
+
case 7:
|
|
134
|
+
return {value: readFloat64(bytes, offset), nextOffset: checkedEnd(offset + 8, endOffset)};
|
|
135
|
+
case 8:
|
|
136
|
+
case 9:
|
|
137
|
+
case 10: {
|
|
138
|
+
const scale = readSigned(bytes, offset, 1);
|
|
139
|
+
const width = primitiveType === 8 ? 4 : primitiveType === 9 ? 8 : 16;
|
|
140
|
+
const unscaled = readBigInt(bytes, offset + 1, width);
|
|
141
|
+
return {
|
|
142
|
+
value: formatVariantDecimal(unscaled, scale),
|
|
143
|
+
nextOffset: checkedEnd(offset + 1 + width, endOffset)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
case 11:
|
|
147
|
+
return {value: readSigned(bytes, offset, 4), nextOffset: checkedEnd(offset + 4, endOffset)};
|
|
148
|
+
case 12:
|
|
149
|
+
case 13:
|
|
150
|
+
case 17:
|
|
151
|
+
case 18:
|
|
152
|
+
case 19:
|
|
153
|
+
return {value: readBigInt(bytes, offset, 8), nextOffset: checkedEnd(offset + 8, endOffset)};
|
|
154
|
+
case 14:
|
|
155
|
+
return {value: readFloat32(bytes, offset), nextOffset: checkedEnd(offset + 4, endOffset)};
|
|
156
|
+
case 15: {
|
|
157
|
+
const length = readUnsigned(bytes, offset, 4);
|
|
158
|
+
const start = checkedEnd(offset + 4, endOffset);
|
|
159
|
+
const binaryEnd = checkedEnd(start + length, endOffset);
|
|
160
|
+
return {value: bytes.slice(start, binaryEnd), nextOffset: binaryEnd};
|
|
161
|
+
}
|
|
162
|
+
case 16: {
|
|
163
|
+
const length = readUnsigned(bytes, offset, 4);
|
|
164
|
+
const start = checkedEnd(offset + 4, endOffset);
|
|
165
|
+
const stringEnd = checkedEnd(start + length, endOffset);
|
|
166
|
+
return {value: decodeUtf8(bytes.subarray(start, stringEnd)), nextOffset: stringEnd};
|
|
167
|
+
}
|
|
168
|
+
case 20: {
|
|
169
|
+
const uuidEnd = checkedEnd(offset + 16, endOffset);
|
|
170
|
+
return {value: bytes.slice(offset, uuidEnd), nextOffset: uuidEnd};
|
|
171
|
+
}
|
|
172
|
+
default:
|
|
173
|
+
throw new Error(`parquet: unsupported VARIANT primitive type ${primitiveType}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Decodes an object using metadata dictionary field IDs and relative value offsets. */
|
|
178
|
+
function decodeObjectValue(
|
|
179
|
+
bytes: Uint8Array,
|
|
180
|
+
offset: number,
|
|
181
|
+
endOffset: number,
|
|
182
|
+
valueHeader: number,
|
|
183
|
+
metadata: VariantMetadata,
|
|
184
|
+
depth: number
|
|
185
|
+
): DecodedVariantValue {
|
|
186
|
+
const isLarge = (valueHeader & 0x10) !== 0;
|
|
187
|
+
const fieldIdSize = ((valueHeader >> 2) & 0x3) + 1;
|
|
188
|
+
const fieldOffsetSize = (valueHeader & 0x3) + 1;
|
|
189
|
+
const countSize = isLarge ? 4 : 1;
|
|
190
|
+
const count = readUnsigned(bytes, offset, countSize);
|
|
191
|
+
offset = checkedEnd(offset + countSize, endOffset);
|
|
192
|
+
const fieldIds: number[] = [];
|
|
193
|
+
for (let index = 0; index < count; index++) {
|
|
194
|
+
fieldIds.push(readUnsigned(bytes, offset, fieldIdSize));
|
|
195
|
+
offset = checkedEnd(offset + fieldIdSize, endOffset);
|
|
196
|
+
}
|
|
197
|
+
const offsets: number[] = [];
|
|
198
|
+
for (let index = 0; index <= count; index++) {
|
|
199
|
+
offsets.push(readUnsigned(bytes, offset, fieldOffsetSize));
|
|
200
|
+
offset = checkedEnd(offset + fieldOffsetSize, endOffset);
|
|
201
|
+
}
|
|
202
|
+
const valuesStart = offset;
|
|
203
|
+
const valuesEnd = checkedEnd(valuesStart + offsets[offsets.length - 1], endOffset);
|
|
204
|
+
const object: Record<string, unknown> = Object.create(null) as Record<string, unknown>;
|
|
205
|
+
for (let index = 0; index < count; index++) {
|
|
206
|
+
const fieldId = fieldIds[index];
|
|
207
|
+
const fieldName = metadata.dictionary[fieldId];
|
|
208
|
+
if (fieldName === undefined) {
|
|
209
|
+
throw new Error(`parquet: invalid VARIANT object field id ${fieldId}`);
|
|
210
|
+
}
|
|
211
|
+
if (Object.prototype.hasOwnProperty.call(object, fieldName)) {
|
|
212
|
+
throw new Error(`parquet: duplicate VARIANT object field ${fieldName}`);
|
|
213
|
+
}
|
|
214
|
+
const valueOffset = checkedEnd(valuesStart + offsets[index], valuesEnd);
|
|
215
|
+
const decoded = decodeVariantValue(bytes, valueOffset, valuesEnd, metadata, depth);
|
|
216
|
+
object[fieldName] = decoded.value;
|
|
217
|
+
}
|
|
218
|
+
return {value: object, nextOffset: valuesEnd};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Decodes an array using relative offsets into its contiguous value region. */
|
|
222
|
+
function decodeArrayValue(
|
|
223
|
+
bytes: Uint8Array,
|
|
224
|
+
offset: number,
|
|
225
|
+
endOffset: number,
|
|
226
|
+
valueHeader: number,
|
|
227
|
+
metadata: VariantMetadata,
|
|
228
|
+
depth: number
|
|
229
|
+
): DecodedVariantValue {
|
|
230
|
+
const isLarge = (valueHeader & 0x4) !== 0;
|
|
231
|
+
const fieldOffsetSize = (valueHeader & 0x3) + 1;
|
|
232
|
+
const countSize = isLarge ? 4 : 1;
|
|
233
|
+
const count = readUnsigned(bytes, offset, countSize);
|
|
234
|
+
offset = checkedEnd(offset + countSize, endOffset);
|
|
235
|
+
const offsets: number[] = [];
|
|
236
|
+
for (let index = 0; index <= count; index++) {
|
|
237
|
+
offsets.push(readUnsigned(bytes, offset, fieldOffsetSize));
|
|
238
|
+
offset = checkedEnd(offset + fieldOffsetSize, endOffset);
|
|
239
|
+
}
|
|
240
|
+
const valuesStart = offset;
|
|
241
|
+
const valuesEnd = checkedEnd(valuesStart + offsets[offsets.length - 1], endOffset);
|
|
242
|
+
const array = new Array<unknown>(count);
|
|
243
|
+
for (let index = 0; index < count; index++) {
|
|
244
|
+
const valueOffset = checkedEnd(valuesStart + offsets[index], valuesEnd);
|
|
245
|
+
array[index] = decodeVariantValue(bytes, valueOffset, valuesEnd, metadata, depth).value;
|
|
246
|
+
}
|
|
247
|
+
return {value: array, nextOffset: valuesEnd};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Reads an unsigned little-endian integer of up to four bytes. */
|
|
251
|
+
function readUnsigned(bytes: Uint8Array, offset: number, byteLength: number): number {
|
|
252
|
+
let value = 0;
|
|
253
|
+
for (let index = 0; index < byteLength; index++) {
|
|
254
|
+
value += bytes[offset + index] * 2 ** (index * 8);
|
|
255
|
+
}
|
|
256
|
+
if (!Number.isSafeInteger(value)) {
|
|
257
|
+
throw new Error('parquet: VARIANT integer exceeds JavaScript safe range');
|
|
258
|
+
}
|
|
259
|
+
return value;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** Reads a signed little-endian integer of up to four bytes. */
|
|
263
|
+
function readSigned(bytes: Uint8Array, offset: number, byteLength: number): number {
|
|
264
|
+
const unsigned = readUnsigned(bytes, offset, byteLength);
|
|
265
|
+
const signBit = 2 ** (byteLength * 8 - 1);
|
|
266
|
+
return unsigned >= signBit ? unsigned - 2 ** (byteLength * 8) : unsigned;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** Reads a signed little-endian integer while preserving 64- and 128-bit precision. */
|
|
270
|
+
function readBigInt(bytes: Uint8Array, offset: number, byteLength: number): bigint {
|
|
271
|
+
let value = 0n;
|
|
272
|
+
for (let index = 0; index < byteLength; index++) {
|
|
273
|
+
value |= BigInt(bytes[offset + index]) << BigInt(index * 8);
|
|
274
|
+
}
|
|
275
|
+
const signBit = 1n << BigInt(byteLength * 8 - 1);
|
|
276
|
+
return value >= signBit ? value - (1n << BigInt(byteLength * 8)) : value;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Reads a little-endian IEEE-754 single-precision value. */
|
|
280
|
+
function readFloat32(bytes: Uint8Array, offset: number): number {
|
|
281
|
+
return new DataView(bytes.buffer, bytes.byteOffset + offset, 4).getFloat32(0, true);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Reads a little-endian IEEE-754 double-precision value. */
|
|
285
|
+
function readFloat64(bytes: Uint8Array, offset: number): number {
|
|
286
|
+
return new DataView(bytes.buffer, bytes.byteOffset + offset, 8).getFloat64(0, true);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** Formats a Variant decimal without losing precision when JavaScript numbers are unsafe. */
|
|
290
|
+
function formatVariantDecimal(unscaled: bigint, scale: number): number | string {
|
|
291
|
+
if (scale < 0) {
|
|
292
|
+
return `${unscaled.toString()}${'0'.repeat(-scale)}`;
|
|
293
|
+
}
|
|
294
|
+
if (
|
|
295
|
+
scale === 0 &&
|
|
296
|
+
unscaled >= BigInt(Number.MIN_SAFE_INTEGER) &&
|
|
297
|
+
unscaled <= BigInt(Number.MAX_SAFE_INTEGER)
|
|
298
|
+
) {
|
|
299
|
+
return Number(unscaled);
|
|
300
|
+
}
|
|
301
|
+
const sign = unscaled < 0n ? '-' : '';
|
|
302
|
+
const digits = (unscaled < 0n ? -unscaled : unscaled).toString().padStart(scale + 1, '0');
|
|
303
|
+
const split = digits.length - scale;
|
|
304
|
+
return `${sign}${digits.slice(0, split)}.${digits.slice(split)}`;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** Validates an offset against the enclosing value boundary. */
|
|
308
|
+
function checkedEnd(offset: number, endOffset: number): number {
|
|
309
|
+
if (!Number.isSafeInteger(offset) || offset < 0 || offset > endOffset) {
|
|
310
|
+
throw new Error('parquet: truncated VARIANT value');
|
|
311
|
+
}
|
|
312
|
+
return offset;
|
|
313
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
/** Computes the IEEE CRC-32 checksum used by Parquet page headers. */
|
|
6
|
+
export function crc32(bytes: Uint8Array): number {
|
|
7
|
+
let checksum = 0xffffffff;
|
|
8
|
+
for (const byte of bytes) {
|
|
9
|
+
checksum ^= byte;
|
|
10
|
+
for (let bit = 0; bit < 8; bit++) {
|
|
11
|
+
checksum = (checksum >>> 1) ^ (0xedb88320 & -(checksum & 1));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return (checksum ^ 0xffffffff) >>> 0;
|
|
15
|
+
}
|
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
// Copyright (c) 2017 ironSource Ltd.
|
|
5
5
|
// Forked from https://github.com/kbajalc/parquets under MIT license
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
ColumnMetaData,
|
|
9
|
+
FileCryptoMetaData,
|
|
10
|
+
FileMetaData,
|
|
11
|
+
PageHeader
|
|
12
|
+
} from '../parquet-thrift/index';
|
|
8
13
|
import {Uint8ArrayCompactProtocol} from './uint8-array-compact-protocol';
|
|
9
14
|
import {Uint8ArrayCompactProtocolWriter} from './uint8-array-compact-protocol-writer';
|
|
10
15
|
import {Uint8ArrayTransport} from './uint8-array-transport';
|
|
@@ -67,6 +72,26 @@ export function decodeFileMetadata(buf: Uint8Array, offset?: number) {
|
|
|
67
72
|
return {length: transport.readPos - offset, metadata};
|
|
68
73
|
}
|
|
69
74
|
|
|
75
|
+
/** Decodes the FileCryptoMetaData prefix used by encrypted-footer files. */
|
|
76
|
+
export function decodeFileCryptoMetadata(buf: Uint8Array, offset?: number) {
|
|
77
|
+
if (!offset) offset = 0;
|
|
78
|
+
const transport = new Uint8ArrayTransport(buf);
|
|
79
|
+
transport.readPos = offset;
|
|
80
|
+
const protocol = new Uint8ArrayCompactProtocol(transport);
|
|
81
|
+
const metadata = FileCryptoMetaData.read(protocol as any);
|
|
82
|
+
return {length: transport.readPos - offset, metadata};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Decodes a serialized ColumnMetaData encryption module. */
|
|
86
|
+
export function decodeColumnMetadata(buf: Uint8Array, offset?: number) {
|
|
87
|
+
if (!offset) offset = 0;
|
|
88
|
+
const transport = new Uint8ArrayTransport(buf);
|
|
89
|
+
transport.readPos = offset;
|
|
90
|
+
const protocol = new Uint8ArrayCompactProtocol(transport);
|
|
91
|
+
const metadata = ColumnMetaData.read(protocol as any);
|
|
92
|
+
return {length: transport.readPos - offset, metadata};
|
|
93
|
+
}
|
|
94
|
+
|
|
70
95
|
export function decodePageHeader(buf: Uint8Array, offset?: number) {
|
|
71
96
|
if (!offset) {
|
|
72
97
|
// tslint:disable-next-line:no-parameter-reassignment
|
package/src/unbundled.ts
CHANGED
|
@@ -14,10 +14,24 @@ export {
|
|
|
14
14
|
type ParquetSourceReadOptions,
|
|
15
15
|
type ParquetSourceMetadata,
|
|
16
16
|
type ParquetRowGroupMetadata,
|
|
17
|
+
type ParquetSortingColumn,
|
|
17
18
|
type ParquetColumnChunkMetadata,
|
|
19
|
+
type ParquetColumnChunkSizeStatistics,
|
|
20
|
+
type ParquetGeospatialBoundingBox,
|
|
21
|
+
type ParquetGeospatialStatistics,
|
|
18
22
|
type ParquetBatchMetadata,
|
|
19
23
|
type ParquetSourceBatch
|
|
20
24
|
} from './parquet-source-loader';
|
|
25
|
+
export {
|
|
26
|
+
createParquetModuleAad,
|
|
27
|
+
decryptParquetModule,
|
|
28
|
+
encryptParquetModule,
|
|
29
|
+
createParquetFooterSignature,
|
|
30
|
+
type ParquetDecryptModuleOptions,
|
|
31
|
+
type ParquetEncryptionAlgorithm,
|
|
32
|
+
type ParquetKeyRetriever,
|
|
33
|
+
type ParquetWriterFooterSignatureOptions
|
|
34
|
+
} from './lib/parquet-encryption';
|
|
21
35
|
export {
|
|
22
36
|
ParquetDatasetSource,
|
|
23
37
|
type ParquetDatasetBatch,
|