You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by mi...@apache.org on 2023/07/13 14:33:24 UTC
[superset] branch master updated: fix: Dashboard time grain in Pivot Table (#24665)
This is an automated email from the ASF dual-hosted git repository.
michaelsmolina 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 6e59f11f4c fix: Dashboard time grain in Pivot Table (#24665)
6e59f11f4c is described below
commit 6e59f11f4ce76305c1b0adee883f3b958199805b
Author: Michael S. Molina <70...@users.noreply.github.com>
AuthorDate: Thu Jul 13 11:33:16 2023 -0300
fix: Dashboard time grain in Pivot Table (#24665)
---
.../src/plugin/buildQuery.ts | 9 +-
.../test/plugin/buildQuery.test.ts | 146 +++++++++++++--------
2 files changed, 96 insertions(+), 59 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 ac2ddcd332..55a6cefd08 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
@@ -30,7 +30,10 @@ import {
import { PivotTableQueryFormData } from '../types';
export default function buildQuery(formData: PivotTableQueryFormData) {
- const { groupbyColumns = [], groupbyRows = [] } = formData;
+ const { groupbyColumns = [], groupbyRows = [], extra_form_data } = formData;
+ const time_grain_sqla =
+ extra_form_data?.time_grain_sqla || formData.time_grain_sqla;
+
// TODO: add deduping of AdhocColumns
const columns = Array.from(
new Set([
@@ -40,7 +43,7 @@ export default function buildQuery(formData: PivotTableQueryFormData) {
).map(col => {
if (
isPhysicalColumn(col) &&
- formData.time_grain_sqla &&
+ time_grain_sqla &&
hasGenericChartAxes &&
/* Charts created before `GENERIC_CHART_AXES` is enabled have a different
* form data, with `granularity_sqla` set instead.
@@ -49,7 +52,7 @@ export default function buildQuery(formData: PivotTableQueryFormData) {
formData.granularity_sqla === col)
) {
return {
- timeGrain: formData.time_grain_sqla,
+ timeGrain: time_grain_sqla,
columnType: 'BASE_AXIS',
sqlExpression: col,
label: col,
diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts
index f3ac8b82d4..7bb47d785c 100644
--- a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts
+++ b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts
@@ -22,65 +22,99 @@ import * as supersetCoreModule from '@superset-ui/core';
import buildQuery from '../../src/plugin/buildQuery';
import { PivotTableQueryFormData } from '../../src/types';
-describe('PivotTableChart buildQuery', () => {
- const formData: PivotTableQueryFormData = {
- groupbyRows: ['row1', 'row2'],
- groupbyColumns: ['col1', 'col2'],
- metrics: ['metric1', 'metric2'],
- tableRenderer: 'Table With Subtotal',
- colOrder: 'key_a_to_z',
- rowOrder: 'key_a_to_z',
- aggregateFunction: 'Sum',
- transposePivot: true,
- rowSubtotalPosition: true,
- colSubtotalPosition: true,
- colTotals: true,
- rowTotals: true,
- valueFormat: 'SMART_NUMBER',
- datasource: '5__table',
- viz_type: 'my_chart',
- width: 800,
- height: 600,
- combineMetric: false,
- verboseMap: {},
- columnFormats: {},
- currencyFormats: {},
- metricColorFormatters: [],
- dateFormatters: {},
- setDataMask: () => {},
- legacy_order_by: 'count',
- order_desc: true,
- margin: 0,
+const formData: PivotTableQueryFormData = {
+ groupbyRows: ['row1', 'row2'],
+ groupbyColumns: ['col1', 'col2'],
+ metrics: ['metric1', 'metric2'],
+ tableRenderer: 'Table With Subtotal',
+ colOrder: 'key_a_to_z',
+ rowOrder: 'key_a_to_z',
+ aggregateFunction: 'Sum',
+ transposePivot: true,
+ rowSubtotalPosition: true,
+ colSubtotalPosition: true,
+ colTotals: true,
+ rowTotals: true,
+ valueFormat: 'SMART_NUMBER',
+ datasource: '5__table',
+ viz_type: 'my_chart',
+ width: 800,
+ height: 600,
+ combineMetric: false,
+ verboseMap: {},
+ columnFormats: {},
+ currencyFormats: {},
+ metricColorFormatters: [],
+ dateFormatters: {},
+ setDataMask: () => {},
+ legacy_order_by: 'count',
+ order_desc: true,
+ margin: 0,
+ time_grain_sqla: TimeGranularity.MONTH,
+ temporal_columns_lookup: { col1: true },
+};
+
+test('should build groupby with series in form data', () => {
+ const queryContext = buildQuery(formData);
+ const [query] = queryContext.queries;
+ expect(query.columns).toEqual(['col1', 'col2', 'row1', 'row2']);
+});
+
+test('should work with old charts after GENERIC_CHART_AXES is enabled', () => {
+ Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
+ value: true,
+ });
+ const modifiedFormData = {
+ ...formData,
+ time_grain_sqla: TimeGranularity.MONTH,
+ granularity_sqla: 'col1',
};
+ const queryContext = buildQuery(modifiedFormData);
+ const [query] = queryContext.queries;
+ expect(query.columns).toEqual([
+ {
+ timeGrain: 'P1M',
+ columnType: 'BASE_AXIS',
+ sqlExpression: 'col1',
+ label: 'col1',
+ expressionType: 'SQL',
+ },
+ 'col2',
+ 'row1',
+ 'row2',
+ ]);
+});
- it('should build groupby with series in form data', () => {
- const queryContext = buildQuery(formData);
- const [query] = queryContext.queries;
- expect(query.columns).toEqual(['col1', 'col2', 'row1', 'row2']);
+test('should prefer extra_form_data.time_grain_sqla over formData.time_grain_sqla', () => {
+ Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
+ value: true,
});
+ const modifiedFormData = {
+ ...formData,
+ extra_form_data: { time_grain_sqla: TimeGranularity.QUARTER },
+ };
+ const queryContext = buildQuery(modifiedFormData);
+ const [query] = queryContext.queries;
+ expect(query.columns?.[0]).toEqual({
+ timeGrain: TimeGranularity.QUARTER,
+ columnType: 'BASE_AXIS',
+ sqlExpression: 'col1',
+ label: 'col1',
+ expressionType: 'SQL',
+ });
+});
- it('should work with old charts after GENERIC_CHART_AXES is enabled', () => {
- Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
- value: true,
- });
- const modifiedFormData = {
- ...formData,
- time_grain_sqla: TimeGranularity.MONTH,
- granularity_sqla: 'col1',
- };
- const queryContext = buildQuery(modifiedFormData);
- const [query] = queryContext.queries;
- expect(query.columns).toEqual([
- {
- timeGrain: 'P1M',
- columnType: 'BASE_AXIS',
- sqlExpression: 'col1',
- label: 'col1',
- expressionType: 'SQL',
- },
- 'col2',
- 'row1',
- 'row2',
- ]);
+test('should fallback to formData.time_grain_sqla if extra_form_data.time_grain_sqla is not set', () => {
+ Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
+ value: true,
+ });
+ const queryContext = buildQuery(formData);
+ const [query] = queryContext.queries;
+ expect(query.columns?.[0]).toEqual({
+ timeGrain: formData.time_grain_sqla,
+ columnType: 'BASE_AXIS',
+ sqlExpression: 'col1',
+ label: 'col1',
+ expressionType: 'SQL',
});
});