@loaders.gl/scan 5.0.0-alpha.3 → 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/dist/hudi.d.ts CHANGED
@@ -3,9 +3,13 @@ import { DataSource } from '@loaders.gl/loader-utils';
3
3
  import type { ParquetDatasetBatch, ParquetDatasetExplain, ParquetDatasetReadOptions, ParquetPredicate, ParquetDatasetSourceOptions } from '@loaders.gl/parquet/parquet-source-types';
4
4
  /** A physical Parquet base file recorded by a Hudi snapshot descriptor. */
5
5
  export type HudiBaseFile = Readonly<{
6
+ /** Path or URL of the Parquet base file. */
6
7
  path: string;
8
+ /** Compressed file size in bytes, when recorded by the descriptor. */
7
9
  size?: number;
10
+ /** Number of records in the base file, when recorded by the descriptor. */
8
11
  numRecords?: number;
12
+ /** Partition column values associated with the base file. */
9
13
  partitionValues?: Readonly<Record<string, unknown>>;
10
14
  }>;
11
15
  /** Minimal, portable descriptor used by the Hudi proof of concept. */
@@ -1 +1 @@
1
- {"version":3,"file":"hudi.d.ts","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAA0B,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAG7E,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAElD,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,SAAS,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,2BAA2B,GAAG;IAC5D,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC;CACH,CAAC;AAEF,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAExD;;;;;GAKG;AACH,qBAAa,eACX,SAAQ,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE,iBAAiB,CACnD,YACE,eAAe,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EACtD,oBAAoB,CAAC,gBAAgB,CAAC;IAExC,OAAO,CAAC,iBAAiB,CAAgD;IAEzE,oEAAoE;gBACxD,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,EAAE,OAAO;IAInF,uDAAuD;IACjD,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAU1E,+EAA+E;IACzE,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAmBvF,2EAA2E;IACrE,gBAAgB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsB1F,sEAAsE;IAChE,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIhF,4EAA4E;IAC5E,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IAIvE,uDAAuD;IACvD,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;YAIzD,cAAc;IA6B5B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,eAAe;CAKxB"}
1
+ {"version":3,"file":"hudi.d.ts","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAA0B,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAG7E,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAElD,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,SAAS,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,2BAA2B,GAAG;IAC5D,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC;CACH,CAAC;AAEF,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAExD;;;;;GAKG;AACH,qBAAa,eACX,SAAQ,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE,iBAAiB,CACnD,YACE,eAAe,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EACtD,oBAAoB,CAAC,gBAAgB,CAAC;IAExC,OAAO,CAAC,iBAAiB,CAAgD;IAEzE,oEAAoE;gBACxD,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,EAAE,OAAO;IAInF,uDAAuD;IACjD,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAU1E,+EAA+E;IACzE,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAmBvF,2EAA2E;IACrE,gBAAgB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsB1F,sEAAsE;IAChE,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIhF,4EAA4E;IAC5E,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IAIvE,uDAAuD;IACvD,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAAC,mBAAmB,CAAC;YAIzD,cAAc;IA4D5B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,eAAe;CAKxB"}
package/dist/hudi.js CHANGED
@@ -75,7 +75,7 @@ export class HudiTableSource extends DataSource {
75
75
  }
76
76
  async loadDescriptor(signal) {
77
77
  const text = typeof this.data === 'string'
78
- ? await (await this.fetch(this.data, { headers: this.options.hudi?.headers, signal })).text()
78
+ ? await (await this.fetch(this.url, { headers: this.options.hudi?.headers, signal })).text()
79
79
  : await this.data.text();
80
80
  let descriptor;
81
81
  try {
@@ -90,6 +90,29 @@ export class HudiTableSource extends DataSource {
90
90
  if (!Array.isArray(files)) {
91
91
  throw new Error('Hudi snapshot descriptor must contain a files array');
92
92
  }
93
+ for (const [index, file] of files.entries()) {
94
+ if (!file || typeof file !== 'object' || Array.isArray(file)) {
95
+ throw new Error(`Hudi snapshot file at index ${index} must be an object`);
96
+ }
97
+ const value = file;
98
+ if (typeof value.path !== 'string' || !value.path) {
99
+ throw new Error(`Hudi snapshot file at index ${index} must contain a non-empty string path`);
100
+ }
101
+ if (value.size !== undefined &&
102
+ (typeof value.size !== 'number' || !Number.isFinite(value.size))) {
103
+ throw new Error(`Hudi snapshot file at index ${index} size must be a finite number`);
104
+ }
105
+ if (value.numRecords !== undefined &&
106
+ (typeof value.numRecords !== 'number' || !Number.isFinite(value.numRecords))) {
107
+ throw new Error(`Hudi snapshot file at index ${index} numRecords must be a finite number`);
108
+ }
109
+ if (value.partitionValues !== undefined &&
110
+ (!value.partitionValues ||
111
+ typeof value.partitionValues !== 'object' ||
112
+ Array.isArray(value.partitionValues))) {
113
+ throw new Error(`Hudi snapshot file at index ${index} partitionValues must be an object`);
114
+ }
115
+ }
93
116
  const value = descriptor;
94
117
  if (value.tableType &&
95
118
  value.tableType !== 'COPY_ON_WRITE' &&
package/dist/hudi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hudi.js","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hudi.js","sourceRoot":"","sources":["../src/hudi.ts"],"names":[],"mappings":"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"}
package/dist/iceberg.cjs CHANGED
@@ -21102,6 +21102,201 @@ var init_decoders = __esm({
21102
21102
  }
21103
21103
  });
21104
21104
 
21105
+ // ../parquet/src/parquetjs/parser/encoded-pages.ts
21106
+ async function scanParquetEncodedPages(buffer, context) {
21107
+ const pages = [];
21108
+ let offset = 0;
21109
+ let dataPageOrdinal = 0;
21110
+ while (offset < buffer.byteLength) {
21111
+ const { pageHeader, length: headerByteLength } = decodePageHeader(buffer, offset);
21112
+ const bodyOffset = offset + headerByteLength;
21113
+ const bodyEnd = bodyOffset + pageHeader.compressed_page_size;
21114
+ if (pageHeader.compressed_page_size < 0 || pageHeader.uncompressed_page_size < 0 || bodyEnd > buffer.byteLength) {
21115
+ throw new Error("Parquet page extends beyond the available column-chunk buffer");
21116
+ }
21117
+ const compressedBody = buffer.subarray(bodyOffset, bodyEnd);
21118
+ verifyEncodedPageChecksum(compressedBody, pageHeader, context.verifyPageChecksums);
21119
+ const pageType = getThriftEnum(PageType, pageHeader.type);
21120
+ if (pageType === "DICTIONARY_PAGE") {
21121
+ pages.push(await createDictionaryPage(compressedBody, pageHeader, context));
21122
+ } else if (pageType === "DATA_PAGE") {
21123
+ pages.push(await createDataPageV1(compressedBody, pageHeader, context, dataPageOrdinal++));
21124
+ } else if (pageType === "DATA_PAGE_V2") {
21125
+ pages.push(await createDataPageV2(compressedBody, pageHeader, context, dataPageOrdinal++));
21126
+ } else {
21127
+ throw new Error(`Unsupported Parquet page type ${pageType}`);
21128
+ }
21129
+ offset = bodyEnd;
21130
+ }
21131
+ return pages;
21132
+ }
21133
+ async function createDictionaryPage(compressedBody, pageHeader, context) {
21134
+ const dictionaryHeader = pageHeader.dictionary_page_header;
21135
+ if (!dictionaryHeader) {
21136
+ throw new Error("Parquet dictionary page is missing its dictionary header");
21137
+ }
21138
+ const preserveCompression = shouldPreserveCompression(context);
21139
+ const data = preserveCompression ? compressedBody : await decompressPageBody(compressedBody, pageHeader.uncompressed_page_size, context);
21140
+ return Object.freeze({
21141
+ type: "dictionary",
21142
+ pageOrdinal: -1,
21143
+ encoding: getThriftEnum(Encoding, dictionaryHeader.encoding),
21144
+ compression: context.compression,
21145
+ compressionState: preserveCompression ? "compressed" : "decompressed",
21146
+ valueCount: dictionaryHeader.num_values,
21147
+ nonNullValueCount: dictionaryHeader.num_values,
21148
+ data,
21149
+ values: preserveCompression ? void 0 : createSection(0, data.byteLength),
21150
+ compressedByteLength: pageHeader.compressed_page_size,
21151
+ uncompressedByteLength: pageHeader.uncompressed_page_size
21152
+ });
21153
+ }
21154
+ async function createDataPageV1(compressedBody, pageHeader, context, pageOrdinal) {
21155
+ const dataHeader = pageHeader.data_page_header;
21156
+ if (!dataHeader) {
21157
+ throw new Error("Parquet V1 data page is missing its data header");
21158
+ }
21159
+ const preserveCompression = shouldPreserveCompression(context);
21160
+ const data = preserveCompression ? compressedBody : await decompressPageBody(compressedBody, pageHeader.uncompressed_page_size, context);
21161
+ let repetitionLevels;
21162
+ let definitionLevels;
21163
+ let values;
21164
+ if (!preserveCompression) {
21165
+ let sectionOffset = 0;
21166
+ const repetitionLevelEncoding = getThriftEnum(Encoding, dataHeader.repetition_level_encoding);
21167
+ repetitionLevels = readV1LevelSection(
21168
+ data,
21169
+ sectionOffset,
21170
+ dataHeader.num_values,
21171
+ context.column.rLevelMax,
21172
+ repetitionLevelEncoding
21173
+ );
21174
+ sectionOffset = repetitionLevels.byteOffset + repetitionLevels.byteLength;
21175
+ const definitionLevelEncoding = getThriftEnum(Encoding, dataHeader.definition_level_encoding);
21176
+ definitionLevels = readV1LevelSection(
21177
+ data,
21178
+ sectionOffset,
21179
+ dataHeader.num_values,
21180
+ context.column.dLevelMax,
21181
+ definitionLevelEncoding
21182
+ );
21183
+ sectionOffset = definitionLevels.byteOffset + definitionLevels.byteLength;
21184
+ values = createSection(sectionOffset, data.byteLength - sectionOffset);
21185
+ }
21186
+ return Object.freeze({
21187
+ type: "data-v1",
21188
+ pageOrdinal,
21189
+ encoding: getThriftEnum(Encoding, dataHeader.encoding),
21190
+ repetitionLevelEncoding: getThriftEnum(Encoding, dataHeader.repetition_level_encoding),
21191
+ definitionLevelEncoding: getThriftEnum(Encoding, dataHeader.definition_level_encoding),
21192
+ compression: context.compression,
21193
+ compressionState: preserveCompression ? "compressed" : "decompressed",
21194
+ valueCount: dataHeader.num_values,
21195
+ data,
21196
+ repetitionLevels,
21197
+ definitionLevels,
21198
+ values,
21199
+ compressedByteLength: pageHeader.compressed_page_size,
21200
+ uncompressedByteLength: pageHeader.uncompressed_page_size
21201
+ });
21202
+ }
21203
+ async function createDataPageV2(compressedBody, pageHeader, context, pageOrdinal) {
21204
+ const dataHeader = pageHeader.data_page_header_v2;
21205
+ if (!dataHeader) {
21206
+ throw new Error("Parquet V2 data page is missing its data header");
21207
+ }
21208
+ const repetitionByteLength = dataHeader.repetition_levels_byte_length;
21209
+ const definitionByteLength = dataHeader.definition_levels_byte_length;
21210
+ const levelsByteLength = repetitionByteLength + definitionByteLength;
21211
+ if (levelsByteLength > compressedBody.byteLength) {
21212
+ throw new Error("Parquet V2 level sections extend beyond the page body");
21213
+ }
21214
+ const valuesAreCompressed = dataHeader.is_compressed !== false && context.compression !== "UNCOMPRESSED";
21215
+ const preserveCompression = valuesAreCompressed && shouldPreserveCompression(context);
21216
+ let data = compressedBody;
21217
+ if (valuesAreCompressed && !preserveCompression) {
21218
+ const uncompressedValuesByteLength = pageHeader.uncompressed_page_size - levelsByteLength;
21219
+ if (uncompressedValuesByteLength < 0) {
21220
+ throw new Error("Invalid Parquet V2 uncompressed value length");
21221
+ }
21222
+ const values = await context.decompressPage(
21223
+ compressedBody.subarray(levelsByteLength),
21224
+ uncompressedValuesByteLength
21225
+ );
21226
+ data = new Uint8Array(levelsByteLength + values.byteLength);
21227
+ data.set(compressedBody.subarray(0, levelsByteLength));
21228
+ data.set(values, levelsByteLength);
21229
+ }
21230
+ return Object.freeze({
21231
+ type: "data-v2",
21232
+ pageOrdinal,
21233
+ encoding: getThriftEnum(Encoding, dataHeader.encoding),
21234
+ repetitionLevelEncoding: "RLE",
21235
+ definitionLevelEncoding: "RLE",
21236
+ compression: context.compression,
21237
+ compressionState: preserveCompression ? "compressed" : "decompressed",
21238
+ valueCount: dataHeader.num_values,
21239
+ nonNullValueCount: dataHeader.num_values - dataHeader.num_nulls,
21240
+ data,
21241
+ repetitionLevels: createSection(0, repetitionByteLength),
21242
+ definitionLevels: createSection(repetitionByteLength, definitionByteLength),
21243
+ values: createSection(levelsByteLength, data.byteLength - levelsByteLength),
21244
+ compressedByteLength: pageHeader.compressed_page_size,
21245
+ uncompressedByteLength: pageHeader.uncompressed_page_size
21246
+ });
21247
+ }
21248
+ function shouldPreserveCompression(context) {
21249
+ var _a;
21250
+ return context.compression !== "UNCOMPRESSED" && Boolean((_a = context.preserveCompression) == null ? void 0 : _a.has(context.compression));
21251
+ }
21252
+ async function decompressPageBody(compressedBody, uncompressedByteLength, context) {
21253
+ if (context.compression === "UNCOMPRESSED") return compressedBody;
21254
+ return await context.decompressPage(compressedBody, uncompressedByteLength);
21255
+ }
21256
+ function readV1LevelSection(data, offset, valueCount, maxLevel, encoding) {
21257
+ if (maxLevel === 0) return createSection(offset, 0);
21258
+ if (encoding === "RLE") {
21259
+ if (offset + 4 > data.byteLength) {
21260
+ throw new Error("Parquet V1 RLE level stream is missing its length prefix");
21261
+ }
21262
+ const byteLength = readUInt32LE(data, offset);
21263
+ const byteOffset = offset + 4;
21264
+ assertSectionBounds(data, byteOffset, byteLength);
21265
+ return createSection(byteOffset, byteLength);
21266
+ }
21267
+ if (encoding === "BIT_PACKED") {
21268
+ const byteLength = Math.ceil(valueCount / 8) * getBitWidth(maxLevel);
21269
+ assertSectionBounds(data, offset, byteLength);
21270
+ return createSection(offset, byteLength);
21271
+ }
21272
+ throw new Error(`Unsupported Parquet V1 level encoding ${encoding}`);
21273
+ }
21274
+ function createSection(byteOffset, byteLength) {
21275
+ return Object.freeze({ byteOffset, byteLength });
21276
+ }
21277
+ function assertSectionBounds(data, byteOffset, byteLength) {
21278
+ if (byteOffset < 0 || byteLength < 0 || byteOffset + byteLength > data.byteLength) {
21279
+ throw new Error("Parquet page section extends beyond the page body");
21280
+ }
21281
+ }
21282
+ function verifyEncodedPageChecksum(compressedBody, pageHeader, verifyPageChecksums = false) {
21283
+ if (!verifyPageChecksums || pageHeader.crc === void 0) return;
21284
+ const expected = pageHeader.crc >>> 0;
21285
+ const actual = crc322(compressedBody);
21286
+ if (actual !== expected) {
21287
+ throw new Error(`Parquet page checksum mismatch: expected ${expected}, calculated ${actual}`);
21288
+ }
21289
+ }
21290
+ var init_encoded_pages = __esm({
21291
+ "../parquet/src/parquetjs/parser/encoded-pages.ts"() {
21292
+ "use strict";
21293
+ init_parquet_thrift();
21294
+ init_crc32();
21295
+ init_binary_utils();
21296
+ init_read_utils();
21297
+ }
21298
+ });
21299
+
21105
21300
  // ../parquet/src/lib/parquet-encryption.ts
21106
21301
  function readParquetEncryptedModule(buffer, offset = 0) {
21107
21302
  if (offset + 4 > buffer.length) {
@@ -21344,6 +21539,7 @@ var init_parquet_reader = __esm({
21344
21539
  "use strict";
21345
21540
  init_schema();
21346
21541
  init_decoders();
21542
+ init_encoded_pages();
21347
21543
  init_shred();
21348
21544
  init_compression2();
21349
21545
  init_constants();
@@ -21830,6 +22026,50 @@ var init_parquet_reader = __esm({
21830
22026
  columnData: Object.fromEntries(columnEntries)
21831
22027
  };
21832
22028
  }
22029
+ /**
22030
+ * Reads selected column chunks as encoded page descriptors without materializing values.
22031
+ *
22032
+ * Page headers, encryption, checksums, and optional decompression remain reader concerns. Value,
22033
+ * dictionary, and level decoding is deliberately left to the downstream consumer.
22034
+ */
22035
+ async readRowGroupEncodedPages(schema, rowGroup, columnList, preserveCompression, signal, rowGroupOrdinal = 0) {
22036
+ await this.resolveColumnMetadata(rowGroup, rowGroupOrdinal, columnList);
22037
+ const selectedColumnChunks = [];
22038
+ for (let columnOrdinal = 0; columnOrdinal < rowGroup.columns.length; columnOrdinal++) {
22039
+ const columnChunk = rowGroup.columns[columnOrdinal];
22040
+ const path = getColumnChunkPath(columnChunk);
22041
+ if (columnList.length > 0 && (!path || fieldIndexOf(columnList, path) < 0)) continue;
22042
+ const physicalColumnOrdinal = getPhysicalColumnOrdinal(columnChunk, columnOrdinal);
22043
+ const metadata = columnChunk.meta_data || await this.getColumnMetadata(columnChunk, rowGroupOrdinal, physicalColumnOrdinal);
22044
+ if (columnList.length === 0 || fieldIndexOf(columnList, metadata.path_in_schema) >= 0) {
22045
+ selectedColumnChunks.push({
22046
+ columnChunk,
22047
+ metadata,
22048
+ columnOrdinal: physicalColumnOrdinal
22049
+ });
22050
+ }
22051
+ }
22052
+ const columns = [];
22053
+ for (let batchStart = 0; batchStart < selectedColumnChunks.length; batchStart += MAXIMUM_CONCURRENT_COLUMN_READS) {
22054
+ columns.push(
22055
+ ...await Promise.all(
22056
+ selectedColumnChunks.slice(batchStart, batchStart + MAXIMUM_CONCURRENT_COLUMN_READS).map(async ({ columnChunk, metadata, columnOrdinal }) => {
22057
+ const encodedColumn = await this.readColumnChunkEncodedPages(
22058
+ schema,
22059
+ columnChunk,
22060
+ preserveCompression,
22061
+ signal,
22062
+ rowGroupOrdinal,
22063
+ columnOrdinal,
22064
+ metadata
22065
+ );
22066
+ return encodedColumn;
22067
+ })
22068
+ )
22069
+ );
22070
+ }
22071
+ return Object.freeze(columns);
22072
+ }
21833
22073
  /** Reads independently materializable non-repeated columns for one row range using page indexes. */
21834
22074
  async readRowGroupRange(schema, rowGroup, columnList, rowRange, pageLocations, signal, rowGroupOrdinal = 0) {
21835
22075
  await this.resolveColumnMetadata(rowGroup, rowGroupOrdinal, columnList);
@@ -22022,6 +22262,99 @@ var init_parquet_reader = __esm({
22022
22262
  ) : chunkBuffer.subarray(pagesRelativeOffset, pagesRelativeOffset + pagesSize);
22023
22263
  return await decodeDataPages(pagesBuf, { ...context, dictionary });
22024
22264
  }
22265
+ /** Reads one column chunk as encoded dictionaries, levels, and values for deferred decoding. */
22266
+ async readColumnChunkEncodedPages(schema, columnChunk, preserveCompression, signal, rowGroupOrdinal = 0, columnOrdinal = 0, resolvedMetadata) {
22267
+ if (columnChunk.file_path !== void 0 && columnChunk.file_path !== null) {
22268
+ throw new Error("external references are not supported");
22269
+ }
22270
+ const metadata = resolvedMetadata || columnChunk.meta_data;
22271
+ if (!metadata) throw new Error("Parquet column metadata is missing");
22272
+ const field = schema.findField(metadata.path_in_schema);
22273
+ const physicalType = getThriftEnum(Type, metadata.type);
22274
+ if (physicalType !== field.primitiveType) {
22275
+ throw new Error(`chunk type not matching schema: ${physicalType}`);
22276
+ }
22277
+ const compression = getThriftEnum(CompressionCodec, metadata.codec);
22278
+ const dataPageOffset = Number(metadata.data_page_offset);
22279
+ const dictionaryPageOffset = metadata.dictionary_page_offset;
22280
+ const validDictionaryPageOffset = dictionaryPageOffset !== void 0 && Number(dictionaryPageOffset) > 0 ? Number(dictionaryPageOffset) : void 0;
22281
+ const chunkOffset = Math.min(dataPageOffset, validDictionaryPageOffset ?? dataPageOffset);
22282
+ const chunkEnd = chunkOffset + Number(metadata.total_compressed_size);
22283
+ const chunkByteLength = Math.min(
22284
+ this.file.size - chunkOffset,
22285
+ Math.max(0, chunkEnd - chunkOffset)
22286
+ );
22287
+ const chunkBuffer = await this.readBytes(chunkOffset, chunkByteLength, signal);
22288
+ const dataPageRelativeOffset = dataPageOffset - chunkOffset;
22289
+ const dataPageByteLength = Math.min(
22290
+ chunkBuffer.byteLength - dataPageRelativeOffset,
22291
+ Math.max(0, chunkEnd - dataPageOffset)
22292
+ );
22293
+ const context = {
22294
+ column: field,
22295
+ compression,
22296
+ decompressPage: this.getPageDecompressor(compression),
22297
+ preserveCompression,
22298
+ verifyPageChecksums: this.props.verifyPageChecksums
22299
+ };
22300
+ let dictionary;
22301
+ if (validDictionaryPageOffset !== void 0) {
22302
+ const dictionaryRelativeOffset = validDictionaryPageOffset - chunkOffset;
22303
+ const dictionaryByteLength = Math.min(
22304
+ Math.max(0, dataPageOffset - validDictionaryPageOffset),
22305
+ chunkBuffer.byteLength - dictionaryRelativeOffset,
22306
+ this.props.defaultDictionarySize
22307
+ );
22308
+ const dictionaryBuffer = chunkBuffer.subarray(
22309
+ dictionaryRelativeOffset,
22310
+ dictionaryRelativeOffset + dictionaryByteLength
22311
+ );
22312
+ const plaintextDictionaryBuffer = columnChunk.crypto_metadata ? await this.decryptColumnPages(
22313
+ dictionaryBuffer,
22314
+ {
22315
+ type: physicalType,
22316
+ rLevelMax: field.rLevelMax,
22317
+ dLevelMax: field.dLevelMax,
22318
+ compression,
22319
+ column: field
22320
+ },
22321
+ rowGroupOrdinal,
22322
+ columnOrdinal,
22323
+ this.getColumnKeyMetadata(columnChunk),
22324
+ true
22325
+ ) : dictionaryBuffer;
22326
+ dictionary = (await scanParquetEncodedPages(plaintextDictionaryBuffer, context))[0];
22327
+ }
22328
+ const dataPageBuffer = chunkBuffer.subarray(
22329
+ dataPageRelativeOffset,
22330
+ dataPageRelativeOffset + dataPageByteLength
22331
+ );
22332
+ const plaintextDataPageBuffer = columnChunk.crypto_metadata ? await this.decryptColumnPages(
22333
+ dataPageBuffer,
22334
+ {
22335
+ type: physicalType,
22336
+ rLevelMax: field.rLevelMax,
22337
+ dLevelMax: field.dLevelMax,
22338
+ compression,
22339
+ column: field
22340
+ },
22341
+ rowGroupOrdinal,
22342
+ columnOrdinal,
22343
+ this.getColumnKeyMetadata(columnChunk)
22344
+ ) : dataPageBuffer;
22345
+ const pages = await scanParquetEncodedPages(plaintextDataPageBuffer, context);
22346
+ return Object.freeze({
22347
+ path: Object.freeze([...metadata.path_in_schema]),
22348
+ physicalType,
22349
+ typeLength: field.typeLength,
22350
+ maxRepetitionLevel: field.rLevelMax,
22351
+ maxDefinitionLevel: field.dLevelMax,
22352
+ compression,
22353
+ valueCount: Number(metadata.num_values),
22354
+ dictionary,
22355
+ pages: Object.freeze(pages)
22356
+ });
22357
+ }
22025
22358
  /** Decrypts the length-prefixed page header and data modules in one column chunk. */
22026
22359
  async decryptColumnPages(encryptedPages, context, rowGroupOrdinal, columnOrdinal, keyMetadata, includesDictionary = false, dataPageOrdinalStart = 0) {
22027
22360
  if (!this.encryptionContext || !this.props.keyRetriever) {
@@ -22845,6 +23178,7 @@ var init_parquet_source_loader = __esm({
22845
23178
  init_src6();
22846
23179
  init_src2();
22847
23180
  init_src4();
23181
+ init_src5();
22848
23182
  init_get_parquet_schema();
22849
23183
  init_geoparquet_covering();
22850
23184
  init_parquet_bloom_filter();
@@ -22998,6 +23332,73 @@ var init_parquet_source_loader = __esm({
22998
23332
  scan(options = {}) {
22999
23333
  return this.read(options);
23000
23334
  }
23335
+ /**
23336
+ * Reads candidate encoded pages without decoding values or constructing Arrow arrays.
23337
+ *
23338
+ * Footer statistics and Bloom filters prune complete row groups. Any exact predicate or spatial
23339
+ * filter is returned as residual work, and its hidden columns are included in the page batch.
23340
+ */
23341
+ async *readPages(options = {}) {
23342
+ const readOptions = this.getReadOptions({
23343
+ rowGroups: options.rowGroups,
23344
+ columns: options.columns,
23345
+ rowGroupFilter: options.rowGroupFilter,
23346
+ predicate: options.predicate,
23347
+ bbox: options.bbox,
23348
+ geometryColumn: options.geometryColumn,
23349
+ signal: options.signal
23350
+ });
23351
+ const readContext = createReadAbortContext(readOptions.signal);
23352
+ this.activeReadControllers.add(readContext.abortController);
23353
+ try {
23354
+ const initialization = await this.getInitialization(readContext.abortController.signal);
23355
+ await this.getCompressionInitialization();
23356
+ throwIfAborted2(readContext.abortController.signal);
23357
+ const physicalPlan = await this.planRowGroups(
23358
+ initialization,
23359
+ readOptions,
23360
+ readContext.abortController.signal
23361
+ );
23362
+ const projectedColumns = normalizeColumns(readOptions.columns, initialization.schema);
23363
+ const predicateColumns = physicalPlan.predicate ? getParquetPredicateColumns(physicalPlan.predicate) : [];
23364
+ const geoMetadata = readOptions.bbox ? getGeoMetadata(initialization.schema.metadata) : void 0;
23365
+ const geometryColumn = readOptions.bbox ? readOptions.geometryColumn || (geoMetadata == null ? void 0 : geoMetadata.primary_column) : void 0;
23366
+ const filterColumns = [
23367
+ .../* @__PURE__ */ new Set([...predicateColumns, ...geometryColumn ? [geometryColumn] : []])
23368
+ ];
23369
+ const decodedColumns = projectedColumns.length === 0 ? [] : [.../* @__PURE__ */ new Set([...projectedColumns, ...filterColumns])];
23370
+ const columnList = decodedColumns.map((column) => [column]);
23371
+ const preserveCompression = new Set(options.preserveCompression ?? []);
23372
+ const residualFilter = readOptions.predicate || readOptions.bbox ? Object.freeze({
23373
+ predicate: readOptions.predicate,
23374
+ bbox: readOptions.bbox,
23375
+ geometryColumn
23376
+ }) : void 0;
23377
+ for (const rowGroupIndex of physicalPlan.rowGroupIndices) {
23378
+ throwIfAborted2(readContext.abortController.signal);
23379
+ const columns = await initialization.reader.readRowGroupEncodedPages(
23380
+ initialization.parquetSchema,
23381
+ initialization.fileMetadata.row_groups[rowGroupIndex],
23382
+ columnList,
23383
+ preserveCompression,
23384
+ readContext.abortController.signal,
23385
+ rowGroupIndex
23386
+ );
23387
+ yield Object.freeze({
23388
+ shape: "parquet-encoded-pages",
23389
+ rowGroup: initialization.metadata.rowGroups[rowGroupIndex],
23390
+ projectedColumns: Object.freeze([...projectedColumns]),
23391
+ filterColumns: Object.freeze(filterColumns),
23392
+ columns,
23393
+ residualFilter
23394
+ });
23395
+ }
23396
+ } finally {
23397
+ readContext.abortController.abort();
23398
+ readContext.removeSignalListener();
23399
+ this.activeReadControllers.delete(readContext.abortController);
23400
+ }
23401
+ }
23001
23402
  /** Returns a copy of cumulative transport, decode, conversion, and pruning telemetry. */
23002
23403
  getTelemetry() {
23003
23404
  return Object.freeze({ ...this.telemetry });