@loaders.gl/parquet 5.0.0-alpha.2 → 5.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +15005 -3143
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +7 -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 +15766 -4896
- 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-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 +14911 -4316
- package/dist/parquet-source-loader.cjs.map +3 -3
- package/dist/parquet-source-loader.d.ts +42 -4
- package/dist/parquet-source-loader.d.ts.map +1 -1
- package/dist/parquet-source-loader.js +585 -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 +7055 -6989
- package/dist/parquet-source-worker.js.map +4 -4
- package/dist/parquet-worker-node.cjs +8505 -1041
- 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/parquet-reader.d.ts +78 -12
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +605 -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 -11
- package/src/bundled.ts +3 -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 +50 -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-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 +929 -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/parquet-reader.ts +935 -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,190 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
/** Reads one length-prefixed encrypted Parquet module from a serialized range. */
|
|
5
|
+
export function readParquetEncryptedModule(buffer, offset = 0) {
|
|
6
|
+
if (offset + 4 > buffer.length) {
|
|
7
|
+
throw new Error('Invalid encrypted Parquet module: missing module length');
|
|
8
|
+
}
|
|
9
|
+
const length = new DataView(buffer.buffer, buffer.byteOffset + offset, 4).getUint32(0, true);
|
|
10
|
+
const moduleStart = offset + 4;
|
|
11
|
+
const moduleEnd = moduleStart + length;
|
|
12
|
+
if (length < 12 || moduleEnd > buffer.length) {
|
|
13
|
+
throw new Error('Invalid encrypted Parquet module: truncated module');
|
|
14
|
+
}
|
|
15
|
+
return { bytes: buffer.subarray(moduleStart, moduleEnd), nextOffset: moduleEnd };
|
|
16
|
+
}
|
|
17
|
+
/** Builds the AAD required by the Parquet modular-encryption specification. */
|
|
18
|
+
export function createParquetModuleAad(aadPrefix, fileUnique, module, rowGroupOrdinal, columnOrdinal, pageOrdinal) {
|
|
19
|
+
const moduleType = [
|
|
20
|
+
'footer',
|
|
21
|
+
'column-metadata',
|
|
22
|
+
'data-page',
|
|
23
|
+
'dictionary-page',
|
|
24
|
+
'data-page-header',
|
|
25
|
+
'dictionary-page-header',
|
|
26
|
+
'column-index',
|
|
27
|
+
'offset-index',
|
|
28
|
+
'bloom-filter-header',
|
|
29
|
+
'bloom-filter-bitset'
|
|
30
|
+
].indexOf(module);
|
|
31
|
+
if (moduleType < 0)
|
|
32
|
+
throw new Error(`Unknown Parquet encryption module ${module}`);
|
|
33
|
+
const isPageModule = module === 'data-page' || module === 'data-page-header';
|
|
34
|
+
const suffixLength = fileUnique.length + (module === 'footer' ? 1 : isPageModule ? 7 : 5);
|
|
35
|
+
const suffix = new Uint8Array(suffixLength);
|
|
36
|
+
suffix.set(fileUnique);
|
|
37
|
+
suffix[fileUnique.length] = moduleType;
|
|
38
|
+
if (module !== 'footer') {
|
|
39
|
+
new DataView(suffix.buffer).setInt16(fileUnique.length + 1, rowGroupOrdinal ?? 0, true);
|
|
40
|
+
new DataView(suffix.buffer).setInt16(fileUnique.length + 3, columnOrdinal ?? 0, true);
|
|
41
|
+
if (isPageModule)
|
|
42
|
+
new DataView(suffix.buffer).setInt16(fileUnique.length + 5, pageOrdinal ?? 0, true);
|
|
43
|
+
}
|
|
44
|
+
const prefix = aadPrefix || new Uint8Array(0);
|
|
45
|
+
const aad = new Uint8Array(prefix.length + suffix.length);
|
|
46
|
+
aad.set(prefix);
|
|
47
|
+
aad.set(suffix, prefix.length);
|
|
48
|
+
return aad;
|
|
49
|
+
}
|
|
50
|
+
/** Decrypts a Parquet module serialized as `[length][nonce][ciphertext][tag]`. */
|
|
51
|
+
export async function decryptParquetModule(encryptedModule, options) {
|
|
52
|
+
const bytes = toUint8Array(encryptedModule);
|
|
53
|
+
const buffer = hasLengthPrefix(bytes) ? bytes.subarray(4) : bytes;
|
|
54
|
+
const nonceLength = 12;
|
|
55
|
+
if (buffer.length < nonceLength + (options.page ? 0 : 16)) {
|
|
56
|
+
throw new Error('Invalid Parquet encrypted module: truncated nonce or authentication tag');
|
|
57
|
+
}
|
|
58
|
+
const nonce = buffer.subarray(0, nonceLength);
|
|
59
|
+
const ciphertext = buffer.subarray(nonceLength);
|
|
60
|
+
const keyMaterial = await options.keyRetriever(options.keyMetadata, {
|
|
61
|
+
algorithm: options.algorithm,
|
|
62
|
+
aad: options.aad
|
|
63
|
+
});
|
|
64
|
+
const cryptoKey = await getCryptoKey(keyMaterial, options.algorithm, options.page);
|
|
65
|
+
const cryptoProvider = getCryptoProvider();
|
|
66
|
+
const plaintext = options.page && options.algorithm === 'AES_GCM_CTR_V1'
|
|
67
|
+
? await cryptoProvider.decrypt({ name: 'AES-CTR', counter: makeCounter(nonce), length: 32 }, cryptoKey, ciphertext)
|
|
68
|
+
: await cryptoProvider.decrypt({
|
|
69
|
+
name: 'AES-GCM',
|
|
70
|
+
iv: nonce,
|
|
71
|
+
additionalData: options.aad
|
|
72
|
+
}, cryptoKey, ciphertext);
|
|
73
|
+
return new Uint8Array(plaintext);
|
|
74
|
+
}
|
|
75
|
+
/** Encrypts one Parquet footer module as nonce-prefixed AES-GCM bytes. */
|
|
76
|
+
export async function encryptParquetModule(plaintext, options) {
|
|
77
|
+
const keyMaterial = await options.keyRetriever(options.keyMetadata, {
|
|
78
|
+
algorithm: options.algorithm,
|
|
79
|
+
aad: options.aad
|
|
80
|
+
});
|
|
81
|
+
const cryptoKey = await getCryptoKey(keyMaterial, options.algorithm, false, ['encrypt']);
|
|
82
|
+
const nonce = new Uint8Array(12);
|
|
83
|
+
const cryptoProvider = getCryptoProvider();
|
|
84
|
+
getCryptoRandomValues(nonce);
|
|
85
|
+
const isCtrPage = options.page && options.algorithm === 'AES_GCM_CTR_V1';
|
|
86
|
+
const pageCryptoKey = isCtrPage
|
|
87
|
+
? await getCryptoKey(keyMaterial, options.algorithm, true, ['encrypt'])
|
|
88
|
+
: cryptoKey;
|
|
89
|
+
const ciphertext = new Uint8Array(await cryptoProvider.encrypt(isCtrPage
|
|
90
|
+
? { name: 'AES-CTR', counter: makeCounter(nonce), length: 32 }
|
|
91
|
+
: {
|
|
92
|
+
name: 'AES-GCM',
|
|
93
|
+
iv: nonce,
|
|
94
|
+
additionalData: options.aad
|
|
95
|
+
}, pageCryptoKey, toUint8Array(plaintext)));
|
|
96
|
+
const encryptedModule = new Uint8Array(nonce.byteLength + ciphertext.byteLength);
|
|
97
|
+
encryptedModule.set(nonce);
|
|
98
|
+
encryptedModule.set(ciphertext, nonce.byteLength);
|
|
99
|
+
return encryptedModule;
|
|
100
|
+
}
|
|
101
|
+
/** Verifies a plaintext-footer signature by authenticating the serialized footer bytes. */
|
|
102
|
+
export async function verifyParquetFooterSignature(footerBytes, signature, options) {
|
|
103
|
+
if (signature.byteLength !== 28) {
|
|
104
|
+
throw new Error(`Invalid Parquet plaintext-footer signature length ${signature.byteLength}; expected 28`);
|
|
105
|
+
}
|
|
106
|
+
const keyMaterial = await options.keyRetriever(options.keyMetadata, {
|
|
107
|
+
algorithm: options.algorithm,
|
|
108
|
+
aad: options.aad
|
|
109
|
+
});
|
|
110
|
+
const cryptoKey = await getCryptoKey(keyMaterial, options.algorithm, false, ['encrypt']);
|
|
111
|
+
const encryptedFooter = new Uint8Array(await getCryptoProvider().encrypt({
|
|
112
|
+
name: 'AES-GCM',
|
|
113
|
+
iv: signature.subarray(0, 12),
|
|
114
|
+
additionalData: options.aad
|
|
115
|
+
}, cryptoKey, footerBytes));
|
|
116
|
+
const calculatedTag = encryptedFooter.subarray(encryptedFooter.byteLength - 16);
|
|
117
|
+
for (let index = 0; index < 16; index++) {
|
|
118
|
+
if (calculatedTag[index] !== signature[12 + index]) {
|
|
119
|
+
throw new Error('Parquet plaintext-footer signature verification failed');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** Creates the nonce and authentication tag used by a plaintext-footer signature. */
|
|
124
|
+
export async function createParquetFooterSignature(footerBytes, options) {
|
|
125
|
+
const algorithm = options.algorithm ?? 'AES_GCM_V1';
|
|
126
|
+
const fileUnique = options.fileUnique ? new Uint8Array(options.fileUnique) : createFileUnique();
|
|
127
|
+
if (fileUnique.byteLength !== 8) {
|
|
128
|
+
throw new Error('Parquet plaintext-footer signature file_unique must be 8 bytes');
|
|
129
|
+
}
|
|
130
|
+
const aad = createParquetModuleAad(options.aadPrefix, fileUnique, 'footer');
|
|
131
|
+
const keyMaterial = await options.keyRetriever(options.keyMetadata, { algorithm, aad });
|
|
132
|
+
const cryptoKey = await getCryptoKey(keyMaterial, algorithm, false, ['encrypt']);
|
|
133
|
+
const nonce = new Uint8Array(12);
|
|
134
|
+
getCryptoRandomValues(nonce);
|
|
135
|
+
const encryptedFooter = new Uint8Array(await getCryptoProvider().encrypt({
|
|
136
|
+
name: 'AES-GCM',
|
|
137
|
+
iv: nonce,
|
|
138
|
+
additionalData: aad
|
|
139
|
+
}, cryptoKey, footerBytes));
|
|
140
|
+
const signature = new Uint8Array(28);
|
|
141
|
+
signature.set(nonce);
|
|
142
|
+
signature.set(encryptedFooter.subarray(encryptedFooter.byteLength - 16), nonce.byteLength);
|
|
143
|
+
return signature;
|
|
144
|
+
}
|
|
145
|
+
function hasLengthPrefix(bytes) {
|
|
146
|
+
if (bytes.length < 4)
|
|
147
|
+
return false;
|
|
148
|
+
const length = new DataView(bytes.buffer, bytes.byteOffset, 4).getUint32(0, true);
|
|
149
|
+
return length === bytes.length - 4;
|
|
150
|
+
}
|
|
151
|
+
function createFileUnique() {
|
|
152
|
+
const fileUnique = new Uint8Array(8);
|
|
153
|
+
getCryptoRandomValues(fileUnique);
|
|
154
|
+
return fileUnique;
|
|
155
|
+
}
|
|
156
|
+
function makeCounter(nonce) {
|
|
157
|
+
const counter = new Uint8Array(16);
|
|
158
|
+
counter.set(nonce);
|
|
159
|
+
counter[15] = 1;
|
|
160
|
+
return counter;
|
|
161
|
+
}
|
|
162
|
+
async function getCryptoKey(keyMaterial, algorithm, page, usages = ['decrypt']) {
|
|
163
|
+
const keyBytes = toUint8Array(keyMaterial);
|
|
164
|
+
if (keyBytes.byteLength !== 16 && keyBytes.byteLength !== 24 && keyBytes.byteLength !== 32) {
|
|
165
|
+
throw new Error(`Invalid Parquet encryption key length ${keyBytes.byteLength}`);
|
|
166
|
+
}
|
|
167
|
+
return await getCryptoProvider().importKey('raw', keyBytes, page && algorithm === 'AES_GCM_CTR_V1' ? { name: 'AES-CTR' } : { name: 'AES-GCM' }, false, usages);
|
|
168
|
+
}
|
|
169
|
+
function getCryptoProvider() {
|
|
170
|
+
const cryptoProvider = globalThis.crypto?.subtle;
|
|
171
|
+
if (!cryptoProvider)
|
|
172
|
+
throw new Error('Parquet encryption requires Web Crypto support');
|
|
173
|
+
return cryptoProvider;
|
|
174
|
+
}
|
|
175
|
+
/** Fills a nonce with cryptographically secure random bytes. */
|
|
176
|
+
function getCryptoRandomValues(array) {
|
|
177
|
+
const cryptoProvider = globalThis.crypto;
|
|
178
|
+
if (!cryptoProvider?.getRandomValues) {
|
|
179
|
+
throw new Error('Parquet encryption requires Web Crypto random values');
|
|
180
|
+
}
|
|
181
|
+
const getRandomValues = cryptoProvider.getRandomValues.bind(cryptoProvider);
|
|
182
|
+
getRandomValues(array);
|
|
183
|
+
return array;
|
|
184
|
+
}
|
|
185
|
+
function toUint8Array(value) {
|
|
186
|
+
return value instanceof ArrayBuffer
|
|
187
|
+
? new Uint8Array(value)
|
|
188
|
+
: new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=parquet-encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet-encryption.js","sourceRoot":"","sources":["../../src/lib/parquet-encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,22 +38,51 @@ export type ParquetPagePruningPlan = {
|
|
|
38
38
|
/** Logical rows eliminated before data-page reads. */
|
|
39
39
|
prunedRowCount: number;
|
|
40
40
|
};
|
|
41
|
+
/** Decrypts an encrypted page-index module before Thrift decoding. */
|
|
42
|
+
export type ParquetPageIndexDecryptor = (bytes: Uint8Array, module: 'column-index' | 'offset-index', rowGroupOrdinal: number, columnOrdinal: number, columnChunk: ColumnChunk) => Promise<Uint8Array>;
|
|
43
|
+
/** Optional controls for reading page indexes from a Parquet source. */
|
|
44
|
+
export type ParquetPagePruningOptions = {
|
|
45
|
+
/** Row-group ordinal used when constructing encrypted-module AAD. */
|
|
46
|
+
rowGroupOrdinal?: number;
|
|
47
|
+
/** Decode legacy INT96 page statistics as epoch nanoseconds. */
|
|
48
|
+
int96AsTimestamp?: boolean;
|
|
49
|
+
/** Decrypts encrypted index modules; omitted for plaintext files. */
|
|
50
|
+
decryptModule?: ParquetPageIndexDecryptor;
|
|
51
|
+
};
|
|
52
|
+
/** Logical statistics attached to one data page. */
|
|
53
|
+
export type ParquetPageStatistics = {
|
|
54
|
+
min?: unknown;
|
|
55
|
+
max?: unknown;
|
|
56
|
+
nullCount?: number;
|
|
57
|
+
minIsExact?: boolean;
|
|
58
|
+
maxIsExact?: boolean;
|
|
59
|
+
};
|
|
41
60
|
/**
|
|
42
61
|
* Builds a conservative selective-page plan from Parquet column and offset indexes.
|
|
43
62
|
*
|
|
44
|
-
* Returns `undefined` when indexes or the
|
|
45
|
-
*
|
|
63
|
+
* Returns `undefined` when indexes or the selected decoder cannot safely avoid full column-chunk
|
|
64
|
+
* reads. Repeated leaves are selected only when every decoded column uses the same page row
|
|
65
|
+
* boundaries, so ranges begin and end on complete logical rows. An empty `rowRanges` array means
|
|
66
|
+
* the indexes prove the predicate cannot match.
|
|
46
67
|
*/
|
|
47
|
-
export declare function createParquetPagePruningPlan(file: ReadableFile, rowGroup: RowGroup, schema: ParquetSchema, selectedColumnPaths: readonly string[][], predicate: ParquetPredicate, signal?: AbortSignal): Promise<ParquetPagePruningPlan | undefined>;
|
|
68
|
+
export declare function createParquetPagePruningPlan(file: ReadableFile, rowGroup: RowGroup, schema: ParquetSchema, selectedColumnPaths: readonly string[][], predicate: ParquetPredicate, signal?: AbortSignal, options?: ParquetPagePruningOptions): Promise<ParquetPagePruningPlan | undefined>;
|
|
48
69
|
/** Returns data-page byte ranges needed to decode a selective row-group plan. */
|
|
49
|
-
export declare function getParquetPageReadRanges(rowGroup: RowGroup, selectedColumnPaths: readonly string[][], plan: ParquetPagePruningPlan): Array<{
|
|
70
|
+
export declare function getParquetPageReadRanges(rowGroup: RowGroup, selectedColumnPaths: readonly string[][], plan: ParquetPagePruningPlan, schema: ParquetSchema): Array<{
|
|
50
71
|
offset: number;
|
|
51
72
|
length: number;
|
|
52
73
|
}>;
|
|
53
74
|
/** Decodes one compact-protocol Parquet offset index. */
|
|
54
75
|
export declare function decodeOffsetIndex(bytes: Uint8Array, rowCount: number): ParquetDataPageLocation[];
|
|
76
|
+
/** Decodes column-index values into logical per-page statistics. */
|
|
77
|
+
export declare function decodeParquetColumnIndex(bytes: Uint8Array, pages: readonly ParquetDataPageLocation[], field: ParquetField, options?: Pick<ParquetPagePruningOptions, 'int96AsTimestamp'>): ParquetPageStatistics[];
|
|
55
78
|
/** Decodes one physical page-index statistic and applies its Parquet logical annotation. */
|
|
56
|
-
export declare function decodeParquetPageStatisticsValue(bytes: Uint8Array, field: ParquetField): unknown;
|
|
79
|
+
export declare function decodeParquetPageStatisticsValue(bytes: Uint8Array, field: ParquetField, options?: Pick<ParquetPagePruningOptions, 'int96AsTimestamp'>): unknown;
|
|
80
|
+
/**
|
|
81
|
+
* Returns whether a column can be decoded from selected page ranges without changing row shape.
|
|
82
|
+
*
|
|
83
|
+
* Repeated leaves are safe only when the selected columns share complete logical-row boundaries.
|
|
84
|
+
*/
|
|
85
|
+
export declare function canUseParquetPageIndexForColumn(schema: ParquetSchema, columnChunk: ColumnChunk): boolean;
|
|
57
86
|
/** Validates one optional footer index byte range against the containing file. */
|
|
58
87
|
export declare function getParquetIndexRange(offsetValue: ColumnChunk['offset_index_offset'], lengthValue: number | undefined, fileSize: number): {
|
|
59
88
|
offset: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parquet-page-index.d.ts","sourceRoot":"","sources":["../../src/lib/parquet-page-index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAIV,gBAAgB,EACjB,mCAAgC;AACjC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,6CAA0C;AAC3C,OAAO,KAAK,EAAC,YAAY,EAAC,uCAAoC;AAC9D,OAAO,KAAK,EAAC,aAAa,EAAC,sCAAmC;
|
|
1
|
+
{"version":3,"file":"parquet-page-index.d.ts","sourceRoot":"","sources":["../../src/lib/parquet-page-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,26 +6,29 @@ import * as Types from "../parquetjs/schema/types.js";
|
|
|
6
6
|
import { copyUint8Array, readDoubleLE, readFloatLE, readInt32LE, readInt64LE, readUInt32LE, readUInt64LE, toUint8Array } from "../parquetjs/utils/binary-utils.js";
|
|
7
7
|
import { Uint8ArrayCompactProtocol } from "../parquetjs/utils/uint8-array-compact-protocol.js";
|
|
8
8
|
import { Uint8ArrayTransport } from "../parquetjs/utils/uint8-array-transport.js";
|
|
9
|
-
import { canParquetStatisticsMatch,
|
|
9
|
+
import { canParquetStatisticsMatch, getParquetPredicatePath, getParquetPredicatePaths } from "./parquet-predicate.js";
|
|
10
10
|
/**
|
|
11
11
|
* Builds a conservative selective-page plan from Parquet column and offset indexes.
|
|
12
12
|
*
|
|
13
|
-
* Returns `undefined` when indexes or the
|
|
14
|
-
*
|
|
13
|
+
* Returns `undefined` when indexes or the selected decoder cannot safely avoid full column-chunk
|
|
14
|
+
* reads. Repeated leaves are selected only when every decoded column uses the same page row
|
|
15
|
+
* boundaries, so ranges begin and end on complete logical rows. An empty `rowRanges` array means
|
|
16
|
+
* the indexes prove the predicate cannot match.
|
|
15
17
|
*/
|
|
16
|
-
export async function createParquetPagePruningPlan(file, rowGroup, schema, selectedColumnPaths, predicate, signal) {
|
|
18
|
+
export async function createParquetPagePruningPlan(file, rowGroup, schema, selectedColumnPaths, predicate, signal, options) {
|
|
17
19
|
const rowCount = Number(rowGroup.num_rows);
|
|
18
20
|
const selectedColumnChunks = getSelectedColumnChunks(rowGroup, selectedColumnPaths);
|
|
19
|
-
if (!
|
|
21
|
+
if (!isSafePageSelection(schema, selectedColumnChunks) || rowCount <= 0) {
|
|
20
22
|
return undefined;
|
|
21
23
|
}
|
|
22
24
|
const pageLocations = {};
|
|
23
25
|
const pageStatistics = {};
|
|
24
|
-
const
|
|
26
|
+
const predicatePaths = new Set(getParquetPredicatePaths(predicate).map(path => JSON.stringify(path)));
|
|
25
27
|
let indexCount = 0;
|
|
26
28
|
await Promise.all(selectedColumnChunks.map(async (columnChunk) => {
|
|
29
|
+
const columnOrdinal = rowGroup.columns.indexOf(columnChunk);
|
|
27
30
|
const path = columnChunk.meta_data.path_in_schema;
|
|
28
|
-
const pathKey =
|
|
31
|
+
const pathKey = JSON.stringify(path);
|
|
29
32
|
const offsetIndexRange = getParquetIndexRange(columnChunk.offset_index_offset, columnChunk.offset_index_length, file.size);
|
|
30
33
|
if (!offsetIndexRange) {
|
|
31
34
|
return;
|
|
@@ -33,14 +36,17 @@ export async function createParquetPagePruningPlan(file, rowGroup, schema, selec
|
|
|
33
36
|
const offsetIndexBytes = await file.read(offsetIndexRange.offset, offsetIndexRange.length, signal);
|
|
34
37
|
let pages;
|
|
35
38
|
try {
|
|
36
|
-
|
|
39
|
+
const decryptedBytes = options?.decryptModule
|
|
40
|
+
? await options.decryptModule(toUint8Array(offsetIndexBytes), 'offset-index', options.rowGroupOrdinal ?? 0, columnOrdinal, columnChunk)
|
|
41
|
+
: toUint8Array(offsetIndexBytes);
|
|
42
|
+
pages = decodeOffsetIndex(decryptedBytes, rowCount);
|
|
37
43
|
}
|
|
38
44
|
catch {
|
|
39
45
|
return;
|
|
40
46
|
}
|
|
41
47
|
pageLocations[pathKey] = pages;
|
|
42
48
|
indexCount++;
|
|
43
|
-
if (
|
|
49
|
+
if (!predicatePaths.has(pathKey)) {
|
|
44
50
|
return;
|
|
45
51
|
}
|
|
46
52
|
const columnIndexRange = getParquetIndexRange(columnChunk.column_index_offset, columnChunk.column_index_length, file.size);
|
|
@@ -50,9 +56,12 @@ export async function createParquetPagePruningPlan(file, rowGroup, schema, selec
|
|
|
50
56
|
const columnIndexBytes = await file.read(columnIndexRange.offset, columnIndexRange.length, signal);
|
|
51
57
|
const field = schema.findField(path);
|
|
52
58
|
try {
|
|
53
|
-
|
|
59
|
+
const decryptedBytes = options?.decryptModule
|
|
60
|
+
? await options.decryptModule(toUint8Array(columnIndexBytes), 'column-index', options.rowGroupOrdinal ?? 0, columnOrdinal, columnChunk)
|
|
61
|
+
: toUint8Array(columnIndexBytes);
|
|
62
|
+
pageStatistics[pathKey] = {
|
|
54
63
|
pages,
|
|
55
|
-
statistics:
|
|
64
|
+
statistics: decodeParquetColumnIndex(decryptedBytes, pages, field, options)
|
|
56
65
|
};
|
|
57
66
|
}
|
|
58
67
|
catch {
|
|
@@ -60,7 +69,10 @@ export async function createParquetPagePruningPlan(file, rowGroup, schema, selec
|
|
|
60
69
|
}
|
|
61
70
|
indexCount++;
|
|
62
71
|
}));
|
|
63
|
-
if (selectedColumnChunks.some(columnChunk => !pageLocations[columnChunk.meta_data.path_in_schema
|
|
72
|
+
if (selectedColumnChunks.some(columnChunk => !pageLocations[JSON.stringify(columnChunk.meta_data.path_in_schema)])) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if (!hasCompatiblePageBoundaries(schema, selectedColumnChunks, pageLocations)) {
|
|
64
76
|
return undefined;
|
|
65
77
|
}
|
|
66
78
|
const candidateRanges = getPredicateRowRanges(predicate, pageStatistics, rowCount);
|
|
@@ -84,15 +96,17 @@ export async function createParquetPagePruningPlan(file, rowGroup, schema, selec
|
|
|
84
96
|
};
|
|
85
97
|
}
|
|
86
98
|
/** Returns data-page byte ranges needed to decode a selective row-group plan. */
|
|
87
|
-
export function getParquetPageReadRanges(rowGroup, selectedColumnPaths, plan) {
|
|
99
|
+
export function getParquetPageReadRanges(rowGroup, selectedColumnPaths, plan, schema) {
|
|
88
100
|
const ranges = [];
|
|
89
101
|
for (const columnChunk of getSelectedColumnChunks(rowGroup, selectedColumnPaths)) {
|
|
90
102
|
const columnMetadata = columnChunk.meta_data;
|
|
91
|
-
const pages = plan.pageLocations[columnMetadata.path_in_schema
|
|
103
|
+
const pages = plan.pageLocations[JSON.stringify(columnMetadata.path_in_schema)];
|
|
92
104
|
const selectedPages = pages.filter(page => plan.rowRanges.some(range => page.endRowIndex > range.start && page.firstRowIndex < range.end));
|
|
93
105
|
if (!selectedPages.length) {
|
|
94
106
|
continue;
|
|
95
107
|
}
|
|
108
|
+
const field = schema.findField(columnMetadata.path_in_schema);
|
|
109
|
+
const repeated = field.rLevelMax > 0 || field.repetitionType === 'REPEATED';
|
|
96
110
|
const dictionaryPageOffset = Number(columnMetadata.dictionary_page_offset);
|
|
97
111
|
if (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0) {
|
|
98
112
|
ranges.push({
|
|
@@ -105,7 +119,9 @@ export function getParquetPageReadRanges(rowGroup, selectedColumnPaths, plan) {
|
|
|
105
119
|
if (!overlappingPages.length) {
|
|
106
120
|
continue;
|
|
107
121
|
}
|
|
108
|
-
|
|
122
|
+
// A repeated page may begin with a continuation level. Transfer the complete prefix so
|
|
123
|
+
// worker-backed readers can probe predecessor pages before decoding the selected range.
|
|
124
|
+
const firstPage = repeated ? pages[0] : overlappingPages[0];
|
|
109
125
|
const lastPage = overlappingPages[overlappingPages.length - 1];
|
|
110
126
|
ranges.push({
|
|
111
127
|
offset: firstPage.offset,
|
|
@@ -123,9 +139,27 @@ export function decodeOffsetIndex(bytes, rowCount) {
|
|
|
123
139
|
Number(offsetIndex.page_locations[0].first_row_index) !== 0) {
|
|
124
140
|
throw new Error('Invalid Parquet offset index page locations');
|
|
125
141
|
}
|
|
142
|
+
let previousFirstRowIndex = -1;
|
|
143
|
+
for (const location of offsetIndex.page_locations) {
|
|
144
|
+
const firstRowIndex = Number(location.first_row_index);
|
|
145
|
+
if (!Number.isSafeInteger(firstRowIndex) || firstRowIndex < previousFirstRowIndex) {
|
|
146
|
+
throw new Error('Invalid Parquet offset index page locations');
|
|
147
|
+
}
|
|
148
|
+
previousFirstRowIndex = firstRowIndex;
|
|
149
|
+
}
|
|
126
150
|
return offsetIndex.page_locations.map((location, index, locations) => {
|
|
127
151
|
const firstRowIndex = Number(location.first_row_index);
|
|
128
|
-
|
|
152
|
+
// A repeated row may continue on one or more pages. In that case the offset index
|
|
153
|
+
// legitimately repeats first_row_index. Extend each continuation page to the next
|
|
154
|
+
// strictly larger row start so selecting the row includes the complete continuation.
|
|
155
|
+
let endRowIndex = rowCount;
|
|
156
|
+
for (let nextIndex = index + 1; nextIndex < locations.length; nextIndex++) {
|
|
157
|
+
const nextFirstRowIndex = Number(locations[nextIndex].first_row_index);
|
|
158
|
+
if (nextFirstRowIndex > firstRowIndex) {
|
|
159
|
+
endRowIndex = nextFirstRowIndex;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
129
163
|
const offset = Number(location.offset);
|
|
130
164
|
const compressedByteLength = location.compressed_page_size;
|
|
131
165
|
if (!Number.isSafeInteger(offset) ||
|
|
@@ -166,7 +200,7 @@ function getPredicateRowRanges(predicate, columns, rowCount) {
|
|
|
166
200
|
return undefined;
|
|
167
201
|
}
|
|
168
202
|
const leafPredicate = predicate;
|
|
169
|
-
const column = columns[leafPredicate.args[0]
|
|
203
|
+
const column = columns[JSON.stringify(getParquetPredicatePath(leafPredicate.args[0]))];
|
|
170
204
|
if (!column) {
|
|
171
205
|
return undefined;
|
|
172
206
|
}
|
|
@@ -179,8 +213,8 @@ function getPredicateRowRanges(predicate, columns, rowCount) {
|
|
|
179
213
|
}
|
|
180
214
|
return mergeRowRanges(ranges);
|
|
181
215
|
}
|
|
182
|
-
/** Decodes column-index values into
|
|
183
|
-
function
|
|
216
|
+
/** Decodes column-index values into logical per-page statistics. */
|
|
217
|
+
export function decodeParquetColumnIndex(bytes, pages, field, options) {
|
|
184
218
|
const protocol = new Uint8ArrayCompactProtocol(new Uint8ArrayTransport(bytes));
|
|
185
219
|
const columnIndex = ColumnIndex.read(protocol);
|
|
186
220
|
if (columnIndex.null_pages.length !== pages.length ||
|
|
@@ -192,10 +226,10 @@ function decodeColumnIndex(bytes, pages, field) {
|
|
|
192
226
|
return pages.map((_page, pageIndex) => ({
|
|
193
227
|
min: columnIndex.null_pages[pageIndex]
|
|
194
228
|
? undefined
|
|
195
|
-
: decodeParquetPageStatisticsValue(columnIndex.min_values[pageIndex], field),
|
|
229
|
+
: decodeParquetPageStatisticsValue(columnIndex.min_values[pageIndex], field, options),
|
|
196
230
|
max: columnIndex.null_pages[pageIndex]
|
|
197
231
|
? undefined
|
|
198
|
-
: decodeParquetPageStatisticsValue(columnIndex.max_values[pageIndex], field),
|
|
232
|
+
: decodeParquetPageStatisticsValue(columnIndex.max_values[pageIndex], field, options),
|
|
199
233
|
nullCount: columnIndex.null_counts?.[pageIndex] !== undefined
|
|
200
234
|
? Number(columnIndex.null_counts[pageIndex])
|
|
201
235
|
: columnIndex.null_pages[pageIndex]
|
|
@@ -206,7 +240,7 @@ function decodeColumnIndex(bytes, pages, field) {
|
|
|
206
240
|
}));
|
|
207
241
|
}
|
|
208
242
|
/** Decodes one physical page-index statistic and applies its Parquet logical annotation. */
|
|
209
|
-
export function decodeParquetPageStatisticsValue(bytes, field) {
|
|
243
|
+
export function decodeParquetPageStatisticsValue(bytes, field, options) {
|
|
210
244
|
let primitiveValue;
|
|
211
245
|
switch (field.primitiveType) {
|
|
212
246
|
case 'BOOLEAN':
|
|
@@ -227,6 +261,18 @@ export function decodeParquetPageStatisticsValue(bytes, field) {
|
|
|
227
261
|
primitiveValue = readDoubleLE(bytes, 0);
|
|
228
262
|
break;
|
|
229
263
|
case 'INT96':
|
|
264
|
+
if (options?.int96AsTimestamp && bytes.byteLength >= 12) {
|
|
265
|
+
const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
266
|
+
const nanosecondsOfDay = dataView.getBigUint64(0, true);
|
|
267
|
+
if (nanosecondsOfDay < 86400000000000n) {
|
|
268
|
+
primitiveValue =
|
|
269
|
+
(BigInt(dataView.getInt32(8, true)) - 2440588n) * 86400000000000n +
|
|
270
|
+
nanosecondsOfDay;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
primitiveValue = copyUint8Array(bytes);
|
|
275
|
+
break;
|
|
230
276
|
case 'BYTE_ARRAY':
|
|
231
277
|
case 'FIXED_LEN_BYTE_ARRAY':
|
|
232
278
|
primitiveValue = copyUint8Array(bytes);
|
|
@@ -245,24 +291,64 @@ function getSelectedColumnChunks(rowGroup, selectedColumnPaths) {
|
|
|
245
291
|
selectedColumnPaths.some(selectedPath => selectedPath[0] === path[0])));
|
|
246
292
|
});
|
|
247
293
|
}
|
|
248
|
-
/** Restricts selective page reads to
|
|
249
|
-
function
|
|
294
|
+
/** Restricts selective page reads to primitive leaves with safe page boundaries. */
|
|
295
|
+
function isSafePageSelection(schema, columnChunks) {
|
|
250
296
|
return (columnChunks.length > 0 &&
|
|
251
297
|
columnChunks.every(columnChunk => {
|
|
252
298
|
const path = columnChunk.meta_data?.path_in_schema;
|
|
253
|
-
if (!path
|
|
299
|
+
if (!path) {
|
|
254
300
|
return false;
|
|
255
301
|
}
|
|
256
302
|
const field = schema.findField(path);
|
|
257
303
|
const dictionaryEncoded = columnChunk.meta_data.encodings.some(encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY);
|
|
258
304
|
const dictionaryPageOffset = Number(columnChunk.meta_data.dictionary_page_offset);
|
|
259
|
-
return (field.
|
|
260
|
-
field.repetitionType !== 'REPEATED' &&
|
|
261
|
-
field.rLevelMax === 0 &&
|
|
305
|
+
return (field.primitiveType !== undefined &&
|
|
262
306
|
(!dictionaryEncoded ||
|
|
263
307
|
(Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0)));
|
|
264
308
|
}));
|
|
265
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* Returns whether a column can be decoded from selected page ranges without changing row shape.
|
|
312
|
+
*
|
|
313
|
+
* Repeated leaves are safe only when the selected columns share complete logical-row boundaries.
|
|
314
|
+
*/
|
|
315
|
+
export function canUseParquetPageIndexForColumn(schema, columnChunk) {
|
|
316
|
+
const path = columnChunk.meta_data?.path_in_schema;
|
|
317
|
+
if (!path) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
const field = schema.findField(path);
|
|
321
|
+
const dictionaryEncoded = columnChunk.meta_data.encodings.some(encoding => encoding === Encoding.PLAIN_DICTIONARY || encoding === Encoding.RLE_DICTIONARY);
|
|
322
|
+
const dictionaryPageOffset = Number(columnChunk.meta_data.dictionary_page_offset);
|
|
323
|
+
return (field.primitiveType !== undefined &&
|
|
324
|
+
field.repetitionType !== 'REPEATED' &&
|
|
325
|
+
field.rLevelMax === 0 &&
|
|
326
|
+
(!dictionaryEncoded || (Number.isSafeInteger(dictionaryPageOffset) && dictionaryPageOffset > 0)));
|
|
327
|
+
}
|
|
328
|
+
/** Ensures repeated selective reads keep every selected column on identical row boundaries. */
|
|
329
|
+
function hasCompatiblePageBoundaries(schema, columnChunks, pageLocations) {
|
|
330
|
+
const hasRepeatedLeaf = columnChunks.some(columnChunk => {
|
|
331
|
+
const field = schema.findField(columnChunk.meta_data.path_in_schema);
|
|
332
|
+
return field.rLevelMax > 0 || field.repetitionType === 'REPEATED';
|
|
333
|
+
});
|
|
334
|
+
if (!hasRepeatedLeaf) {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
// Offset indexes identify the first logical row represented by each page, but do not
|
|
338
|
+
// expose repetition levels. Equal starts therefore indicate a continuation page whose
|
|
339
|
+
// boundary cannot be proven safe for a selective read; retain the full-column fallback.
|
|
340
|
+
if (columnChunks.some(columnChunk => {
|
|
341
|
+
const pages = pageLocations[JSON.stringify(columnChunk.meta_data.path_in_schema)];
|
|
342
|
+
return pages.some((page, pageIndex) => pageIndex > 0 && page.firstRowIndex === pages[pageIndex - 1].firstRowIndex);
|
|
343
|
+
})) {
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
const signatures = columnChunks.map(columnChunk => {
|
|
347
|
+
const pages = pageLocations[JSON.stringify(columnChunk.meta_data.path_in_schema)];
|
|
348
|
+
return pages.map(page => `${page.firstRowIndex}:${page.endRowIndex}`).join('|');
|
|
349
|
+
});
|
|
350
|
+
return signatures.every(signature => signature === signatures[0]);
|
|
351
|
+
}
|
|
266
352
|
/** Validates one optional footer index byte range against the containing file. */
|
|
267
353
|
export function getParquetIndexRange(offsetValue, lengthValue, fileSize) {
|
|
268
354
|
if (offsetValue === undefined || lengthValue === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parquet-page-index.js","sourceRoot":"","sources":["../../src/lib/parquet-page-index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,+BAA+B;AAC/B,oCAAoC;AAUpC,OAAO,EACL,WAAW,EACX,QAAQ,EACR,WAAW,EAGZ,6CAA0C;AAG3C,OAAO,KAAK,KAAK,qCAAkC;AACnD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,2CAAwC;AACzC,OAAO,EAAC,yBAAyB,EAAC,2DAAwD;AAC1F,OAAO,EAAC,mBAAmB,EAAC,oDAAiD;AAC7E,OAAO,EAAC,yBAAyB,EAAE,0BAA0B,EAAC,+BAA4B;AAsD1F;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAkB,EAClB,QAAkB,EAClB,MAAqB,EACrB,mBAAwC,EACxC,SAA2B,EAC3B,MAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACpF,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAyB,EAAE,CAAC;IAC/C,MAAM,cAAc,GAAgD,EAAE,CAAC;IACvE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,OAAO,CAAC,GAAG,CACf,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAC,WAAW,EAAC,EAAE;QAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,SAAU,CAAC,cAAc,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,gBAAgB,GAAG,oBAAoB,CAC3C,WAAW,CAAC,mBAAmB,EAC/B,WAAW,CAAC,mBAAmB,EAC/B,IAAI,CAAC,IAAI,CACV,CAAC;QACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,IAAI,CACtC,gBAAgB,CAAC,MAAM,EACvB,gBAAgB,CAAC,MAAM,EACvB,MAAM,CACP,CAAC;QACF,IAAI,KAAgC,CAAC;QACrC,IAAI,CAAC;YACH,KAAK,GAAG,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC/B,UAAU,EAAE,CAAC;QAEb,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,oBAAoB,CAC3C,WAAW,CAAC,mBAAmB,EAC/B,WAAW,CAAC,mBAAmB,EAC/B,IAAI,CAAC,IAAI,CACV,CAAC;QACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,IAAI,CACtC,gBAAgB,CAAC,MAAM,EACvB,gBAAgB,CAAC,MAAM,EACvB,MAAM,CACP,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;gBACxB,KAAK;gBACL,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;aAC5E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CACH,CAAC;IAEF,IACE,oBAAoB,CAAC,IAAI,CACvB,WAAW,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,SAAU,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAC/E,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IACnF,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,GAAG,uBAAuB,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACpF,MAAM,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CACxD,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EACtC,CAAC,CACF,CAAC;IACF,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAC3D,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,EAC9D,CAAC,CACF,CAAC;IACF,OAAO;QACL,SAAS;QACT,aAAa;QACb,UAAU;QACV,cAAc;QACd,iBAAiB;QACjB,cAAc;KACf,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,wBAAwB,CACtC,QAAkB,EAClB,mBAAwC,EACxC,IAA4B;IAE5B,MAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,KAAK,MAAM,WAAW,IAAI,uBAAuB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACjF,MAAM,cAAc,GAAG,WAAW,CAAC,SAAU,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAC/F,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,MAAM,oBAAoB,GAAG,MAAM,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,oBAAoB;gBAC5B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,oBAAoB,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAC/E,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,oBAAoB,GAAG,SAAS,CAAC,MAAM;aAC3E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,KAAiB,EAAE,QAAgB;IACnE,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,QAAe,CAAC,CAAC;IACtD,IACE,WAAW,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,EAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACnE,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACvD,MAAM,WAAW,GACf,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,oBAAoB,CAAC;QAC3D,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAC7B,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC;YAC3C,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC;YACpC,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;YAClC,MAAM,GAAG,CAAC;YACV,oBAAoB,IAAI,CAAC;YACzB,aAAa,GAAG,CAAC;YACjB,WAAW,IAAI,aAAa;YAC5B,WAAW,GAAG,QAAQ,EACtB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,EAAC,MAAM,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,SAAS,qBAAqB,CAC5B,SAA2B,EAC3B,OAAoD,EACpD,QAAgB;IAEhB,IAAI,SAAS,CAAC,EAAE,KAAK,KAAK,IAAI,SAAS,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,MAAqC,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,GAAsB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACpE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,SAGE,CAAC;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IACE,yBAAyB,CACvB,aAAa,EACb,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CACtC,EACD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,4FAA4F;AAC5F,SAAS,iBAAiB,CACxB,KAAiB,EACjB,KAAyC,EACzC,KAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,QAAe,CAAC,CAAC;IACtD,IACE,WAAW,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC9C,WAAW,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC9C,WAAW,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC9C,CAAC,WAAW,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAC1F,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,GAAG,EAAE,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,gCAAgC,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QAC9E,GAAG,EAAE,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,gCAAgC,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QAC9E,SAAS,EACP,WAAW,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,SAAS;YAChD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;gBACjC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,aAAa;gBAC/D,CAAC,CAAC,SAAS;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,gCAAgC,CAAC,KAAiB,EAAE,KAAmB;IACrF,IAAI,cAAuB,CAAC;IAC5B,QAAQ,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5B,KAAK,SAAS;YACZ,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,OAAO;YACV,cAAc;gBACZ,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM;QACR,KAAK,OAAO;YACV,cAAc;gBACZ,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM;QACR,KAAK,OAAO;YACV,cAAc,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,QAAQ;YACX,cAAc,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM;QACR,KAAK,OAAO,CAAC;QACb,KAAK,YAAY,CAAC;QAClB,KAAK,sBAAsB;YACzB,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM;QACR;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,aAAa,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AAC/F,CAAC;AAED,6FAA6F;AAC7F,SAAS,uBAAuB,CAC9B,QAAkB,EAClB,mBAAwC;IAExC,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;QAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC;QACnD,OAAO,OAAO,CACZ,IAAI;YACF,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC;gBAC/B,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6FAA6F;AAC7F,SAAS,uBAAuB,CAC9B,MAAqB,EACrB,YAAoC;IAEpC,OAAO,CACL,YAAY,CAAC,MAAM,GAAG,CAAC;QACvB,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;YAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC;YACnD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,iBAAiB,GAAG,WAAW,CAAC,SAAU,CAAC,SAAS,CAAC,IAAI,CAC7D,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,KAAK,QAAQ,CAAC,cAAc,CAC3F,CAAC;YACF,MAAM,oBAAoB,GAAG,MAAM,CAAC,WAAW,CAAC,SAAU,CAAC,sBAAsB,CAAC,CAAC;YACnF,OAAO,CACL,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBACvB,KAAK,CAAC,cAAc,KAAK,UAAU;gBACnC,KAAK,CAAC,SAAS,KAAK,CAAC;gBACrB,CAAC,CAAC,iBAAiB;oBACjB,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAC5E,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAClC,WAA+C,EAC/C,WAA+B,EAC/B,QAAgB;IAEhB,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACnC,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QAC7B,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;QAClC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC/B,MAAM,GAAG,CAAC;QACV,WAAW,IAAI,CAAC;QAChB,QAAQ,GAAG,CAAC;QACZ,MAAM,GAAG,QAAQ,GAAG,WAAW,EAC/B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAC,CAAC;AACvC,CAAC;AAED,mGAAmG;AACnG,SAAS,uBAAuB,CAC9B,MAAkC,EAClC,aAAmC,EACnC,QAAgB;IAEhB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAClC,IAAI,OAAO,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;QACzB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,OAAO,EAAE,CAAC;YACf,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAC9B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAC7E,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;oBACxB,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;gBACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBACnF,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;oBACnD,OAAO,GAAG,EAAC,KAAK,EAAE,GAAG,EAAC,CAAC;oBACvB,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,sEAAsE;AACtE,SAAS,kBAAkB,CACzB,IAAmC,EACnC,KAAoC;IAEpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAChD,SAAS,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACN,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wCAAwC;AACxC,SAAS,cAAc,CACrB,IAAgC,EAChC,KAAiC;IAEjC,OAAO,cAAc,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,mEAAmE;AACnE,SAAS,cAAc,CAAC,MAAkC;IACxD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAC7B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAClE,CAAC;IACF,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,QAAQ,IAAI,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAC,GAAG,KAAK,EAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0DAA0D;AAC1D,SAAS,gBAAgB,CAAC,MAAkC;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,uEAAuE;AACvE,SAAS,kBAAkB,CACzB,KAAyC,EACzC,MAAkC;IAElC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CACvF,CAAC,MAAM,CAAC;AACX,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe,CACtB,MAAmD;IAEnD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7E,MAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACxC,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAC,GAAG,KAAK,EAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"parquet-page-index.js","sourceRoot":"","sources":["../../src/lib/parquet-page-index.ts"],"names":[],"mappings":"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"}
|