Repository navigation
Conversation
Plan only, no implementation. Deletes ensure_result and points its consumers at cached_result_expr, leaving xorq's baked .cache() snapshot as the single materialised copy. Captures the decisions from a grilling pass (scope, pandas/polars drop, inspector repoint, cache-lab migration, salt-branch removal). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Review of the inspector repoint and test plan surfaced six fixes: filter the cache inspector to entries with cache_bytes set (cheap entries would otherwise list as undeletable 0-byte rows); coerce row_count to a non-null int (CacheEntry contract is number, frontend calls .toLocaleString() unguarded); reformat created_at to the existing %Y-%m-%d %H:%M:%S; add test_paths.py to the cleanup (module-level imports of the deleted symbols break collection); drop the now-unused pyarrow guard import in post_processing; and enumerate the full stale-copy surface. Core approach (salt branch deletion, no download route, three consumer conversions) verified correct against the code. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t-parquet refactor(cache): remove the on-demand result.parquet layer, rely on xorq .cache() (#101)
Review: plan to remove the on-demand
|
|
Closing unmerged. The implementation landed in #104, which also unwound #102 and corrected three of this plan's prescriptions during implementation. Rather than merge a plan that no longer matches reality, I've rewritten it as an as-built record in #108 (supersedes this). The forward-looking plan served its purpose; #104's PR body + #108 are the durable record. |
Plan only — no implementation, no tests. Adds
plans/remove-ondemand-result-parquet.md.What
#73 stopped writing
result.parquetat build time but keptensure_resultto regenerate it lazily; #71/#90 moved the viewer and paginated reads ontocached_result_expr. This plan finishes that arc: delete the on-demandresult.parquetlayer entirely and let xorq's baked.cache()snapshot (already produced byrewrite_for_buildfor expensive entries) be the single materialised copy. Cheap entries recompute on read, as today.The core of the work is deleting
ensure_resultand pointing its three real consumers atcached_result_expr:post_processing→cached_result_expr(...).execute()instead ofpq.read_table(ensure_result(...))companion/diff.build_diff_expr→cached_result_exprdirectly (drops a double-materialisation)xorq/diff.full_diff→ drop the now-dead_ensure_entry_parquetfallback (all live callers already pass exprs)Plus removing the path plumbing (
ENTRY_RESULT_FILENAME,entry_result_path, the manifestresult_pathfield), repointing the cache-admin surfaces at the baked snapshot, and migrating the cache-lab benchmark off the materialised parquet.Decisions (resolved in a grilling pass)
result.parquetlayer.full_diffbackends — xorq-only (every live caller passes exprs)./api/result_cacheinspector + delete at the baked snapshot; the inspector readsmanifest.cache_bytes(perf/caching: log the cache admission decision — structural cache_worthy verdict + measured value-per-byte (compile_seconds, bytes) side by side — so the #30 flip is data-driven #87), so theCacheEntryJSON contract and the frontend are untouched.test_cache_lab.py) ontocached_result_expr;view_timingsbecomes snapshot cold-vs-warm.Context
Builds on #73 (drop blanket
result.parquet), #71/#90 (read path ontocached_result_expr), and #87 (manifestcache_bytes, reused by the repointed inspector). Implementation will follow in a separate PR under the repo's TDD split — failing-tests commit first (post-processing / promote-diff /full_diffasserting noresult.parquetis written), watched red on CI, then the fixes.🤖 Generated with Claude Code