superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {
buildQueryContext,
ensureIsArray,
getXAxisColumn,
isXAxisSet,
normalizeOrderBy,
PostProcessingPivot,
QueryFormData,
} from '@superset-ui/core';
import {
contributionOperator,
extractExtraMetrics,
flattenOperator,
isTimeComparison,
pivotOperator,
prophetOperator,
renameOperator,
resampleOperator,
rollingWindowOperator,
sortOperator,
timeComparePivotOperator,
timeCompareOperator,
} from '@superset-ui/chart-controls';
export default function buildQuery(formData: QueryFormData) {
const { groupby } = formData;
return buildQueryContext(formData, baseQueryObject => {
/* the `pivotOperatorInRuntime` determines how to pivot the dataframe returned from the raw query.
1. If it's a time compared query, there will return a pivoted dataframe that append time compared metrics. for instance:
MAX(value) MAX(value)__1 year ago MIN(value) MIN(value)__1 year ago
city LA LA LA LA
__timestamp
2015-01-01 568.0 671.0 5.0 6.0
2015-02-01 407.0 649.0 4.0 3.0
2015-03-01 318.0 465.0 0.0 3.0
2. If it's a normal query, there will return a pivoted dataframe.
MAX(value) MIN(value)
city LA LA
__timestamp
2015-01-01 568.0 5.0
2015-02-01 407.0 4.0
2015-03-01 318.0 0.0
*/
// only add series limit metric if it's explicitly needed e.g. for sorting
const extra_metrics = extractExtraMetrics(formData);
const pivotOperatorInRuntime: PostProcessingPivot = isTimeComparison(
formData,
baseQueryObject,
)
? timeComparePivotOperator(formData, baseQueryObject)
: pivotOperator(formData, baseQueryObject);
const columns = [
...(isXAxisSet(formData) ? ensureIsArray(getXAxisColumn(formData)) : []),
...ensureIsArray(groupby),
];
const time_offsets = isTimeComparison(formData, baseQueryObject)
? formData.time_compare
: [];
return [
{
...baseQueryObject,
metrics: [...(baseQueryObject.metrics || []), ...extra_metrics],
columns,
series_columns: groupby,
...(isXAxisSet(formData) ? {} : { is_timeseries: true }),
// todo: move `normalizeOrderBy to extractQueryFields`
orderby: normalizeOrderBy(baseQueryObject).orderby,
time_offsets,
/* Note that:
1. The resample, rolling, cum, timeCompare operators should be after pivot.
2. the flatOperator makes multiIndex Dataframe into flat Dataframe
*/
post_processing: [
pivotOperatorInRuntime,
rollingWindowOperator(formData, baseQueryObject),
timeCompareOperator(formData, baseQueryObject),
resampleOperator(formData, baseQueryObject),
renameOperator(formData, baseQueryObject),
contributionOperator(formData, baseQueryObject, time_offsets),
sortOperator(formData, baseQueryObject),
flattenOperator(formData, baseQueryObject),
// todo: move prophet before flatten
prophetOperator(formData, baseQueryObject),
],
},
];
});
}