From 9f834e8317dca7c71470c89e2c86bb35ca7ca39f Mon Sep 17 00:00:00 2001 From: Kamil Gabryjelski Date: Fri, 4 Mar 2022 17:48:41 +0100 Subject: [PATCH] fix(plugin-chart-echarts): Apply temporary filters to Query B in explore (#18998) * fix(explore): Extra filters not applied to query b in mixed timeseries * Add return type * Apply review comment * Fix non-dnd filters --- .../src/shared-controls/dndControls.tsx | 2 +- .../src/shared-controls/index.tsx | 2 +- ...944_change_adhoc_filter_b_from_none_to_.py | 84 +++++++++++++++++++ superset/utils/core.py | 12 +-- 4 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 superset/migrations/versions/7293b0ca7944_change_adhoc_filter_b_from_none_to_.py diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx index 5c06a5404..44b4bcc18 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx @@ -80,7 +80,7 @@ export const dndEntity: typeof dndGroupByControl = { export const dnd_adhoc_filters: SharedControlConfig<'DndFilterSelect'> = { type: 'DndFilterSelect', label: t('Filters'), - default: null, + default: [], description: '', mapStateToProps: ({ datasource, form_data }) => ({ columns: datasource?.columns.filter(c => c.filterable) || [], diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx index 8163dd97d..90c0e88f9 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx @@ -458,7 +458,7 @@ const x_axis_time_format: SharedControlConfig<'SelectControl'> = { const adhoc_filters: SharedControlConfig<'AdhocFilterControl'> = { type: 'AdhocFilterControl', label: t('Filters'), - default: null, + default: [], description: '', mapStateToProps: ({ datasource, form_data }) => ({ columns: datasource?.columns.filter(c => c.filterable) || [], diff --git a/superset/migrations/versions/7293b0ca7944_change_adhoc_filter_b_from_none_to_.py b/superset/migrations/versions/7293b0ca7944_change_adhoc_filter_b_from_none_to_.py new file mode 100644 index 000000000..65299701a --- /dev/null +++ b/superset/migrations/versions/7293b0ca7944_change_adhoc_filter_b_from_none_to_.py @@ -0,0 +1,84 @@ +# 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. +"""change_adhoc_filter_b_from_none_to_empty_array + +Revision ID: 7293b0ca7944 +Revises: b8d3a24d9131 +Create Date: 2022-03-02 16:41:36.350540 + +""" + +# revision identifiers, used by Alembic. +revision = "7293b0ca7944" +down_revision = "ab9a9d86e695" + + +import json + +from alembic import op +from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base + +from superset import db + +Base = declarative_base() + + +class Slice(Base): + __tablename__ = "slices" + + id = Column(Integer, primary_key=True) + params = Column(Text) + viz_type = Column(String(250)) + + +def upgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + for slc in session.query(Slice).filter(Slice.viz_type == "mixed_timeseries").all(): + try: + params = json.loads(slc.params) + + adhoc_filters_b = params.get("adhoc_filters_b", None) + if not adhoc_filters_b: + params["adhoc_filters_b"] = [] + slc.params = json.dumps(params, sort_keys=True) + except Exception: + pass + + session.commit() + session.close() + + +def downgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + for slc in session.query(Slice).filter(Slice.viz_type == "mixed_timeseries").all(): + try: + params = json.loads(slc.params) + + adhoc_filters_b = params.get("adhoc_filters_b", []) + if not adhoc_filters_b: + del params["adhoc_filters_b"] + slc.params = json.dumps(params, sort_keys=True) + except Exception: + pass + + session.commit() + session.close() diff --git a/superset/utils/core.py b/superset/utils/core.py index b936b2373..2fdbc278a 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -1081,11 +1081,13 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None: {"isExtra": True, **fltr} for fltr in append_adhoc_filters # type: ignore ) if append_filters: - adhoc_filters.extend( - simple_filter_to_adhoc({"isExtra": True, **fltr}) # type: ignore - for fltr in append_filters - if fltr - ) + for key, value in form_data.items(): + if re.match("adhoc_filter.*", key): + value.extend( + simple_filter_to_adhoc({"isExtra": True, **fltr}) # type: ignore + for fltr in append_filters + if fltr + ) def merge_extra_filters(form_data: Dict[str, Any]) -> None: