fix: custom SQL in the XAxis (#21847)

This commit is contained in:
Yongjie Zhao 2022-10-19 11:40:52 +08:00 committed by GitHub
parent b77335494a
commit 0a4ecca9f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 50 additions and 23 deletions

View File

@ -21,7 +21,7 @@ import {
getColumnLabel, getColumnLabel,
getMetricLabel, getMetricLabel,
PostProcessingPivot, PostProcessingPivot,
getXAxis, getXAxisLabel,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { PostProcessingFactory } from './types'; import { PostProcessingFactory } from './types';
@ -30,7 +30,7 @@ export const pivotOperator: PostProcessingFactory<PostProcessingPivot> = (
queryObject, queryObject,
) => { ) => {
const metricLabels = ensureIsArray(queryObject.metrics).map(getMetricLabel); const metricLabels = ensureIsArray(queryObject.metrics).map(getMetricLabel);
const xAxis = getXAxis(formData); const xAxis = getXAxisLabel(formData);
if (xAxis && metricLabels.length) { if (xAxis && metricLabels.length) {
return { return {

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitationsxw * specific language governing permissions and limitationsxw
* under the License. * under the License.
*/ */
import { PostProcessingProphet, getXAxis } from '@superset-ui/core'; import { PostProcessingProphet, getXAxisLabel } from '@superset-ui/core';
import { PostProcessingFactory } from './types'; import { PostProcessingFactory } from './types';
/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */
@ -24,7 +24,7 @@ export const prophetOperator: PostProcessingFactory<PostProcessingProphet> = (
formData, formData,
queryObject, queryObject,
) => { ) => {
const xAxis = getXAxis(formData); const xAxis = getXAxisLabel(formData);
if (formData.forecastEnabled && xAxis) { if (formData.forecastEnabled && xAxis) {
return { return {
operation: 'prophet', operation: 'prophet',

View File

@ -22,7 +22,7 @@ import {
ensureIsArray, ensureIsArray,
getMetricLabel, getMetricLabel,
ComparisionType, ComparisionType,
getXAxis, getXAxisLabel,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { PostProcessingFactory } from './types'; import { PostProcessingFactory } from './types';
import { getMetricOffsetsMap, isTimeComparison } from './utils'; import { getMetricOffsetsMap, isTimeComparison } from './utils';
@ -34,7 +34,7 @@ export const renameOperator: PostProcessingFactory<PostProcessingRename> = (
const metrics = ensureIsArray(queryObject.metrics); const metrics = ensureIsArray(queryObject.metrics);
const columns = ensureIsArray(queryObject.columns); const columns = ensureIsArray(queryObject.columns);
const { truncate_metric } = formData; const { truncate_metric } = formData;
const xAxis = getXAxis(formData); const xAxis = getXAxisLabel(formData);
// remove or rename top level of column name(metric name) in the MultiIndex when // remove or rename top level of column name(metric name) in the MultiIndex when
// 1) only 1 metric // 1) only 1 metric
// 2) exist dimentsion // 2) exist dimentsion

View File

@ -22,7 +22,7 @@ import {
getColumnLabel, getColumnLabel,
NumpyFunction, NumpyFunction,
PostProcessingPivot, PostProcessingPivot,
getXAxis, getXAxisLabel,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { getMetricOffsetsMap, isTimeComparison } from './utils'; import { getMetricOffsetsMap, isTimeComparison } from './utils';
import { PostProcessingFactory } from './types'; import { PostProcessingFactory } from './types';
@ -30,7 +30,7 @@ import { PostProcessingFactory } from './types';
export const timeComparePivotOperator: PostProcessingFactory<PostProcessingPivot> = export const timeComparePivotOperator: PostProcessingFactory<PostProcessingPivot> =
(formData, queryObject) => { (formData, queryObject) => {
const metricOffsetMap = getMetricOffsetsMap(formData, queryObject); const metricOffsetMap = getMetricOffsetsMap(formData, queryObject);
const xAxis = getXAxis(formData); const xAxis = getXAxisLabel(formData);
if (isTimeComparison(formData, queryObject) && xAxis) { if (isTimeComparison(formData, queryObject) && xAxis) {
const aggregates = Object.fromEntries( const aggregates = Object.fromEntries(

View File

@ -23,6 +23,8 @@ import {
getColumnLabel, getColumnLabel,
isQueryFormColumn, isQueryFormColumn,
QueryFormData, QueryFormData,
QueryFormColumn,
Optional,
} from '@superset-ui/core'; } from '@superset-ui/core';
export const isXAxisSet = (formData: QueryFormData) => export const isXAxisSet = (formData: QueryFormData) =>
@ -32,14 +34,24 @@ export const hasGenericChartAxes = isFeatureEnabled(
FeatureFlag.GENERIC_CHART_AXES, FeatureFlag.GENERIC_CHART_AXES,
); );
export const getXAxis = (formData: QueryFormData): string | undefined => { export const getXAxisColumn = (
formData: QueryFormData,
): Optional<QueryFormColumn> => {
// The formData should be "raw form_data" -- the snake_case version of formData rather than camelCase. // The formData should be "raw form_data" -- the snake_case version of formData rather than camelCase.
if (!(formData.granularity_sqla || formData.x_axis)) { if (!(formData.granularity_sqla || formData.x_axis)) {
return undefined; return undefined;
} }
if (isXAxisSet(formData)) { if (isXAxisSet(formData)) {
return getColumnLabel(formData.x_axis); return formData.x_axis;
} }
return DTTM_ALIAS; return DTTM_ALIAS;
}; };
export const getXAxisLabel = (formData: QueryFormData): Optional<string> => {
const col = getXAxisColumn(formData);
if (col) {
return getColumnLabel(col);
}
return undefined;
};

View File

@ -29,7 +29,12 @@ export { default as getMetricLabel } from './getMetricLabel';
export { default as DatasourceKey } from './DatasourceKey'; export { default as DatasourceKey } from './DatasourceKey';
export { default as normalizeOrderBy } from './normalizeOrderBy'; export { default as normalizeOrderBy } from './normalizeOrderBy';
export { normalizeTimeColumn } from './normalizeTimeColumn'; export { normalizeTimeColumn } from './normalizeTimeColumn';
export { getXAxis, isXAxisSet, hasGenericChartAxes } from './getXAxis'; export {
getXAxisLabel,
getXAxisColumn,
isXAxisSet,
hasGenericChartAxes,
} from './getXAxis';
export * from './types/AnnotationLayer'; export * from './types/AnnotationLayer';
export * from './types/QueryFormData'; export * from './types/QueryFormData';

View File

@ -20,4 +20,6 @@ export * from '../query/types';
export type Maybe<T> = T | null; export type Maybe<T> = T | null;
export type Optional<T> = T | undefined;
export type ValueOf<T> = T[keyof T]; export type ValueOf<T> = T[keyof T];

View File

@ -19,7 +19,7 @@
import { import {
buildQueryContext, buildQueryContext,
ensureIsArray, ensureIsArray,
getXAxis, getXAxisColumn,
isXAxisSet, isXAxisSet,
QueryFormData, QueryFormData,
} from '@superset-ui/core'; } from '@superset-ui/core';
@ -35,7 +35,9 @@ export default function buildQuery(formData: QueryFormData) {
{ {
...baseQueryObject, ...baseQueryObject,
columns: [ columns: [
...(isXAxisSet(formData) ? ensureIsArray(getXAxis(formData)) : []), ...(isXAxisSet(formData)
? ensureIsArray(getXAxisColumn(formData))
: []),
], ],
...(isXAxisSet(formData) ? {} : { is_timeseries: true }), ...(isXAxisSet(formData) ? {} : { is_timeseries: true }),
post_processing: [ post_processing: [

View File

@ -26,7 +26,7 @@ import {
smartDateVerboseFormatter, smartDateVerboseFormatter,
NumberFormatter, NumberFormatter,
TimeFormatter, TimeFormatter,
getXAxis, getXAxisLabel,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { EChartsCoreOption, graphic } from 'echarts'; import { EChartsCoreOption, graphic } from 'echarts';
import { import {
@ -102,7 +102,7 @@ export default function transformProps(
const { r, g, b } = colorPicker; const { r, g, b } = colorPicker;
const mainColor = `rgb(${r}, ${g}, ${b})`; const mainColor = `rgb(${r}, ${g}, ${b})`;
const timeColumn = getXAxis(rawFormData) as string; const timeColumn = getXAxisLabel(rawFormData) as string;
let trendLineData; let trendLineData;
let percentChange = 0; let percentChange = 0;
let bigNumber = data.length === 0 ? null : data[0][metricName]; let bigNumber = data.length === 0 ? null : data[0][metricName];

View File

@ -23,8 +23,8 @@ import {
PostProcessingPivot, PostProcessingPivot,
QueryFormData, QueryFormData,
QueryObject, QueryObject,
getXAxis,
isXAxisSet, isXAxisSet,
getXAxisColumn,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { import {
pivotOperator, pivotOperator,
@ -54,7 +54,9 @@ export default function buildQuery(formData: QueryFormData) {
const queryObject = { const queryObject = {
...baseQueryObject, ...baseQueryObject,
columns: [ columns: [
...(isXAxisSet(formData) ? ensureIsArray(getXAxis(formData)) : []), ...(isXAxisSet(formData)
? ensureIsArray(getXAxisColumn(formData))
: []),
...ensureIsArray(fd.groupby), ...ensureIsArray(fd.groupby),
], ],
series_columns: fd.groupby, series_columns: fd.groupby,

View File

@ -29,7 +29,7 @@ import {
QueryFormData, QueryFormData,
TimeseriesChartDataResponseResult, TimeseriesChartDataResponseResult,
TimeseriesDataRecord, TimeseriesDataRecord,
getXAxis, getXAxisLabel,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { EChartsCoreOption, SeriesOption } from 'echarts'; import { EChartsCoreOption, SeriesOption } from 'echarts';
import { import {
@ -152,7 +152,9 @@ export default function transformProps(
const colorScale = CategoricalColorNamespace.getScale(colorScheme as string); const colorScale = CategoricalColorNamespace.getScale(colorScheme as string);
const xAxisCol = getXAxis(chartProps.rawFormData as QueryFormData) as string; const xAxisCol = getXAxisLabel(
chartProps.rawFormData as QueryFormData,
) as string;
const rebasedDataA = rebaseForecastDatum(data1, verboseMap); const rebasedDataA = rebaseForecastDatum(data1, verboseMap);
const rawSeriesA = extractSeries(rebasedDataA, { const rawSeriesA = extractSeries(rebasedDataA, {

View File

@ -22,7 +22,7 @@ import {
normalizeOrderBy, normalizeOrderBy,
PostProcessingPivot, PostProcessingPivot,
QueryFormData, QueryFormData,
getXAxis, getXAxisColumn,
isXAxisSet, isXAxisSet,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { import {
@ -72,7 +72,9 @@ export default function buildQuery(formData: QueryFormData) {
{ {
...baseQueryObject, ...baseQueryObject,
columns: [ columns: [
...(isXAxisSet(formData) ? ensureIsArray(getXAxis(formData)) : []), ...(isXAxisSet(formData)
? ensureIsArray(getXAxisColumn(formData))
: []),
...ensureIsArray(groupby), ...ensureIsArray(groupby),
], ],
series_columns: groupby, series_columns: groupby,

View File

@ -28,8 +28,8 @@ import {
isTimeseriesAnnotationLayer, isTimeseriesAnnotationLayer,
TimeseriesChartDataResponseResult, TimeseriesChartDataResponseResult,
t, t,
getXAxis,
AxisType, AxisType,
getXAxisLabel,
} from '@superset-ui/core'; } from '@superset-ui/core';
import { isDerivedSeries } from '@superset-ui/chart-controls'; import { isDerivedSeries } from '@superset-ui/chart-controls';
import { EChartsCoreOption, SeriesOption } from 'echarts'; import { EChartsCoreOption, SeriesOption } from 'echarts';
@ -148,7 +148,7 @@ export default function transformProps(
const colorScale = CategoricalColorNamespace.getScale(colorScheme as string); const colorScale = CategoricalColorNamespace.getScale(colorScheme as string);
const rebasedData = rebaseForecastDatum(data, verboseMap); const rebasedData = rebaseForecastDatum(data, verboseMap);
const xAxisCol = getXAxis(chartProps.rawFormData) as string; const xAxisCol = getXAxisLabel(chartProps.rawFormData) as string;
const isHorizontal = orientation === OrientationType.horizontal; const isHorizontal = orientation === OrientationType.horizontal;
const { totalStackedValues, thresholdValues } = extractDataTotalValues( const { totalStackedValues, thresholdValues } = extractDataTotalValues(
rebasedData, rebasedData,