codeant-ai-for-open-source[bot] commented on code in PR #42088:
URL: https://github.com/apache/superset/pull/42088#discussion_r3590358071


##########
superset/migrations/shared/migrate_viz/processors.py:
##########
@@ -642,3 +644,225 @@ def process(base_query_object: dict[str, Any]) -> 
list[dict[str, Any]]:
             return [result]
 
         return build_query_context(self.data, process)
+
+
+def _get_table_chart_time_offsets(form_data: dict[str, Any]) -> list[Any]:
+    """
+    Resolve time_compare into the list of shifts buildQuery.ts sends as
+    time_offsets. table charts use a single-select time_compare control
+    whose choices include the special 'custom'/'inherit' shifts, which
+    resolve to start_date_offset/'inherit' rather than being used verbatim.
+    """
+    time_compare_shifts = ensure_is_array(form_data.get("time_compare"))
+    non_custom_or_inherit_shifts = [
+        shift for shift in time_compare_shifts if shift not in ("custom", 
"inherit")
+    ]
+    custom_or_inherit_shifts = [
+        shift for shift in time_compare_shifts if shift in ("custom", 
"inherit")
+    ]
+
+    time_offsets: list[Any] = list(non_custom_or_inherit_shifts)
+    if "custom" in custom_or_inherit_shifts:
+        time_offsets.append(form_data.get("start_date_offset"))
+    if "inherit" in custom_or_inherit_shifts:
+        time_offsets.append("inherit")
+    return time_offsets

Review Comment:
   **Suggestion:** Time-offset derivation ignores the 
`extra_form_data.time_compare` override path used by table buildQuery, so 
migrated query contexts can execute with a different shift than runtime 
behavior. Apply the same override precedence so dashboard-level time-compare 
overrides replace chart-level offsets. [api mismatch]
   
   <details>
   <summary><b>Severity Level:</b> Major ⚠️</summary>
   
   ```mdx
   ❌ Migrated table charts ignore dashboard override time comparison shifts.
   ⚠️ Stored query_context diverges from frontend time_compare behavior.
   ```
   </details>
   <details>
   <summary><b>Steps of Reproduction ✅ </b></summary>
   
   ```mdx
   1. Observe the runtime table buildQuery logic in
   `superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts:96-132`, 
where
   `timeOffsets` is first derived from `formData.time_compare` and then 
overridden when
   `extra_form_data.time_compare` is present: `if 
(extra_form_data?.time_compare &&
   !timeOffsets.includes(extra_form_data.time_compare)) { timeOffsets =
   [extra_form_data.time_compare]; }`, and similarly in AG Grid’s buildQuery at
   
`superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts:100-134`
 which
   unconditionally sets `timeOffsets = [extra_form_data.time_compare]` when the 
override
   exists.
   
   2. Configure a saved table slice whose JSON `params` include an 
`extra_form_data` object
   with a `time_compare` override (dashboard-level time comparison), distinct 
from the
   chart-level `time_compare` setting; this is a realistic configuration 
produced by
   dashboard filters and persisted in Slice.params, and extra_form_data 
precedence for other
   fields (like time_grain_sqla) is already mirrored in Python for pivot tables 
at
   `superset/migrations/shared/migrate_viz/processors.py:117-120`.
   
   3. Run `superset migrate_viz upgrade --viz_type table` as defined in
   `superset/cli/viz_migrations.py:33-40,69-81`, which instantiates 
`MigrateTableChart` for
   each matching Slice and calls `MigrateViz.upgrade_slice`
   (`superset/migrations/shared/migrate_viz/base.py:150-183`) to rebuild 
query_context via
   `MigrateTableChart._build_query()`.
   
   4. Inside `_build_query`, the helper `_get_table_chart_time_offsets`
   (`superset/migrations/shared/migrate_viz/processors.py:649-669`) derives 
`time_offsets`
   purely from `form_data.get("time_compare")`, `start_date_offset`, and the 
special
   "inherit" value, and never inspects `form_data.get("extra_form_data",
   {}).get("time_compare")`; the migrated query_context therefore hard-codes 
the chart-level
   time shifts, while at runtime the frontend buildQuery uses the 
extra_form_data override,
   resulting in stored queries that can execute with different effective time 
comparison
   shifts than the UI expects when dashboard overrides are in play.
   ```
   </details>
   
   [![Fix in 
Cursor](https://new-codeant-butcket.s3.us-west-1.amazonaws.com/badges/fix-in-cursor-flat.svg)](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=5835efe923ae4fb19fe8edc9d8d76c63&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
 [![Fix in VSCode 
Claude](https://new-codeant-butcket.s3.us-west-1.amazonaws.com/badges/fix-in-vscode-claude-flat.svg)](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=5835efe923ae4fb19fe8edc9d8d76c63&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
   
   *(Use Cmd/Ctrl + Click for best experience)*
   <details>
   <summary><b>Prompt for AI Agent 🤖 </b></summary>
   
   ```mdx
   This is a comment left during a code review.
   
   **Path:** superset/migrations/shared/migrate_viz/processors.py
   **Line:** 656:669
   **Comment:**
        *Api Mismatch: Time-offset derivation ignores the 
`extra_form_data.time_compare` override path used by table buildQuery, so 
migrated query contexts can execute with a different shift than runtime 
behavior. Apply the same override precedence so dashboard-level time-compare 
overrides replace chart-level offsets.
   
   Validate the correctness of the flagged issue. If correct, How can I resolve 
this? If you propose a fix, implement it and please make it concise.
   Once fix is implemented, also check other comments on the same PR, and ask 
user if the user wants to fix the rest of the comments as well. if said yes, 
then fetch all the comments validate the correctness and implement a minimal fix
   ```
   </details>
   <a 
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F42088&comment_hash=5aae68e3c9b7cfef69a2b5485ed2175002849f83b197f77fc5a854a7e31a40e2&reaction=like'>👍</a>
 | <a 
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F42088&comment_hash=5aae68e3c9b7cfef69a2b5485ed2175002849f83b197f77fc5a854a7e31a40e2&reaction=dislike'>👎</a>



##########
superset/migrations/shared/migrate_viz/processors.py:
##########
@@ -642,3 +644,225 @@ def process(base_query_object: dict[str, Any]) -> 
list[dict[str, Any]]:
             return [result]
 
         return build_query_context(self.data, process)
+
+
+def _get_table_chart_time_offsets(form_data: dict[str, Any]) -> list[Any]:
+    """
+    Resolve time_compare into the list of shifts buildQuery.ts sends as
+    time_offsets. table charts use a single-select time_compare control
+    whose choices include the special 'custom'/'inherit' shifts, which
+    resolve to start_date_offset/'inherit' rather than being used verbatim.
+    """
+    time_compare_shifts = ensure_is_array(form_data.get("time_compare"))
+    non_custom_or_inherit_shifts = [
+        shift for shift in time_compare_shifts if shift not in ("custom", 
"inherit")
+    ]
+    custom_or_inherit_shifts = [
+        shift for shift in time_compare_shifts if shift in ("custom", 
"inherit")
+    ]
+
+    time_offsets: list[Any] = list(non_custom_or_inherit_shifts)
+    if "custom" in custom_or_inherit_shifts:
+        time_offsets.append(form_data.get("start_date_offset"))
+    if "inherit" in custom_or_inherit_shifts:
+        time_offsets.append("inherit")
+    return time_offsets
+
+
+def _reorder_table_chart_temporal_column(
+    columns: list[Any],
+    time_grain_sqla: Any,
+    temporal_columns_lookup: dict[str, Any],
+) -> list[Any]:
+    """
+    Move the first physical column with a temporal_columns_lookup entry to
+    the front of the columns list as a BASE_AXIS adhoc column, mirroring
+    buildQuery.ts's temporal-column handling in aggregate mode.
+    """
+    temporal_column = None
+    filtered_columns = []
+    for col in columns:
+        should_be_temporal = (
+            is_physical_column(col)
+            and time_grain_sqla
+            and temporal_columns_lookup.get(col)
+        )
+        if should_be_temporal and temporal_column is None:
+            temporal_column = {
+                "timeGrain": time_grain_sqla,
+                "columnType": "BASE_AXIS",
+                "sqlExpression": col,
+                "label": col,
+                "expressionType": "SQL",
+            }
+        else:
+            filtered_columns.append(col)
+    return [temporal_column] + filtered_columns if temporal_column else 
filtered_columns
+
+
+class MigrateTableChart(MigrateViz):
+    source_viz_type = "table"
+    target_viz_type = "ag-grid-table"
+    remove_keys = {"allow_rearrange_columns", "allow_render_html"}
+    rename_keys: dict[str, str] = {}  # no renames needed; names match 1:1
+
+    def _pre_action(self) -> None:
+        # page_length: 0 ("All") has no dropdown choice in v2, but the control
+        # is freeForm and 0 still works at runtime — map to v2's largest
+        # PAGE_SIZE_OPTIONS entry (200) so the migrated chart keeps showing as
+        # many rows per page as v2 supports, rather than an arbitrary smaller
+        # value
+        if self.data.get("page_length") in (0, "0"):
+            self.data["page_length"] = 200
+
+        # Table charts are explicitly excluded from Matrixify
+        # (MATRIXIFY_INCOMPATIBLE_CHARTS), so drop any matrixify_* keys
+        # rather than migrating them.
+        for key in [k for k in self.data if k.startswith("matrixify_")]:
+            self.data.pop(key)
+
+    def _build_aggregate_mode_query(
+        self, base_query_object: dict[str, Any], time_offsets: list[Any]
+    ) -> tuple[list[Any], list[Any], Any, list[Any]]:
+        """
+        Returns (metrics, columns, orderby, post_processing) for aggregate
+        mode, mirroring buildQuery.ts's QueryMode.Aggregate branch: sort-by
+        metric/default ordering, percent-metric contribution, time
+        comparison, and moving the temporal column to the front.
+        """
+        metrics = base_query_object.get("metrics") or []
+        orderby = base_query_object.get("orderby") or []
+        columns = list(base_query_object.get("columns") or [])
+        post_processing: list[Any] = []
+
+        sort_by_metric_options = ensure_is_array(
+            self.data.get("timeseries_limit_metric")
+        )
+        sort_by_metric = sort_by_metric_options[0] if sort_by_metric_options 
else None
+        if sort_by_metric:
+            orderby = [[sort_by_metric, not self.data.get("order_desc", 
False)]]
+        elif metrics:
+            orderby = [[metrics[0], False]]
+
+        if percent_metrics := 
ensure_is_array(self.data.get("percent_metrics")):
+            percent_metric_labels = remove_duplicates(
+                [get_metric_label(m) for m in percent_metrics], 
get_metric_label
+            )
+            metrics = remove_duplicates(metrics + percent_metrics, 
get_metric_label)
+            post_processing.append(
+                {
+                    "operation": "contribution",
+                    "options": {
+                        "columns": percent_metric_labels,
+                        "rename_columns": [f"%{m}" for m in 
percent_metric_labels],
+                    },
+                }
+            )

Review Comment:
   **Suggestion:** The percent-metric contribution setup does not include 
time-comparison-expanded metric labels, so when time comparison is enabled only 
the base percent metric is renamed/computed and offset percent columns are 
missing. Mirror the frontend logic by expanding percent metric labels with each 
time offset before building `columns` and `rename_columns` for the contribution 
operator. [api mismatch]
   
   <details>
   <summary><b>Severity Level:</b> Major ⚠️</summary>
   
   ```mdx
   ❌ Migrated table charts miscompute percent metrics with time comparison.
   ⚠️ Dashboard percent trend views show inconsistent shifted percent columns.
   ```
   </details>
   <details>
   <summary><b>Steps of Reproduction ✅ </b></summary>
   
   ```mdx
   1. Configure a saved table chart slice with percent metrics and time 
comparison enabled in
   its form data, e.g. "percent_metrics": ["sum__sales"], "time_compare": ["1 
year ago"], and
   a standard comparison_type, following the runtime behavior defined in
   
`superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts:139-176`
 where
   percentMetricsLabelsWithTimeComparison is expanded via
   `addComparisonPercentMetrics(percentMetrics.map(getMetricLabel), 
timeOffsets)`.
   
   2. Run the CLI migration `superset migrate_viz upgrade --viz_type table`, 
which is wired
   in `superset/cli/viz_migrations.py:69-81` to call 
`MigrateTableChart.upgrade(db.session)`,
   and then `MigrateViz.upgrade_slice` in
   `superset/migrations/shared/migrate_viz/base.py:150-183` to rebuild each 
Slice’s
   query_context using `MigrateTableChart._build_query()`.
   
   3. During `MigrateTableChart._build_query` (processors.py:69-119, 840-919), 
aggregate mode
   delegates to `_build_aggregate_mode_query`; inside that method at
   `superset/migrations/shared/migrate_viz/processors.py:747-760` the Python 
code computes
   `percent_metric_labels = remove_duplicates([get_metric_label(m) for m in 
percent_metrics],
   get_metric_label)` and builds a contribution post-processing rule with 
`columns` and
   `rename_columns` based only on these base labels, without expanding them 
with time_offsets
   for comparison metrics like "sum__sales__1 year ago".
   
   4. After migration, the stored query_context for the slice contains a 
`post_processing`
   array where the "contribution" rule’s `options.columns` only list base 
percent metric
   labels, while the frontend AG Grid buildQuery
   (plugins/plugin-chart-ag-grid-table/src/buildQuery.ts:150-173) expects 
expanded labels
   including time-comparison suffixes; executing the migrated chart produces 
percent columns
   only for the base metric and omits or mislabels percent columns for shifted 
metrics,
   causing the v2 table to diverge from the expected runtime behavior.
   ```
   </details>
   
   [![Fix in 
Cursor](https://new-codeant-butcket.s3.us-west-1.amazonaws.com/badges/fix-in-cursor-flat.svg)](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=29fff66282084a19ad82a0e686e0a634&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
 [![Fix in VSCode 
Claude](https://new-codeant-butcket.s3.us-west-1.amazonaws.com/badges/fix-in-vscode-claude-flat.svg)](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=29fff66282084a19ad82a0e686e0a634&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
   
   *(Use Cmd/Ctrl + Click for best experience)*
   <details>
   <summary><b>Prompt for AI Agent 🤖 </b></summary>
   
   ```mdx
   This is a comment left during a code review.
   
   **Path:** superset/migrations/shared/migrate_viz/processors.py
   **Line:** 747:760
   **Comment:**
        *Api Mismatch: The percent-metric contribution setup does not include 
time-comparison-expanded metric labels, so when time comparison is enabled only 
the base percent metric is renamed/computed and offset percent columns are 
missing. Mirror the frontend logic by expanding percent metric labels with each 
time offset before building `columns` and `rename_columns` for the contribution 
operator.
   
   Validate the correctness of the flagged issue. If correct, How can I resolve 
this? If you propose a fix, implement it and please make it concise.
   Once fix is implemented, also check other comments on the same PR, and ask 
user if the user wants to fix the rest of the comments as well. if said yes, 
then fetch all the comments validate the correctness and implement a minimal fix
   ```
   </details>
   <a 
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F42088&comment_hash=ed92df1e74eaa0ac5f5fdc5f89dc38585292230762764cd6f48ab3e2664077d7&reaction=like'>👍</a>
 | <a 
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F42088&comment_hash=ed92df1e74eaa0ac5f5fdc5f89dc38585292230762764cd6f48ab3e2664077d7&reaction=dislike'>👎</a>



##########
superset/migrations/shared/migrate_viz/processors.py:
##########
@@ -642,3 +644,225 @@ def process(base_query_object: dict[str, Any]) -> 
list[dict[str, Any]]:
             return [result]
 
         return build_query_context(self.data, process)
+
+
+def _get_table_chart_time_offsets(form_data: dict[str, Any]) -> list[Any]:
+    """
+    Resolve time_compare into the list of shifts buildQuery.ts sends as
+    time_offsets. table charts use a single-select time_compare control
+    whose choices include the special 'custom'/'inherit' shifts, which
+    resolve to start_date_offset/'inherit' rather than being used verbatim.
+    """
+    time_compare_shifts = ensure_is_array(form_data.get("time_compare"))
+    non_custom_or_inherit_shifts = [
+        shift for shift in time_compare_shifts if shift not in ("custom", 
"inherit")
+    ]
+    custom_or_inherit_shifts = [
+        shift for shift in time_compare_shifts if shift in ("custom", 
"inherit")
+    ]
+
+    time_offsets: list[Any] = list(non_custom_or_inherit_shifts)
+    if "custom" in custom_or_inherit_shifts:
+        time_offsets.append(form_data.get("start_date_offset"))
+    if "inherit" in custom_or_inherit_shifts:
+        time_offsets.append("inherit")
+    return time_offsets
+
+
+def _reorder_table_chart_temporal_column(
+    columns: list[Any],
+    time_grain_sqla: Any,
+    temporal_columns_lookup: dict[str, Any],
+) -> list[Any]:
+    """
+    Move the first physical column with a temporal_columns_lookup entry to
+    the front of the columns list as a BASE_AXIS adhoc column, mirroring
+    buildQuery.ts's temporal-column handling in aggregate mode.
+    """
+    temporal_column = None
+    filtered_columns = []
+    for col in columns:
+        should_be_temporal = (
+            is_physical_column(col)
+            and time_grain_sqla
+            and temporal_columns_lookup.get(col)
+        )
+        if should_be_temporal and temporal_column is None:
+            temporal_column = {
+                "timeGrain": time_grain_sqla,
+                "columnType": "BASE_AXIS",
+                "sqlExpression": col,
+                "label": col,
+                "expressionType": "SQL",
+            }
+        else:
+            filtered_columns.append(col)
+    return [temporal_column] + filtered_columns if temporal_column else 
filtered_columns
+
+
+class MigrateTableChart(MigrateViz):
+    source_viz_type = "table"
+    target_viz_type = "ag-grid-table"
+    remove_keys = {"allow_rearrange_columns", "allow_render_html"}
+    rename_keys: dict[str, str] = {}  # no renames needed; names match 1:1
+
+    def _pre_action(self) -> None:
+        # page_length: 0 ("All") has no dropdown choice in v2, but the control
+        # is freeForm and 0 still works at runtime — map to v2's largest
+        # PAGE_SIZE_OPTIONS entry (200) so the migrated chart keeps showing as
+        # many rows per page as v2 supports, rather than an arbitrary smaller
+        # value
+        if self.data.get("page_length") in (0, "0"):
+            self.data["page_length"] = 200
+
+        # Table charts are explicitly excluded from Matrixify
+        # (MATRIXIFY_INCOMPATIBLE_CHARTS), so drop any matrixify_* keys
+        # rather than migrating them.
+        for key in [k for k in self.data if k.startswith("matrixify_")]:
+            self.data.pop(key)
+
+    def _build_aggregate_mode_query(
+        self, base_query_object: dict[str, Any], time_offsets: list[Any]
+    ) -> tuple[list[Any], list[Any], Any, list[Any]]:
+        """
+        Returns (metrics, columns, orderby, post_processing) for aggregate
+        mode, mirroring buildQuery.ts's QueryMode.Aggregate branch: sort-by
+        metric/default ordering, percent-metric contribution, time
+        comparison, and moving the temporal column to the front.
+        """
+        metrics = base_query_object.get("metrics") or []
+        orderby = base_query_object.get("orderby") or []
+        columns = list(base_query_object.get("columns") or [])
+        post_processing: list[Any] = []
+
+        sort_by_metric_options = ensure_is_array(
+            self.data.get("timeseries_limit_metric")
+        )
+        sort_by_metric = sort_by_metric_options[0] if sort_by_metric_options 
else None
+        if sort_by_metric:
+            orderby = [[sort_by_metric, not self.data.get("order_desc", 
False)]]
+        elif metrics:
+            orderby = [[metrics[0], False]]
+
+        if percent_metrics := 
ensure_is_array(self.data.get("percent_metrics")):
+            percent_metric_labels = remove_duplicates(
+                [get_metric_label(m) for m in percent_metrics], 
get_metric_label
+            )
+            metrics = remove_duplicates(metrics + percent_metrics, 
get_metric_label)
+            post_processing.append(
+                {
+                    "operation": "contribution",
+                    "options": {
+                        "columns": percent_metric_labels,
+                        "rename_columns": [f"%{m}" for m in 
percent_metric_labels],
+                    },
+                }
+            )
+
+        if time_offsets:
+            time_compare = time_compare_operator(self.data, base_query_object)
+            if time_compare:
+                post_processing.append(time_compare)
+
+        columns = _reorder_table_chart_temporal_column(
+            columns,
+            self.data.get("time_grain_sqla"),
+            self.data.get("temporal_columns_lookup") or {},
+        )

Review Comment:
   **Suggestion:** The temporal-column rewrite uses only `time_grain_sqla` from 
top-level form data and misses the `extra_form_data.time_grain_sqla` override 
used by frontend buildQuery, so charts relying on overridden grain will not 
promote the temporal dimension correctly. Resolve the effective time grain with 
the same precedence as frontend before calling the reorder helper. [api 
mismatch]
   
   <details>
   <summary><b>Severity Level:</b> Major ⚠️</summary>
   
   ```mdx
   ❌ Migrated table charts drop temporal-axis promotion under override grain.
   ⚠️ Column ordering mismatches UI expectations for temporal columns.
   ```
   </details>
   <details>
   <summary><b>Steps of Reproduction ✅ </b></summary>
   
   ```mdx
   1. Examine the frontend table buildQuery implementations: in
   `superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts:68-70` and
   
`superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts:72-74`, 
both
   compute the effective time grain via `const time_grain_sqla =
   extra_form_data?.time_grain_sqla || formData.time_grain_sqla;`, giving 
dashboard-level
   overrides (`extra_form_data.time_grain_sqla`) precedence over the chart-level
   `time_grain_sqla` when deciding temporal-axis behavior.
   
   2. Note that the pivot table migration processor in Python already mirrors 
this override
   precedence: `superset/migrations/shared/migrate_viz/processors.py:117-120` 
reads
   `extra_form_data = self.data.get("extra_form_data", {})` and then 
`time_grain_sqla =
   extra_form_data.get("time_grain_sqla") or self.data.get("time_grain_sqla")`, 
ensuring
   temporal column promotion respects overrides when migrating pivot_table 
slices.
   
   3. For migrated table charts, inspect 
`MigrateTableChart._build_aggregate_mode_query` in
   `superset/migrations/shared/migrate_viz/processors.py:85-120`; after 
building metrics and
   post-processing, it calls `_reorder_table_chart_temporal_column(columns,
   self.data.get("time_grain_sqla"), self.data.get("temporal_columns_lookup") 
or {})` at
   lines 767-771, passing only the top-level `time_grain_sqla` value and 
ignoring any
   `extra_form_data.time_grain_sqla` that might be present in the saved form 
data.
   
   4. Create or identify a slice whose saved params carry 
`extra_form_data.time_grain_sqla`
   (e.g., from a dashboard filter applying a specific grain) but no top-level
   `time_grain_sqla`, then run `superset migrate_viz upgrade --viz_type table` 
per
   `superset/cli/viz_migrations.py:69-81`; `MigrateTableChart.upgrade_slice`
   (`base.py:150-183`) will invoke `_build_query`, but because
   `_reorder_table_chart_temporal_column` sees `time_grain_sqla` as None it 
will not promote
   the temporal physical column to a BASE_AXIS adhoc column, leading to a 
migrated
   query_context whose temporal column ordering and axis handling no longer 
match the
   frontend buildQuery semantics under override grain.
   ```
   </details>
   
   [![Fix in 
Cursor](https://new-codeant-butcket.s3.us-west-1.amazonaws.com/badges/fix-in-cursor-flat.svg)](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=223cac1a82204bfabaf91d374d067155&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
 [![Fix in VSCode 
Claude](https://new-codeant-butcket.s3.us-west-1.amazonaws.com/badges/fix-in-vscode-claude-flat.svg)](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=223cac1a82204bfabaf91d374d067155&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
   
   *(Use Cmd/Ctrl + Click for best experience)*
   <details>
   <summary><b>Prompt for AI Agent 🤖 </b></summary>
   
   ```mdx
   This is a comment left during a code review.
   
   **Path:** superset/migrations/shared/migrate_viz/processors.py
   **Line:** 767:771
   **Comment:**
        *Api Mismatch: The temporal-column rewrite uses only `time_grain_sqla` 
from top-level form data and misses the `extra_form_data.time_grain_sqla` 
override used by frontend buildQuery, so charts relying on overridden grain 
will not promote the temporal dimension correctly. Resolve the effective time 
grain with the same precedence as frontend before calling the reorder helper.
   
   Validate the correctness of the flagged issue. If correct, How can I resolve 
this? If you propose a fix, implement it and please make it concise.
   Once fix is implemented, also check other comments on the same PR, and ask 
user if the user wants to fix the rest of the comments as well. if said yes, 
then fetch all the comments validate the correctness and implement a minimal fix
   ```
   </details>
   <a 
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F42088&comment_hash=36ba90fa44ed52e31e5dfe83fdb2ad51d91823a7deb35f1f522b953098744fc5&reaction=like'>👍</a>
 | <a 
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F42088&comment_hash=36ba90fa44ed52e31e5dfe83fdb2ad51d91823a7deb35f1f522b953098744fc5&reaction=dislike'>👎</a>



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to