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/18 18:35:08 UTC

[superset] 01/01: fix migration

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

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

commit 4aeed9729bd4ea3592ded457b8e39dfb31eec93f
Author: hughhhh <hu...@gmail.com>
AuthorDate: Mon Apr 18 11:34:46 2022 -0700

    fix migration
---
 ...07e4fdbaba_rm_time_range_endpoints_from_qc_3.py |  77 ++++++++++++
 ...baba_rm_time_range_endpoints_from_qc_3__test.py | 134 +++++++++++++++++++++
 2 files changed, 211 insertions(+)

diff --git a/superset/migrations/versions/0d07e4fdbaba_rm_time_range_endpoints_from_qc_3.py b/superset/migrations/versions/0d07e4fdbaba_rm_time_range_endpoints_from_qc_3.py
new file mode 100644
index 0000000000..9be4274a3a
--- /dev/null
+++ b/superset/migrations/versions/0d07e4fdbaba_rm_time_range_endpoints_from_qc_3.py
@@ -0,0 +1,77 @@
+# 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.
+"""rm_time_range_endpoints_from_qc_3
+
+Revision ID: 0d07e4fdbaba
+Revises: cecc6bf46990
+Create Date: 2022-04-18 11:20:47.390901
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = "0d07e4fdbaba"
+down_revision = "cecc6bf46990"
+
+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)
+    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)
+        query.get("form_data", {}).pop("time_range_endpoints", None)
+
+    slc.query_context = json.dumps(query_context)
+
+
+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%"))
+        .all()
+    ):
+        upgrade_slice(slc)
+
+    session.commit()
+    session.close()
+
+
+def downgrade():
+    pass
diff --git a/tests/integration_tests/migrations/0d07e4fdbaba_rm_time_range_endpoints_from_qc_3__test.py b/tests/integration_tests/migrations/0d07e4fdbaba_rm_time_range_endpoints_from_qc_3__test.py
new file mode 100644
index 0000000000..77d228a12b
--- /dev/null
+++ b/tests/integration_tests/migrations/0d07e4fdbaba_rm_time_range_endpoints_from_qc_3__test.py
@@ -0,0 +1,134 @@
+# 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.0d07e4fdbaba_rm_time_range_endpoints_from_qc_3 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": {
+        "time_range_endpoints": ["inclusive", "exclusive"],
+    },
+    "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", {})
+        form_data = q.get("form_data", {})
+        assert "time_range_endpoints" not in extras
+        assert "time_range_endpoints" not in form_data
+
+
+def test_upgrade_bad_json():
+    slc = Slice(slice_name="FOO", query_context="abc")
+
+    assert None == upgrade_slice(slc)