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)