diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index 577679092c09b..3b22ade1df366 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -1144,7 +1144,9 @@ def run_query( # noqa / druid pre_qry['aggregations'] = aggs_dict pre_qry['post_aggregations'] = post_aggs_dict else: - order_by = list(qry['aggregations'].keys())[0] + agg_keys = qry['aggregations'].keys() + order_by = list(agg_keys)[0] if agg_keys else None + # Limit on the number of timeseries, doing a two-phases query pre_qry['granularity'] = 'all' pre_qry['threshold'] = min(row_limit, diff --git a/superset/migrations/versions/fb13d49b72f9_better_filters.py b/superset/migrations/versions/fb13d49b72f9_better_filters.py index 956766d060b79..cac42c3dc6147 100644 --- a/superset/migrations/versions/fb13d49b72f9_better_filters.py +++ b/superset/migrations/versions/fb13d49b72f9_better_filters.py @@ -46,6 +46,27 @@ class Slice(Base): slice_name = Column(String(250)) +def upgrade_slice(slc): + params = json.loads(slc.params) + logging.info(f'Upgrading {slc.slice_name}') + cols = params.get('groupby') + metric = params.get('metric') + if cols: + flts = [{ + 'column': col, + 'metric': metric, + 'asc': False, + 'clearable': True, + 'multiple': True, + } for col in cols] + params['filter_configs'] = flts + if 'groupby' in params: + del params['groupby'] + if 'metric' in params: + del params['metric'] + slc.params = json.dumps(params, sort_keys=True) + + def upgrade(): bind = op.get_bind() session = db.Session(bind=bind) @@ -53,24 +74,7 @@ def upgrade(): filter_box_slices = session.query(Slice).filter_by(viz_type='filter_box') for slc in filter_box_slices.all(): try: - params = json.loads(slc.params) - logging.info(f'Upgrading {slc.slice_name}') - cols = params.get('groupby') - metrics = params.get('metrics') - if cols: - flts = [{ - 'column': col, - 'metric': metrics[0] if metrics else None, - 'asc': False, - 'clearable': True, - 'multiple': True, - } for col in cols] - params['filter_configs'] = flts - if 'groupby' in params: - del params['groupby'] - if 'metrics' in params: - del params['metrics'] - slc.params = json.dumps(params, sort_keys=True) + upgrade_slice(slc) except Exception as e: logging.exception(e) diff --git a/tests/migration_tests.py b/tests/migration_tests.py new file mode 100644 index 0000000000000..530e0060361a3 --- /dev/null +++ b/tests/migration_tests.py @@ -0,0 +1,42 @@ +# 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.fb13d49b72f9_better_filters import ( + Slice, upgrade_slice, +) +from .base_tests import SupersetTestCase + + +class MigrationTestCase(SupersetTestCase): + + def test_upgrade_slice(self): + slc = Slice( + slice_name='FOO', + viz_type='filter_box', + params=json.dumps(dict( + metric='foo', + groupby=['bar'], + )), + ) + upgrade_slice(slc) + params = json.loads(slc.params) + self.assertNotIn('metric', params) + self.assertIn('filter_configs', params) + + cfg = params['filter_configs'][0] + self.assertEquals(cfg.get('metric'), 'foo')