From 8fe07e9f69e2d539a6ffb9d3b7993663c79adce4 Mon Sep 17 00:00:00 2001 From: stephenLYZ <750188453@qq.com> Date: Wed, 7 Sep 2022 20:37:02 +0800 Subject: [PATCH] feat(plugin-chart-echarts): support sort bar on the bar chart V2 --- .../src/operators/sortOperator.ts | 22 ++++-- .../test/operators/sortOperator.test.ts | 76 ++++++++++--------- .../src/Timeseries/buildQuery.ts | 2 + 3 files changed, 55 insertions(+), 45 deletions(-) diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts index 277d2df559ced..3af1378bc1fe4 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts @@ -17,24 +17,30 @@ * specific language governing permissions and limitationsxw * under the License. */ -import { DTTM_ALIAS, PostProcessingSort, RollingType } from '@superset-ui/core'; +import { + ensureIsArray, + getColumnLabel, + getMetricLabel, + PostProcessingSort, +} from '@superset-ui/core'; import { PostProcessingFactory } from './types'; export const sortOperator: PostProcessingFactory = ( formData, queryObject, ) => { - const { x_axis: xAxis } = formData; - if ( - (xAxis || queryObject.is_timeseries) && - Object.values(RollingType).includes(formData.rolling_type) - ) { - const index = xAxis || DTTM_ALIAS; + const { columns, metrics, timeseries_limit_metric, order_desc } = queryObject; + const metricLabels = ensureIsArray(metrics).map(getMetricLabel); + const columnLabels = ensureIsArray(columns).map(getColumnLabel); + const column: string[] = ensureIsArray(timeseries_limit_metric).map( + getMetricLabel, + ); + if (metricLabels.includes(column[0]) || columnLabels.includes(column[0])) { return { operation: 'sort', options: { columns: { - [index]: true, + [column[0]]: !order_desc, }, }, }; diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts index 6f0267d91305e..8cb32dc9400e2 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts @@ -34,6 +34,7 @@ const queryObject: QueryObject = { 'count(*)', { label: 'sum(val)', expressionType: 'SQL', sqlExpression: 'sum(val)' }, ], + columns: ['state'], time_range: '2015 : 2016', granularity: 'month', post_processing: [ @@ -55,88 +56,89 @@ const queryObject: QueryObject = { test('skip sort', () => { expect(sortOperator(formData, queryObject)).toEqual(undefined); expect( - sortOperator(formData, { ...queryObject, is_timeseries: false }), - ).toEqual(undefined); - expect( - sortOperator( - { ...formData, rolling_type: 'xxxx' }, - { ...queryObject, is_timeseries: true }, - ), - ).toEqual(undefined); - expect( - sortOperator(formData, { ...queryObject, is_timeseries: true }), + sortOperator(formData, { ...queryObject, timeseries_limit_metric: 'bar' }), ).toEqual(undefined); }); -test('sort by __timestamp', () => { +test('sort by metric', () => { expect( - sortOperator( - { ...formData, rolling_type: 'cumsum' }, - { ...queryObject, is_timeseries: true }, - ), + sortOperator(formData, { + ...queryObject, + timeseries_limit_metric: 'count(*)', + }), ).toEqual({ operation: 'sort', options: { columns: { - __timestamp: true, + 'count(*)': true, }, }, }); expect( - sortOperator( - { ...formData, rolling_type: 'sum' }, - { ...queryObject, is_timeseries: true }, - ), + sortOperator(formData, { + ...queryObject, + timeseries_limit_metric: 'count(*)', + order_desc: true, + }), ).toEqual({ operation: 'sort', options: { columns: { - __timestamp: true, + 'count(*)': false, }, }, }); expect( - sortOperator( - { ...formData, rolling_type: 'mean' }, - { ...queryObject, is_timeseries: true }, - ), + sortOperator(formData, { + ...queryObject, + timeseries_limit_metric: { + label: 'sum(val)', + expressionType: 'SQL', + sqlExpression: 'sum(val)', + }, + }), ).toEqual({ operation: 'sort', options: { columns: { - __timestamp: true, + 'sum(val)': true, }, }, }); expect( - sortOperator( - { ...formData, rolling_type: 'std' }, - { ...queryObject, is_timeseries: true }, - ), + sortOperator(formData, { + ...queryObject, + timeseries_limit_metric: { + label: 'sum(val)', + expressionType: 'SQL', + sqlExpression: 'sum(val)', + }, + order_desc: false, + }), ).toEqual({ operation: 'sort', options: { columns: { - __timestamp: true, + 'sum(val)': true, }, }, }); }); -test('sort by named x-axis', () => { +test('sort by column', () => { expect( - sortOperator( - { ...formData, x_axis: 'ds', rolling_type: 'cumsum' }, - { ...queryObject }, - ), + sortOperator(formData, { + ...queryObject, + timeseries_limit_metric: 'state', + }), ).toEqual({ operation: 'sort', options: { columns: { - ds: true, + state: true, }, }, }); diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts index 085635209ac20..fe3bd931a6cc0 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts @@ -35,6 +35,7 @@ import { prophetOperator, timeComparePivotOperator, flattenOperator, + sortOperator, } from '@superset-ui/chart-controls'; export default function buildQuery(formData: QueryFormData) { @@ -97,6 +98,7 @@ export default function buildQuery(formData: QueryFormData) { is_timeseries, }), contributionOperator(formData, baseQueryObject), + sortOperator(formData, baseQueryObject), flattenOperator(formData, baseQueryObject), // todo: move prophet before flatten prophetOperator(formData, baseQueryObject),