This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch change/33615-chart-data-query-context
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 0ca40bb24d994805d71d0ec852afe27539a5c237
Author: Eugene Olkhovski <[email protected]>
AuthorDate: Wed Aug 19 05:56:20 2026 -0400

    fix(charts): repair CI failures on #33615 query_context PR
    
    The master merge into this branch left tests/.../import_test.py scrambled
    (test bodies shuffled, undefined names admin/config/original_id) and a stray
    blank line in the v1 importers __init__.py. Reconstruct import_test.py from
    master's soft-delete suite plus the three query_context synthesis tests, and
    clear the remaining lint/type failures so CI is green:
    
    - ruff: TID251 (use superset.utils.json), E501, I001, and C901 — extract
      helpers _synthesize_query_context_if_absent (import_chart) and
      _derive_query_context (backfill CLI) to cut cyclomatic complexity.
    - pylint: annotate the two batched CLI commits with
      consider-using-transaction (streaming backfill, not a single unit of 
work).
    - mypy: guard the Optional SqlaTable datasource before .database.
    - oxlint (frontend): fix no-new-func, prefer-template, no-plusplus,
      no-unused-vars and jest consistent-test-it in the gen-qc scripts and
      parity.test.ts.
    - RAT license check: add Apache headers to the three gen-qc *.mjs scripts.
    - oxfmt: format the generated registry/entry and the query_context fixtures.
    - .gitignore: restore entries dropped by the merge and ignore the generated
      _bundles/*.js artifact (documented as not committed).
    
    Co-Authored-By: Claude Opus 4.8 <[email protected]>
---
 .gitignore                                         |   8 +-
 superset-frontend/scripts/gen-qc-fixtures.mjs      |  36 +++++-
 superset-frontend/scripts/gen-qc-goldens.mjs       |  28 ++++-
 superset-frontend/scripts/gen-qc-registry.mjs      |  41 ++++++-
 .../__fixtures__/expected/big_number.json          |  61 +++--------
 .../__fixtures__/expected/big_number_total.json    |  42 ++-----
 .../__fixtures__/expected/box_plot.json            |  42 ++-----
 .../__fixtures__/expected/bubble_v2.json           |  42 ++-----
 .../__fixtures__/expected/echarts_area.json        |  52 ++-------
 .../__fixtures__/expected/echarts_timeseries.json  |  52 ++-------
 .../expected/echarts_timeseries_bar.json           |  52 ++-------
 .../expected/echarts_timeseries_line.json          |  52 ++-------
 .../expected/echarts_timeseries_scatter.json       |  52 ++-------
 .../expected/echarts_timeseries_smooth.json        |  52 ++-------
 .../expected/echarts_timeseries_step.json          |  52 ++-------
 .../__fixtures__/expected/funnel.json              |  42 ++-----
 .../__fixtures__/expected/gauge_chart.json         |  42 ++-----
 .../__fixtures__/expected/graph_chart.json         |  42 ++-----
 .../__fixtures__/expected/handlebars.json          |  49 ++-------
 .../__fixtures__/expected/heatmap_v2.json          |  37 ++-----
 .../__fixtures__/expected/histogram_v2.json        |  42 ++-----
 .../__fixtures__/expected/mixed_timeseries.json    |  67 +++---------
 .../__fixtures__/expected/pie.json                 |  50 ++-------
 .../__fixtures__/expected/pivot_table_v2.json      |  44 ++------
 .../__fixtures__/expected/pop_kpi.json             |  42 ++-----
 .../__fixtures__/expected/radar.json               |  49 ++-------
 .../__fixtures__/expected/sankey_v2.json           |  47 ++------
 .../__fixtures__/expected/sunburst_v2.json         |  42 ++-----
 .../__fixtures__/expected/table.json               |  42 ++-----
 .../__fixtures__/expected/tree_chart.json          |  42 ++-----
 .../__fixtures__/expected/treemap_v2.json          |  42 ++-----
 .../__fixtures__/expected/waterfall.json           |  47 ++------
 .../__fixtures__/expected/word_cloud.json          |  42 ++-----
 .../__fixtures__/formdata/big_number.json          |  29 ++---
 .../__fixtures__/formdata/big_number_total.json    |  29 ++---
 .../__fixtures__/formdata/box_plot.json            |  29 ++---
 .../__fixtures__/formdata/bubble_v2.json           |  29 ++---
 .../__fixtures__/formdata/echarts_area.json        |  29 ++---
 .../__fixtures__/formdata/echarts_timeseries.json  |  29 ++---
 .../formdata/echarts_timeseries_bar.json           |  29 ++---
 .../formdata/echarts_timeseries_line.json          |  29 ++---
 .../formdata/echarts_timeseries_scatter.json       |  29 ++---
 .../formdata/echarts_timeseries_smooth.json        |  29 ++---
 .../formdata/echarts_timeseries_step.json          |  29 ++---
 .../__fixtures__/formdata/funnel.json              |  29 ++---
 .../__fixtures__/formdata/gauge_chart.json         |  29 ++---
 .../__fixtures__/formdata/graph_chart.json         |  29 ++---
 .../__fixtures__/formdata/handlebars.json          |  29 ++---
 .../__fixtures__/formdata/heatmap_v2.json          |  29 ++---
 .../__fixtures__/formdata/histogram_v2.json        |  29 ++---
 .../__fixtures__/formdata/mixed_timeseries.json    |  29 ++---
 .../__fixtures__/formdata/pie.json                 |  29 ++---
 .../__fixtures__/formdata/pivot_table_v2.json      |  29 ++---
 .../__fixtures__/formdata/pop_kpi.json             |  29 ++---
 .../__fixtures__/formdata/radar.json               |  29 ++---
 .../__fixtures__/formdata/sankey_v2.json           |  29 ++---
 .../__fixtures__/formdata/sunburst_v2.json         |  29 ++---
 .../__fixtures__/formdata/table.json               |  29 ++---
 .../__fixtures__/formdata/tree_chart.json          |  29 ++---
 .../__fixtures__/formdata/treemap_v2.json          |  29 ++---
 .../__fixtures__/formdata/waterfall.json           |  29 ++---
 .../__fixtures__/formdata/word_cloud.json          |  29 ++---
 .../src/backend-querycontext/entry.ts              |   4 +-
 .../src/backend-querycontext/parity.test.ts        |   2 +-
 .../src/backend-querycontext/registry.generated.ts |  58 +++++-----
 superset/cli/charts.py                             |  86 +++++++++------
 superset/commands/chart/importers/v1/utils.py      | 121 +++++++++++----------
 superset/commands/chart/query_context_builder.py   |   4 +-
 superset/commands/chart/query_context_generator.py |  11 +-
 tests/integration_tests/charts/commands_tests.py   |  14 +--
 tests/integration_tests/charts/data/api_tests.py   |   4 +-
 .../charts/commands/importers/v1/import_test.py    |  70 ------------
 .../importers/v1/query_context_builder_test.py     |   6 +-
 .../importers/v1/query_context_parity_test.py      |   3 +-
 74 files changed, 790 insertions(+), 1908 deletions(-)

diff --git a/.gitignore b/.gitignore
index 69ed5344cb0..9c17c161824 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,6 +128,10 @@ docker-compose.override.yml
 
 .temp_cache
 
+# Generated backend query_context bundle (built via
+# `npm run build:backend-querycontext`; see 
superset/commands/chart/_bundles/README.md)
+superset/commands/chart/_bundles/*.js
+
 # Jest test report
 test-report.html
 superset/static/stats/statistics.html
@@ -143,7 +147,3 @@ PROJECT.md
 oxc-custom-build/
 *.code-workspace
 *.duckdb
-
-# Generated backend query-context bundle (#33615) — built via
-# `npm run build:backend-querycontext`, never committed.
-superset/commands/chart/_bundles/query_context_bundle.js
diff --git a/superset-frontend/scripts/gen-qc-fixtures.mjs 
b/superset-frontend/scripts/gen-qc-fixtures.mjs
index 654c472aeb6..cf449b551bc 100644
--- a/superset-frontend/scripts/gen-qc-fixtures.mjs
+++ b/superset-frontend/scripts/gen-qc-fixtures.mjs
@@ -1,9 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 // Generates a minimal-but-valid form_data fixture + frontend golden for every 
viz
 // type in the generated REGISTRY, by actually running each plugin's 
buildQuery under
 // Node's V8. A viz is COVERED if its builder returns a real query_context on 
the base
 // form_data; otherwise it's honestly SKIPPED (reason recorded) — never faked.
 import { build } from 'esbuild';
-import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
+import { writeFileSync, mkdirSync } from 'node:fs';
 import { createRequire } from 'node:module';
 
 const require = createRequire(import.meta.url);
@@ -30,7 +49,14 @@ shim('window', globalThis);
 shim('navigator', { userAgent: 'superset-fixtures-node' });
 shim('document', {});
 const mod = { exports: {} };
-new Function('module', 'exports', 'require', res.outputFiles[0].text)(mod, 
mod.exports, require);
+// eslint-disable-next-line no-new-func -- evaluating our own freshly built 
bundle
+const load = new Function(
+  'module',
+  'exports',
+  'require',
+  res.outputFiles[0].text,
+);
+load(mod, mod.exports, require);
 const gen = mod.exports.generateQueryContext;
 const VIZ_TYPES = mod.exports.VIZ_TYPES || globalThis.SUPERSET_QC_VIZ_TYPES;
 
@@ -96,13 +122,13 @@ for (const viz of VIZ_TYPES) {
     skipped.push([viz, 'no queries produced']);
     continue;
   }
-  writeFileSync(`${FEX}/formdata/${viz}.json`, JSON.stringify(fd, null, 2) + 
'\n');
-  writeFileSync(`${FEX}/expected/${viz}.json`, JSON.stringify(out, null, 2) + 
'\n');
+  writeFileSync(`${FEX}/formdata/${viz}.json`, `${JSON.stringify(fd, null, 
2)}\n`);
+  writeFileSync(`${FEX}/expected/${viz}.json`, `${JSON.stringify(out, null, 
2)}\n`);
   covered.push(viz);
 }
 
 console.log(`REGISTRY viz types: ${VIZ_TYPES.length}`);
 console.log(`COVERED (fixture+golden written): ${covered.length}`);
-console.log('  ' + covered.join(', '));
+console.log(`  ${covered.join(', ')}`);
 console.log(`SKIPPED (base form_data insufficient): ${skipped.length}`);
 for (const [v, r] of skipped) console.log(`  - ${v}: ${r}`);
diff --git a/superset-frontend/scripts/gen-qc-goldens.mjs 
b/superset-frontend/scripts/gen-qc-goldens.mjs
index 393470c6f45..68944ee6638 100644
--- a/superset-frontend/scripts/gen-qc-goldens.mjs
+++ b/superset-frontend/scripts/gen-qc-goldens.mjs
@@ -1,3 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 // Records frontend query_context goldens by running the SAME buildQuery entry
 // under Node's V8 (independent of the backend mini-racer runtime). Pure 
buildQuery
 // logic → identical output to the browser. Writes 
__fixtures__/expected/<stem>.json.
@@ -32,7 +51,9 @@ shim('window', globalThis);
 shim('navigator', { userAgent: 'superset-goldens-node' });
 shim('document', {});
 const mod = { exports: {} };
-new Function('module', 'exports', 'require', code)(mod, mod.exports, require);
+// eslint-disable-next-line no-new-func -- evaluating our own freshly built 
bundle
+const load = new Function('module', 'exports', 'require', code);
+load(mod, mod.exports, require);
 const gen = mod.exports.generateQueryContext || 
globalThis.generateQueryContext;
 if (typeof gen !== 'function') throw new Error('generateQueryContext not found 
in bundle');
 
@@ -46,6 +67,9 @@ for (const f of readdirSync(`${FEX}/formdata`)) {
   if (parsed && (parsed.__unsupported__ || parsed.__error__)) {
     throw new Error(`golden gen failed for ${stem}: ${outStr}`);
   }
-  writeFileSync(`${FEX}/expected/${stem}.json`, JSON.stringify(parsed, null, 
2) + '\n');
+  writeFileSync(
+    `${FEX}/expected/${stem}.json`,
+    `${JSON.stringify(parsed, null, 2)}\n`,
+  );
   console.log(`golden recorded: ${stem} (queries=${(parsed.queries || 
[]).length})`);
 }
diff --git a/superset-frontend/scripts/gen-qc-registry.mjs 
b/superset-frontend/scripts/gen-qc-registry.mjs
index d0c29280438..5fad639e24c 100644
--- a/superset-frontend/scripts/gen-qc-registry.mjs
+++ b/superset-frontend/scripts/gen-qc-registry.mjs
@@ -1,3 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 // Deterministic, re-runnable codegen: maps every plugin `buildQuery` module 
to the
 // viz_type key(s) it is registered under, and emits registry.generated.ts 
consumed
 // by entry.ts. Join: buildQuery module  <- (index.ts that imports it) -> 
plugin class
@@ -66,7 +85,13 @@ const buildQueryFiles = files.filter((f) => 
/[/\\]buildQuery\.(ts|js)$/.test(f))
 // resolve an import specifier from a file to an absolute module file 
(ts/js/index)
 function resolveImport(fromFile, spec) {
   const base = path.resolve(path.dirname(fromFile), spec);
-  for (const c of [base, base + '.ts', base + '.js', path.join(base, 
'index.ts'), path.join(base, 'index.js')]) {
+  for (const c of [
+    base,
+    `${base}.ts`,
+    `${base}.js`,
+    path.join(base, 'index.ts'),
+    path.join(base, 'index.js'),
+  ]) {
     if (existsSync(c) && statSync(c).isFile()) return path.resolve(c);
   }
   return null;
@@ -149,10 +174,14 @@ const nameByPath = new Map();
 let n = 0;
 for (const [, abs] of entries) {
   if (!nameByPath.has(abs)) {
-    const id = `bq${n++}`;
+    const id = `bq${n}`;
+    n += 1;
     nameByPath.set(abs, id);
-    let rel = path.relative(path.dirname(OUT), abs).replace(/\\/g, 
'/').replace(/\.(ts|js)$/, '');
-    if (!rel.startsWith('.')) rel = './' + rel;
+    let rel = path
+      .relative(path.dirname(OUT), abs)
+      .replace(/\\/g, '/')
+      .replace(/\.(ts|js)$/, '');
+    if (!rel.startsWith('.')) rel = `./${rel}`;
     imports += `import ${id} from '${rel}';\n`;
   }
 }
@@ -177,11 +206,11 @@ const header = `// Licensed to the Apache Software 
Foundation (ASF) under one
 // GENERATED by superset-frontend/scripts/gen-qc-registry.mjs — DO NOT EDIT.
 // Re-run: node scripts/gen-qc-registry.mjs
 `;
-writeFileSync(OUT, header + '\n' + imports + '\n' + body, 'utf8');
+writeFileSync(OUT, `${header}\n${imports}\n${body}`, 'utf8');
 
 console.log(`buildQuery modules: ${buildQueryFiles.length}`);
 console.log(`viz keys mapped: ${entries.length}`);
-console.log('keys: ' + entries.map(([v]) => v).join(', '));
+console.log(`keys: ${entries.map(([v]) => v).join(', ')}`);
 console.log(`unmapped buildQuery (no MainPreset key): ${unmapped.length}`);
 for (const u of unmapped) console.log(`  - ${u.bq} (classes: 
${u.classes.join(',') || 'none'})`);
 console.log(`wrote ${path.relative(FE, OUT)}`);
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number.json
index d27168e8434..bcda82fff1a 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number.json
@@ -24,14 +24,10 @@
           "expressionType": "SQL"
         }
       ],
-      "metrics": [
-        "count"
-      ],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -41,12 +37,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -79,14 +71,10 @@
           "expressionType": "SQL"
         }
       ],
-      "metrics": [
-        "count"
-      ],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -96,12 +84,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -117,24 +101,13 @@
     "datasource": "1__table",
     "viz_type": "big_number",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -151,12 +124,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number_total.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number_total.json
index 79ad5925de6..165432b3df3 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number_total.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/big_number_total.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "big_number_total",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/box_plot.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/box_plot.json
index 51a97d3fec8..31896dc2b01 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/box_plot.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/box_plot.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "gender"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "gender"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -39,24 +32,13 @@
     "datasource": "1__table",
     "viz_type": "box_plot",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -73,12 +55,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/bubble_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/bubble_v2.json
index b52a1b081a6..1f442b84efd 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/bubble_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/bubble_v2.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "gender"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "gender"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "bubble_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_area.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_area.json
index d8b04ba544f..0b79c4028c0 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_area.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_area.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_area",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries.json
index 1c825c79428..de6008da7eb 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_timeseries",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_bar.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_bar.json
index 18b4e23eff4..43f3ce58d77 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_bar.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_bar.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_timeseries_bar",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_line.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_line.json
index 3fe112ee3c5..0cd2b15454d 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_line.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_line.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_timeseries_line",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_scatter.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_scatter.json
index 50fb1b59b48..2d8a5ebda3c 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_scatter.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_scatter.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_timeseries_scatter",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_smooth.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_smooth.json
index eaafc4f70e6..9cfc18e0650 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_smooth.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_smooth.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_timeseries_smooth",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_step.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_step.json
index 479694214f7..e2c3dbc964e 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_step.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/echarts_timeseries_step.json
@@ -25,20 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -49,12 +40,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -73,24 +60,13 @@
     "datasource": "1__table",
     "viz_type": "echarts_timeseries_step",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -107,12 +83,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/funnel.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/funnel.json
index abef3201d9a..cc0f1be58ad 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/funnel.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/funnel.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "funnel",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/gauge_chart.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/gauge_chart.json
index cae2ec8637c..f00758542f5 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/gauge_chart.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/gauge_chart.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "gauge_chart",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/graph_chart.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/graph_chart.json
index c9a6aa33129..129fd5a7729 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/graph_chart.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/graph_chart.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "graph_chart",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/handlebars.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/handlebars.json
index 87b87894901..a500ea4d19d 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/handlebars.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/handlebars.json
@@ -15,24 +15,12 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -44,24 +32,13 @@
     "datasource": "1__table",
     "viz_type": "handlebars",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -78,12 +55,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/heatmap_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/heatmap_v2.json
index 727bce82b58..c887a16680b 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/heatmap_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/heatmap_v2.json
@@ -25,15 +25,11 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
+      "metrics": ["count"],
       "orderby": [],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -53,24 +49,13 @@
     "datasource": "1__table",
     "viz_type": "heatmap_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -87,12 +72,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/histogram_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/histogram_v2.json
index 2664d0be527..e4be02df827 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/histogram_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/histogram_v2.json
@@ -15,15 +15,10 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "num"
-      ],
+      "columns": ["gender", "num"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -34,9 +29,7 @@
           "operation": "histogram",
           "options": {
             "column": "num",
-            "groupby": [
-              "gender"
-            ],
+            "groupby": ["gender"],
             "bins": 5
           }
         }
@@ -47,24 +40,13 @@
     "datasource": "1__table",
     "viz_type": "histogram_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -81,12 +63,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/mixed_timeseries.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/mixed_timeseries.json
index ba1c2047187..b48e6abd522 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/mixed_timeseries.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/mixed_timeseries.json
@@ -25,14 +25,10 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "url_params": {},
       "custom_params": {},
@@ -42,12 +38,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -60,12 +52,7 @@
           "operation": "flatten"
         }
       ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ]
+      "orderby": [["count", false]]
     },
     {
       "time_range": "No filter",
@@ -87,14 +74,10 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "url_params": {},
       "custom_params": {},
@@ -104,12 +87,8 @@
         {
           "operation": "pivot",
           "options": {
-            "index": [
-              "ds"
-            ],
-            "columns": [
-              "gender"
-            ],
+            "index": ["ds"],
+            "columns": ["gender"],
             "aggregates": {
               "count": {
                 "operator": "mean"
@@ -122,36 +101,20 @@
           "operation": "flatten"
         }
       ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ]
+      "orderby": [["count", false]]
     }
   ],
   "form_data": {
     "datasource": "1__table",
     "viz_type": "mixed_timeseries",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/pie.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/pie.json
index 46931d7cff0..7c8ea2876fa 100644
--- a/superset-frontend/src/backend-querycontext/__fixtures__/expected/pie.json
+++ b/superset-frontend/src/backend-querycontext/__fixtures__/expected/pie.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -36,12 +29,8 @@
         {
           "operation": "contribution",
           "options": {
-            "columns": [
-              "count"
-            ],
-            "rename_columns": [
-              "count__contribution"
-            ]
+            "columns": ["count"],
+            "rename_columns": ["count__contribution"]
           }
         }
       ]
@@ -51,24 +40,13 @@
     "datasource": "1__table",
     "viz_type": "pie",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -85,12 +63,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/pivot_table_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/pivot_table_v2.json
index 83bca36357a..9d4bee6f142 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/pivot_table_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/pivot_table_v2.json
@@ -16,20 +16,11 @@
       },
       "applied_time_extras": {},
       "columns": [],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -41,24 +32,13 @@
     "datasource": "1__table",
     "viz_type": "pivot_table_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -75,12 +55,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/pop_kpi.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/pop_kpi.json
index b74efd35e9c..61f74bab338 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/pop_kpi.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/pop_kpi.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -40,24 +33,13 @@
     "datasource": "1__table",
     "viz_type": "pop_kpi",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -74,12 +56,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/radar.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/radar.json
index 22369451173..e34097d65f8 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/radar.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/radar.json
@@ -15,24 +15,12 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
-      "orderby": [
-        [
-          "count",
-          false
-        ]
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
+      "orderby": [["count", false]],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -44,24 +32,13 @@
     "datasource": "1__table",
     "viz_type": "radar",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -78,12 +55,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/sankey_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/sankey_v2.json
index eef4e4a2af4..a0fddbef839 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/sankey_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/sankey_v2.json
@@ -15,51 +15,30 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
       "custom_params": {},
       "custom_form_data": {},
-      "groupby": [
-        "gender",
-        "name"
-      ]
+      "groupby": ["gender", "name"]
     }
   ],
   "form_data": {
     "datasource": "1__table",
     "viz_type": "sankey_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -76,12 +55,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/sunburst_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/sunburst_v2.json
index f5b15a6da9b..6bf88d04f88 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/sunburst_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/sunburst_v2.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "sunburst_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/table.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/table.json
index 86b97a4af2a..6b5ff8f0bb2 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/table.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/table.json
@@ -15,19 +15,12 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "orderby": [],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -41,24 +34,13 @@
     "datasource": "1__table",
     "viz_type": "table",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -75,12 +57,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": [],
     "include_time": false
   },
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/tree_chart.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/tree_chart.json
index f1373c2968f..d8c6be23891 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/tree_chart.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/tree_chart.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "tree_chart",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/treemap_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/treemap_v2.json
index d46d2296062..f1d83b1b18d 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/treemap_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/treemap_v2.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "treemap_v2",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/waterfall.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/waterfall.json
index 1a2698215ab..8b3c84dadb8 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/waterfall.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/waterfall.json
@@ -25,24 +25,14 @@
         },
         "gender"
       ],
-      "metrics": [
-        "count"
-      ],
+      "metrics": ["count"],
       "orderby": [
-        [
-          "ds",
-          true
-        ],
-        [
-          "gender",
-          true
-        ]
+        ["ds", true],
+        ["gender", true]
       ],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -54,24 +44,13 @@
     "datasource": "1__table",
     "viz_type": "waterfall",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -88,12 +67,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/word_cloud.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/word_cloud.json
index db9279c505b..e3452dc4f68 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/expected/word_cloud.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/expected/word_cloud.json
@@ -15,18 +15,11 @@
         "where": ""
       },
       "applied_time_extras": {},
-      "columns": [
-        "gender",
-        "name"
-      ],
-      "metrics": [
-        "count"
-      ],
+      "columns": ["gender", "name"],
+      "metrics": ["count"],
       "annotation_layers": [],
       "row_limit": 100,
-      "series_columns": [
-        "gender"
-      ],
+      "series_columns": ["gender"],
       "series_limit": 0,
       "order_desc": true,
       "url_params": {},
@@ -38,24 +31,13 @@
     "datasource": "1__table",
     "viz_type": "word_cloud",
     "metric": "count",
-    "metrics": [
-      "count"
-    ],
-    "groupby": [
-      "gender"
-    ],
-    "columns": [
-      "gender"
-    ],
-    "all_columns": [
-      "gender",
-      "name"
-    ],
+    "metrics": ["count"],
+    "groupby": ["gender"],
+    "columns": ["gender"],
+    "all_columns": ["gender", "name"],
     "entity": "gender",
     "series": "gender",
-    "series_columns": [
-      "gender"
-    ],
+    "series_columns": ["gender"],
     "x_axis": "ds",
     "granularity_sqla": "ds",
     "time_grain_sqla": "P1D",
@@ -72,12 +54,8 @@
     "y": "count",
     "size": "count",
     "column": "num",
-    "metrics_b": [
-      "count"
-    ],
-    "groupby_b": [
-      "gender"
-    ],
+    "metrics_b": ["count"],
+    "groupby_b": ["gender"],
     "adhoc_filters_b": []
   },
   "result_format": "json",
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number.json
index 03a0967066f..ce625627b77 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "big_number",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number_total.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number_total.json
index cad0bc79762..712fdbc8e40 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number_total.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/big_number_total.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "big_number_total",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/box_plot.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/box_plot.json
index 020c3f93372..3cd34b1110a 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/box_plot.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/box_plot.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "box_plot",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/bubble_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/bubble_v2.json
index 1a4385d444b..114f73faae4 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/bubble_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/bubble_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "bubble_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_area.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_area.json
index 7718ec6d60a..08f7abe1443 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_area.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_area.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_area",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries.json
index 684db978e11..4b8245ffefc 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_timeseries",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_bar.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_bar.json
index 9eae4b2f6ff..3259a02f40d 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_bar.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_bar.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_timeseries_bar",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_line.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_line.json
index b1d26d40dca..e40459e9654 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_line.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_line.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_timeseries_line",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_scatter.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_scatter.json
index 9214b8cea7e..24bb755a8d8 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_scatter.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_scatter.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_timeseries_scatter",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_smooth.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_smooth.json
index 401f24f755e..34f17686ecd 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_smooth.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_smooth.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_timeseries_smooth",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_step.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_step.json
index de097ce1193..3527ff01cd2 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_step.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/echarts_timeseries_step.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "echarts_timeseries_step",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/funnel.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/funnel.json
index 6f4781c14c8..d2db27b9081 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/funnel.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/funnel.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "funnel",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/gauge_chart.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/gauge_chart.json
index 7337458c7b9..ff79ed4d66e 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/gauge_chart.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/gauge_chart.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "gauge_chart",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/graph_chart.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/graph_chart.json
index 32d4f51cf5b..5783c10ef26 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/graph_chart.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/graph_chart.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "graph_chart",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/handlebars.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/handlebars.json
index 399e16074bb..ad17378fffc 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/handlebars.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/handlebars.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "handlebars",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/heatmap_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/heatmap_v2.json
index 92c3a135237..65dfce9b44d 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/heatmap_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/heatmap_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "heatmap_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/histogram_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/histogram_v2.json
index 72e76e603da..ccf7e8d1449 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/histogram_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/histogram_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "histogram_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/mixed_timeseries.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/mixed_timeseries.json
index 0aa61b4cad8..22e14a5441b 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/mixed_timeseries.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/mixed_timeseries.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "mixed_timeseries",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pie.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pie.json
index 87e7978fb89..05a68137dc1 100644
--- a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pie.json
+++ b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pie.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "pie",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pivot_table_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pivot_table_v2.json
index 00cd7863694..a55d6baf652 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pivot_table_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pivot_table_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "pivot_table_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pop_kpi.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pop_kpi.json
index 228809f7aaa..4ce24cddfe1 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pop_kpi.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/pop_kpi.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "pop_kpi",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/radar.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/radar.json
index a260b26f5be..ad36ce50f1d 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/radar.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/radar.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "radar",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sankey_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sankey_v2.json
index 8e77577d53b..7445fe0e7d6 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sankey_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sankey_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "sankey_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sunburst_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sunburst_v2.json
index 43230457ca2..c3a73902d1a 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sunburst_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/sunburst_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "sunburst_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/table.json 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/table.json
index 78261244739..3b9acd468ce 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/table.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/table.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "table",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/tree_chart.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/tree_chart.json
index b96aaf0c560..a6dd42ec555 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/tree_chart.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/tree_chart.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "tree_chart",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/treemap_v2.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/treemap_v2.json
index a6d10ae26a0..cc184c40e9c 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/treemap_v2.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/treemap_v2.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "treemap_v2",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/waterfall.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/waterfall.json
index fcf5782bf91..ce815bd08c9 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/waterfall.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/waterfall.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "waterfall",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/word_cloud.json
 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/word_cloud.json
index cb2e832a741..0501c027427 100644
--- 
a/superset-frontend/src/backend-querycontext/__fixtures__/formdata/word_cloud.json
+++ 
b/superset-frontend/src/backend-querycontext/__fixtures__/formdata/word_cloud.json
@@ -2,24 +2,13 @@
   "datasource": "1__table",
   "viz_type": "word_cloud",
   "metric": "count",
-  "metrics": [
-    "count"
-  ],
-  "groupby": [
-    "gender"
-  ],
-  "columns": [
-    "gender"
-  ],
-  "all_columns": [
-    "gender",
-    "name"
-  ],
+  "metrics": ["count"],
+  "groupby": ["gender"],
+  "columns": ["gender"],
+  "all_columns": ["gender", "name"],
   "entity": "gender",
   "series": "gender",
-  "series_columns": [
-    "gender"
-  ],
+  "series_columns": ["gender"],
   "x_axis": "ds",
   "granularity_sqla": "ds",
   "time_grain_sqla": "P1D",
@@ -36,11 +25,7 @@
   "y": "count",
   "size": "count",
   "column": "num",
-  "metrics_b": [
-    "count"
-  ],
-  "groupby_b": [
-    "gender"
-  ],
+  "metrics_b": ["count"],
+  "groupby_b": ["gender"],
   "adhoc_filters_b": []
 }
diff --git a/superset-frontend/src/backend-querycontext/entry.ts 
b/superset-frontend/src/backend-querycontext/entry.ts
index a47868869f7..4a6989f9cac 100644
--- a/superset-frontend/src/backend-querycontext/entry.ts
+++ b/superset-frontend/src/backend-querycontext/entry.ts
@@ -64,7 +64,9 @@ export function generateQueryContext(
     const queryContext = fn(formData);
     return JSON.stringify(queryContext);
   } catch (e) {
-    return JSON.stringify({ __error__: String((e && (e as Error).stack) || e) 
});
+    return JSON.stringify({
+      __error__: String((e && (e as Error).stack) || e),
+    });
   }
 }
 
diff --git a/superset-frontend/src/backend-querycontext/parity.test.ts 
b/superset-frontend/src/backend-querycontext/parity.test.ts
index 9378c4b993e..ffd3745ef66 100644
--- a/superset-frontend/src/backend-querycontext/parity.test.ts
+++ b/superset-frontend/src/backend-querycontext/parity.test.ts
@@ -49,7 +49,7 @@ describe('backend query-context parity goldens', () => {
     .filter(f => f.endsWith('.json'))
     .map(f => f.replace(/\.json$/, ''));
 
-  it.each(fixtures)('records + validates query_context for %s', vizType => {
+  test.each(fixtures)('records + validates query_context for %s', vizType => {
     const formData = JSON.parse(
       fs.readFileSync(path.join(FORMDATA_DIR, `${vizType}.json`), 'utf8'),
     );
diff --git a/superset-frontend/src/backend-querycontext/registry.generated.ts 
b/superset-frontend/src/backend-querycontext/registry.generated.ts
index 51395c80d2e..fc4f0796773 100644
--- a/superset-frontend/src/backend-querycontext/registry.generated.ts
+++ b/superset-frontend/src/backend-querycontext/registry.generated.ts
@@ -40,35 +40,35 @@ import bq21 from 
'../../plugins/plugin-chart-echarts/src/Waterfall/buildQuery';
 import bq22 from '../../plugins/plugin-chart-word-cloud/src/plugin/buildQuery';
 
 export const REGISTRY: Record<string, (fd: any) => any> = {
-  'big_number': bq0 as (fd: any) => any,
-  'big_number_total': bq1 as (fd: any) => any,
-  'box_plot': bq2 as (fd: any) => any,
-  'bubble_v2': bq3 as (fd: any) => any,
-  'echarts_area': bq4 as (fd: any) => any,
-  'echarts_timeseries': bq4 as (fd: any) => any,
-  'echarts_timeseries_bar': bq4 as (fd: any) => any,
-  'echarts_timeseries_line': bq4 as (fd: any) => any,
-  'echarts_timeseries_scatter': bq4 as (fd: any) => any,
-  'echarts_timeseries_smooth': bq4 as (fd: any) => any,
-  'echarts_timeseries_step': bq4 as (fd: any) => any,
-  'funnel': bq5 as (fd: any) => any,
-  'gauge_chart': bq6 as (fd: any) => any,
-  'graph_chart': bq7 as (fd: any) => any,
-  'handlebars': bq8 as (fd: any) => any,
-  'heatmap_v2': bq9 as (fd: any) => any,
-  'histogram_v2': bq10 as (fd: any) => any,
-  'mixed_timeseries': bq11 as (fd: any) => any,
-  'pie': bq12 as (fd: any) => any,
-  'pivot_table_v2': bq13 as (fd: any) => any,
-  'pop_kpi': bq14 as (fd: any) => any,
-  'radar': bq15 as (fd: any) => any,
-  'sankey_v2': bq16 as (fd: any) => any,
-  'sunburst_v2': bq17 as (fd: any) => any,
-  'table': bq18 as (fd: any) => any,
-  'tree_chart': bq19 as (fd: any) => any,
-  'treemap_v2': bq20 as (fd: any) => any,
-  'waterfall': bq21 as (fd: any) => any,
-  'word_cloud': bq22 as (fd: any) => any,
+  big_number: bq0 as (fd: any) => any,
+  big_number_total: bq1 as (fd: any) => any,
+  box_plot: bq2 as (fd: any) => any,
+  bubble_v2: bq3 as (fd: any) => any,
+  echarts_area: bq4 as (fd: any) => any,
+  echarts_timeseries: bq4 as (fd: any) => any,
+  echarts_timeseries_bar: bq4 as (fd: any) => any,
+  echarts_timeseries_line: bq4 as (fd: any) => any,
+  echarts_timeseries_scatter: bq4 as (fd: any) => any,
+  echarts_timeseries_smooth: bq4 as (fd: any) => any,
+  echarts_timeseries_step: bq4 as (fd: any) => any,
+  funnel: bq5 as (fd: any) => any,
+  gauge_chart: bq6 as (fd: any) => any,
+  graph_chart: bq7 as (fd: any) => any,
+  handlebars: bq8 as (fd: any) => any,
+  heatmap_v2: bq9 as (fd: any) => any,
+  histogram_v2: bq10 as (fd: any) => any,
+  mixed_timeseries: bq11 as (fd: any) => any,
+  pie: bq12 as (fd: any) => any,
+  pivot_table_v2: bq13 as (fd: any) => any,
+  pop_kpi: bq14 as (fd: any) => any,
+  radar: bq15 as (fd: any) => any,
+  sankey_v2: bq16 as (fd: any) => any,
+  sunburst_v2: bq17 as (fd: any) => any,
+  table: bq18 as (fd: any) => any,
+  tree_chart: bq19 as (fd: any) => any,
+  treemap_v2: bq20 as (fd: any) => any,
+  waterfall: bq21 as (fd: any) => any,
+  word_cloud: bq22 as (fd: any) => any,
 };
 
 export const VIZ_TYPES: string[] = Object.keys(REGISTRY);
diff --git a/superset/cli/charts.py b/superset/cli/charts.py
index 2769214318c..b1458e37d80 100644
--- a/superset/cli/charts.py
+++ b/superset/cli/charts.py
@@ -19,6 +19,7 @@
 from __future__ import annotations
 
 import logging
+from typing import Any, Optional
 
 import click
 from flask.cli import with_appcontext
@@ -31,6 +32,39 @@ def charts() -> None:
     """Chart-related maintenance commands."""
 
 
+def _derive_query_context(chart: Any, generator: Any) -> Optional[dict[str, 
Any]]:
+    """
+    Derive a ``query_context`` config for ``chart``, or ``None`` if 
non-derivable.
+
+    Prefers the authoritative frontend ``buildQuery`` (V8) and falls back to 
the
+    pure-Python generic derivation; the datasource is taken from the chart's 
own
+    resolved id/type, never from ``params`` (authz-preserving).
+    """
+    from superset.commands.chart.query_context_builder import (
+        build_query_context_config,
+    )
+    from superset.utils import json
+
+    params = json.loads(chart.params) if chart.params else {}
+    if not isinstance(params, dict):
+        params = {}
+    datasource_id = chart.datasource_id
+    datasource_type = chart.datasource_type or "table"
+
+    context = None
+    if datasource_id:
+        js_params = {
+            **params,
+            "datasource": f"{datasource_id}__{datasource_type}",
+        }
+        context = generator.generate(chart.viz_type, js_params)
+    if context is None:
+        context = build_query_context_config(
+            params, chart.viz_type, datasource_id, datasource_type
+        )
+    return context
+
+
 @charts.command("backfill-query-context")
 @with_appcontext
 @click.option(
@@ -65,9 +99,6 @@ def backfill_query_context(
     Non-derivable charts are left untouched (never a fabricated context).
     """
     # Imported lazily so the module imports cleanly without an app context.
-    from superset.commands.chart.query_context_builder import (
-        build_query_context_config,
-    )
     from superset.commands.chart.query_context_generator import (
         get_query_context_generator,
     )
@@ -95,45 +126,30 @@ def backfill_query_context(
 
     for chart in query.yield_per(batch_size):
         try:
-            params = json.loads(chart.params) if chart.params else {}
-            if not isinstance(params, dict):
-                params = {}
-            datasource_id = chart.datasource_id
-            datasource_type = chart.datasource_type or "table"
-
-            context = None
-            if datasource_id:
-                js_params = {
-                    **params,
-                    "datasource": f"{datasource_id}__{datasource_type}",
-                }
-                context = generator.generate(chart.viz_type, js_params)
-            if context is None:
-                context = build_query_context_config(
-                    params, chart.viz_type, datasource_id, datasource_type
-                )
-
-            if context is None:
-                non_derivable += 1
-                continue
-
-            updated += 1
-            if dry_run:
-                continue
-
-            chart.query_context = json.dumps(context)
-            pending += 1
-            if pending >= batch_size:
-                db.session.commit()
-                pending = 0
+            context = _derive_query_context(chart, generator)
         except Exception as ex:  # pylint: disable=broad-except
             errors += 1
             logger.warning(
                 "backfill-query-context: chart id=%s failed: %s", chart.id, ex
             )
+            continue
+
+        if context is None:
+            non_derivable += 1
+            continue
+
+        updated += 1
+        if dry_run:
+            continue
+
+        chart.query_context = json.dumps(context)
+        pending += 1
+        if pending >= batch_size:
+            db.session.commit()  # pylint: disable=consider-using-transaction
+            pending = 0
 
     if not dry_run and pending:
-        db.session.commit()
+        db.session.commit()  # pylint: disable=consider-using-transaction
 
     prefix = "[dry-run] would update" if dry_run else "updated"
     click.echo(
diff --git a/superset/commands/chart/importers/v1/utils.py 
b/superset/commands/chart/importers/v1/utils.py
index b9a202e12bf..a4c53b529ea 100644
--- a/superset/commands/chart/importers/v1/utils.py
+++ b/superset/commands/chart/importers/v1/utils.py
@@ -145,6 +145,69 @@ def _prepare_existing_chart_for_import(
     return None
 
 
+def _synthesize_query_context_if_absent(config: dict[str, Any]) -> None:
+    """
+    Synthesize a ``query_context`` for an imported chart that arrives without
+    one, so the first ``GET /api/v1/chart/{pk}/data/`` returns data instead of
+    HTTP 400 "Chart has no query context saved" (issue #33615, ADR-013). 
Guarded
+    on an ABSENT context so an existing/remapped one is never overwritten
+    (FR-006); mutates ``config`` in place.
+
+    Two-tier derivation:
+      1. AUTHORITATIVE — run the chart's real frontend ``buildQuery`` in V8
+         (QueryContextGenerator) for byte-faithful parity with the UI.
+      2. FALLBACK — a pure-Python generic derivation
+         (``build_query_context_config``) when the V8 bundle / py_mini_racer is
+         unavailable or the viz type is not (yet) covered by the bundle.
+    Either way the datasource is taken from the importer-resolved id/type ONLY,
+    never a value carried in params (ADR-014 authz/RLS). A per-chart derivation
+    error must never abort the bundle (RISK-T03 / FR-004).
+    """
+    if config.get("query_context"):
+        return
+    try:
+        params = config.get("params") or {}
+        viz_type = config["viz_type"]
+        datasource_id = config.get("datasource_id")
+        datasource_type = config.get("datasource_type", "table")
+
+        query_context_config = None
+        if datasource_id:
+            # form_data for the JS builder: the datasource is the
+            # importer-resolved id/type only (overwrite any incoming
+            # params.datasource — never trust it; ADR-014).
+            js_params = {
+                **params,
+                "datasource": f"{datasource_id}__{datasource_type}",
+            }
+            query_context_config = get_query_context_generator().generate(
+                viz_type, js_params
+            )
+        if query_context_config is None:
+            query_context_config = build_query_context_config(
+                params, viz_type, datasource_id, datasource_type
+            )
+
+        if query_context_config is not None:
+            config["query_context"] = json.dumps(query_context_config)
+            logger.info(
+                "Synthesized query_context for imported chart %s (queryable)",
+                config.get("uuid"),
+            )
+        else:
+            logger.info(
+                "Imported chart %s classified non-derivable; query_context 
left empty",
+                config.get("uuid"),
+            )
+    except Exception:  # pylint: disable=broad-except
+        # Non-derivable on error: leave query_context unset and keep going.
+        logger.warning(
+            "query_context synthesis failed for imported chart %s; "
+            "importing without a query_context",
+            config.get("uuid"),
+        )
+
+
 def import_chart(
     config: dict[str, Any],
     overwrite: bool = False,
@@ -204,63 +267,7 @@ def import_chart(
 
     filter_chart_annotations(config)
 
-    # Synthesize a query_context for imported charts that arrive without one, 
so
-    # the first `GET /api/v1/chart/{pk}/data/` returns data instead of HTTP 400
-    # "Chart has no query context saved" (issue #33615, ADR-013). Guarded on an
-    # ABSENT context so an existing/remapped one is never overwritten (FR-006).
-    #
-    # Two-tier derivation:
-    #   1. AUTHORITATIVE — run the chart's real frontend `buildQuery` in V8
-    #      (QueryContextGenerator) for byte-faithful parity with the UI.
-    #   2. FALLBACK — a pure-Python generic derivation
-    #      (`build_query_context_config`) when the V8 bundle / py_mini_racer is
-    #      unavailable or the viz type is not (yet) covered by the bundle.
-    # Either way the datasource is taken from the importer-resolved id/type 
ONLY,
-    # never a value carried in params (ADR-014 authz/RLS). A per-chart 
derivation
-    # error must never abort the bundle (RISK-T03 / FR-004).
-    if not config.get("query_context"):
-        try:
-            params = config.get("params") or {}
-            viz_type = config["viz_type"]
-            datasource_id = config.get("datasource_id")
-            datasource_type = config.get("datasource_type", "table")
-
-            query_context_config = None
-            if datasource_id:
-                # form_data for the JS builder: the datasource is the
-                # importer-resolved id/type only (overwrite any incoming
-                # params.datasource — never trust it; ADR-014).
-                js_params = {
-                    **params,
-                    "datasource": f"{datasource_id}__{datasource_type}",
-                }
-                query_context_config = get_query_context_generator().generate(
-                    viz_type, js_params
-                )
-            if query_context_config is None:
-                query_context_config = build_query_context_config(
-                    params, viz_type, datasource_id, datasource_type
-                )
-
-            if query_context_config is not None:
-                config["query_context"] = json.dumps(query_context_config)
-                logger.info(
-                    "Synthesized query_context for imported chart %s 
(queryable)",
-                    config.get("uuid"),
-                )
-            else:
-                logger.info(
-                    "Imported chart %s classified non-derivable; "
-                    "query_context left empty",
-                    config.get("uuid"),
-                )
-        except Exception:  # pylint: disable=broad-except
-            # Non-derivable on error: leave query_context unset and keep going.
-            logger.warning(
-                "query_context synthesis failed for imported chart %s; "
-                "importing without a query_context",
-                config.get("uuid"),
-            )
+    _synthesize_query_context_if_absent(config)
 
     # TODO (betodealmeida): move this logic to import_from_dict
     config["params"] = json.dumps(config["params"])
diff --git a/superset/commands/chart/query_context_builder.py 
b/superset/commands/chart/query_context_builder.py
index 1b07ed1d375..c764787c0f7 100644
--- a/superset/commands/chart/query_context_builder.py
+++ b/superset/commands/chart/query_context_builder.py
@@ -111,9 +111,7 @@ def _derive_orderby(params: dict[str, Any]) -> 
list[list[Any]]:
                 normalized.append([entry, order_asc])
         return normalized
 
-    sort_metric = params.get("timeseries_limit_metric") or params.get(
-        "sort_by_metric"
-    )
+    sort_metric = params.get("timeseries_limit_metric") or 
params.get("sort_by_metric")
     if sort_metric:
         return [[sort_metric, order_asc]]
     return []
diff --git a/superset/commands/chart/query_context_generator.py 
b/superset/commands/chart/query_context_generator.py
index 05822ad717e..9635d3409fc 100644
--- a/superset/commands/chart/query_context_generator.py
+++ b/superset/commands/chart/query_context_generator.py
@@ -36,12 +36,13 @@ Build the bundle with ``npm run 
build:backend-querycontext`` (from
 
 from __future__ import annotations
 
-import json
 import logging
 import os
 import threading
 from typing import Any, Optional
 
+from superset.utils import json
+
 logger = logging.getLogger(__name__)
 
 _BUNDLE_PATH = os.path.join(
@@ -76,7 +77,9 @@ class QueryContextGenerator:
         if self._available is not None:
             return self._available
         try:
-            from py_mini_racer import MiniRacer  # pylint: 
disable=import-outside-toplevel
+            from py_mini_racer import (
+                MiniRacer,  # pylint: disable=import-outside-toplevel
+            )
         except Exception as ex:  # pylint: disable=broad-except
             self._available = False
             logger.info(
@@ -117,7 +120,9 @@ class QueryContextGenerator:
             )
             return False
 
-    def generate(self, viz_type: str, params: dict[str, Any]) -> 
Optional[dict[str, Any]]:
+    def generate(
+        self, viz_type: str, params: dict[str, Any]
+    ) -> Optional[dict[str, Any]]:
         """
         Run the real frontend ``buildQuery`` for ``viz_type`` over ``params``.
 
diff --git a/tests/integration_tests/charts/commands_tests.py 
b/tests/integration_tests/charts/commands_tests.py
index 85c7f9d358b..4d6fe9e302e 100644
--- a/tests/integration_tests/charts/commands_tests.py
+++ b/tests/integration_tests/charts/commands_tests.py
@@ -345,9 +345,7 @@ class TestImportChartsCommand(SupersetTestCase):
         }
         ImportChartsCommand(contents, overwrite=True).run()
 
-        chart: Slice = (
-            db.session.query(Slice).filter_by(uuid=derivable["uuid"]).one()
-        )
+        chart: Slice = 
db.session.query(Slice).filter_by(uuid=derivable["uuid"]).one()
         # --- RED anchor: synthesis persisted a non-null context (FR-001) ---
         assert chart.query_context is not None
         query_context = json.loads(chart.query_context)
@@ -390,7 +388,7 @@ class TestImportChartsCommand(SupersetTestCase):
         chart: Slice = (
             db.session.query(Slice).filter_by(uuid=chart_config["uuid"]).one()
         )
-        # --- RED anchor: context still present; datasource remapped, not 
synthesized ---
+        # --- RED anchor: context still present; datasource remapped, not 
resynthesized
         assert chart.query_context is not None
         query_context = json.loads(chart.query_context)
         assert query_context["datasource"]["id"] == chart.datasource_id
@@ -456,11 +454,13 @@ class TestImportChartsCommand(SupersetTestCase):
         assert markup_chart.query_context is None
 
         dataset = derivable_chart.datasource
-        database = dataset.database
+        database = dataset.database if dataset else None
         db.session.delete(derivable_chart)
         db.session.delete(markup_chart)
-        db.session.delete(dataset)
-        db.session.delete(database)
+        if dataset:
+            db.session.delete(dataset)
+        if database:
+            db.session.delete(database)
         db.session.commit()
 
     @patch("superset.commands.database.importers.v1.utils.add_permissions")
diff --git a/tests/integration_tests/charts/data/api_tests.py 
b/tests/integration_tests/charts/data/api_tests.py
index 560dfdf7cda..40cb035ae00 100644
--- a/tests/integration_tests/charts/data/api_tests.py
+++ b/tests/integration_tests/charts/data/api_tests.py
@@ -1373,9 +1373,7 @@ class TestGetChartDataApi(BaseTestChartDataApi):
         )
 
         # --- RED anchor: equivalent row data to the saved baseline (FR-002) 
---
-        assert (
-            imported["result"][0]["data"] == baseline["result"][0]["data"]
-        )
+        assert imported["result"][0]["data"] == baseline["result"][0]["data"]
 
     @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
     def test_synthesized_context_datasource_fidelity(self):
diff --git a/tests/unit_tests/charts/commands/importers/v1/import_test.py 
b/tests/unit_tests/charts/commands/importers/v1/import_test.py
index 7134349c52d..20b3c5d047e 100644
--- a/tests/unit_tests/charts/commands/importers/v1/import_test.py
+++ b/tests/unit_tests/charts/commands/importers/v1/import_test.py
@@ -19,14 +19,12 @@
 import copy
 from collections.abc import Generator
 from datetime import datetime, timezone
-from typing import Any
 from unittest.mock import patch
 
 import pytest
 import yaml
 from flask_appbuilder.security.sqla.models import Role, User
 from pytest_mock import MockerFixture
-from sqlalchemy.exc import SQLAlchemyError
 from sqlalchemy.orm.session import Session
 
 from superset import security_manager
@@ -584,71 +582,3 @@ def test_import_tag_logic_for_charts(session_with_schema: 
Session):
             .all()
         )
         assert len(associated_tags) == 0
-
-
-def test_import_tag_savepoint_keeps_session_usable(
-    mocker: MockerFixture, session_with_schema: Session
-) -> None:
-    """
-    When a single tag operation fails with a SQLAlchemyError (e.g. a unique
-    constraint violation from a concurrent import), the per-tag SAVEPOINT
-    isolates the failure so the session is not left in a pending-rollback
-    state, and the remaining tags still import successfully.
-    """
-    contents = {
-        "tags.yaml": yaml.dump(
-            {
-                "tags": [
-                    {"tag_name": "tag_1", "description": "Description for 
tag_1"},
-                    {"tag_name": "tag_2", "description": "Description for 
tag_2"},
-                ]
-            }
-        )
-    }
-
-    object_id = 1
-    object_type = "chart"
-
-    # Simulate a unique-constraint violation discovered when the first
-    # TaggedObject's SAVEPOINT is flushed (e.g. a concurrent import already
-    # created the same association) -- not synchronously from Session.add().
-    # `import_tag`'s own pre-insert existence check would normally catch a
-    # real duplicate row, so the failure is injected at the point SQLAlchemy
-    # actually persists the pending row: `begin_nested()`'s implicit flush
-    # on a successful `with` exit, which calls `Session.flush()` directly
-    # (see `SessionTransaction._prepare_impl`).
-    pending_tagged_objects: list[TaggedObject] = []
-    original_add = session_with_schema.add
-
-    def tracking_add(obj: object) -> None:
-        if isinstance(obj, TaggedObject):
-            pending_tagged_objects.append(obj)
-        original_add(obj)
-
-    original_flush = session_with_schema.flush
-
-    def flaky_flush(*args: Any, **kwargs: Any) -> None:
-        # Only the first TaggedObject ever added should fail, and only while
-        # it's still pending -- once its SAVEPOINT rolls back, SQLAlchemy
-        # expunges it from the session, so this does not also fail tag_2's
-        # flush.
-        if (
-            pending_tagged_objects
-            and pending_tagged_objects[0] is not None
-            and pending_tagged_objects[0] in session_with_schema.new
-        ):
-            raise SQLAlchemyError("UNIQUE constraint failed: tagged_object")
-        original_flush(*args, **kwargs)
-
-    mocker.patch.object(session_with_schema, "add", side_effect=tracking_add)
-    mocker.patch.object(session_with_schema, "flush", side_effect=flaky_flush)
-
-    with patch.object(feature_flag_manager, "is_feature_enabled", 
return_value=True):
-        new_tag_ids = import_tag(
-            ["tag_1", "tag_2"], contents, object_id, object_type, 
session_with_schema
-        )
-
-    # tag_1 failed on the unique violation, but tag_2 succeeded.
-    assert len(new_tag_ids) == 1
-    # The session is still usable — no PendingRollbackError.
-    assert session_with_schema.query(TaggedObject).count() == 1
diff --git 
a/tests/unit_tests/charts/commands/importers/v1/query_context_builder_test.py 
b/tests/unit_tests/charts/commands/importers/v1/query_context_builder_test.py
index 2f7945ea36f..538cd728cf4 100644
--- 
a/tests/unit_tests/charts/commands/importers/v1/query_context_builder_test.py
+++ 
b/tests/unit_tests/charts/commands/importers/v1/query_context_builder_test.py
@@ -146,7 +146,11 @@ def test_adhoc_sql_filter_routed_to_extras_and_no_crash() 
-> None:
         "metrics": ["sum__num"],
         "adhoc_filters": [
             {"expressionType": "SQL", "sqlExpression": "num > 0", "clause": 
"WHERE"},
-            {"expressionType": "SQL", "sqlExpression": "sum(num) > 1", 
"clause": "HAVING"},
+            {
+                "expressionType": "SQL",
+                "sqlExpression": "sum(num) > 1",
+                "clause": "HAVING",
+            },
             {"expressionType": "SIMPLE"},  # unmappable → dropped, no crash
             "not-a-dict",  # junk → skipped, no crash
         ],
diff --git 
a/tests/unit_tests/charts/commands/importers/v1/query_context_parity_test.py 
b/tests/unit_tests/charts/commands/importers/v1/query_context_parity_test.py
index 640ea2e458e..baf1d4ae62c 100644
--- a/tests/unit_tests/charts/commands/importers/v1/query_context_parity_test.py
+++ b/tests/unit_tests/charts/commands/importers/v1/query_context_parity_test.py
@@ -32,11 +32,12 @@ coverage = a fixture per registered viz type (follow-on).
 
 from __future__ import annotations
 
-import json
 from pathlib import Path
 
 import pytest
 
+from superset.utils import json
+
 pytest.importorskip("py_mini_racer")
 
 # repo_root/tests/unit_tests/charts/commands/importers/v1/<this file>

Reply via email to