You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by hu...@apache.org on 2022/04/15 17:17:12 UTC

[superset] branch master updated: fix: Removetime_range_endpoints from query context object pt 2 (#19728)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 86642025ba fix: Removetime_range_endpoints from query context object pt 2 (#19728)
86642025ba is described below

commit 86642025ba0bb555e6e5d6c058a74e98d997f2e8
Author: Hugh A. Miles II <hu...@gmail.com>
AuthorDate: Fri Apr 15 13:17:05 2022 -0400

    fix: Removetime_range_endpoints from query context object pt 2 (#19728)
---
 ...2ed890b36b94_rm_time_range_endpoints_from_qc.py |  33 +-----
 ...y => cecc6bf46990_rm_time_range_endpoints_2.py} |  36 +++---
 ...ecc6bf46990_rm_time_range_endpoints_2__tests.py | 130 +++++++++++++++++++++
 3 files changed, 153 insertions(+), 46 deletions(-)

diff --git a/superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py b/superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py
index 42d73bc33d..e4e4718a41 100644
--- a/superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py
+++ b/superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py
@@ -26,40 +26,9 @@ Create Date: 2022-03-29 18:03:48.977741
 revision = "2ed890b36b94"
 down_revision = "58df9d617f14"
 
-import json
-
-import sqlalchemy as sa
-from alembic import op
-from sqlalchemy.ext.declarative import declarative_base
-
-from superset import db
-
-Base = declarative_base()
-
-
-class Slice(Base):
-    __tablename__ = "slices"
-    id = sa.Column(sa.Integer, primary_key=True)
-    query_context = sa.Column(sa.Text)
-
 
 def upgrade():
-    bind = op.get_bind()
-    session = db.Session(bind=bind)
-    for slc in session.query(Slice).filter(
-        Slice.query_context.like("%time_range_endpoints%")
-    ):
-        try:
-            query_context = json.loads(slc.query_context)
-        except json.decoder.JSONDecodeError:
-            continue
-        queries = query_context.get("queries")
-        for query in queries:
-            query.get("extras", {}).pop("time_range_endpoints", None)
-        slc.queries = json.dumps(queries)
-
-    session.commit()
-    session.close()
+    pass
 
 
 def downgrade():
diff --git a/superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py b/superset/migrations/versions/cecc6bf46990_rm_time_range_endpoints_2.py
similarity index 70%
copy from superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py
copy to superset/migrations/versions/cecc6bf46990_rm_time_range_endpoints_2.py
index 42d73bc33d..20d797ddba 100644
--- a/superset/migrations/versions/2ed890b36b94_rm_time_range_endpoints_from_qc.py
+++ b/superset/migrations/versions/cecc6bf46990_rm_time_range_endpoints_2.py
@@ -14,17 +14,17 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""rm_time_range_endpoints_from_qc
+"""rm_time_range_endpoints_2
 
-Revision ID: 2ed890b36b94
-Revises: 58df9d617f14
-Create Date: 2022-03-29 18:03:48.977741
+Revision ID: cecc6bf46990
+Revises: 9d8a8d575284
+Create Date: 2022-04-14 17:21:53.996022
 
 """
 
 # revision identifiers, used by Alembic.
-revision = "2ed890b36b94"
-down_revision = "58df9d617f14"
+revision = "cecc6bf46990"
+down_revision = "9d8a8d575284"
 
 import json
 
@@ -41,6 +41,21 @@ class Slice(Base):
     __tablename__ = "slices"
     id = sa.Column(sa.Integer, primary_key=True)
     query_context = sa.Column(sa.Text)
+    slice_name = sa.Column(sa.String(250))
+
+
+def upgrade_slice(slc: Slice):
+    try:
+        query_context = json.loads(slc.query_context)
+    except json.decoder.JSONDecodeError:
+        return
+
+    queries = query_context.get("queries")
+
+    for query in queries:
+        query.get("extras", {}).pop("time_range_endpoints", None)
+
+    slc.query_context = json.dumps(query_context)
 
 
 def upgrade():
@@ -49,14 +64,7 @@ def upgrade():
     for slc in session.query(Slice).filter(
         Slice.query_context.like("%time_range_endpoints%")
     ):
-        try:
-            query_context = json.loads(slc.query_context)
-        except json.decoder.JSONDecodeError:
-            continue
-        queries = query_context.get("queries")
-        for query in queries:
-            query.get("extras", {}).pop("time_range_endpoints", None)
-        slc.queries = json.dumps(queries)
+        upgrade_slice(slc)
 
     session.commit()
     session.close()
diff --git a/tests/integration_tests/migrations/cecc6bf46990_rm_time_range_endpoints_2__tests.py b/tests/integration_tests/migrations/cecc6bf46990_rm_time_range_endpoints_2__tests.py
new file mode 100644
index 0000000000..26d9eec0a5
--- /dev/null
+++ b/tests/integration_tests/migrations/cecc6bf46990_rm_time_range_endpoints_2__tests.py
@@ -0,0 +1,130 @@
+# 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 json
+
+from superset.migrations.versions.cecc6bf46990_rm_time_range_endpoints_2 import (
+    Slice,
+    upgrade_slice,
+)
+
+sample_query_context = {
+    "datasource": {"id": 27, "type": "table"},
+    "force": False,
+    "queries": [
+        {
+            "time_range": "No filter",
+            "filters": [],
+            "extras": {
+                "time_grain_sqla": "P1D",
+                "time_range_endpoints": ["inclusive", "exclusive"],
+                "having": "",
+                "having_druid": [],
+                "where": "",
+            },
+            "applied_time_extras": {},
+            "columns": ["a", "b"],
+            "orderby": [],
+            "annotation_layers": [],
+            "row_limit": 1000,
+            "timeseries_limit": 0,
+            "order_desc": True,
+            "url_params": {},
+            "custom_params": {},
+            "custom_form_data": {},
+            "post_processing": [],
+        }
+    ],
+    "form_data": {
+        "viz_type": "table",
+        "datasource": "27__table",
+        "slice_id": 545,
+        "url_params": {},
+        "time_grain_sqla": "P1D",
+        "time_range": "No filter",
+        "query_mode": "raw",
+        "groupby": [],
+        "metrics": [],
+        "all_columns": ["a", "b"],
+        "percent_metrics": [],
+        "adhoc_filters": [],
+        "order_by_cols": [],
+        "row_limit": 1000,
+        "server_page_length": 10,
+        "include_time": False,
+        "order_desc": True,
+        "table_timestamp_format": "smart_date",
+        "show_cell_bars": True,
+        "color_pn": True,
+        "extra_form_data": {},
+        "force": False,
+        "result_format": "json",
+        "result_type": "full",
+    },
+    "result_format": "json",
+    "result_type": "full",
+}
+
+
+sample_query_context = {
+    "datasource": {"id": 27, "type": "table"},
+    "force": False,
+    "queries": [
+        {
+            "time_range": "No filter",
+            "filters": [],
+            "extras": {
+                "time_grain_sqla": "P1D",
+                "time_range_endpoints": ["inclusive", "exclusive"],
+                "having": "",
+                "having_druid": [],
+                "where": "",
+            },
+            "applied_time_extras": {},
+            "columns": ["a", "b"],
+            "orderby": [],
+            "annotation_layers": [],
+            "row_limit": 1000,
+            "timeseries_limit": 0,
+            "order_desc": True,
+            "url_params": {},
+            "custom_params": {},
+            "custom_form_data": {},
+            "post_processing": [],
+        }
+    ],
+    "form_data": {},
+    "result_format": "json",
+    "result_type": "full",
+}
+
+
+def test_upgrade():
+    slc = Slice(slice_name="FOO", query_context=json.dumps(sample_query_context))
+
+    upgrade_slice(slc)
+
+    query_context = json.loads(slc.query_context)
+    queries = query_context.get("queries")
+    for q in queries:
+        extras = q.get("extras", {})
+        assert "time_range_endpoints" not in extras
+
+
+def test_upgrade_bad_json():
+    slc = Slice(slice_name="FOO", query_context="abc")
+
+    assert None == upgrade_slice(slc)