Skip to content

Commit 7ca725a

Browse files
committed
fix: local-executor explain() now reports fragment-level pruning stats
Previously always reported fragmentsScanned = total fragments. Now computes fragmentsSkipped via canSkipFragment, matching query-do's explain behavior. Also imports canSkipFragment from decode.js.
1 parent 29ad441 commit 7ca725a

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/local-executor.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { AppendResult, ColumnMeta, DataType, DiffResult, ExplainResult, Pag
1010
import { parseFooter, parseColumnMetaFromProtobuf, FOOTER_SIZE } from "./footer.js";
1111
import { parseManifest } from "./manifest.js";
1212
import { detectFormat, getParquetFooterLength, parseParquetFooter, parquetMetaToTableMeta } from "./parquet.js";
13-
import { assembleRows } from "./decode.js";
13+
import { assembleRows, canSkipFragment } from "./decode.js";
1414
import { coalesceRanges, autoCoalesceGap } from "./coalesce.js";
1515
import { instantiateWasm, type WasmEngine } from "./wasm-engine.js";
1616

@@ -266,6 +266,16 @@ export class LocalExecutor implements QueryExecutor {
266266
// Detect format from file
267267
const format = await this.detectFileFormat(query.table);
268268

269+
// Fragment-level pruning stats
270+
const dataset = this.datasetCache.get(query.table);
271+
const totalFragments = dataset ? dataset.fragmentMetas.size : 1;
272+
let fragmentsSkipped = 0;
273+
if (dataset) {
274+
for (const fragMeta of dataset.fragmentMetas.values()) {
275+
if (canSkipFragment(fragMeta, query.filters, query.filterGroups)) fragmentsSkipped++;
276+
}
277+
}
278+
269279
return {
270280
table: query.table,
271281
format,
@@ -277,8 +287,9 @@ export class LocalExecutor implements QueryExecutor {
277287
estimatedBytes,
278288
estimatedR2Reads: coalesced.length,
279289
estimatedRows,
280-
fragments: this.datasetCache.get(query.table)?.fragmentMetas.size ?? 1,
281-
fragmentsScanned: this.datasetCache.get(query.table)?.fragmentMetas.size ?? 1,
290+
fragments: totalFragments,
291+
fragmentsSkipped,
292+
fragmentsScanned: totalFragments - fragmentsSkipped,
282293
fanOut: false,
283294
filters: [
284295
...query.filters.map(f => ({ column: f.column, op: f.op, pushable: true })),

0 commit comments

Comments
 (0)