This is an automated email from the ASF dual-hosted git repository.
yongjiezhao 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 59437ea6e7 feat(plugin-chart-echarts): able to sort bar on the bar
chart V2 (#21356)
59437ea6e7 is described below
commit 59437ea6e7ec02267c6e03e174be39a6cae48893
Author: Stephen Liu <[email protected]>
AuthorDate: Tue Sep 13 23:09:09 2022 +0800
feat(plugin-chart-echarts): able to sort bar on the bar chart V2 (#21356)
---
.../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 277d2df559..3af1378bc1 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<PostProcessingSort> = (
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 6f0267d913..8cb32dc940 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 085635209a..fe3bd931a6 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),