You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2023/08/18 00:02:26 UTC

[superset] branch 2.1 updated (ae2eaba8cd -> 1f104a0c50)

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

elizabeth pushed a change to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git


    omit ae2eaba8cd lint
    omit e825aff7ad fix: update permalink schema (#24970)
    omit 8a92c928e2 fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)
    omit 8405ec4ae7 fix(sqllab): normalize changedOn timestamp (#24513)
    omit 8e7e10463c fix: Dashboard not loading with default first value in filter (#23512)
    omit 856a56e450 update changelog
     new 4be3fa218f fix: Dashboard not loading with default first value in filter (#23512)
     new dd3877a2d3 fix(sqllab): normalize changedOn timestamp (#24513)
     new 2f19b12a22 fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)
     new d0588f7668 fix: update permalink schema (#24970)
     new c03cfa6485 lint
     new 1f104a0c50 update changelog

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (ae2eaba8cd)
            \
             N -- N -- N   refs/heads/2.1 (1f104a0c50)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGELOG.md | 4 ++++
 1 file changed, 4 insertions(+)


[superset] 01/06: fix: Dashboard not loading with default first value in filter (#23512)

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 4be3fa218f68ea96b41236977695f71fa5bbc2d2
Author: Geido <60...@users.noreply.github.com>
AuthorDate: Wed Mar 29 18:18:08 2023 +0200

    fix: Dashboard not loading with default first value in filter (#23512)
---
 .../src/filters/components/Select/SelectFilterPlugin.tsx           | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
index 7de9efcfaf..50f87b655d 100644
--- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
+++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
@@ -128,7 +128,6 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) {
         enableEmptyFilter && !inverseSelection && !values?.length;
 
       const suffix = inverseSelection && values?.length ? t(' (excluded)') : '';
-
       dispatchDataMask({
         type: 'filterState',
         __cache: filterState,
@@ -289,13 +288,9 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) {
     updateDataMask,
     data,
     groupby,
-    JSON.stringify(filterState),
+    JSON.stringify(filterState.value),
   ]);
 
-  useEffect(() => {
-    updateDataMask(filterState.value);
-  }, [JSON.stringify(filterState.value)]);
-
   useEffect(() => {
     setDataMask(dataMask);
   }, [JSON.stringify(dataMask)]);


[superset] 05/06: lint

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit c03cfa6485f2c4b0a365604c3b3006db750a0f5c
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Thu Aug 17 16:56:07 2023 -0700

    lint
---
 .../plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts        | 1 -
 1 file changed, 1 deletion(-)

diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
index 4cbcfae230..cdfeb8c61f 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
@@ -28,7 +28,6 @@ import {
   isTimeseriesAnnotationLayer,
   TimeseriesChartDataResponseResult,
   t,
-  AxisType,
   getXAxisLabel,
   isPhysicalColumn,
   isDefined,


[superset] 04/06: fix: update permalink schema (#24970)

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit d0588f766835ae90c43c8923fa00847edfa6767e
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Wed Aug 16 09:56:20 2023 -0700

    fix: update permalink schema (#24970)
---
 docs/static/resources/openapi.json | 4751 +++++++++++++++++++++++++++++-------
 superset/explore/permalink/api.py  |    2 +-
 2 files changed, 3843 insertions(+), 910 deletions(-)

diff --git a/docs/static/resources/openapi.json b/docs/static/resources/openapi.json
index 18ea7a47f8..6ad0be5756 100644
--- a/docs/static/resources/openapi.json
+++ b/docs/static/resources/openapi.json
@@ -311,8 +311,7 @@
           },
           "width": {
             "description": "Width of annotation line",
-            "format": "float",
-            "minimum": 0,
+            "minimum": 0.0,
             "type": "number"
           }
         },
@@ -331,7 +330,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -345,7 +343,7 @@
       "AnnotationLayerRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User"
+            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User1"
           },
           "changed_on": {
             "format": "date-time",
@@ -356,7 +354,7 @@
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User1"
+            "$ref": "#/components/schemas/AnnotationLayerRestApi.get_list.User"
           },
           "created_on": {
             "format": "date-time",
@@ -368,7 +366,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -455,7 +452,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -488,7 +484,6 @@
       "AnnotationRestApi.get.AnnotationLayer": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -502,13 +497,13 @@
       "AnnotationRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User"
+            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User1"
           },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User1"
+            "$ref": "#/components/schemas/AnnotationRestApi.get_list.User"
           },
           "end_dttm": {
             "format": "date-time",
@@ -516,7 +511,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "long_descr": {
@@ -543,7 +537,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -559,7 +552,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -668,7 +660,6 @@
       "CacheRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -677,7 +668,6 @@
       "CacheRestApi.get_list": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -686,7 +676,6 @@
       "CacheRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -695,7 +684,6 @@
       "CacheRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -718,10 +706,59 @@
         },
         "type": "object"
       },
+      "ChartCacheWarmUpRequestSchema": {
+        "properties": {
+          "chart_id": {
+            "description": "The ID of the chart to warm up cache for",
+            "type": "integer"
+          },
+          "dashboard_id": {
+            "description": "The ID of the dashboard to get filters for when warming cache",
+            "type": "integer"
+          },
+          "extra_filters": {
+            "description": "Extra filters to apply when warming up cache",
+            "type": "string"
+          }
+        },
+        "required": [
+          "chart_id"
+        ],
+        "type": "object"
+      },
+      "ChartCacheWarmUpResponseSchema": {
+        "properties": {
+          "result": {
+            "description": "A list of each chart's warmup status and errors if any",
+            "items": {
+              "$ref": "#/components/schemas/ChartCacheWarmUpResponseSingle"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "ChartCacheWarmUpResponseSingle": {
+        "properties": {
+          "chart_id": {
+            "description": "The ID of the chart the status belongs to",
+            "type": "integer"
+          },
+          "viz_error": {
+            "description": "Error that occurred when warming cache for chart",
+            "type": "string"
+          },
+          "viz_status": {
+            "description": "Status of the underlying query for the viz",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
       "ChartDataAdhocMetricSchema": {
         "properties": {
           "aggregate": {
-            "description": "Aggregation operator. Only required for simple expression types.",
+            "description": "Aggregation operator.Only required for simple expression types.",
             "enum": [
               "AVG",
               "COUNT",
@@ -754,12 +791,12 @@
             "type": "boolean"
           },
           "label": {
-            "description": "Label for the metric. Is automatically generated unless hasCustomLabel is true, in which case label must be defined.",
+            "description": "Label for the metric. Is automatically generated unlesshasCustomLabel is true, in which case label must be defined.",
             "example": "Weighted observations",
             "type": "string"
           },
           "optionName": {
-            "description": "Unique identifier. Can be any string value, as long as all metrics have a unique identifier. If undefined, a random name will be generated.",
+            "description": "Unique identifier. Can be any string value, as long as all metrics have a unique identifier. If undefined, a random namewill be generated.",
             "example": "metric_aec60732-fac0-4b17-b736-93f1a5c93e30",
             "type": "string"
           },
@@ -898,7 +935,6 @@
         "properties": {
           "id": {
             "description": "Datasource id",
-            "format": "int32",
             "type": "integer"
           },
           "type": {
@@ -925,13 +961,6 @@
             "description": "HAVING clause to be added to aggregate queries using AND operator.",
             "type": "string"
           },
-          "having_druid": {
-            "description": "HAVING filters to be added to legacy Druid datasource queries. This field is deprecated",
-            "items": {
-              "$ref": "#/components/schemas/ChartDataFilter"
-            },
-            "type": "array"
-          },
           "relative_end": {
             "description": "End time for relative time deltas. Default: `config[\"DEFAULT_RELATIVE_START_TIME\"]`",
             "enum": [
@@ -969,7 +998,12 @@
               "1969-12-28T00:00:00Z/P1W",
               "1969-12-29T00:00:00Z/P1W",
               "P1W/1970-01-03T00:00:00Z",
-              "P1W/1970-01-04T00:00:00Z"
+              "P1W/1970-01-04T00:00:00Z",
+              "PT2H",
+              "PT4H",
+              "PT8H",
+              "PT10H",
+              "PT12H"
             ],
             "example": "P1D",
             "nullable": true,
@@ -1012,7 +1046,6 @@
               "IS NOT NULL",
               "IN",
               "NOT IN",
-              "REGEX",
               "IS TRUE",
               "IS FALSE",
               "TEMPORAL_RANGE"
@@ -1213,9 +1246,8 @@
           "confidence_interval": {
             "description": "Width of predicted confidence interval",
             "example": 0.8,
-            "format": "float",
-            "maximum": 1,
-            "minimum": 0,
+            "maximum": 1.0,
+            "minimum": 0.0,
             "type": "number"
           },
           "monthly_seasonality": {
@@ -1225,7 +1257,6 @@
           "periods": {
             "description": "Time periods (in units of `time_grain`) to predict into the future",
             "example": 7,
-            "format": "int32",
             "type": "integer"
           },
           "time_grain": {
@@ -1249,7 +1280,12 @@
               "1969-12-28T00:00:00Z/P1W",
               "1969-12-29T00:00:00Z/P1W",
               "P1W/1970-01-03T00:00:00Z",
-              "P1W/1970-01-04T00:00:00Z"
+              "P1W/1970-01-04T00:00:00Z",
+              "PT2H",
+              "PT4H",
+              "PT8H",
+              "PT10H",
+              "PT12H"
             ],
             "example": "P1D",
             "type": "string"
@@ -1274,7 +1310,6 @@
         "properties": {
           "custom_cache_timeout": {
             "description": "Override the default cache timeout",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1295,8 +1330,25 @@
             },
             "type": "array"
           },
-          "result_format": {},
-          "result_type": {}
+          "result_format": {
+            "enum": [
+              "csv",
+              "json",
+              "xlsx"
+            ]
+          },
+          "result_type": {
+            "enum": [
+              "columns",
+              "full",
+              "query",
+              "results",
+              "samples",
+              "timegrains",
+              "post_processed",
+              "drill_detail"
+            ]
+          }
         },
         "type": "object"
       },
@@ -1337,11 +1389,6 @@
             ],
             "nullable": true
           },
-          "druid_time_origin": {
-            "description": "Starting point for time grain counting on legacy Druid datasources. Used to change e.g. Monday/Sunday first-day-of-week. This field is deprecated and should be passed to `extras` as `druid_time_origin`.",
-            "nullable": true,
-            "type": "string"
-          },
           "extras": {
             "allOf": [
               {
@@ -1359,11 +1406,12 @@
             "type": "array"
           },
           "granularity": {
-            "description": "Name of temporal column used for time filtering. For legacy Druid datasources this defines the time grain.",
+            "description": "Name of temporal column used for time filtering. ",
             "nullable": true,
             "type": "string"
           },
           "granularity_sqla": {
+            "deprecated": true,
             "description": "Name of temporal column used for time filtering for SQL datasources. This field is deprecated, use `granularity` instead.",
             "nullable": true,
             "type": "string"
@@ -1375,18 +1423,11 @@
             "type": "array"
           },
           "having": {
+            "deprecated": true,
             "description": "HAVING clause to be added to aggregate queries using AND operator. This field is deprecated and should be passed to `extras`.",
             "nullable": true,
             "type": "string"
           },
-          "having_filters": {
-            "description": "HAVING filters to be added to legacy Druid datasource queries. This field is deprecated and should be passed to `extras` as `having_druid`.",
-            "items": {
-              "$ref": "#/components/schemas/ChartDataFilter"
-            },
-            "nullable": true,
-            "type": "array"
-          },
           "is_rowcount": {
             "description": "Should the rowcount of the actual query be returned",
             "nullable": true,
@@ -1438,18 +1479,26 @@
             "type": "array"
           },
           "result_type": {
+            "enum": [
+              "columns",
+              "full",
+              "query",
+              "results",
+              "samples",
+              "timegrains",
+              "post_processed",
+              "drill_detail"
+            ],
             "nullable": true
           },
           "row_limit": {
             "description": "Maximum row count (0=disabled). Default: `config[\"ROW_LIMIT\"]`",
-            "format": "int32",
             "minimum": 0,
             "nullable": true,
             "type": "integer"
           },
           "row_offset": {
             "description": "Number of rows to skip. Default: `0`",
-            "format": "int32",
             "minimum": 0,
             "nullable": true,
             "type": "integer"
@@ -1462,7 +1511,6 @@
           },
           "series_limit": {
             "description": "Maximum number of series. Requires `series` and `series_limit_metric` to be set.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1490,7 +1538,6 @@
           },
           "timeseries_limit": {
             "description": "Maximum row count for timeseries queries. This field is deprecated, use `series_limit` instead.Default: `0`",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1503,11 +1550,12 @@
               "description": "The value of the query parameter",
               "type": "string"
             },
-            "description": "Optional query parameters passed to a dashboard or Explore view",
+            "description": "Optional query parameters passed to a dashboard or Explore  view",
             "nullable": true,
             "type": "object"
           },
           "where": {
+            "deprecated": true,
             "description": "WHERE clause to be added to queries using AND operator.This field is deprecated and should be passed to `extras`.",
             "nullable": true,
             "type": "string"
@@ -1542,7 +1590,6 @@
           },
           "cache_timeout": {
             "description": "Cache timeout in following order: custom timeout, datasource timeout, cache default timeout, config default cache timeout.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1561,7 +1608,6 @@
           "coltypes": {
             "description": "A list of generic data types of each column",
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -1580,7 +1626,6 @@
           },
           "from_dttm": {
             "description": "Start timestamp of time range",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1601,7 +1646,6 @@
           },
           "rowcount": {
             "description": "Amount of rows in result set",
-            "format": "int32",
             "type": "integer"
           },
           "stacktrace": {
@@ -1624,7 +1668,6 @@
           },
           "to_dttm": {
             "description": "End timestamp of time range",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -1653,7 +1696,6 @@
       "ChartDataRestApi.get": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1676,7 +1718,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -1698,6 +1739,9 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartDataRestApi.get.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -1720,7 +1764,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -1730,6 +1773,27 @@
         },
         "type": "object"
       },
+      "ChartDataRestApi.get.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "ChartDataRestApi.get.User": {
         "properties": {
           "first_name": {
@@ -1737,29 +1801,22 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
       "ChartDataRestApi.get_list": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1772,22 +1829,25 @@
             "type": "string"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User3"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
+          "changed_on_delta_humanized": {
             "readOnly": true
           },
-          "changed_on_delta_humanized": {
+          "changed_on_dttm": {
             "readOnly": true
           },
           "changed_on_utc": {
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User2"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User"
+          },
+          "created_by_name": {
+            "readOnly": true
           },
           "created_on_delta_humanized": {
             "readOnly": true
@@ -1796,7 +1856,6 @@
             "$ref": "#/components/schemas/ChartDataRestApi.get_list.Dashboard"
           },
           "datasource_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -1821,8 +1880,10 @@
           "edit_url": {
             "readOnly": true
           },
+          "form_data": {
+            "readOnly": true
+          },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -1834,7 +1895,7 @@
             "type": "string"
           },
           "last_saved_by": {
-            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User3"
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.User2"
           },
           "owners": {
             "$ref": "#/components/schemas/ChartDataRestApi.get_list.User1"
@@ -1848,9 +1909,15 @@
             "nullable": true,
             "type": "string"
           },
+          "slice_url": {
+            "readOnly": true
+          },
           "table": {
             "$ref": "#/components/schemas/ChartDataRestApi.get_list.SqlaTable"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartDataRestApi.get_list.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -1873,7 +1940,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -1895,12 +1961,36 @@
         ],
         "type": "object"
       },
+      "ChartDataRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "ChartDataRestApi.get_list.User": {
         "properties": {
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
+          "id": {
+            "type": "integer"
+          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
@@ -1919,22 +2009,16 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
@@ -1945,7 +2029,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -1965,10 +2048,6 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
@@ -1984,7 +2063,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2001,14 +2079,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_name": {
@@ -2044,7 +2120,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2074,7 +2149,6 @@
             "description": "The type of chart visualization used.",
             "example": [
               "bar",
-              "line_multi",
               "area",
               "table"
             ],
@@ -2094,7 +2168,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2111,14 +2184,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2151,7 +2222,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2178,11 +2248,16 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "items": {
+              "$ref": "#/components/schemas/Tag"
+            },
+            "type": "array"
+          },
           "viz_type": {
             "description": "The type of chart visualization used.",
             "example": [
               "bar",
-              "line_multi",
               "area",
               "table"
             ],
@@ -2197,14 +2272,13 @@
       "ChartDataRollingOptionsSchema": {
         "properties": {
           "center": {
-            "description": "Should the label be at the center of the window. Default: `false`",
+            "description": "Should the label be at the center of the window.Default: `false`",
             "example": false,
             "type": "boolean"
           },
           "min_periods": {
             "description": "The minimum amount of periods required for a row to be included in the result set.",
             "example": 7,
-            "format": "int32",
             "type": "integer"
           },
           "rolling_type": {
@@ -2241,7 +2315,7 @@
             "type": "object"
           },
           "win_type": {
-            "description": "Type of window function. See [SciPy window functions](https://docs.scipy.org/doc/scipy/reference/signal.windows.html#module-scipy.signal.windows) for more details. Some window functions require passing additional parameters to `rolling_type_options`. For instance, to use `gaussian`, the parameter `std` needs to be provided.",
+            "description": "Type of window function. See [SciPy window functions](https://docs.scipy.org/doc/scipy/reference /signal.windows.html#module-scipy.signal.windows) for more details. Some window functions require passing additional parameters to `rolling_type_options`. For instance, to use `gaussian`, the parameter `std` needs to be provided.",
             "enum": [
               "boxcar",
               "triang",
@@ -2264,7 +2338,6 @@
           "window": {
             "description": "Size of the rolling window in days.",
             "example": 7,
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -2346,7 +2419,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "type": "integer"
           },
           "certification_details": {
@@ -2359,6 +2431,7 @@
           },
           "changed_on": {
             "description": "The ISO date that the chart was last changed.",
+            "format": "date-time",
             "type": "string"
           },
           "description": {
@@ -2375,7 +2448,6 @@
           },
           "id": {
             "description": "The id of the chart.",
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -2393,7 +2465,6 @@
         "properties": {
           "id": {
             "description": "The Chart id",
-            "format": "int32",
             "type": "integer"
           },
           "value": {
@@ -2407,12 +2478,10 @@
         "properties": {
           "datasource_id": {
             "description": "The datasource identifier",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_type": {
             "description": "The datasource type",
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -2434,7 +2503,6 @@
         "properties": {
           "count": {
             "description": "The total number of datasources",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -2446,7 +2514,6 @@
       "ChartRestApi.get": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2469,7 +2536,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -2491,6 +2557,9 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartRestApi.get.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -2513,7 +2582,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -2523,6 +2591,27 @@
         },
         "type": "object"
       },
+      "ChartRestApi.get.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "ChartRestApi.get.User": {
         "properties": {
           "first_name": {
@@ -2530,29 +2619,22 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
       "ChartRestApi.get_list": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2565,22 +2647,25 @@
             "type": "string"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User3"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
+          "changed_on_delta_humanized": {
             "readOnly": true
           },
-          "changed_on_delta_humanized": {
+          "changed_on_dttm": {
             "readOnly": true
           },
           "changed_on_utc": {
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User2"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User"
+          },
+          "created_by_name": {
+            "readOnly": true
           },
           "created_on_delta_humanized": {
             "readOnly": true
@@ -2589,7 +2674,6 @@
             "$ref": "#/components/schemas/ChartRestApi.get_list.Dashboard"
           },
           "datasource_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2614,8 +2698,10 @@
           "edit_url": {
             "readOnly": true
           },
+          "form_data": {
+            "readOnly": true
+          },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -2627,7 +2713,7 @@
             "type": "string"
           },
           "last_saved_by": {
-            "$ref": "#/components/schemas/ChartRestApi.get_list.User3"
+            "$ref": "#/components/schemas/ChartRestApi.get_list.User2"
           },
           "owners": {
             "$ref": "#/components/schemas/ChartRestApi.get_list.User1"
@@ -2641,9 +2727,15 @@
             "nullable": true,
             "type": "string"
           },
+          "slice_url": {
+            "readOnly": true
+          },
           "table": {
             "$ref": "#/components/schemas/ChartRestApi.get_list.SqlaTable"
           },
+          "tags": {
+            "$ref": "#/components/schemas/ChartRestApi.get_list.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -2666,7 +2758,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -2688,12 +2779,36 @@
         ],
         "type": "object"
       },
+      "ChartRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "ChartRestApi.get_list.User": {
         "properties": {
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
+          "id": {
+            "type": "integer"
+          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
@@ -2712,22 +2827,16 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
@@ -2738,7 +2847,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -2758,10 +2866,6 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
@@ -2777,7 +2881,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2794,14 +2897,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_name": {
@@ -2837,7 +2938,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2867,7 +2967,6 @@
             "description": "The type of chart visualization used.",
             "example": [
               "bar",
-              "line_multi",
               "area",
               "table"
             ],
@@ -2887,7 +2986,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2904,14 +3002,12 @@
           "dashboards": {
             "items": {
               "description": "A list of dashboards to include this new chart to.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
           },
           "datasource_id": {
             "description": "The id of the dataset/datasource this new chart will use. A complete datasource identification needs `datasouce_id` and `datasource_type`.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -2944,7 +3040,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this chart. If left empty you will be one of the owners of the chart.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -2971,11 +3066,16 @@
             "nullable": true,
             "type": "string"
           },
+          "tags": {
+            "items": {
+              "$ref": "#/components/schemas/Tag"
+            },
+            "type": "array"
+          },
           "viz_type": {
             "description": "The type of chart visualization used.",
             "example": [
               "bar",
-              "line_multi",
               "area",
               "table"
             ],
@@ -2997,7 +3097,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "template_name": {
@@ -3015,7 +3114,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -3032,13 +3130,13 @@
       "CssTemplateRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User"
+            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User1"
           },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User1"
+            "$ref": "#/components/schemas/CssTemplateRestApi.get_list.User"
           },
           "created_on": {
             "format": "date-time",
@@ -3050,7 +3148,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "template_name": {
@@ -3068,7 +3165,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -3089,7 +3185,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -3131,10 +3226,36 @@
         },
         "type": "object"
       },
+      "DashboardCopySchema": {
+        "properties": {
+          "css": {
+            "description": "Override CSS for the dashboard.",
+            "type": "string"
+          },
+          "dashboard_title": {
+            "description": "A title for the dashboard.",
+            "maxLength": 500,
+            "minLength": 0,
+            "nullable": true,
+            "type": "string"
+          },
+          "duplicate_slices": {
+            "description": "Whether or not to also copy all charts on the dashboard",
+            "type": "boolean"
+          },
+          "json_metadata": {
+            "description": "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter  specific parameters.",
+            "type": "string"
+          }
+        },
+        "required": [
+          "json_metadata"
+        ],
+        "type": "object"
+      },
       "DashboardDatasetSchema": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "type": "integer"
           },
           "column_formats": {
@@ -3142,7 +3263,6 @@
           },
           "column_types": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -3153,6 +3273,9 @@
             },
             "type": "array"
           },
+          "currency_formats": {
+            "type": "object"
+          },
           "database": {
             "$ref": "#/components/schemas/Database"
           },
@@ -3187,7 +3310,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_sqllab_view": {
@@ -3206,7 +3328,6 @@
             "type": "string"
           },
           "offset": {
-            "format": "int32",
             "type": "integer"
           },
           "order_by_choices": {
@@ -3285,9 +3406,6 @@
           "changed_by_name": {
             "type": "string"
           },
-          "changed_by_url": {
-            "type": "string"
-          },
           "changed_on": {
             "format": "date-time",
             "type": "string"
@@ -3311,7 +3429,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -3344,16 +3461,22 @@
           "slug": {
             "type": "string"
           },
-          "thumbnail_url": {
-            "type": "string"
-          },
+          "tags": {
+            "items": {
+              "$ref": "#/components/schemas/Tag1"
+            },
+            "type": "array"
+          },
+          "thumbnail_url": {
+            "type": "string"
+          },
           "url": {
             "type": "string"
           }
         },
         "type": "object"
       },
-      "DashboardPermalinkPostSchema": {
+      "DashboardPermalinkStateSchema": {
         "properties": {
           "activeTabs": {
             "description": "Current active dashboard tabs",
@@ -3388,7 +3511,6 @@
       "DashboardRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -3405,14 +3527,11 @@
             "type": "string"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/DashboardRestApi.get_list.User"
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.User2"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
-            "readOnly": true
-          },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
@@ -3420,7 +3539,7 @@
             "readOnly": true
           },
           "created_by": {
-            "$ref": "#/components/schemas/DashboardRestApi.get_list.User2"
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.User"
           },
           "created_on_delta_humanized": {
             "readOnly": true
@@ -3435,7 +3554,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -3467,6 +3585,9 @@
           "status": {
             "readOnly": true
           },
+          "tags": {
+            "$ref": "#/components/schemas/DashboardRestApi.get_list.Tag"
+          },
           "thumbnail_url": {
             "readOnly": true
           },
@@ -3479,7 +3600,6 @@
       "DashboardRestApi.get_list.Role": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -3492,6 +3612,27 @@
         ],
         "type": "object"
       },
+      "DashboardRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "DashboardRestApi.get_list.User": {
         "properties": {
           "first_name": {
@@ -3499,53 +3640,36 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
       "DashboardRestApi.get_list.User1": {
         "properties": {
-          "email": {
-            "maxLength": 64,
-            "type": "string"
-          },
           "first_name": {
             "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
-          "email",
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
@@ -3556,7 +3680,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -3583,6 +3706,7 @@
             "type": "string"
           },
           "css": {
+            "description": "Override CSS for the dashboard.",
             "type": "string"
           },
           "dashboard_title": {
@@ -3607,7 +3731,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this dashboard. If left empty you will be one of the owners of the dashboard.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -3623,7 +3746,6 @@
           "roles": {
             "items": {
               "description": "Roles is a list which defines access to the dashboard. These roles are always applied in addition to restrictions on dataset level access. If no roles defined then the dashboard is available to all roles.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -3678,7 +3800,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this dashboard. If left empty you will be one of the owners of the dashboard.",
-              "format": "int32",
               "nullable": true,
               "type": "integer"
             },
@@ -3697,7 +3818,6 @@
           "roles": {
             "items": {
               "description": "Roles is a list which defines access to the dashboard. These roles are always applied in addition to restrictions on dataset level access. If no roles defined then the dashboard is available to all roles.",
-              "format": "int32",
               "nullable": true,
               "type": "integer"
             },
@@ -3731,11 +3851,9 @@
             "type": "boolean"
           },
           "explore_database_id": {
-            "format": "int32",
             "type": "integer"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -3752,6 +3870,125 @@
         },
         "type": "object"
       },
+      "DatabaseConnectionSchema": {
+        "properties": {
+          "allow_ctas": {
+            "description": "Allow CREATE TABLE AS option in SQL Lab",
+            "type": "boolean"
+          },
+          "allow_cvas": {
+            "description": "Allow CREATE VIEW AS option in SQL Lab",
+            "type": "boolean"
+          },
+          "allow_dml": {
+            "description": "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab",
+            "type": "boolean"
+          },
+          "allow_file_upload": {
+            "description": "Allow to upload CSV file data into this databaseIf selected, please set the schemas allowed for csv upload in Extra.",
+            "type": "boolean"
+          },
+          "allow_run_async": {
+            "description": "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.",
+            "type": "boolean"
+          },
+          "backend": {
+            "description": "SQLAlchemy engine to use",
+            "nullable": true,
+            "type": "string"
+          },
+          "cache_timeout": {
+            "description": "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.",
+            "nullable": true,
+            "type": "integer"
+          },
+          "configuration_method": {
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "type": "string"
+          },
+          "database_name": {
+            "description": "A database name to identify this connection.",
+            "maxLength": 250,
+            "minLength": 1,
+            "nullable": true,
+            "type": "string"
+          },
+          "driver": {
+            "description": "SQLAlchemy driver to use",
+            "nullable": true,
+            "type": "string"
+          },
+          "engine_information": {
+            "additionalProperties": {},
+            "type": "object"
+          },
+          "expose_in_sqllab": {
+            "description": "Expose this database to SQLLab",
+            "type": "boolean"
+          },
+          "extra": {
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
+            "type": "string"
+          },
+          "force_ctas_schema": {
+            "description": "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema",
+            "maxLength": 250,
+            "minLength": 0,
+            "nullable": true,
+            "type": "string"
+          },
+          "id": {
+            "description": "Database ID (for updates)",
+            "type": "integer"
+          },
+          "impersonate_user": {
+            "description": "If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.",
+            "type": "boolean"
+          },
+          "is_managed_externally": {
+            "nullable": true,
+            "type": "boolean"
+          },
+          "masked_encrypted_extra": {
+            "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>",
+            "nullable": true,
+            "type": "string"
+          },
+          "parameters": {
+            "additionalProperties": {},
+            "description": "DB-specific parameters for configuration",
+            "type": "object"
+          },
+          "parameters_schema": {
+            "additionalProperties": {},
+            "description": "JSONSchema for configuring the database by parameters instead of SQLAlchemy URI",
+            "type": "object"
+          },
+          "server_cert": {
+            "description": "<p>Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.</p>",
+            "nullable": true,
+            "type": "string"
+          },
+          "sqlalchemy_uri": {
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "maxLength": 1024,
+            "minLength": 1,
+            "type": "string"
+          },
+          "ssh_tunnel": {
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/DatabaseSSHTunnel"
+              }
+            ],
+            "nullable": true
+          },
+          "uuid": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
       "DatabaseFunctionNamesResponse": {
         "properties": {
           "function_names": {
@@ -3766,7 +4003,6 @@
       "DatabaseRelatedChart": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -3782,7 +4018,6 @@
         "properties": {
           "count": {
             "description": "Chart count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -3798,7 +4033,6 @@
       "DatabaseRelatedDashboard": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -3817,7 +4051,6 @@
         "properties": {
           "count": {
             "description": "Dashboard count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -3867,7 +4100,6 @@
             "readOnly": true
           },
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -3890,17 +4122,12 @@
             "nullable": true,
             "type": "boolean"
           },
-          "extra": {
-            "nullable": true,
-            "type": "string"
-          },
           "force_ctas_schema": {
             "maxLength": 250,
             "nullable": true,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "impersonate_user": {
@@ -3910,23 +4137,6 @@
           "is_managed_externally": {
             "type": "boolean"
           },
-          "masked_encrypted_extra": {
-            "readOnly": true
-          },
-          "parameters": {
-            "readOnly": true
-          },
-          "parameters_schema": {
-            "readOnly": true
-          },
-          "server_cert": {
-            "nullable": true,
-            "type": "string"
-          },
-          "sqlalchemy_uri": {
-            "maxLength": 1024,
-            "type": "string"
-          },
           "uuid": {
             "format": "uuid",
             "nullable": true,
@@ -3934,8 +4144,7 @@
           }
         },
         "required": [
-          "database_name",
-          "sqlalchemy_uri"
+          "database_name"
         ],
         "type": "object"
       },
@@ -4011,7 +4220,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "uuid": {
@@ -4066,13 +4274,16 @@
           },
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "configuration_method": {
             "default": "sqlalchemy_form",
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -4099,7 +4310,7 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "force_ctas_schema": {
@@ -4133,7 +4344,7 @@
             "type": "string"
           },
           "sqlalchemy_uri": {
-            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
             "maxLength": 1024,
             "minLength": 1,
             "type": "string"
@@ -4179,13 +4390,16 @@
           },
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "configuration_method": {
             "default": "sqlalchemy_form",
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -4213,7 +4427,7 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "force_ctas_schema": {
@@ -4247,7 +4461,7 @@
             "type": "string"
           },
           "sqlalchemy_uri": {
-            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
             "maxLength": 1024,
             "minLength": 0,
             "type": "string"
@@ -4259,6 +4473,9 @@
               }
             ],
             "nullable": true
+          },
+          "uuid": {
+            "type": "string"
           }
         },
         "type": "object"
@@ -4267,7 +4484,6 @@
         "properties": {
           "id": {
             "description": "SSH Tunnel ID (for updates)",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -4284,7 +4500,6 @@
             "type": "string"
           },
           "server_port": {
-            "format": "int32",
             "type": "integer"
           },
           "username": {
@@ -4293,6 +4508,18 @@
         },
         "type": "object"
       },
+      "DatabaseSchemaAccessForFileUploadResponse": {
+        "properties": {
+          "schemas": {
+            "description": "The list of schemas allowed for the database to upload information",
+            "items": {
+              "type": "string"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
       "DatabaseTablesResponse": {
         "properties": {
           "extra": {
@@ -4314,7 +4541,11 @@
         "properties": {
           "configuration_method": {
             "default": "sqlalchemy_form",
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -4334,7 +4565,7 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "impersonate_user": {
@@ -4357,7 +4588,7 @@
             "type": "string"
           },
           "sqlalchemy_uri": {
-            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
+            "description": "<p>Refer to the <a href=\"https://docs.sqlalchemy.org/en/rel_1_2/core/engines.html#database-urls\" rel=\"noopener noreferrer\">SqlAlchemy docs</a> for more information on how to structure your URI.</p>",
             "maxLength": 1024,
             "minLength": 1,
             "type": "string"
@@ -4383,7 +4614,11 @@
             "type": "object"
           },
           "configuration_method": {
-            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri."
+            "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri.",
+            "enum": [
+              "sqlalchemy_form",
+              "dynamic_form"
+            ]
           },
           "database_name": {
             "description": "A database name to identify this connection.",
@@ -4402,12 +4637,11 @@
             "type": "string"
           },
           "extra": {
-            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata [...]
+            "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\" rel=\"noopener noreferrer\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\" rel=\"noopener noreferrer\ [...]
             "type": "string"
           },
           "id": {
             "description": "Database ID (for updates)",
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -4443,7 +4677,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this dataset.",
-            "format": "int32",
             "type": "integer"
           },
           "column_formats": {
@@ -4457,6 +4690,10 @@
             },
             "type": "array"
           },
+          "currency_formats": {
+            "description": "Currency formats.",
+            "type": "object"
+          },
           "database": {
             "description": "Database associated with the dataset.",
             "type": "object"
@@ -4509,7 +4746,6 @@
           },
           "id": {
             "description": "Dataset ID.",
-            "format": "int32",
             "type": "integer"
           },
           "is_sqllab_view": {
@@ -4533,7 +4769,6 @@
           },
           "offset": {
             "description": "Dataset offset.",
-            "format": "int32",
             "type": "integer"
           },
           "order_by_choices": {
@@ -4549,7 +4784,6 @@
           "owners": {
             "description": "List of owners identifiers",
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -4607,6 +4841,60 @@
         },
         "type": "object"
       },
+      "DatasetCacheWarmUpRequestSchema": {
+        "properties": {
+          "dashboard_id": {
+            "description": "The ID of the dashboard to get filters for when warming cache",
+            "type": "integer"
+          },
+          "db_name": {
+            "description": "The name of the database where the table is located",
+            "type": "string"
+          },
+          "extra_filters": {
+            "description": "Extra filters to apply when warming up cache",
+            "type": "string"
+          },
+          "table_name": {
+            "description": "The name of the table to warm up cache for",
+            "type": "string"
+          }
+        },
+        "required": [
+          "db_name",
+          "table_name"
+        ],
+        "type": "object"
+      },
+      "DatasetCacheWarmUpResponseSchema": {
+        "properties": {
+          "result": {
+            "description": "A list of each chart's warmup status and errors if any",
+            "items": {
+              "$ref": "#/components/schemas/DatasetCacheWarmUpResponseSingle"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "DatasetCacheWarmUpResponseSingle": {
+        "properties": {
+          "chart_id": {
+            "description": "The ID of the chart the status belongs to",
+            "type": "integer"
+          },
+          "viz_error": {
+            "description": "Error that occurred when warming cache for chart",
+            "type": "string"
+          },
+          "viz_status": {
+            "description": "Status of the underlying query for the viz",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
       "DatasetColumnsPut": {
         "properties": {
           "advanced_data_type": {
@@ -4639,13 +4927,14 @@
             "type": "boolean"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_active": {
+            "nullable": true,
             "type": "boolean"
           },
           "is_dttm": {
+            "nullable": true,
             "type": "boolean"
           },
           "python_date_format": {
@@ -4676,7 +4965,6 @@
       "DatasetColumnsRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4685,7 +4973,6 @@
       "DatasetColumnsRestApi.get_list": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4694,7 +4981,6 @@
       "DatasetColumnsRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4703,7 +4989,6 @@
       "DatasetColumnsRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4712,7 +4997,6 @@
       "DatasetDuplicateSchema": {
         "properties": {
           "base_model_id": {
-            "format": "int32",
             "type": "integer"
           },
           "table_name": {
@@ -4730,7 +5014,6 @@
       "DatasetMetricRestApi.get": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4739,7 +5022,6 @@
       "DatasetMetricRestApi.get_list": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4748,7 +5030,6 @@
       "DatasetMetricRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4757,7 +5038,6 @@
       "DatasetMetricRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -4765,6 +5045,12 @@
       },
       "DatasetMetricsPut": {
         "properties": {
+          "currency": {
+            "maxLength": 128,
+            "minLength": 1,
+            "nullable": true,
+            "type": "string"
+          },
           "d3format": {
             "maxLength": 128,
             "minLength": 1,
@@ -4783,7 +5069,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "metric_name": {
@@ -4820,7 +5105,6 @@
       "DatasetRelatedChart": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -4836,7 +5120,6 @@
         "properties": {
           "count": {
             "description": "Chart count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -4852,7 +5135,6 @@
       "DatasetRelatedDashboard": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "json_metadata": {
@@ -4871,7 +5153,6 @@
         "properties": {
           "count": {
             "description": "Dashboard count",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -4898,12 +5179,11 @@
       "DatasetRestApi.get": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/DatasetRestApi.get.User"
+            "$ref": "#/components/schemas/DatasetRestApi.get.User2"
           },
           "changed_on": {
             "format": "date-time",
@@ -4913,11 +5193,14 @@
           "changed_on_humanized": {
             "readOnly": true
           },
-          "columns": {
+          "column_formats": {
+            "readOnly": true
+          },
+          "columns": {
             "$ref": "#/components/schemas/DatasetRestApi.get.TableColumn"
           },
           "created_by": {
-            "$ref": "#/components/schemas/DatasetRestApi.get.User2"
+            "$ref": "#/components/schemas/DatasetRestApi.get.User"
           },
           "created_on": {
             "format": "date-time",
@@ -4927,9 +5210,15 @@
           "created_on_humanized": {
             "readOnly": true
           },
+          "currency_formats": {
+            "readOnly": true
+          },
           "database": {
             "$ref": "#/components/schemas/DatasetRestApi.get.Database"
           },
+          "datasource_name": {
+            "readOnly": true
+          },
           "datasource_type": {
             "readOnly": true
           },
@@ -4953,8 +5242,10 @@
             "nullable": true,
             "type": "boolean"
           },
+          "granularity_sqla": {
+            "readOnly": true
+          },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_managed_externally": {
@@ -4975,11 +5266,16 @@
           "metrics": {
             "$ref": "#/components/schemas/DatasetRestApi.get.SqlMetric"
           },
+          "name": {
+            "readOnly": true
+          },
           "offset": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
+          "order_by_choices": {
+            "readOnly": true
+          },
           "owners": {
             "$ref": "#/components/schemas/DatasetRestApi.get.User1"
           },
@@ -5003,8 +5299,17 @@
             "nullable": true,
             "type": "string"
           },
+          "time_grain_sqla": {
+            "readOnly": true
+          },
+          "uid": {
+            "readOnly": true
+          },
           "url": {
             "readOnly": true
+          },
+          "verbose_map": {
+            "readOnly": true
           }
         },
         "required": [
@@ -5025,7 +5330,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -5046,6 +5350,11 @@
             "nullable": true,
             "type": "string"
           },
+          "currency": {
+            "maxLength": 128,
+            "nullable": true,
+            "type": "string"
+          },
           "d3format": {
             "maxLength": 128,
             "nullable": true,
@@ -5063,7 +5372,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "metric_name": {
@@ -5133,7 +5441,6 @@
             "type": "boolean"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "is_active": {
@@ -5196,22 +5503,16 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
@@ -5235,14 +5536,11 @@
       "DatasetRestApi.get_list": {
         "properties": {
           "changed_by": {
-            "$ref": "#/components/schemas/DatasetRestApi.get_list.User"
+            "$ref": "#/components/schemas/DatasetRestApi.get_list.User1"
           },
           "changed_by_name": {
             "readOnly": true
           },
-          "changed_by_url": {
-            "readOnly": true
-          },
           "changed_on_delta_humanized": {
             "readOnly": true
           },
@@ -5271,14 +5569,13 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "kind": {
             "readOnly": true
           },
           "owners": {
-            "$ref": "#/components/schemas/DatasetRestApi.get_list.User1"
+            "$ref": "#/components/schemas/DatasetRestApi.get_list.User"
           },
           "schema": {
             "maxLength": 255,
@@ -5307,7 +5604,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -5322,14 +5618,17 @@
             "maxLength": 64,
             "type": "string"
           },
-          "username": {
+          "id": {
+            "type": "integer"
+          },
+          "last_name": {
             "maxLength": 64,
             "type": "string"
           }
         },
         "required": [
           "first_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
@@ -5339,30 +5638,20 @@
             "maxLength": 64,
             "type": "string"
           },
-          "id": {
-            "format": "int32",
-            "type": "integer"
-          },
           "last_name": {
             "maxLength": 64,
             "type": "string"
-          },
-          "username": {
-            "maxLength": 64,
-            "type": "string"
           }
         },
         "required": [
           "first_name",
-          "last_name",
-          "username"
+          "last_name"
         ],
         "type": "object"
       },
       "DatasetRestApi.post": {
         "properties": {
           "database": {
-            "format": "int32",
             "type": "integer"
           },
           "external_url": {
@@ -5375,7 +5664,6 @@
           },
           "owners": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -5383,6 +5671,7 @@
           "schema": {
             "maxLength": 250,
             "minLength": 0,
+            "nullable": true,
             "type": "string"
           },
           "sql": {
@@ -5404,7 +5693,6 @@
       "DatasetRestApi.put": {
         "properties": {
           "cache_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5415,7 +5703,6 @@
             "type": "array"
           },
           "database_id": {
-            "format": "int32",
             "type": "integer"
           },
           "default_endpoint": {
@@ -5463,13 +5750,11 @@
             "type": "array"
           },
           "offset": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "owners": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -5533,7 +5818,6 @@
         "properties": {
           "count": {
             "description": "The total number of distinct values",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -5577,7 +5861,7 @@
             "type": "array"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/User"
+            "$ref": "#/components/schemas/User1"
           },
           "changed_on": {
             "format": "date-time",
@@ -5628,6 +5912,32 @@
         },
         "type": "object"
       },
+      "EstimateQueryCostSchema": {
+        "properties": {
+          "database_id": {
+            "description": "The database id",
+            "type": "integer"
+          },
+          "schema": {
+            "description": "The database schema",
+            "nullable": true,
+            "type": "string"
+          },
+          "sql": {
+            "description": "The SQL query to estimate",
+            "type": "string"
+          },
+          "template_params": {
+            "description": "The SQL query template params",
+            "type": "object"
+          }
+        },
+        "required": [
+          "database_id",
+          "sql"
+        ],
+        "type": "object"
+      },
       "ExecutePayloadSchema": {
         "properties": {
           "client_id": {
@@ -5639,7 +5949,6 @@
             "type": "string"
           },
           "database_id": {
-            "format": "int32",
             "type": "integer"
           },
           "expand_data": {
@@ -5651,7 +5960,6 @@
             "type": "boolean"
           },
           "queryLimit": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5712,7 +6020,7 @@
         },
         "type": "object"
       },
-      "ExplorePermalinkPostSchema": {
+      "ExplorePermalinkStateSchema": {
         "properties": {
           "formData": {
             "description": "Chart form data",
@@ -5736,7 +6044,6 @@
       "FilterSetRestApi.get": {
         "properties": {
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5745,7 +6052,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -5753,7 +6059,6 @@
             "type": "string"
           },
           "owner_id": {
-            "format": "int32",
             "type": "integer"
           },
           "owner_type": {
@@ -5774,7 +6079,6 @@
       "FilterSetRestApi.get_list": {
         "properties": {
           "changed_by_fk": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5784,7 +6088,6 @@
             "type": "string"
           },
           "created_by_fk": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5794,7 +6097,6 @@
             "type": "string"
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -5803,7 +6105,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "name": {
@@ -5811,7 +6112,6 @@
             "type": "string"
           },
           "owner_id": {
-            "format": "int32",
             "type": "integer"
           },
           "owner_type": {
@@ -5846,7 +6146,6 @@
             "type": "string"
           },
           "owner_id": {
-            "format": "int32",
             "type": "integer"
           },
           "owner_type": {
@@ -5892,12 +6191,10 @@
         "properties": {
           "chart_id": {
             "description": "The chart ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_id": {
             "description": "The datasource ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_type": {
@@ -5928,12 +6225,10 @@
         "properties": {
           "chart_id": {
             "description": "The chart ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_id": {
             "description": "The datasource ID",
-            "format": "int32",
             "type": "integer"
           },
           "datasource_type": {
@@ -5972,6 +6267,34 @@
         },
         "type": "object"
       },
+      "GetOrCreateDatasetSchema": {
+        "properties": {
+          "database_id": {
+            "description": "ID of database table belongs to",
+            "type": "integer"
+          },
+          "schema": {
+            "description": "The schema the table belongs to",
+            "maxLength": 250,
+            "minLength": 0,
+            "nullable": true,
+            "type": "string"
+          },
+          "table_name": {
+            "description": "Name of table",
+            "type": "string"
+          },
+          "template_params": {
+            "description": "Template params for the table",
+            "type": "string"
+          }
+        },
+        "required": [
+          "database_id",
+          "table_name"
+        ],
+        "type": "object"
+      },
       "GuestTokenCreate": {
         "properties": {
           "resources": {
@@ -5987,7 +6310,7 @@
             "type": "array"
           },
           "user": {
-            "$ref": "#/components/schemas/User1"
+            "$ref": "#/components/schemas/User2"
           }
         },
         "required": [
@@ -6004,7 +6327,6 @@
             "type": "string"
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6014,7 +6336,6 @@
             "type": "string"
           },
           "duration_ms": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6028,7 +6349,6 @@
             "type": "string"
           },
           "slice_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6036,7 +6356,6 @@
             "$ref": "#/components/schemas/LogRestApi.get.User"
           },
           "user_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -6063,7 +6382,6 @@
             "type": "string"
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6073,7 +6391,6 @@
             "type": "string"
           },
           "duration_ms": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6087,7 +6404,6 @@
             "type": "string"
           },
           "slice_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6095,7 +6411,6 @@
             "$ref": "#/components/schemas/LogRestApi.get_list.User"
           },
           "user_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -6117,7 +6432,6 @@
       "LogRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6169,7 +6483,6 @@
             "$ref": "#/components/schemas/QueryResult"
           },
           "query_id": {
-            "format": "int32",
             "type": "integer"
           },
           "selected_columns": {
@@ -6215,16 +6528,13 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "limit": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "progress": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6234,7 +6544,6 @@
             "type": "string"
           },
           "rows": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6305,7 +6614,6 @@
       "QueryRestApi.get.Database": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6321,18 +6629,15 @@
             "$ref": "#/components/schemas/Database1"
           },
           "end_time": {
-            "format": "float",
             "type": "number"
           },
           "executed_sql": {
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "rows": {
-            "format": "int32",
             "type": "integer"
           },
           "schema": {
@@ -6345,7 +6650,6 @@
             "readOnly": true
           },
           "start_time": {
-            "format": "float",
             "type": "number"
           },
           "status": {
@@ -6369,7 +6673,6 @@
       "QueryRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6378,7 +6681,6 @@
       "QueryRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6386,11 +6688,8 @@
       },
       "QueryResult": {
         "properties": {
-          "changedOn": {
-            "format": "date-time",
-            "type": "string"
-          },
           "changed_on": {
+            "format": "date-time",
             "type": "string"
           },
           "ctas": {
@@ -6400,11 +6699,9 @@
             "type": "string"
           },
           "dbId": {
-            "format": "int32",
             "type": "integer"
           },
           "endDttm": {
-            "format": "float",
             "type": "number"
           },
           "errorMessage": {
@@ -6421,32 +6718,27 @@
             "type": "string"
           },
           "limit": {
-            "format": "int32",
             "type": "integer"
           },
           "limitingFactor": {
             "type": "string"
           },
           "progress": {
-            "format": "int32",
             "type": "integer"
           },
           "queryId": {
-            "format": "int32",
             "type": "integer"
           },
           "resultsKey": {
             "type": "string"
           },
           "rows": {
-            "format": "int32",
             "type": "integer"
           },
           "schema": {
             "type": "string"
           },
           "serverId": {
-            "format": "int32",
             "type": "integer"
           },
           "sql": {
@@ -6456,7 +6748,6 @@
             "type": "string"
           },
           "startDttm": {
-            "format": "float",
             "type": "number"
           },
           "state": {
@@ -6481,12 +6772,206 @@
             "type": "string"
           },
           "userId": {
-            "format": "int32",
             "type": "integer"
           }
         },
         "type": "object"
       },
+      "RLSRestApi.get": {
+        "properties": {
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "type": "string"
+          },
+          "id": {
+            "description": "id_description",
+            "type": "integer"
+          },
+          "name": {
+            "description": "name_description",
+            "type": "string"
+          },
+          "roles": {
+            "items": {
+              "$ref": "#/components/schemas/Roles1"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "items": {
+              "$ref": "#/components/schemas/Tables"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "RLSRestApi.get_list": {
+        "properties": {
+          "changed_on_delta_humanized": {
+            "readOnly": true
+          },
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "type": "string"
+          },
+          "id": {
+            "description": "id_description",
+            "type": "integer"
+          },
+          "name": {
+            "description": "name_description",
+            "type": "string"
+          },
+          "roles": {
+            "items": {
+              "$ref": "#/components/schemas/Roles1"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "items": {
+              "$ref": "#/components/schemas/Tables"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
+      "RLSRestApi.post": {
+        "properties": {
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "name": {
+            "description": "name_description",
+            "maxLength": 255,
+            "minLength": 1,
+            "type": "string"
+          },
+          "roles": {
+            "description": "roles_description",
+            "items": {
+              "type": "integer"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "description": "tables_description",
+            "items": {
+              "type": "integer"
+            },
+            "minItems": 1,
+            "type": "array"
+          }
+        },
+        "required": [
+          "clause",
+          "filter_type",
+          "name",
+          "roles",
+          "tables"
+        ],
+        "type": "object"
+      },
+      "RLSRestApi.put": {
+        "properties": {
+          "clause": {
+            "description": "clause_description",
+            "type": "string"
+          },
+          "description": {
+            "description": "description_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "filter_type": {
+            "description": "filter_type_description",
+            "enum": [
+              "Regular",
+              "Base"
+            ],
+            "type": "string"
+          },
+          "group_key": {
+            "description": "group_key_description",
+            "nullable": true,
+            "type": "string"
+          },
+          "name": {
+            "description": "name_description",
+            "maxLength": 255,
+            "minLength": 1,
+            "type": "string"
+          },
+          "roles": {
+            "description": "roles_description",
+            "items": {
+              "type": "integer"
+            },
+            "type": "array"
+          },
+          "tables": {
+            "description": "tables_description",
+            "items": {
+              "type": "integer"
+            },
+            "type": "array"
+          }
+        },
+        "type": "object"
+      },
       "RecentActivity": {
         "properties": {
           "action": {
@@ -6507,11 +6992,10 @@
           },
           "time": {
             "description": "Time of activity, in epoch milliseconds",
-            "format": "float",
             "type": "number"
           },
           "time_delta_humanized": {
-            "description": "Human-readable description of how long ago activity took place",
+            "description": "Human-readable description of how long ago activity took place.",
             "type": "string"
           }
         },
@@ -6549,11 +7033,10 @@
           },
           "time": {
             "description": "Time of activity, in epoch milliseconds",
-            "format": "float",
             "type": "number"
           },
           "time_delta_humanized": {
-            "description": "Human-readable description of how long ago activity took place",
+            "description": "Human-readable description of how long ago activity took place.",
             "type": "string"
           }
         },
@@ -6563,7 +7046,6 @@
         "properties": {
           "count": {
             "description": "The total number of related values",
-            "format": "int32",
             "type": "integer"
           },
           "result": {
@@ -6587,7 +7069,6 @@
           },
           "value": {
             "description": "The related item identifier",
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6605,7 +7086,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "scheduled_dttm": {
@@ -6627,7 +7107,6 @@
             "type": "string"
           },
           "value": {
-            "format": "float",
             "nullable": true,
             "type": "number"
           },
@@ -6654,7 +7133,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "scheduled_dttm": {
@@ -6676,7 +7154,6 @@
             "type": "string"
           },
           "value": {
-            "format": "float",
             "nullable": true,
             "type": "number"
           },
@@ -6694,7 +7171,6 @@
       "ReportExecutionLogRestApi.post": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6703,7 +7179,6 @@
       "ReportExecutionLogRestApi.put": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6758,6 +7233,10 @@
             "maxLength": 1000,
             "type": "string"
           },
+          "custom_width": {
+            "nullable": true,
+            "type": "integer"
+          },
           "dashboard": {
             "$ref": "#/components/schemas/ReportScheduleRestApi.get.Dashboard"
           },
@@ -6776,12 +7255,10 @@
             "type": "boolean"
           },
           "grace_period": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_eval_dttm": {
@@ -6795,7 +7272,6 @@
             "type": "string"
           },
           "last_value": {
-            "format": "float",
             "nullable": true,
             "type": "number"
           },
@@ -6804,7 +7280,6 @@
             "type": "string"
           },
           "log_retention": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -6845,7 +7320,6 @@
             "type": "string"
           },
           "working_timeout": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           }
@@ -6866,7 +7340,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6879,7 +7352,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -6891,7 +7363,6 @@
       "ReportScheduleRestApi.get.ReportRecipients": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "recipient_config_json": {
@@ -6911,7 +7382,6 @@
       "ReportScheduleRestApi.get.Slice": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -6934,7 +7404,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -6955,7 +7424,7 @@
             "type": "boolean"
           },
           "changed_by": {
-            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User"
+            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User2"
           },
           "changed_on": {
             "format": "date-time",
@@ -6966,12 +7435,11 @@
             "readOnly": true
           },
           "chart_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "created_by": {
-            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User2"
+            "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User"
           },
           "created_on": {
             "format": "date-time",
@@ -6991,7 +7459,6 @@
             "readOnly": true
           },
           "dashboard_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -7003,7 +7470,6 @@
             "readOnly": true
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_eval_dttm": {
@@ -7046,7 +7512,6 @@
       "ReportScheduleRestApi.get_list.ReportRecipients": {
         "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "type": {
@@ -7083,7 +7548,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -7120,7 +7584,6 @@
             "type": "boolean"
           },
           "chart": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -7130,7 +7593,12 @@
             "type": "string"
           },
           "creation_method": {
-            "description": "Creation method is used to inform the frontend whether the report/alert was created in the dashboard, chart, or alerts and reports UI."
+            "description": "Creation method is used to inform the frontend whether the report/alert was created in the dashboard, chart, or alerts and reports UI.",
+            "enum": [
+              "charts",
+              "dashboards",
+              "alerts_reports"
+            ]
           },
           "crontab": {
             "description": "A CRON expression.[Crontab Guru](https://crontab.guru/) is a helpful resource that can help you craft a CRON expression.",
@@ -7139,13 +7607,17 @@
             "minLength": 1,
             "type": "string"
           },
+          "custom_width": {
+            "description": "Custom width of the screenshot in pixels",
+            "example": 1000,
+            "nullable": true,
+            "type": "integer"
+          },
           "dashboard": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "database": {
-            "format": "int32",
             "type": "integer"
           },
           "description": {
@@ -7163,14 +7635,12 @@
           "grace_period": {
             "description": "Once an alert is triggered, how long, in seconds, before Superset nags you again. (in seconds)",
             "example": 14400,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
           "log_retention": {
             "description": "How long to keep the logs around for this report (in days)",
             "example": 90,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
@@ -7184,7 +7654,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this report. If left empty you will be one of the owners of the report.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -7205,7 +7674,6 @@
           },
           "selected_tabs": {
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "nullable": true,
@@ -7838,7 +8306,6 @@
           "working_timeout": {
             "description": "If an alert is staled at a working state, how long until it's state is reseted to error",
             "example": 3600,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           }
@@ -7856,7 +8323,6 @@
             "type": "boolean"
           },
           "chart": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -7867,6 +8333,11 @@
           },
           "creation_method": {
             "description": "Creation method is used to inform the frontend whether the report/alert was created in the dashboard, chart, or alerts and reports UI.",
+            "enum": [
+              "charts",
+              "dashboards",
+              "alerts_reports"
+            ],
             "nullable": true
           },
           "crontab": {
@@ -7875,13 +8346,17 @@
             "minLength": 1,
             "type": "string"
           },
+          "custom_width": {
+            "description": "Custom width of the screenshot in pixels",
+            "example": 1000,
+            "nullable": true,
+            "type": "integer"
+          },
           "dashboard": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
           "database": {
-            "format": "int32",
             "type": "integer"
           },
           "description": {
@@ -7899,14 +8374,12 @@
           "grace_period": {
             "description": "Once an alert is triggered, how long, in seconds, before Superset nags you again. (in seconds)",
             "example": 14400,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
           "log_retention": {
             "description": "How long to keep the logs around for this report (in days)",
             "example": 90,
-            "format": "int32",
             "minimum": 1,
             "type": "integer"
           },
@@ -7919,7 +8392,6 @@
           "owners": {
             "items": {
               "description": "Owner are users ids allowed to delete or change this report. If left empty you will be one of the owners of the report.",
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -8567,7 +9039,6 @@
           "working_timeout": {
             "description": "If an alert is staled at a working state, how long until it's state is reseted to error",
             "example": 3600,
-            "format": "int32",
             "minimum": 1,
             "nullable": true,
             "type": "integer"
@@ -8580,7 +9051,11 @@
           "id": {
             "type": "string"
           },
-          "type": {}
+          "type": {
+            "enum": [
+              "dashboard"
+            ]
+          }
         },
         "required": [
           "id",
@@ -8594,7 +9069,6 @@
             "type": "string"
           },
           "dataset": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -8606,7 +9080,17 @@
       "Roles": {
         "properties": {
           "id": {
-            "format": "int32",
+            "type": "integer"
+          },
+          "name": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "Roles1": {
+        "properties": {
+          "id": {
             "type": "integer"
           },
           "name": {
@@ -8631,7 +9115,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "label": {
@@ -8665,7 +9148,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -8681,7 +9163,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -8712,7 +9193,6 @@
             "$ref": "#/components/schemas/SavedQueryRestApi.get_list.Database"
           },
           "db_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8724,7 +9204,6 @@
             "readOnly": true
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "label": {
@@ -8736,7 +9215,6 @@
             "readOnly": true
           },
           "rows": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8751,6 +9229,9 @@
           },
           "sql_tables": {
             "readOnly": true
+          },
+          "tags": {
+            "$ref": "#/components/schemas/SavedQueryRestApi.get_list.Tag"
           }
         },
         "type": "object"
@@ -8762,7 +9243,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           }
         },
@@ -8771,6 +9251,27 @@
         ],
         "type": "object"
       },
+      "SavedQueryRestApi.get_list.Tag": {
+        "properties": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
+            "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
       "SavedQueryRestApi.get_list.User": {
         "properties": {
           "first_name": {
@@ -8778,7 +9279,6 @@
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
           "last_name": {
@@ -8795,7 +9295,6 @@
       "SavedQueryRestApi.post": {
         "properties": {
           "db_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8827,7 +9326,6 @@
       "SavedQueryRestApi.put": {
         "properties": {
           "db_id": {
-            "format": "int32",
             "nullable": true,
             "type": "integer"
           },
@@ -8881,7 +9379,6 @@
         "properties": {
           "cache_timeout": {
             "description": "Duration (in seconds) of the caching timeout for this chart.",
-            "format": "int32",
             "type": "integer"
           },
           "certification_details": {
@@ -8894,6 +9391,7 @@
           },
           "changed_on": {
             "description": "Timestamp of the last modification.",
+            "format": "date-time",
             "type": "string"
           },
           "changed_on_humanized": {
@@ -8931,7 +9429,6 @@
           "owners": {
             "description": "Owners identifiers.",
             "items": {
-              "format": "int32",
               "type": "integer"
             },
             "type": "array"
@@ -8942,7 +9439,6 @@
           },
           "slice_id": {
             "description": "The slice ID.",
-            "format": "int32",
             "type": "integer"
           },
           "slice_name": {
@@ -9009,7 +9505,7 @@
         "properties": {
           "column_names": {
             "items": {
-              "description": "A list of column names that compose the foreign key or index",
+              "description": "A list of column names that compose the foreign key or  index",
               "type": "string"
             },
             "type": "array"
@@ -9120,192 +9616,491 @@
         },
         "type": "object"
       },
-      "TemporaryCachePostSchema": {
+      "Tables": {
         "properties": {
-          "value": {
-            "description": "Any type of JSON supported text.",
+          "id": {
+            "type": "integer"
+          },
+          "schema": {
+            "type": "string"
+          },
+          "table_name": {
             "type": "string"
           }
         },
-        "required": [
-          "value"
-        ],
         "type": "object"
       },
-      "TemporaryCachePutSchema": {
+      "Tag": {
         "properties": {
-          "value": {
-            "description": "Any type of JSON supported text.",
+          "id": {
+            "type": "integer"
+          },
+          "name": {
             "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
-        "required": [
-          "value"
-        ],
         "type": "object"
       },
-      "User": {
+      "Tag1": {
         "properties": {
-          "first_name": {
+          "id": {
+            "type": "integer"
+          },
+          "name": {
             "type": "string"
           },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
+          }
+        },
+        "type": "object"
+      },
+      "TagGetResponseSchema": {
+        "properties": {
           "id": {
-            "format": "int32",
             "type": "integer"
           },
-          "last_name": {
+          "name": {
             "type": "string"
           },
-          "username": {
+          "type": {
             "type": "string"
           }
         },
         "type": "object"
       },
-      "User1": {
+      "TagRestApi.get": {
         "properties": {
-          "first_name": {
-            "type": "string"
+          "changed_by": {
+            "$ref": "#/components/schemas/TagRestApi.get.User1"
           },
-          "last_name": {
-            "type": "string"
+          "changed_on_delta_humanized": {
+            "readOnly": true
           },
-          "username": {
+          "created_by": {
+            "$ref": "#/components/schemas/TagRestApi.get.User"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
             "type": "string"
+          },
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
         "type": "object"
       },
-      "UserResponseSchema": {
+      "TagRestApi.get.User": {
         "properties": {
+          "active": {
+            "nullable": true,
+            "type": "boolean"
+          },
+          "changed_on": {
+            "format": "date-time",
+            "nullable": true,
+            "type": "string"
+          },
+          "created_on": {
+            "format": "date-time",
+            "nullable": true,
+            "type": "string"
+          },
           "email": {
+            "maxLength": 64,
             "type": "string"
           },
+          "fail_login_count": {
+            "nullable": true,
+            "type": "integer"
+          },
           "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
           "id": {
-            "format": "int32",
             "type": "integer"
           },
-          "is_active": {
-            "type": "boolean"
-          },
-          "is_anonymous": {
-            "type": "boolean"
+          "last_login": {
+            "format": "date-time",
+            "nullable": true,
+            "type": "string"
           },
           "last_name": {
+            "maxLength": 64,
+            "type": "string"
+          },
+          "login_count": {
+            "nullable": true,
+            "type": "integer"
+          },
+          "password": {
+            "maxLength": 256,
+            "nullable": true,
             "type": "string"
           },
           "username": {
+            "maxLength": 64,
             "type": "string"
           }
         },
+        "required": [
+          "email",
+          "first_name",
+          "last_name",
+          "username"
+        ],
         "type": "object"
       },
-      "ValidateSQLRequest": {
+      "TagRestApi.get.User1": {
         "properties": {
-          "schema": {
-            "nullable": true,
+          "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
-          "sql": {
-            "description": "SQL statement to validate",
+          "last_name": {
+            "maxLength": 64,
             "type": "string"
-          },
-          "template_params": {
-            "nullable": true,
-            "type": "object"
           }
         },
         "required": [
-          "sql"
+          "first_name",
+          "last_name"
         ],
         "type": "object"
       },
-      "ValidateSQLResponse": {
+      "TagRestApi.get_list": {
         "properties": {
-          "end_column": {
-            "format": "int32",
-            "type": "integer"
+          "changed_by": {
+            "$ref": "#/components/schemas/TagRestApi.get_list.User1"
           },
-          "line_number": {
-            "format": "int32",
+          "changed_on_delta_humanized": {
+            "readOnly": true
+          },
+          "created_by": {
+            "$ref": "#/components/schemas/TagRestApi.get_list.User"
+          },
+          "id": {
             "type": "integer"
           },
-          "message": {
+          "name": {
+            "maxLength": 250,
+            "nullable": true,
             "type": "string"
           },
-          "start_column": {
-            "format": "int32",
-            "type": "integer"
+          "type": {
+            "enum": [
+              1,
+              2,
+              3,
+              4
+            ]
           }
         },
         "type": "object"
       },
-      "ValidatorConfigJSON": {
+      "TagRestApi.get_list.User": {
         "properties": {
-          "op": {
-            "description": "The operation to compare with a threshold to apply to the SQL output\n",
-            "enum": [
-              "<",
-              "<=",
-              ">",
-              ">=",
-              "==",
-              "!="
-            ],
+          "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
-          "threshold": {
-            "format": "float",
-            "type": "number"
+          "last_name": {
+            "maxLength": 64,
+            "type": "string"
           }
         },
+        "required": [
+          "first_name",
+          "last_name"
+        ],
         "type": "object"
       },
-      "advanced_data_type_convert_schema": {
+      "TagRestApi.get_list.User1": {
         "properties": {
-          "type": {
-            "default": "port",
+          "first_name": {
+            "maxLength": 64,
             "type": "string"
           },
-          "values": {
-            "items": {
-              "default": "http"
-            },
-            "minItems": 1,
-            "type": "array"
+          "last_name": {
+            "maxLength": 64,
+            "type": "string"
           }
         },
         "required": [
-          "type",
-          "values"
+          "first_name",
+          "last_name"
         ],
         "type": "object"
       },
-      "database_schemas_query_schema": {
+      "TagRestApi.post": {
         "properties": {
-          "force": {
-            "type": "boolean"
+          "tags": {
+            "items": {
+              "type": "string"
+            },
+            "type": "array"
           }
         },
         "type": "object"
       },
-      "database_tables_query_schema": {
+      "TagRestApi.put": {
         "properties": {
-          "force": {
-            "type": "boolean"
-          },
-          "schema_name": {
-            "type": "string"
+          "id": {
+            "type": "integer"
           }
         },
-        "required": [
-          "schema_name"
-        ],
         "type": "object"
       },
+      "TaggedObjectEntityResponseSchema": {
+        "properties": {
+          "changed_on": {
+            "format": "date-time",
+            "type": "string"
+          },
+          "created_by": {
+            "$ref": "#/components/schemas/User"
+          },
+          "creator": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "name": {
+            "type": "string"
+          },
+          "type": {
+            "type": "string"
+          },
+          "url": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "TemporaryCachePostSchema": {
+        "properties": {
+          "value": {
+            "description": "Any type of JSON supported text.",
+            "type": "string"
+          }
+        },
+        "required": [
+          "value"
+        ],
+        "type": "object"
+      },
+      "TemporaryCachePutSchema": {
+        "properties": {
+          "value": {
+            "description": "Any type of JSON supported text.",
+            "type": "string"
+          }
+        },
+        "required": [
+          "value"
+        ],
+        "type": "object"
+      },
+      "User": {
+        "properties": {
+          "first_name": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "last_name": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "User1": {
+        "properties": {
+          "first_name": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "last_name": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "User2": {
+        "properties": {
+          "first_name": {
+            "type": "string"
+          },
+          "last_name": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "UserResponseSchema": {
+        "properties": {
+          "email": {
+            "type": "string"
+          },
+          "first_name": {
+            "type": "string"
+          },
+          "id": {
+            "type": "integer"
+          },
+          "is_active": {
+            "type": "boolean"
+          },
+          "is_anonymous": {
+            "type": "boolean"
+          },
+          "last_name": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "ValidateSQLRequest": {
+        "properties": {
+          "schema": {
+            "nullable": true,
+            "type": "string"
+          },
+          "sql": {
+            "description": "SQL statement to validate",
+            "type": "string"
+          },
+          "template_params": {
+            "nullable": true,
+            "type": "object"
+          }
+        },
+        "required": [
+          "sql"
+        ],
+        "type": "object"
+      },
+      "ValidateSQLResponse": {
+        "properties": {
+          "end_column": {
+            "type": "integer"
+          },
+          "line_number": {
+            "type": "integer"
+          },
+          "message": {
+            "type": "string"
+          },
+          "start_column": {
+            "type": "integer"
+          }
+        },
+        "type": "object"
+      },
+      "ValidatorConfigJSON": {
+        "properties": {
+          "op": {
+            "description": "The operation to compare with a threshold to apply to the SQL output\n",
+            "enum": [
+              "<",
+              "<=",
+              ">",
+              ">=",
+              "==",
+              "!="
+            ],
+            "type": "string"
+          },
+          "threshold": {
+            "type": "number"
+          }
+        },
+        "type": "object"
+      },
+      "advanced_data_type_convert_schema": {
+        "properties": {
+          "type": {
+            "default": "port",
+            "type": "string"
+          },
+          "values": {
+            "items": {
+              "default": "http"
+            },
+            "minItems": 1,
+            "type": "array"
+          }
+        },
+        "required": [
+          "type",
+          "values"
+        ],
+        "type": "object"
+      },
+      "database_schemas_query_schema": {
+        "properties": {
+          "force": {
+            "type": "boolean"
+          }
+        },
+        "type": "object"
+      },
+      "database_tables_query_schema": {
+        "properties": {
+          "force": {
+            "type": "boolean"
+          },
+          "schema_name": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "schema_name"
+        ],
+        "type": "object"
+      },
+      "delete_tags_schema": {
+        "items": {
+          "type": "string"
+        },
+        "type": "array"
+      },
       "get_delete_ids_schema": {
         "items": {
           "type": "integer"
@@ -10716,6 +11511,18 @@
                   "passwords": {
                     "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
+                  },
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                    "type": "string"
                   }
                 },
                 "type": "object"
@@ -11111,6 +11918,9 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -11439,6 +12249,18 @@
                   "passwords": {
                     "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
+                  },
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                    "type": "string"
                   }
                 },
                 "type": "object"
@@ -11544,20 +12366,66 @@
         ]
       }
     },
-    "/api/v1/chart/{pk}": {
-      "delete": {
-        "description": "Deletes a Chart.",
-        "parameters": [
-          {
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
+    "/api/v1/chart/warm_up_cache": {
+      "put": {
+        "description": "Warms up the cache for the chart. Note for slices a force refresh occurs. In terms of the `extra_filters` these can be obtained from records in the JSON encoded `logs.json` column associated with the `explore_json` action.",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ChartCacheWarmUpRequestSchema"
+              }
             }
-          }
-        ],
-        "responses": {
+          },
+          "description": "Identifies the chart to warm up cache for, and any additional dashboard or filter context to use.",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ChartCacheWarmUpResponseSchema"
+                }
+              }
+            },
+            "description": "Each chart's warmup status"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Warms up the cache for the chart",
+        "tags": [
+          "Charts"
+        ]
+      }
+    },
+    "/api/v1/chart/{pk}": {
+      "delete": {
+        "description": "Deletes a Chart.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
           "200": {
             "content": {
               "application/json": {
@@ -11906,6 +12774,102 @@
         ]
       }
     },
+    "/api/v1/chart/{pk}/favorites/": {
+      "delete": {
+        "description": "Remove the chart from the user favorite list",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Chart removed from favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Charts"
+        ]
+      },
+      "post": {
+        "description": "Marks the chart as favorite for the current user",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Chart added to favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Charts"
+        ]
+      }
+    },
     "/api/v1/chart/{pk}/screenshot/{digest}/": {
       "get": {
         "description": "Get a computed screenshot from cache.",
@@ -13020,6 +13984,18 @@
                   "passwords": {
                     "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
+                  },
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                    "type": "string"
                   }
                 },
                 "type": "object"
@@ -13574,6 +14550,75 @@
         ]
       }
     },
+    "/api/v1/dashboard/{id_or_slug}/copy/": {
+      "post": {
+        "parameters": [
+          {
+            "description": "The dashboard id or slug",
+            "in": "path",
+            "name": "id_or_slug",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DashboardCopySchema"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "last_modified_time": {
+                      "type": "number"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Id of new dashboard and last modified time"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Makes a copy of an existing dashboard",
+        "tags": [
+          "Dashboards"
+        ]
+      }
+    },
     "/api/v1/dashboard/{id_or_slug}/datasets": {
       "get": {
         "description": "Returns a list of a dashboard's datasets. Each dataset includes only the information necessary to render the dashboard's charts.",
@@ -13962,9 +15007,9 @@
         ]
       }
     },
-    "/api/v1/dashboard/{pk}/filter_state": {
-      "post": {
-        "description": "Stores a new value.",
+    "/api/v1/dashboard/{pk}/favorites/": {
+      "delete": {
+        "description": "Remove the dashboard from the user favorite list",
         "parameters": [
           {
             "in": "path",
@@ -13973,50 +15018,29 @@
             "schema": {
               "type": "integer"
             }
-          },
-          {
-            "in": "query",
-            "name": "tab_id",
-            "schema": {
-              "type": "integer"
-            }
           }
         ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/TemporaryCachePostSchema"
-              }
-            }
-          },
-          "required": true
-        },
         "responses": {
-          "201": {
+          "200": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
-                    "key": {
-                      "description": "The key to retrieve the value.",
-                      "type": "string"
+                    "result": {
+                      "type": "object"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "The value was stored successfully."
-          },
-          "400": {
-            "$ref": "#/components/responses/400"
+            "description": "Dashboard removed from favorites"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "422": {
-            "$ref": "#/components/responses/422"
+          "404": {
+            "$ref": "#/components/responses/404"
           },
           "500": {
             "$ref": "#/components/responses/500"
@@ -14028,13 +15052,11 @@
           }
         ],
         "tags": [
-          "Dashboard Filter State"
+          "Dashboards"
         ]
-      }
-    },
-    "/api/v1/dashboard/{pk}/filter_state/{key}": {
-      "delete": {
-        "description": "Deletes a value.",
+      },
+      "post": {
+        "description": "Marks the dashboard as favorite for the current user",
         "parameters": [
           {
             "in": "path",
@@ -14043,9 +15065,128 @@
             "schema": {
               "type": "integer"
             }
-          },
-          {
-            "description": "The value key.",
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dashboard added to favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Dashboards"
+        ]
+      }
+    },
+    "/api/v1/dashboard/{pk}/filter_state": {
+      "post": {
+        "description": "Stores a new value.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "query",
+            "name": "tab_id",
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TemporaryCachePostSchema"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "key": {
+                      "description": "The key to retrieve the value.",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "The value was stored successfully."
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Dashboard Filter State"
+        ]
+      }
+    },
+    "/api/v1/dashboard/{pk}/filter_state/{key}": {
+      "delete": {
+        "description": "Deletes a value.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "description": "The value key.",
             "in": "path",
             "name": "key",
             "required": true,
@@ -14255,7 +15396,7 @@
           "content": {
             "application/json": {
               "schema": {
-                "$ref": "#/components/schemas/DashboardPermalinkPostSchema"
+                "$ref": "#/components/schemas/DashboardPermalinkStateSchema"
               }
             }
           },
@@ -14788,6 +15929,18 @@
                   "passwords": {
                     "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
+                  },
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                    "type": "string"
                   }
                 },
                 "type": "object"
@@ -15106,6 +16259,54 @@
         ]
       }
     },
+    "/api/v1/database/{pk}/connection": {
+      "get": {
+        "parameters": [
+          {
+            "description": "The database id",
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseConnectionSchema"
+                }
+              }
+            },
+            "description": "Database with connection info"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Get a database connection info",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
     "/api/v1/database/{pk}/function_names/": {
       "get": {
         "description": "Get function names supported by a database",
@@ -15253,6 +16454,50 @@
         ]
       }
     },
+    "/api/v1/database/{pk}/schemas_access_for_file_upload/": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseSchemaAccessForFileUploadResponse"
+                }
+              }
+            },
+            "description": "The list of the database schemas where to upload information"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "The list of the database schemas where to upload information",
+        "tags": [
+          "Database"
+        ]
+      }
+    },
     "/api/v1/database/{pk}/select_star/{table_name}/": {
       "get": {
         "description": "Get database select star for table",
@@ -16204,36 +17449,13 @@
         ]
       }
     },
-    "/api/v1/dataset/import/": {
+    "/api/v1/dataset/get_or_create/": {
       "post": {
         "requestBody": {
           "content": {
-            "multipart/form-data": {
+            "application/json": {
               "schema": {
-                "properties": {
-                  "formData": {
-                    "description": "upload file (ZIP or YAML)",
-                    "format": "binary",
-                    "type": "string"
-                  },
-                  "overwrite": {
-                    "description": "overwrite existing datasets?",
-                    "type": "boolean"
-                  },
-                  "passwords": {
-                    "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
-                    "type": "string"
-                  },
-                  "sync_columns": {
-                    "description": "sync columns?",
-                    "type": "boolean"
-                  },
-                  "sync_metrics": {
-                    "description": "sync metrics?",
-                    "type": "boolean"
-                  }
-                },
-                "type": "object"
+                "$ref": "#/components/schemas/GetOrCreateDatasetSchema"
               }
             }
           },
@@ -16245,15 +17467,20 @@
               "application/json": {
                 "schema": {
                   "properties": {
-                    "message": {
-                      "type": "string"
+                    "result": {
+                      "properties": {
+                        "table_id": {
+                          "type": "integer"
+                        }
+                      },
+                      "type": "object"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Dataset import result"
+            "description": "The ID of the table"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -16273,21 +17500,108 @@
             "jwt": []
           }
         ],
+        "summary": "Retrieve a table by name, or create it if it does not exist",
         "tags": [
           "Datasets"
         ]
       }
     },
-    "/api/v1/dataset/related/{column_name}": {
-      "get": {
-        "parameters": [
-          {
-            "in": "path",
-            "name": "column_name",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
+    "/api/v1/dataset/import/": {
+      "post": {
+        "requestBody": {
+          "content": {
+            "multipart/form-data": {
+              "schema": {
+                "properties": {
+                  "formData": {
+                    "description": "upload file (ZIP or YAML)",
+                    "format": "binary",
+                    "type": "string"
+                  },
+                  "overwrite": {
+                    "description": "overwrite existing datasets?",
+                    "type": "boolean"
+                  },
+                  "passwords": {
+                    "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
+                    "type": "string"
+                  },
+                  "sync_columns": {
+                    "description": "sync columns?",
+                    "type": "boolean"
+                  },
+                  "sync_metrics": {
+                    "description": "sync metrics?",
+                    "type": "boolean"
+                  }
+                },
+                "type": "object"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Dataset import result"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
+    "/api/v1/dataset/related/{column_name}": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
           },
           {
             "content": {
@@ -16335,6 +17649,52 @@
         ]
       }
     },
+    "/api/v1/dataset/warm_up_cache": {
+      "put": {
+        "description": "Warms up the cache for the table. Note for slices a force refresh occurs. In terms of the `extra_filters` these can be obtained from records in the JSON encoded `logs.json` column associated with the `explore_json` action.",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatasetCacheWarmUpRequestSchema"
+              }
+            }
+          },
+          "description": "Identifies the database and table to warm up cache for, and any additional dashboard or filter context to use.",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatasetCacheWarmUpResponseSchema"
+                }
+              }
+            },
+            "description": "Each chart's warmup status"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Warms up the cache for each chart powered by the given table",
+        "tags": [
+          "Datasets"
+        ]
+      }
+    },
     "/api/v1/dataset/{pk}": {
       "delete": {
         "description": "Deletes a Dataset",
@@ -17268,7 +18628,7 @@
           "content": {
             "application/json": {
               "schema": {
-                "$ref": "#/components/schemas/ExplorePermalinkPostSchema"
+                "$ref": "#/components/schemas/ExplorePermalinkStateSchema"
               }
             }
           },
@@ -17285,7 +18645,7 @@
                       "type": "string"
                     },
                     "url": {
-                      "description": "pemanent link.",
+                      "description": "permanent link.",
                       "type": "string"
                     }
                   },
@@ -17536,7 +18896,7 @@
         ]
       }
     },
-    "/api/v1/log/recent_activity/{user_id}/": {
+    "/api/v1/log/recent_activity/": {
       "get": {
         "parameters": [
           {
@@ -18999,9 +20359,9 @@
         ]
       }
     },
-    "/api/v1/saved_query/": {
+    "/api/v1/rowlevelsecurity/": {
       "delete": {
-        "description": "Deletes multiple saved queries in a bulk operation.",
+        "description": "Deletes multiple RLS rules in a bulk operation.",
         "parameters": [
           {
             "content": {
@@ -19029,11 +20389,14 @@
                 }
               }
             },
-            "description": "Saved queries bulk delete"
+            "description": "RLS Rule bulk delete"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
           "404": {
             "$ref": "#/components/responses/404"
           },
@@ -19050,11 +20413,11 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
       },
       "get": {
-        "description": "Get a list of saved queries, use Rison or JSON query parameters for filtering, sorting, pagination and for selecting specific columns and metadata.",
+        "description": "Get a list of models",
         "parameters": [
           {
             "content": {
@@ -19127,7 +20490,7 @@
                     "result": {
                       "description": "The result from the get list query",
                       "items": {
-                        "$ref": "#/components/schemas/SavedQueryRestApi.get_list"
+                        "$ref": "#/components/schemas/RLSRestApi.get_list"
                       },
                       "type": "array"
                     }
@@ -19157,20 +20520,20 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
       },
       "post": {
-        "description": "Create a saved query",
+        "description": "Create a new RLS Rule",
         "requestBody": {
           "content": {
             "application/json": {
               "schema": {
-                "$ref": "#/components/schemas/SavedQueryRestApi.post"
+                "$ref": "#/components/schemas/RLSRestApi.post"
               }
             }
           },
-          "description": "Model schema",
+          "description": "RLS schema",
           "required": true
         },
         "responses": {
@@ -19180,17 +20543,17 @@
                 "schema": {
                   "properties": {
                     "id": {
-                      "type": "string"
+                      "type": "number"
                     },
                     "result": {
-                      "$ref": "#/components/schemas/SavedQueryRestApi.post"
+                      "$ref": "#/components/schemas/RLSRestApi.post"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Item inserted"
+            "description": "RLS Rule added"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19198,6 +20561,9 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -19211,11 +20577,11 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
       }
     },
-    "/api/v1/saved_query/_info": {
+    "/api/v1/rowlevelsecurity/_info": {
       "get": {
         "description": "Get metadata information about this API resource",
         "parameters": [
@@ -19297,11 +20663,11 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
       }
     },
-    "/api/v1/saved_query/distinct/{column_name}": {
+    "/api/v1/rowlevelsecurity/related/{column_name}": {
       "get": {
         "parameters": [
           {
@@ -19329,11 +20695,11 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/DistincResponseSchema"
+                  "$ref": "#/components/schemas/RelatedResponseSchema"
                 }
               }
             },
-            "description": "Distinct field data"
+            "description": "Related column data"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19354,88 +20720,22 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
       }
     },
-    "/api/v1/saved_query/export/": {
-      "get": {
-        "description": "Exports multiple saved queries and downloads them as YAML files",
+    "/api/v1/rowlevelsecurity/{pk}": {
+      "delete": {
         "parameters": [
           {
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/get_export_ids_schema"
-                }
-              }
-            },
-            "in": "query",
-            "name": "q"
-          }
-        ],
-        "responses": {
-          "200": {
-            "content": {
-              "application/zip": {
-                "schema": {
-                  "format": "binary",
-                  "type": "string"
-                }
-              }
-            },
-            "description": "A zip file with saved query(ies) and database(s) as YAML"
-          },
-          "400": {
-            "$ref": "#/components/responses/400"
-          },
-          "401": {
-            "$ref": "#/components/responses/401"
-          },
-          "404": {
-            "$ref": "#/components/responses/404"
-          },
-          "500": {
-            "$ref": "#/components/responses/500"
-          }
-        },
-        "security": [
-          {
-            "jwt": []
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
           }
         ],
-        "tags": [
-          "Queries"
-        ]
-      }
-    },
-    "/api/v1/saved_query/import/": {
-      "post": {
-        "requestBody": {
-          "content": {
-            "multipart/form-data": {
-              "schema": {
-                "properties": {
-                  "formData": {
-                    "description": "upload file (ZIP)",
-                    "format": "binary",
-                    "type": "string"
-                  },
-                  "overwrite": {
-                    "description": "overwrite existing saved queries?",
-                    "type": "boolean"
-                  },
-                  "passwords": {
-                    "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
-                    "type": "string"
-                  }
-                },
-                "type": "object"
-              }
-            }
-          },
-          "required": true
-        },
         "responses": {
           "200": {
             "content": {
@@ -19450,13 +20750,10 @@
                 }
               }
             },
-            "description": "Saved Query import result"
-          },
-          "400": {
-            "$ref": "#/components/responses/400"
+            "description": "Item deleted"
           },
-          "401": {
-            "$ref": "#/components/responses/401"
+          "404": {
+            "$ref": "#/components/responses/404"
           },
           "422": {
             "$ref": "#/components/responses/422"
@@ -19471,26 +20768,25 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
-      }
-    },
-    "/api/v1/saved_query/related/{column_name}": {
+      },
       "get": {
+        "description": "Get an item model",
         "parameters": [
           {
             "in": "path",
-            "name": "column_name",
+            "name": "pk",
             "required": true,
             "schema": {
-              "type": "string"
+              "type": "integer"
             }
           },
           {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/get_related_schema"
+                  "$ref": "#/components/schemas/get_item_schema"
                 }
               }
             },
@@ -19503,11 +20799,52 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/RelatedResponseSchema"
+                  "properties": {
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "id": {
+                      "description": "The item id",
+                      "type": "string"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/RLSRestApi.get"
+                    },
+                    "show_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "show_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "Show Item Details",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "Related column data"
+            "description": "Item from Model"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19518,6 +20855,9 @@
           "404": {
             "$ref": "#/components/responses/404"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -19528,15 +20868,14 @@
           }
         ],
         "tags": [
-          "Queries"
+          "Row Level Security"
         ]
-      }
-    },
-    "/api/v1/saved_query/{pk}": {
-      "delete": {
-        "description": "Delete saved query",
+      },
+      "put": {
+        "description": "Updates an RLS Rule",
         "parameters": [
           {
+            "description": "The Rule pk",
             "in": "path",
             "name": "pk",
             "required": true,
@@ -19545,6 +20884,81 @@
             }
           }
         ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/RLSRestApi.put"
+              }
+            }
+          },
+          "description": "RLS schema",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "number"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/RLSRestApi.put"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Rule changed"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Row Level Security"
+        ]
+      }
+    },
+    "/api/v1/saved_query/": {
+      "delete": {
+        "description": "Deletes multiple saved queries in a bulk operation.",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_delete_ids_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
         "responses": {
           "200": {
             "content": {
@@ -19559,7 +20973,10 @@
                 }
               }
             },
-            "description": "Item deleted"
+            "description": "Saved queries bulk delete"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
           },
           "404": {
             "$ref": "#/components/responses/404"
@@ -19581,21 +20998,13 @@
         ]
       },
       "get": {
-        "description": "Get a saved query",
+        "description": "Get a list of saved queries, use Rison or JSON query parameters for filtering, sorting, pagination and for selecting specific columns and metadata.",
         "parameters": [
-          {
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
-            }
-          },
           {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/get_item_schema"
+                  "$ref": "#/components/schemas/get_list_schema"
                 }
               }
             },
@@ -19609,6 +21018,10 @@
               "application/json": {
                 "schema": {
                   "properties": {
+                    "count": {
+                      "description": "The total record count on the backend",
+                      "type": "number"
+                    },
                     "description_columns": {
                       "properties": {
                         "column_name": {
@@ -19619,9 +21032,12 @@
                       },
                       "type": "object"
                     },
-                    "id": {
-                      "description": "The item id",
-                      "type": "string"
+                    "ids": {
+                      "description": "A list of item ids, useful when you don't know the column id",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
                     },
                     "label_columns": {
                       "properties": {
@@ -19633,27 +21049,38 @@
                       },
                       "type": "object"
                     },
-                    "result": {
-                      "$ref": "#/components/schemas/SavedQueryRestApi.get"
-                    },
-                    "show_columns": {
+                    "list_columns": {
                       "description": "A list of columns",
                       "items": {
                         "type": "string"
                       },
                       "type": "array"
                     },
-                    "show_title": {
+                    "list_title": {
                       "description": "A title to render. Will be translated by babel",
-                      "example": "Show Item Details",
+                      "example": "List Items",
                       "type": "string"
+                    },
+                    "order_columns": {
+                      "description": "A list of allowed columns to sort",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "result": {
+                      "description": "The result from the get list query",
+                      "items": {
+                        "$ref": "#/components/schemas/SavedQueryRestApi.get_list"
+                      },
+                      "type": "array"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Item from Model"
+            "description": "Items from Model"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19661,9 +21088,6 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "404": {
-            "$ref": "#/components/responses/404"
-          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -19680,23 +21104,13 @@
           "Queries"
         ]
       },
-      "put": {
-        "description": "Update a saved query",
-        "parameters": [
-          {
-            "in": "path",
-            "name": "pk",
-            "required": true,
-            "schema": {
-              "type": "integer"
-            }
-          }
-        ],
+      "post": {
+        "description": "Create a saved query",
         "requestBody": {
           "content": {
             "application/json": {
               "schema": {
-                "$ref": "#/components/schemas/SavedQueryRestApi.put"
+                "$ref": "#/components/schemas/SavedQueryRestApi.post"
               }
             }
           },
@@ -19704,20 +21118,23 @@
           "required": true
         },
         "responses": {
-          "200": {
+          "201": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
+                    "id": {
+                      "type": "string"
+                    },
                     "result": {
-                      "$ref": "#/components/schemas/SavedQueryRestApi.put"
+                      "$ref": "#/components/schemas/SavedQueryRestApi.post"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Item changed"
+            "description": "Item inserted"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19725,9 +21142,6 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "404": {
-            "$ref": "#/components/responses/404"
-          },
           "422": {
             "$ref": "#/components/responses/422"
           },
@@ -19745,71 +21159,68 @@
         ]
       }
     },
-    "/api/v1/security/csrf_token/": {
+    "/api/v1/saved_query/_info": {
       "get": {
-        "description": "Fetch the CSRF token",
-        "responses": {
-          "200": {
+        "description": "Get metadata information about this API resource",
+        "parameters": [
+          {
             "content": {
               "application/json": {
                 "schema": {
-                  "properties": {
-                    "result": {
-                      "type": "string"
-                    }
-                  },
-                  "type": "object"
+                  "$ref": "#/components/schemas/get_info_schema"
                 }
               }
             },
-            "description": "Result contains the CSRF token"
-          },
-          "401": {
-            "$ref": "#/components/responses/401"
-          },
-          "500": {
-            "$ref": "#/components/responses/500"
-          }
-        },
-        "security": [
-          {
-            "jwt": []
+            "in": "query",
+            "name": "q"
           }
         ],
-        "tags": [
-          "Security"
-        ]
-      }
-    },
-    "/api/v1/security/guest_token/": {
-      "post": {
-        "description": "Fetches a guest token",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/GuestTokenCreate"
-              }
-            }
-          },
-          "description": "Parameters for the guest token",
-          "required": true
-        },
         "responses": {
           "200": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
-                    "token": {
-                      "type": "string"
+                    "add_columns": {
+                      "type": "object"
+                    },
+                    "edit_columns": {
+                      "type": "object"
+                    },
+                    "filters": {
+                      "properties": {
+                        "column_name": {
+                          "items": {
+                            "properties": {
+                              "name": {
+                                "description": "The filter name. Will be translated by babel",
+                                "type": "string"
+                              },
+                              "operator": {
+                                "description": "The filter operation key to use on list filters",
+                                "type": "string"
+                              }
+                            },
+                            "type": "object"
+                          },
+                          "type": "array"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "permissions": {
+                      "description": "The user permissions for this API resource",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
                     }
                   },
                   "type": "object"
                 }
               }
             },
-            "description": "Result contains the guest token"
+            "description": "Item from Model"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19817,6 +21228,9 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -19827,40 +21241,148 @@
           }
         ],
         "tags": [
-          "Security"
+          "Queries"
         ]
       }
     },
-    "/api/v1/security/login": {
+    "/api/v1/saved_query/distinct/{column_name}": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_related_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DistincResponseSchema"
+                }
+              }
+            },
+            "description": "Distinct field data"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      }
+    },
+    "/api/v1/saved_query/export/": {
+      "get": {
+        "description": "Exports multiple saved queries and downloads them as YAML files",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_export_ids_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/zip": {
+                "schema": {
+                  "format": "binary",
+                  "type": "string"
+                }
+              }
+            },
+            "description": "A zip file with saved query(ies) and database(s) as YAML"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      }
+    },
+    "/api/v1/saved_query/import/": {
       "post": {
-        "description": "Authenticate and get a JWT access and refresh token",
         "requestBody": {
           "content": {
-            "application/json": {
+            "multipart/form-data": {
               "schema": {
                 "properties": {
-                  "password": {
-                    "description": "The password for authentication",
-                    "example": "complex-password",
+                  "formData": {
+                    "description": "upload file (ZIP)",
+                    "format": "binary",
                     "type": "string"
                   },
-                  "provider": {
-                    "description": "Choose an authentication provider",
-                    "enum": [
-                      "db",
-                      "ldap"
-                    ],
-                    "example": "db",
+                  "overwrite": {
+                    "description": "overwrite existing saved queries?",
+                    "type": "boolean"
+                  },
+                  "passwords": {
+                    "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
                     "type": "string"
                   },
-                  "refresh": {
-                    "description": "If true a refresh token is provided also",
-                    "example": true,
-                    "type": "boolean"
+                  "ssh_tunnel_passwords": {
+                    "description": "JSON map of passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.",
+                    "type": "string"
                   },
-                  "username": {
-                    "description": "The username for authentication",
-                    "example": "admin",
+                  "ssh_tunnel_private_key_passwords": {
+                    "description": "JSON map of private_key_passwords for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key_password\"}`.",
+                    "type": "string"
+                  },
+                  "ssh_tunnel_private_keys": {
+                    "description": "JSON map of private_keys for each ssh_tunnel associated to a featured database in the ZIP file. If the ZIP includes a ssh_tunnel config in the path `databases/MyDatabase.yaml`, the private_key should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_private_key\"}`.",
                     "type": "string"
                   }
                 },
@@ -19876,10 +21398,1302 @@
               "application/json": {
                 "schema": {
                   "properties": {
-                    "access_token": {
-                      "type": "string"
-                    },
-                    "refresh_token": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Saved Query import result"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      }
+    },
+    "/api/v1/saved_query/related/{column_name}": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_related_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RelatedResponseSchema"
+                }
+              }
+            },
+            "description": "Related column data"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      }
+    },
+    "/api/v1/saved_query/{pk}": {
+      "delete": {
+        "description": "Delete saved query",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item deleted"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      },
+      "get": {
+        "description": "Get a saved query",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_item_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "id": {
+                      "description": "The item id",
+                      "type": "string"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/SavedQueryRestApi.get"
+                    },
+                    "show_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "show_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "Show Item Details",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item from Model"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      },
+      "put": {
+        "description": "Update a saved query",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/SavedQueryRestApi.put"
+              }
+            }
+          },
+          "description": "Model schema",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "$ref": "#/components/schemas/SavedQueryRestApi.put"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item changed"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Queries"
+        ]
+      }
+    },
+    "/api/v1/security/csrf_token/": {
+      "get": {
+        "description": "Fetch the CSRF token",
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Result contains the CSRF token"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Security"
+        ]
+      }
+    },
+    "/api/v1/security/guest_token/": {
+      "post": {
+        "description": "Fetches a guest token",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/GuestTokenCreate"
+              }
+            }
+          },
+          "description": "Parameters for the guest token",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "token": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Result contains the guest token"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Security"
+        ]
+      }
+    },
+    "/api/v1/security/login": {
+      "post": {
+        "description": "Authenticate and get a JWT access and refresh token",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "properties": {
+                  "password": {
+                    "description": "The password for authentication",
+                    "example": "complex-password",
+                    "type": "string"
+                  },
+                  "provider": {
+                    "description": "Choose an authentication provider",
+                    "enum": [
+                      "db",
+                      "ldap"
+                    ],
+                    "example": "db",
+                    "type": "string"
+                  },
+                  "refresh": {
+                    "description": "If true a refresh token is provided also",
+                    "example": true,
+                    "type": "boolean"
+                  },
+                  "username": {
+                    "description": "The username for authentication",
+                    "example": "admin",
+                    "type": "string"
+                  }
+                },
+                "type": "object"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "access_token": {
+                      "type": "string"
+                    },
+                    "refresh_token": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Authentication Successful"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "tags": [
+          "Security"
+        ]
+      }
+    },
+    "/api/v1/security/refresh": {
+      "post": {
+        "description": "Use the refresh token to get a new JWT access token",
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "access_token": {
+                      "description": "A new refreshed access token",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Refresh Successful"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt_refresh": []
+          }
+        ],
+        "tags": [
+          "Security"
+        ]
+      }
+    },
+    "/api/v1/sqllab/estimate/": {
+      "post": {
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/EstimateQueryCostSchema"
+              }
+            }
+          },
+          "description": "SQL query and params",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Query estimation result"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Estimates the SQL query execution cost",
+        "tags": [
+          "SQL Lab"
+        ]
+      }
+    },
+    "/api/v1/sqllab/execute/": {
+      "post": {
+        "description": "Starts the execution of a SQL query",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ExecutePayloadSchema"
+              }
+            }
+          },
+          "description": "SQL query and params",
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/QueryExecutionResponseSchema"
+                }
+              }
+            },
+            "description": "Query execution result"
+          },
+          "202": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/QueryExecutionResponseSchema"
+                }
+              }
+            },
+            "description": "Query execution result, query still running"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "SQL Lab"
+        ]
+      }
+    },
+    "/api/v1/sqllab/export/{client_id}/": {
+      "get": {
+        "parameters": [
+          {
+            "description": "The SQL query result identifier",
+            "in": "path",
+            "name": "client_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "text/csv": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            },
+            "description": "SQL query results"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Exports the SQL query results to a CSV",
+        "tags": [
+          "SQL Lab"
+        ]
+      }
+    },
+    "/api/v1/sqllab/results/": {
+      "get": {
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/sql_lab_get_results_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/QueryExecutionResponseSchema"
+                }
+              }
+            },
+            "description": "SQL query execution result"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "410": {
+            "$ref": "#/components/responses/410"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "summary": "Gets the result of a SQL query execution",
+        "tags": [
+          "SQL Lab"
+        ]
+      }
+    },
+    "/api/v1/tag/": {
+      "delete": {
+        "description": "Deletes multiple Tags. This will remove all tagged objects with this tag",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/delete_tags_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Deletes multiple Tags"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      },
+      "get": {
+        "description": "Get a list of tags, use Rison or JSON query parameters for filtering, sorting, pagination and  for selecting specific columns and metadata.",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_list_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "count": {
+                      "description": "The total record count on the backend",
+                      "type": "number"
+                    },
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "ids": {
+                      "description": "A list of item ids, useful when you don't know the column id",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "list_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "list_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "List Items",
+                      "type": "string"
+                    },
+                    "order_columns": {
+                      "description": "A list of allowed columns to sort",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "result": {
+                      "description": "The result from the get list query",
+                      "items": {
+                        "$ref": "#/components/schemas/TagRestApi.get_list"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Items from Model"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      },
+      "post": {
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TagRestApi.post"
+              }
+            }
+          },
+          "description": "Model schema",
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "string"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/TagRestApi.post"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item inserted"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      }
+    },
+    "/api/v1/tag/_info": {
+      "get": {
+        "description": "Several metadata information about tag API endpoints.",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_info_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "add_columns": {
+                      "type": "object"
+                    },
+                    "edit_columns": {
+                      "type": "object"
+                    },
+                    "filters": {
+                      "properties": {
+                        "column_name": {
+                          "items": {
+                            "properties": {
+                              "name": {
+                                "description": "The filter name. Will be translated by babel",
+                                "type": "string"
+                              },
+                              "operator": {
+                                "description": "The filter operation key to use on list filters",
+                                "type": "string"
+                              }
+                            },
+                            "type": "object"
+                          },
+                          "type": "array"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "permissions": {
+                      "description": "The user permissions for this API resource",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Item from Model"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      }
+    },
+    "/api/v1/tag/favorite_status/": {
+      "get": {
+        "description": "Check favorited dashboards for current user",
+        "parameters": [
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_fav_star_ids_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/GetFavStarIdsSchema"
+                }
+              }
+            },
+            "description": "None"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      }
+    },
+    "/api/v1/tag/get_objects/": {
+      "get": {
+        "description": "Gets all objects associated with a Tag.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "tag_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "result": {
+                      "items": {
+                        "$ref": "#/components/schemas/TaggedObjectEntityResponseSchema"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "List of tagged objects associated with a Tag"
+          },
+          "302": {
+            "description": "Redirects to the current digest"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      }
+    },
+    "/api/v1/tag/related/{column_name}": {
+      "get": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "column_name",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/get_related_schema"
+                }
+              }
+            },
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RelatedResponseSchema"
+                }
+              }
+            },
+            "description": "Related column data"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      }
+    },
+    "/api/v1/tag/{object_type}/{object_id}/": {
+      "post": {
+        "description": "Add tags to an object..",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "object_type",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "path",
+            "name": "object_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "properties": {
+                  "tags": {
+                    "description": "list of tag names to add to object",
+                    "items": {
+                      "type": "string"
+                    },
+                    "type": "array"
+                  }
+                },
+                "type": "object"
+              }
+            }
+          },
+          "description": "Tag schema",
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Tag added"
+          },
+          "302": {
+            "description": "Redirects to the current digest"
+          },
+          "400": {
+            "$ref": "#/components/responses/400"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      }
+    },
+    "/api/v1/tag/{object_type}/{object_id}/{tag}/": {
+      "delete": {
+        "description": "Deletes a Tagged Object.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "tag",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "in": "path",
+            "name": "object_type",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "path",
+            "name": "object_id",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "message": {
                       "type": "string"
                     }
                   },
@@ -19887,34 +22701,53 @@
                 }
               }
             },
-            "description": "Authentication Successful"
-          },
-          "400": {
-            "$ref": "#/components/responses/400"
+            "description": "Chart delete"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
+          "403": {
+            "$ref": "#/components/responses/403"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
         },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
         "tags": [
-          "Security"
+          "Tags"
         ]
       }
     },
-    "/api/v1/security/refresh": {
-      "post": {
-        "description": "Use the refresh token to get a new JWT access token",
+    "/api/v1/tag/{pk}": {
+      "delete": {
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
         "responses": {
           "200": {
             "content": {
               "application/json": {
                 "schema": {
                   "properties": {
-                    "access_token": {
-                      "description": "A new refreshed access token",
+                    "message": {
                       "type": "string"
                     }
                   },
@@ -19922,10 +22755,13 @@
                 }
               }
             },
-            "description": "Refresh Successful"
+            "description": "Item deleted"
           },
-          "401": {
-            "$ref": "#/components/responses/401"
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
           },
           "500": {
             "$ref": "#/components/responses/500"
@@ -19933,48 +22769,87 @@
         },
         "security": [
           {
-            "jwt_refresh": []
+            "jwt": []
           }
         ],
         "tags": [
-          "Security"
+          "Tags"
         ]
-      }
-    },
-    "/api/v1/sqllab/execute/": {
-      "post": {
-        "description": "Starts the execution of a SQL query",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/ExecutePayloadSchema"
-              }
+      },
+      "get": {
+        "description": "Get a tag detail information.",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
             }
           },
-          "description": "SQL query and params",
-          "required": true
-        },
-        "responses": {
-          "200": {
+          {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/QueryExecutionResponseSchema"
+                  "$ref": "#/components/schemas/get_item_schema"
                 }
               }
             },
-            "description": "Query execution result"
-          },
-          "202": {
+            "in": "query",
+            "name": "q"
+          }
+        ],
+        "responses": {
+          "200": {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/QueryExecutionResponseSchema"
+                  "properties": {
+                    "description_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The description for the column name. Will be translated by babel",
+                          "example": "A Nice description for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "id": {
+                      "description": "The item id",
+                      "type": "string"
+                    },
+                    "label_columns": {
+                      "properties": {
+                        "column_name": {
+                          "description": "The label for the column name. Will be translated by babel",
+                          "example": "A Nice label for the column",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "result": {
+                      "$ref": "#/components/schemas/TagRestApi.get"
+                    },
+                    "show_columns": {
+                      "description": "A list of columns",
+                      "items": {
+                        "type": "string"
+                      },
+                      "type": "array"
+                    },
+                    "show_title": {
+                      "description": "A title to render. Will be translated by babel",
+                      "example": "Show Item Details",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "Query execution result, query still running"
+            "description": "Item from Model"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -19982,12 +22857,12 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "403": {
-            "$ref": "#/components/responses/403"
-          },
           "404": {
             "$ref": "#/components/responses/404"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -19998,33 +22873,46 @@
           }
         ],
         "tags": [
-          "SQL Lab"
+          "Tags"
         ]
-      }
-    },
-    "/api/v1/sqllab/export/{client_id}/": {
-      "get": {
+      },
+      "put": {
         "parameters": [
           {
-            "description": "The SQL query result identifier",
             "in": "path",
-            "name": "client_id",
+            "name": "pk",
             "required": true,
             "schema": {
               "type": "integer"
             }
           }
         ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TagRestApi.put"
+              }
+            }
+          },
+          "description": "Model schema",
+          "required": true
+        },
         "responses": {
           "200": {
             "content": {
-              "text/csv": {
+              "application/json": {
                 "schema": {
-                  "type": "string"
+                  "properties": {
+                    "result": {
+                      "$ref": "#/components/schemas/TagRestApi.put"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "SQL query results"
+            "description": "Item changed"
           },
           "400": {
             "$ref": "#/components/responses/400"
@@ -20032,12 +22920,12 @@
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "403": {
-            "$ref": "#/components/responses/403"
-          },
           "404": {
             "$ref": "#/components/responses/404"
           },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
           "500": {
             "$ref": "#/components/responses/500"
           }
@@ -20047,25 +22935,72 @@
             "jwt": []
           }
         ],
-        "summary": "Exports the SQL query results to a CSV",
         "tags": [
-          "SQL Lab"
+          "Tags"
         ]
       }
     },
-    "/api/v1/sqllab/results/": {
-      "get": {
+    "/api/v1/tag/{pk}/favorites/": {
+      "delete": {
+        "description": "Remove the tag from the user favorite list",
         "parameters": [
           {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/sql_lab_get_results_schema"
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "in": "query",
-            "name": "q"
+            "description": "Tag removed from favorites"
+          },
+          "401": {
+            "$ref": "#/components/responses/401"
+          },
+          "404": {
+            "$ref": "#/components/responses/404"
+          },
+          "422": {
+            "$ref": "#/components/responses/422"
+          },
+          "500": {
+            "$ref": "#/components/responses/500"
+          }
+        },
+        "security": [
+          {
+            "jwt": []
+          }
+        ],
+        "tags": [
+          "Tags"
+        ]
+      },
+      "post": {
+        "description": "Marks the tag as favorite for the current user",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "pk",
+            "required": true,
+            "schema": {
+              "type": "integer"
+            }
           }
         ],
         "responses": {
@@ -20073,26 +23008,25 @@
             "content": {
               "application/json": {
                 "schema": {
-                  "$ref": "#/components/schemas/QueryExecutionResponseSchema"
+                  "properties": {
+                    "result": {
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
                 }
               }
             },
-            "description": "SQL query execution result"
-          },
-          "400": {
-            "$ref": "#/components/responses/400"
+            "description": "Tag added to favorites"
           },
           "401": {
             "$ref": "#/components/responses/401"
           },
-          "403": {
-            "$ref": "#/components/responses/403"
-          },
           "404": {
             "$ref": "#/components/responses/404"
           },
-          "410": {
-            "$ref": "#/components/responses/410"
+          "422": {
+            "$ref": "#/components/responses/422"
           },
           "500": {
             "$ref": "#/components/responses/500"
@@ -20103,9 +23037,8 @@
             "jwt": []
           }
         ],
-        "summary": "Gets the result of a SQL query execution",
         "tags": [
-          "SQL Lab"
+          "Tags"
         ]
       }
     },
diff --git a/superset/explore/permalink/api.py b/superset/explore/permalink/api.py
index 2a8ff1998d..d9219b87be 100644
--- a/superset/explore/permalink/api.py
+++ b/superset/explore/permalink/api.py
@@ -69,7 +69,7 @@ class ExplorePermalinkRestApi(BaseSupersetApi):
             content:
               application/json:
                 schema:
-                  $ref: '#/components/schemas/ExplorePermalinkPostSchema'
+                  $ref: '#/components/schemas/ExplorePermalinkStateSchema'
           responses:
             201:
               description: The permanent link was stored successfully.


[superset] 02/06: fix(sqllab): normalize changedOn timestamp (#24513)

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit dd3877a2d3a99c84883a19094bf79615ddce5c5c
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon Jun 26 19:13:55 2023 +0300

    fix(sqllab): normalize changedOn timestamp (#24513)
---
 .../superset-ui-core/src/time-format/index.ts      |  3 ++
 .../src/time-format/utils/denormalizeTimestamp.ts} | 16 ++++----
 .../src/time-format/utils/normalizeTimestamp.ts}   | 16 ++++----
 .../time-format/utils/denormalizeTimestamp.test.ts | 43 ++++++++++++++++++++++
 .../preset-chart-xy/src/Line/createMetadata.ts     |  2 +
 .../SqlLab/components/SouthPane/SouthPane.test.jsx |  9 +++--
 superset-frontend/src/SqlLab/fixtures.ts           |  9 ++++-
 superset-frontend/src/SqlLab/reducers/sqlLab.js    |  8 ++--
 .../src/SqlLab/reducers/sqlLab.test.js             | 22 +++++++++--
 9 files changed, 98 insertions(+), 30 deletions(-)

diff --git a/superset-frontend/packages/superset-ui-core/src/time-format/index.ts b/superset-frontend/packages/superset-ui-core/src/time-format/index.ts
index 48ac1a6803..53f23f3643 100644
--- a/superset-frontend/packages/superset-ui-core/src/time-format/index.ts
+++ b/superset-frontend/packages/superset-ui-core/src/time-format/index.ts
@@ -36,4 +36,7 @@ export { default as smartDateFormatter } from './formatters/smartDate';
 export { default as smartDateDetailedFormatter } from './formatters/smartDateDetailed';
 export { default as smartDateVerboseFormatter } from './formatters/smartDateVerbose';
 
+export { default as normalizeTimestamp } from './utils/normalizeTimestamp';
+export { default as denormalizeTimestamp } from './utils/denormalizeTimestamp';
+
 export * from './types';
diff --git a/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts b/superset-frontend/packages/superset-ui-core/src/time-format/utils/denormalizeTimestamp.ts
similarity index 74%
copy from superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
copy to superset-frontend/packages/superset-ui-core/src/time-format/utils/denormalizeTimestamp.ts
index 1567210cf7..3a69667ce1 100644
--- a/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
+++ b/superset-frontend/packages/superset-ui-core/src/time-format/utils/denormalizeTimestamp.ts
@@ -17,14 +17,12 @@
  * under the License.
  */
 
-import { t, ChartMetadata } from '@superset-ui/core';
-import thumbnail from './images/thumbnail.png';
+import { TS_REGEX } from './normalizeTimestamp';
 
-export default function createMetadata(useLegacyApi = false) {
-  return new ChartMetadata({
-    description: '',
-    name: t('Line Chart'),
-    thumbnail,
-    useLegacyApi,
-  });
+export default function normalizeTimestamp(value: string): string {
+  const match = value.match(TS_REGEX);
+  if (match) {
+    return `${match[1]}T${match[2]}`;
+  }
+  return value;
 }
diff --git a/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts b/superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
similarity index 74%
copy from superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
copy to superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
index 1567210cf7..8e5201f238 100644
--- a/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
+++ b/superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
@@ -17,14 +17,12 @@
  * under the License.
  */
 
-import { t, ChartMetadata } from '@superset-ui/core';
-import thumbnail from './images/thumbnail.png';
+export const TS_REGEX = /(\d{4}-\d{2}-\d{2})[\sT](\d{2}:\d{2}:\d{2}\.?\d*).*/;
 
-export default function createMetadata(useLegacyApi = false) {
-  return new ChartMetadata({
-    description: '',
-    name: t('Line Chart'),
-    thumbnail,
-    useLegacyApi,
-  });
+export default function normalizeTimestamp(value: string): string {
+  const match = value.match(TS_REGEX);
+  if (match) {
+    return `${match[1]}T${match[2]}Z`;
+  }
+  return value;
 }
diff --git a/superset-frontend/packages/superset-ui-core/test/time-format/utils/denormalizeTimestamp.test.ts b/superset-frontend/packages/superset-ui-core/test/time-format/utils/denormalizeTimestamp.test.ts
new file mode 100644
index 0000000000..27838c393a
--- /dev/null
+++ b/superset-frontend/packages/superset-ui-core/test/time-format/utils/denormalizeTimestamp.test.ts
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+import denormalizeTimestamp from '../../../src/time-format/utils/denormalizeTimestamp';
+
+test('denormalizeTimestamp should normalize typical timestamps', () => {
+  expect(denormalizeTimestamp('2023-03-11 08:26:52.695 UTC')).toEqual(
+    '2023-03-11T08:26:52.695',
+  );
+  expect(
+    denormalizeTimestamp('2023-03-11 08:26:52.695 Europe/Helsinki'),
+  ).toEqual('2023-03-11T08:26:52.695');
+  expect(denormalizeTimestamp('2023-03-11T08:26:52.695 UTC')).toEqual(
+    '2023-03-11T08:26:52.695',
+  );
+  expect(denormalizeTimestamp('2023-03-11T08:26:52.695')).toEqual(
+    '2023-03-11T08:26:52.695',
+  );
+  expect(denormalizeTimestamp('2023-03-11 08:26:52')).toEqual(
+    '2023-03-11T08:26:52',
+  );
+});
+
+test('denormalizeTimestamp should return unmatched timestamps as-is', () => {
+  expect(denormalizeTimestamp('abcd')).toEqual('abcd');
+  expect(denormalizeTimestamp('03/11/2023')).toEqual('03/11/2023');
+});
diff --git a/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts b/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
index 1567210cf7..a1554206e9 100644
--- a/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
+++ b/superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts
@@ -20,6 +20,8 @@
 import { t, ChartMetadata } from '@superset-ui/core';
 import thumbnail from './images/thumbnail.png';
 
+export const TS_REGEX = /(\d{4}-\d{2}-\d{2})[\sT](\d{2}:\d{2}:\d{2}\.?\d*).*/;
+
 export default function createMetadata(useLegacyApi = false) {
   return new ChartMetadata({
     description: '',
diff --git a/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx b/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx
index 519e729c41..276d8eea66 100644
--- a/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx
+++ b/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx
@@ -24,6 +24,7 @@ import SouthPane from 'src/SqlLab/components/SouthPane';
 import '@testing-library/jest-dom/extend-expect';
 import { STATUS_OPTIONS } from 'src/SqlLab/constants';
 import { initialState, table, defaultQueryEditor } from 'src/SqlLab/fixtures';
+import { denormalizeTimestamp } from '@superset-ui/core';
 
 const mockedProps = {
   queryEditorId: defaultQueryEditor.id,
@@ -61,7 +62,7 @@ const store = mockStore({
     queries: {
       LCly_kkIN: {
         cached: false,
-        changedOn: Date.now(),
+        changed_on: denormalizeTimestamp(new Date().toISOString()),
         db: 'main',
         dbId: 1,
         id: 'LCly_kkIN',
@@ -71,7 +72,7 @@ const store = mockStore({
       },
       lXJa7F9_r: {
         cached: false,
-        changedOn: 1559238500401,
+        changed_on: denormalizeTimestamp(new Date(1559238500401).toISOString()),
         db: 'main',
         dbId: 1,
         id: 'lXJa7F9_r',
@@ -80,7 +81,7 @@ const store = mockStore({
       },
       '2g2_iRFMl': {
         cached: false,
-        changedOn: 1559238506925,
+        changed_on: denormalizeTimestamp(new Date(1559238506925).toISOString()),
         db: 'main',
         dbId: 1,
         id: '2g2_iRFMl',
@@ -89,7 +90,7 @@ const store = mockStore({
       },
       erWdqEWPm: {
         cached: false,
-        changedOn: 1559238516395,
+        changed_on: denormalizeTimestamp(new Date(1559238516395).toISOString()),
         db: 'main',
         dbId: 1,
         id: 'erWdqEWPm',
diff --git a/superset-frontend/src/SqlLab/fixtures.ts b/superset-frontend/src/SqlLab/fixtures.ts
index 456a83a3fa..27b582cbd0 100644
--- a/superset-frontend/src/SqlLab/fixtures.ts
+++ b/superset-frontend/src/SqlLab/fixtures.ts
@@ -19,7 +19,12 @@
 import sinon from 'sinon';
 import * as actions from 'src/SqlLab/actions/sqlLab';
 import { ColumnKeyTypeType } from 'src/SqlLab/components/ColumnElement';
-import { DatasourceType, QueryResponse, QueryState } from '@superset-ui/core';
+import {
+  DatasourceType,
+  denormalizeTimestamp,
+  QueryResponse,
+  QueryState,
+} from '@superset-ui/core';
 import { ISaveableDatasource } from 'src/SqlLab/components/SaveDatasetModal';
 
 export const mockedActions = sinon.stub({ ...actions });
@@ -721,7 +726,7 @@ export const mockdatasets = [...new Array(3)].map((_, i) => ({
   kind: i === 0 ? 'virtual' : 'physical', // ensure there is 1 virtual
   changed_by_url: 'changed_by_url',
   changed_by: 'user',
-  changed_on: new Date().toISOString(),
+  changed_on: denormalizeTimestamp(new Date().toISOString()),
   database_name: `db ${i}`,
   explore_url: `/explore/?datasource_type=table&datasource_id=${i}`,
   id: i,
diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.js b/superset-frontend/src/SqlLab/reducers/sqlLab.js
index e3bb196fbc..db0332f8c9 100644
--- a/superset-frontend/src/SqlLab/reducers/sqlLab.js
+++ b/superset-frontend/src/SqlLab/reducers/sqlLab.js
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { QueryState, t } from '@superset-ui/core';
+import { normalizeTimestamp, QueryState, t } from '@superset-ui/core';
 import getInitialState from './getInitialState';
 import * as actions from '../actions/sqlLab';
 import { now } from '../../utils/dates';
@@ -729,8 +729,10 @@ export default function sqlLabReducer(state = {}, action) {
           (state.queries[id].state !== QueryState.STOPPED &&
             state.queries[id].state !== QueryState.FAILED)
         ) {
-          if (changedQuery.changedOn > queriesLastUpdate) {
-            queriesLastUpdate = changedQuery.changedOn;
+          const changedOn = normalizeTimestamp(changedQuery.changed_on);
+          const timestamp = Date.parse(changedOn);
+          if (timestamp > queriesLastUpdate) {
+            queriesLastUpdate = timestamp;
           }
           const prevState = state.queries[id]?.state;
           const currentState = changedQuery.state;
diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.test.js b/superset-frontend/src/SqlLab/reducers/sqlLab.test.js
index dd4c0be4b4..a5468f6898 100644
--- a/superset-frontend/src/SqlLab/reducers/sqlLab.test.js
+++ b/superset-frontend/src/SqlLab/reducers/sqlLab.test.js
@@ -18,7 +18,6 @@
  */
 import sqlLabReducer from 'src/SqlLab/reducers/sqlLab';
 import * as actions from 'src/SqlLab/actions/sqlLab';
-import { now } from 'src/utils/dates';
 import { table, initialState as mockState } from '../fixtures';
 
 const initialState = mockState.sqlLab;
@@ -272,6 +271,8 @@ describe('sqlLabReducer', () => {
     });
   });
   describe('Run Query', () => {
+    const DENORMALIZED_CHANGED_ON = '2023-06-26T07:53:05.439';
+    const CHANGED_ON_TIMESTAMP = 1687765985439;
     let newState;
     let query;
     beforeEach(() => {
@@ -279,7 +280,8 @@ describe('sqlLabReducer', () => {
       query = {
         id: 'abcd',
         progress: 0,
-        startDttm: now(),
+        changed_on: DENORMALIZED_CHANGED_ON,
+        startDttm: CHANGED_ON_TIMESTAMP,
         state: 'running',
         cached: false,
         sqlEditorId: 'dfsadfs',
@@ -291,7 +293,8 @@ describe('sqlLabReducer', () => {
         query: {
           id: 'abcd',
           progress: 0,
-          startDttm: now(),
+          changed_on: DENORMALIZED_CHANGED_ON,
+          startDttm: CHANGED_ON_TIMESTAMP,
           state: 'running',
           cached: false,
           sqlEditorId: 'dfsadfs',
@@ -327,6 +330,19 @@ describe('sqlLabReducer', () => {
       newState = sqlLabReducer(newState, removeQueryAction);
       expect(Object.keys(newState.queries)).toHaveLength(0);
     });
+    it('should refresh queries when polling returns new results', () => {
+      newState = sqlLabReducer(
+        {
+          ...newState,
+          queries: { abcd: {} },
+        },
+        actions.refreshQueries({
+          abcd: query,
+        }),
+      );
+      expect(newState.queries.abcd.changed_on).toBe(DENORMALIZED_CHANGED_ON);
+      expect(newState.queriesLastUpdate).toBe(CHANGED_ON_TIMESTAMP);
+    });
     it('should refresh queries when polling returns empty', () => {
       newState = sqlLabReducer(newState, actions.refreshQueries({}));
     });


[superset] 06/06: update changelog

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 1f104a0c502047a8c60b0a52add5cbe3694e1d26
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Fri Jul 7 17:06:51 2023 -0700

    update changelog
---
 CHANGELOG.md | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6f67b4d5cf..7eeb2f42c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,7 +19,7 @@ under the License.
 
 ## Change Log
 
-- [2.1.1](#211-sun-apr-23-154421-2023--0100)
+- [2.1.1](#211-sun-apr-23-154421-2023-0100)
 - [2.1.0](#210-thu-mar-16-211305-2023--0700)
 - [2.0.1](#201-fri-nov-4-103402-2022--0400)
 - [2.0.0](#200-tue-jun-28-085302-2022--0400)
@@ -34,14 +34,26 @@ under the License.
 ### 2.1.1 (Sun Apr 23 15:44:21 2023 +0100)
 
 **Database Migrations**
-- [##23980](https://github.com/apache/superset/pull/23980) fix(migration): handle permalink edge cases correctly (@villebro)
-- [23888](https://github.com/apache/superset/pull/23888) chore(key-value): use json serialization for main resources (@villebro)
+- [#23980](https://github.com/apache/superset/pull/23980) fix(migration): handle permalink edge cases correctly (@villebro)
+- [#23888](https://github.com/apache/superset/pull/23888) chore(key-value): use json serialization for main resources (@villebro)
 
 **Fixes**
+- [#23723](https://github.com/apache/superset/pull/23723) fix: add enforce URI query params with a specific for MySQL (@dpgaspar)
+- [#24970](https://github.com/apache/superset/pull/24970) fix: update permalink schema (@eschutho)
+- [#24995](https://github.com/apache/superset/pull/24995) fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (@eschutho)
+- [#24513](https://github.com/apache/superset/pull/24513) fix(sqllab): normalize changedOn timestamp (@villebro)
+- [#23512](https://github.com/apache/superset/pull/23512) fix: Dashboard not loading with default first value in filter (@geido)
+- [#24482](https://github.com/apache/superset/pull/24482) fix(permalink): Incorrect component schema reference (@Nisden)
+- [#24166](https://github.com/apache/superset/pull/24166) fix(permalink): migrate to marshmallow codec (@villebro)
+- [#24697](https://github.com/apache/superset/pull/24697) fix: import database engine validation (@dpgaspar)
+- [#24390](https://github.com/apache/superset/pull/24390) fix: FAB CSS on Superset (@dpgaspar)
+- [#24249](https://github.com/apache/superset/pull/24249) fix: dashboard ownership check (@betodealmeida)
+- [#23801](https://github.com/apache/superset/pull/23801) fix(plugin-chart-handlebars): Fix TypeError when using handlebars columns raw mode (@fmannhardt)
+- [#23566](https://github.com/apache/superset/pull/23566) fix: Filter values are not updating when dependencies are set (@michael-s-molina)
+- [#23400](https://github.com/apache/superset/pull/23400) fix: Select all issue with "Dynamically search all filter values" in FilterBar (@geido)
 - [#23865](https://github.com/apache/superset/pull/23865) fix: Native time range filter in legacy charts (@kgabryje)
 - [#24054](https://github.com/apache/superset/pull/24054) fix: handle temporal columns in presto partitions (@giftig)
 - [#23882](https://github.com/apache/superset/pull/23882) fix: handle comments in `has_table_query` (@betodealmeida)
-- [#24256](https://github.com/apache/superset/pull/24256) fix: enable strong session protection by default (@dpgaspar)
 - [#24137](https://github.com/apache/superset/pull/24137) fix: disable SHOW_STACKTRACE by default (@dpgaspar)
 - [#24185](https://github.com/apache/superset/pull/24185) fix: db validate parameters permission (@dpgaspar)
 - [#23769](https://github.com/apache/superset/pull/23769) fix: allow db driver distinction on enforced URI params (@dpgaspar)
@@ -58,7 +70,8 @@ under the License.
 - [#22851](https://github.com/apache/superset/pull/22851) fix: Validate jinja rendered query (@geido)
 
 **Others**
-- [#23723](https://github.com/apache/superset/pull/23723) chore: add enforce URI query params with a specific for MySQL (@dpgaspar)
+- [#24586](https://github.com/apache/superset/pull/24586) chore(metastore-cache): add codec support (@villebro)
+- [#23113](https://github.com/apache/superset/pull/23113) chore(sqla): Address performance tradeoff with eager loading (@john-bodley)
 - [#24294](https://github.com/apache/superset/pull/24294) chore: update UPDATING for 2.1.0 (@eschutho)
 - [#24056](https://github.com/apache/superset/pull/24056) chore: Remove unnecessary information from response (@geido)
 


[superset] 03/06: fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 2f19b12a224bbd5e1894ee44075ea5a5955010c6
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Wed Aug 16 09:51:00 2023 -0700

    fix: Revert "fix(chart): Time Series set showMaxLabel as null for time xAxis (#20627) (#24995)
---
 .../plugin-chart-echarts/src/Timeseries/transformProps.ts  | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
index eadded44a9..4cbcfae230 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
@@ -339,23 +339,13 @@ export default function transformProps(
       rotate: xAxisLabelRotation,
     },
     minInterval:
-      xAxisType === AxisType.time && timeGrainSqla
+      xAxisType === 'time' && timeGrainSqla
         ? TIMEGRAIN_TO_TIMESTAMP[timeGrainSqla]
         : 0,
   };
-
-  if (xAxisType === AxisType.time) {
-    /**
-     * Overriding default behavior (false) for time axis regardless of the granilarity.
-     * Not including this in the initial declaration above so if echarts changes the default
-     * behavior for other axist types we won't unintentionally override it
-     */
-    xAxis.axisLabel.showMaxLabel = null;
-  }
-
   let yAxis: any = {
     ...defaultYAxis,
-    type: logAxis ? AxisType.log : AxisType.value,
+    type: logAxis ? 'log' : 'value',
     min,
     max,
     minorTick: { show: true },