mirror of
https://github.com/apache/superset.git
synced 2026-07-16 19:55:39 +00:00
Surfaced by the SQLAlchemy review (Warning #1) and required before T045's p95 perf budget can be met on dashboards with many historical dataset edits. Before: _decorate_records fired one COUNT(DISTINCT slice_id) query per related dataset record via _compute_impact → _count_dashboard_ charts_pointing_at_dataset_at_tx. For a dashboard activity stream with N dataset-edit records, that's N round-trips to compute impacts. After: _decorate_records collects the distinct (dataset_id, target_tx) pairs once via _collect_impact_pairs, fires a single batched query via _batch_chart_counts that pulls the (slice, dataset, validity- window) state for every relevant slice, and filters by validity in Python per pair. The result is a {(dataset_id, target_tx): count} mapping consumed by the new pure helper _impact_for_record per row. Round-trip count drops from O(N records) to O(1) for the impact calculation. The SQL stays small and dialect-portable — same per-kind IN-clause + Python validity filter pattern as _fetch_change_records. Trade-off documented in _batch_chart_counts' docstring: the SELECT pulls (slice_id, datasource_id, two validity-window pairs) for every slice ever on the dashboard whose dataset matches one of the requested dataset_ids. For a busy dashboard with 100 slices and 50 versions each, that's ~5000 rows into Python vs N small COUNT scans. For N > ~5 (which is typical) the batch wins. Removed: * _compute_impact (replaced by _impact_for_record + _collect_impact_pairs) * _count_dashboard_charts_pointing_at_dataset_at_tx (replaced by _batch_chart_counts) Test changes: the three _compute_impact unit tests (no-impact paths) become six _impact_for_record tests (positive count + four no-impact paths + zero-count → None). Five new _collect_impact_pairs tests cover dashboard/chart/dataset path branching plus dedupe and empty. Full suite: 27/27 integration + 65/65 unit (was 57; +8 from the restructure). No semantic regression on either side of the cut. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>