You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by kg...@apache.org on 2021/12/21 16:01:05 UTC
[superset] branch master updated: feat(plugin-chart-pivot-table): support series limit (#17803)
This is an automated email from the ASF dual-hosted git repository.
kgabryje 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 2c3f39f feat(plugin-chart-pivot-table): support series limit (#17803)
2c3f39f is described below
commit 2c3f39f3f2a4369bf03403c452d124c24c521e7d
Author: Kamil Gabryjelski <ka...@gmail.com>
AuthorDate: Tue Dec 21 16:58:54 2021 +0100
feat(plugin-chart-pivot-table): support series limit (#17803)
* feat(plugin-chart-pivot-table): support series limit
* Add a migration
* Use non-legacy series limit controls
* Add a todo comment
* Bug fix
---
.../src/plugin/buildQuery.ts | 34 +++-----
.../src/plugin/controlPanel.tsx | 29 ++++++-
...d1d2_move_pivot_table_v2_legacy_order_by_to_.py | 95 ++++++++++++++++++++++
3 files changed, 132 insertions(+), 26 deletions(-)
diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts
index cd5db2a..677902b 100644
--- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts
+++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts
@@ -19,45 +19,31 @@
import {
buildQueryContext,
ensureIsArray,
- getMetricLabel,
- normalizeOrderBy,
QueryFormColumn,
+ QueryFormOrderBy,
} from '@superset-ui/core';
import { PivotTableQueryFormData } from '../types';
export default function buildQuery(formData: PivotTableQueryFormData) {
- const {
- groupbyColumns = [],
- groupbyRows = [],
- order_desc = true,
- legacy_order_by,
- } = formData;
+ const { groupbyColumns = [], groupbyRows = [] } = formData;
// TODO: add deduping of AdhocColumns
const groupbySet = new Set([
...ensureIsArray<QueryFormColumn>(groupbyColumns),
...ensureIsArray<QueryFormColumn>(groupbyRows),
]);
return buildQueryContext(formData, baseQueryObject => {
- const queryObject = normalizeOrderBy({
- ...baseQueryObject,
- order_desc,
- legacy_order_by,
- });
- const { metrics } = queryObject;
- const orderBy = ensureIsArray(legacy_order_by);
- if (
- orderBy.length &&
- !metrics?.find(
- metric => getMetricLabel(metric) === getMetricLabel(orderBy[0]),
- )
- ) {
- metrics?.push(orderBy[0]);
+ const { series_limit_metric, metrics, order_desc } = baseQueryObject;
+ let orderBy: QueryFormOrderBy[] | undefined;
+ if (series_limit_metric) {
+ orderBy = [[series_limit_metric, !order_desc]];
+ } else if (Array.isArray(metrics) && metrics[0]) {
+ orderBy = [[metrics[0], !order_desc]];
}
return [
{
- ...queryObject,
+ ...baseQueryObject,
+ orderby: orderBy,
columns: [...groupbySet],
- metrics,
},
];
});
diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx
index ccb74e4..b546c08 100644
--- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx
@@ -30,7 +30,6 @@ import {
sections,
sharedControls,
emitFilterControl,
- legacySortBy,
} from '@superset-ui/chart-controls';
import { MetricsLayoutEnum } from '../types';
@@ -90,15 +89,41 @@ const config: ControlPanelConfig = {
],
['adhoc_filters'],
emitFilterControl,
+ ['series_limit'],
[
{
name: 'row_limit',
config: {
...sharedControls.row_limit,
+ label: t('Cell limit'),
+ description: t('Limits the number of cells that get retrieved.'),
+ },
+ },
+ ],
+ // TODO(kgabryje): add series_columns control after control panel is redesigned to avoid clutter
+ [
+ {
+ name: 'series_limit_metric',
+ config: {
+ ...sharedControls.series_limit_metric,
+ description: t(
+ 'Metric used to define how the top series are sorted if a series or cell limit is present. ' +
+ 'If undefined reverts to the first metric (where appropriate).',
+ ),
+ },
+ },
+ ],
+ [
+ {
+ name: 'order_desc',
+ config: {
+ type: 'CheckboxControl',
+ label: t('Sort Descending'),
+ default: true,
+ description: t('Whether to sort descending or ascending'),
},
},
],
- ...legacySortBy,
],
},
{
diff --git a/superset/migrations/versions/31bb738bd1d2_move_pivot_table_v2_legacy_order_by_to_.py b/superset/migrations/versions/31bb738bd1d2_move_pivot_table_v2_legacy_order_by_to_.py
new file mode 100644
index 0000000..0adaa0d
--- /dev/null
+++ b/superset/migrations/versions/31bb738bd1d2_move_pivot_table_v2_legacy_order_by_to_.py
@@ -0,0 +1,95 @@
+# 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.
+"""move_pivot_table_v2_legacy_order_by_to_timeseries_limit_metric
+
+Revision ID: 31bb738bd1d2
+Revises: fe23025b9441
+Create Date: 2021-12-17 16:56:55.186285
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = "31bb738bd1d2"
+down_revision = "fe23025b9441"
+
+
+import json
+import logging
+
+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()
+
+logger = logging.getLogger("alembic")
+
+
+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)
+
+ slices = session.query(Slice).filter(Slice.viz_type == "pivot_table_v2").all()
+ for slc in slices:
+ try:
+ params = json.loads(slc.params)
+ legacy_order_by = params.pop("legacy_order_by", None)
+ if legacy_order_by:
+ params["series_limit_metric"] = legacy_order_by
+ slc.params = json.dumps(params, sort_keys=True)
+ except Exception as e:
+ logger.exception(
+ f"An error occurred: parsing params for slice {slc.id} failed."
+ f"You need to fix it before upgrading your DB."
+ )
+ raise e
+
+ session.commit()
+ session.close()
+
+
+def downgrade():
+ bind = op.get_bind()
+ session = db.Session(bind=bind)
+
+ slices = session.query(Slice).filter(Slice.viz_type == "pivot_table_v2").all()
+ for slc in slices:
+ try:
+ params = json.loads(slc.params)
+ series_limit_metric = params.pop("series_limit_metric", None)
+ if series_limit_metric:
+ params["legacy_order_by"] = series_limit_metric
+ slc.params = json.dumps(params, sort_keys=True)
+ except Exception as e:
+ logger.exception(
+ f"An error occurred: parsing params for slice {slc.id} failed. "
+ "You need to fix it before downgrading your DB."
+ )
+ raise e
+
+ session.commit()
+ session.close()