This is an automated email from the ASF dual-hosted git repository. arivero pushed a commit to branch bn_time_comparison_current_api in repository https://gitbox.apache.org/repos/asf/superset.git
commit a3a2d93a44cd6a86632cf0c1aee61819bc793833 Author: Antonio Rivero <[email protected]> AuthorDate: Wed Mar 27 22:02:23 2024 +0100 - demo --- .../BigNumberPeriodOverPeriod/buildQuery.ts | 58 ++++++++---------- .../BigNumberPeriodOverPeriod/controlPanel.ts | 69 +--------------------- .../BigNumberPeriodOverPeriod/transformProps.ts | 30 ++++++---- 3 files changed, 46 insertions(+), 111 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts index abf9110403..96ef017319 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts @@ -18,50 +18,42 @@ */ import { buildQueryContext, - getComparisonInfo, - ComparisonTimeRangeType, QueryFormData, + PostProcessingRule, } from '@superset-ui/core'; +import { + isTimeComparison, + timeCompareOperator, +} from '@superset-ui/chart-controls'; export default function buildQuery(formData: QueryFormData) { - const { - cols: groupby, - time_comparison: timeComparison, - extra_form_data: extraFormData, - } = formData; - - const queryContextA = buildQueryContext(formData, baseQueryObject => [ - { - ...baseQueryObject, - groupby, - }, - ]); - - const comparisonFormData = getComparisonInfo( - formData, - timeComparison, - extraFormData, - ); + const { cols: groupby } = formData; - const queryContextB = buildQueryContext( - comparisonFormData, - baseQueryObject => [ + const queryContextA = buildQueryContext(formData, baseQueryObject => { + let postProcessing: PostProcessingRule[] = []; + postProcessing.push(timeCompareOperator(formData, baseQueryObject)); + return [ { ...baseQueryObject, + columns: [ + { + timeGrain: 'P1Y', // Group by the greatest grain to have less data points + columnType: 'BASE_AXIS', + sqlExpression: baseQueryObject.filters?.[0]?.col.toString() || '', + label: baseQueryObject.filters?.[0]?.col.toString() || '', + expressionType: 'SQL', + }, + ], groupby, - extras: { - ...baseQueryObject.extras, - instant_time_comparison_range: - timeComparison !== ComparisonTimeRangeType.Custom - ? timeComparison - : undefined, - }, + post_processing: postProcessing, + time_offsets: isTimeComparison(formData, baseQueryObject) + ? formData.time_compare + : [], }, - ], - ); + ]; + }); return { ...queryContextA, - queries: [...queryContextA.queries, ...queryContextB.queries], }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts index f6f81d98d7..06984985b2 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts @@ -30,6 +30,7 @@ import { ControlState, getStandardizedControls, sharedControls, + sections, } from '@superset-ui/chart-controls'; import { headerFontSize, subheaderFontSize } from '../sharedControls'; import { ColorSchemeEnum } from './types'; @@ -42,70 +43,6 @@ const config: ControlPanelConfig = { controlSetRows: [ ['metric'], ['adhoc_filters'], - [ - { - name: 'time_comparison', - config: { - type: 'SelectControl', - label: t('Range for Comparison'), - default: 'r', - choices: [ - ['r', 'Inherit range from time filters'], - ['y', 'Year'], - ['m', 'Month'], - ['w', 'Week'], - ['c', 'Custom'], - ], - rerender: ['adhoc_custom'], - description: t( - 'Set the time range that will be used for the comparison metrics. ' + - 'For example, "Year" will compare to the same dates one year earlier. ' + - 'Use "Inherit range from time filters" to shift the comparison time range' + - 'by the same length as your time range and use "Custom" to set a custom comparison range.', - ), - }, - }, - ], - [ - { - name: `adhoc_custom`, - config: { - ...sharedControls.adhoc_filters, - label: t('Filters for Comparison'), - description: - 'This only applies when selecting the Range for Comparison Type: Custom', - visibility: ({ controls }) => - controls?.time_comparison?.value === - ComparisonTimeRangeType.Custom, - mapStateToProps: ( - state: ControlPanelState, - controlState: ControlState, - ) => { - const originalMapStateToPropsRes = - sharedControls.adhoc_filters.mapStateToProps?.( - state, - controlState, - ) || {}; - const columns = originalMapStateToPropsRes.columns.filter( - (col: ColumnMeta) => - col.is_dttm && - (state.controls.adhoc_filters.value as AdhocFilter[]).some( - (val: SimpleAdhocFilter) => - val.subject === col.column_name, - ), - ); - return { - ...originalMapStateToPropsRes, - columns, - externalValidationErrors: validateTimeComparisonRangeValues( - state.controls?.time_comparison?.value, - controlState.value, - ), - }; - }, - }, - }, - ], [ { name: 'row_limit', @@ -180,14 +117,12 @@ const config: ControlPanelConfig = { ], ], }, + sections.advancedAnalyticsControls, ], controlOverrides: { y_axis_format: { label: t('Number format'), }, - adhoc_filters: { - rerender: ['adhoc_custom'], - }, }, formDataOverrides: formData => ({ ...formData, diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/transformProps.ts index a17fb8edd0..ad825ae6cc 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/transformProps.ts @@ -87,17 +87,28 @@ export default function transformProps(chartProps: ChartProps) { percentDifferenceFormat, } = formData; const { data: dataA = [] } = queriesData[0]; - const { - data: dataB = [], - from_dttm: comparisonFromDatetime, - to_dttm: comparisonToDatetime, - } = queriesData[1]; const data = dataA; const metricName = getMetricLabel(metric); + const timeComparison = chartProps.rawFormData?.time_compare?.[0]; + + const { value1, value2 } = data.reduce( + (acc: { value1: any; value2: any }, curr: { [x: string]: any }) => { + for (const key in curr) { + if (key.includes(`${metricName}__${timeComparison}`)) { + acc.value2 += curr[key]; + } else if (key.includes(metricName)) { + acc.value1 += curr[key]; + } + } + return acc; + }, + { value1: 0, value2: 0 }, + ); + let bigNumber: number | string = - data.length === 0 ? 0 : parseMetricValue(data[0][metricName]); + data.length === 0 ? 0 : parseMetricValue(value1); let prevNumber: number | string = - data.length === 0 ? 0 : parseMetricValue(dataB[0][metricName]); + data.length === 0 ? 0 : parseMetricValue(value2); const numberFormatter = getValueFormatter( metric, @@ -133,10 +144,7 @@ export default function transformProps(chartProps: ChartProps) { prevNumber = numberFormatter(prevNumber); valueDifference = numberFormatter(valueDifference); const percentDifference: string = formatPercentChange(percentDifferenceNum); - const comparatorText = formatTimeRange('%Y-%m-%d', [ - comparisonFromDatetime, - comparisonToDatetime, - ]); + const comparatorText = 'test'; return { width,
