fix: rolling and cum operator in multiple series chart (#1386)

* fix: rolling and cum operator in multiple series chart

* fix lint

* fix UT
This commit is contained in:
Yongjie Zhao 2021-10-06 08:08:58 +01:00
parent f1613fd17e
commit b5dcf1ae81
4 changed files with 51 additions and 18 deletions

View File

@ -39,7 +39,7 @@ export const rollingWindowOperator: PostProcessingFactory<
// time compare type: actual values // time compare type: actual values
columns = [...Array.from(metricsMap.values()), ...Array.from(metricsMap.keys())]; columns = [...Array.from(metricsMap.values()), ...Array.from(metricsMap.keys())];
} else { } else {
// time compare type: absolute / percentage / ratio // time compare type: difference / percentage / ratio
columns = Array.from(metricsMap.entries()).map(([offset, metric]) => columns = Array.from(metricsMap.entries()).map(([offset, metric]) =>
[comparisonType, metric, offset].join(TIME_COMPARISON_SEPARATOR), [comparisonType, metric, offset].join(TIME_COMPARISON_SEPARATOR),
); );
@ -60,6 +60,7 @@ export const rollingWindowOperator: PostProcessingFactory<
options: { options: {
operator: 'sum', operator: 'sum',
columns: columnsMap, columns: columnsMap,
is_pivot_df: true,
}, },
}; };
} }
@ -72,6 +73,7 @@ export const rollingWindowOperator: PostProcessingFactory<
window: ensureIsInt(formData.rolling_periods, 1), window: ensureIsInt(formData.rolling_periods, 1),
min_periods: ensureIsInt(formData.min_periods, 0), min_periods: ensureIsInt(formData.min_periods, 0),
columns: columnsMap, columns: columnsMap,
is_pivot_df: true,
}, },
}; };
} }

View File

@ -69,6 +69,7 @@ test('rolling_type: cumsum', () => {
'count(*)': 'count(*)', 'count(*)': 'count(*)',
'sum(val)': 'sum(val)', 'sum(val)': 'sum(val)',
}, },
is_pivot_df: true,
}, },
}); });
}); });
@ -86,6 +87,7 @@ test('rolling_type: sum/mean/std', () => {
'count(*)': 'count(*)', 'count(*)': 'count(*)',
'sum(val)': 'sum(val)', 'sum(val)': 'sum(val)',
}, },
is_pivot_df: true,
}, },
}); });
}); });
@ -114,6 +116,7 @@ test('rolling window and "actual values" in the time compare', () => {
'sum(val)__1 year ago': 'sum(val)__1 year ago', 'sum(val)__1 year ago': 'sum(val)__1 year ago',
'sum(val)__1 year later': 'sum(val)__1 year later', 'sum(val)__1 year later': 'sum(val)__1 year later',
}, },
is_pivot_df: true,
}, },
}); });
}); });
@ -141,6 +144,7 @@ test('rolling window and "difference / percentage / ratio" in the time compare',
[`${cType}__sum(val)__sum(val)__1 year ago`]: `${cType}__sum(val)__sum(val)__1 year ago`, [`${cType}__sum(val)__sum(val)__1 year ago`]: `${cType}__sum(val)__sum(val)__1 year ago`,
[`${cType}__sum(val)__sum(val)__1 year later`]: `${cType}__sum(val)__sum(val)__1 year later`, [`${cType}__sum(val)__sum(val)__1 year later`]: `${cType}__sum(val)__sum(val)__1 year later`,
}, },
is_pivot_df: true,
}, },
}); });
}); });

View File

@ -97,6 +97,8 @@ export interface PostProcessingPivot {
index: string[]; index: string[];
columns: string[]; columns: string[];
aggregates: Aggregates; aggregates: Aggregates;
flatten_columns?: boolean;
reset_index?: boolean;
}; };
} }
@ -128,6 +130,7 @@ export interface PostProcessingRolling {
window: number; window: number;
min_periods: number; min_periods: number;
columns: string[]; columns: string[];
is_pivot_df?: boolean;
}; };
} }
@ -136,6 +139,7 @@ export interface PostProcessingCum {
options: { options: {
columns: string[]; columns: string[];
operator: NumpyFunction; operator: NumpyFunction;
is_pivot_df?: boolean;
}; };
} }

View File

@ -16,7 +16,13 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
import { buildQueryContext, QueryFormData, normalizeOrderBy } from '@superset-ui/core'; import {
buildQueryContext,
QueryFormData,
normalizeOrderBy,
RollingType,
PostProcessingPivot,
} from '@superset-ui/core';
import { import {
rollingWindowOperator, rollingWindowOperator,
timeCompareOperator, timeCompareOperator,
@ -29,22 +35,39 @@ import {
} from '@superset-ui/chart-controls'; } from '@superset-ui/chart-controls';
export default function buildQuery(formData: QueryFormData) { export default function buildQuery(formData: QueryFormData) {
return buildQueryContext(formData, baseQueryObject => [ return buildQueryContext(formData, baseQueryObject => {
{ const pivotOperatorInRuntime: PostProcessingPivot | undefined = pivotOperator(formData, {
...baseQueryObject, ...baseQueryObject,
is_timeseries: true, is_timeseries: true,
// todo: move `normalizeOrderBy to extractQueryFields` });
orderby: normalizeOrderBy(baseQueryObject).orderby, if (pivotOperatorInRuntime && Object.values(RollingType).includes(formData.rolling_type)) {
time_offsets: isValidTimeCompare(formData, baseQueryObject) ? formData.time_compare : [], pivotOperatorInRuntime.options = {
post_processing: [ ...pivotOperatorInRuntime.options,
resampleOperator(formData, baseQueryObject), ...{
timeCompareOperator(formData, baseQueryObject), flatten_columns: false,
sortOperator(formData, { ...baseQueryObject, is_timeseries: true }), reset_index: false,
rollingWindowOperator(formData, baseQueryObject), },
pivotOperator(formData, { ...baseQueryObject, is_timeseries: true }), };
contributionOperator(formData, baseQueryObject), }
prophetOperator(formData, baseQueryObject),
], return [
}, {
]); ...baseQueryObject,
is_timeseries: true,
// todo: move `normalizeOrderBy to extractQueryFields`
orderby: normalizeOrderBy(baseQueryObject).orderby,
time_offsets: isValidTimeCompare(formData, baseQueryObject) ? formData.time_compare : [],
post_processing: [
resampleOperator(formData, baseQueryObject),
timeCompareOperator(formData, baseQueryObject),
sortOperator(formData, { ...baseQueryObject, is_timeseries: true }),
// in order to be able to rolling in multiple series, must do pivot before rollingOperator
pivotOperatorInRuntime,
rollingWindowOperator(formData, baseQueryObject),
contributionOperator(formData, baseQueryObject),
prophetOperator(formData, baseQueryObject),
],
},
];
});
} }