mirror of
https://github.com/apache/superset.git
synced 2026-04-20 00:24:38 +00:00
106 lines
3.9 KiB
TypeScript
106 lines
3.9 KiB
TypeScript
/**
|
|
* 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,
|
|
normalizeOrderBy,
|
|
PostProcessingPivot,
|
|
QueryFormData,
|
|
getXAxisColumn,
|
|
isXAxisSet,
|
|
} from '@superset-ui/core';
|
|
import {
|
|
rollingWindowOperator,
|
|
timeCompareOperator,
|
|
isTimeComparison,
|
|
pivotOperator,
|
|
resampleOperator,
|
|
renameOperator,
|
|
contributionOperator,
|
|
prophetOperator,
|
|
timeComparePivotOperator,
|
|
flattenOperator,
|
|
} 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
|
|
|
|
*/
|
|
const pivotOperatorInRuntime: PostProcessingPivot = isTimeComparison(
|
|
formData,
|
|
baseQueryObject,
|
|
)
|
|
? timeComparePivotOperator(formData, baseQueryObject)
|
|
: pivotOperator(formData, baseQueryObject);
|
|
|
|
return [
|
|
{
|
|
...baseQueryObject,
|
|
columns: [
|
|
...(isXAxisSet(formData)
|
|
? ensureIsArray(getXAxisColumn(formData))
|
|
: []),
|
|
...ensureIsArray(groupby),
|
|
],
|
|
series_columns: groupby,
|
|
...(isXAxisSet(formData) ? {} : { is_timeseries: true }),
|
|
// todo: move `normalizeOrderBy to extractQueryFields`
|
|
orderby: normalizeOrderBy(baseQueryObject).orderby,
|
|
time_offsets: isTimeComparison(formData, baseQueryObject)
|
|
? formData.time_compare
|
|
: [],
|
|
/* 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),
|
|
flattenOperator(formData, baseQueryObject),
|
|
// todo: move prophet before flatten
|
|
prophetOperator(formData, baseQueryObject),
|
|
],
|
|
},
|
|
];
|
|
});
|
|
}
|