123 lines
3.2 KiB
TypeScript
123 lines
3.2 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 {
|
|
ChartProps,
|
|
LegacyQueryData,
|
|
QueryFormData,
|
|
QueryFormMetric,
|
|
} from '@superset-ui/core';
|
|
import {
|
|
RawBoxPlotDataRow,
|
|
BoxPlotDataRow,
|
|
} from '../../components/BoxPlot/types';
|
|
|
|
export type LegacyBoxPlotFormData = {
|
|
groupby?: QueryFormData['groupby'];
|
|
metrics?: QueryFormData['metrics'];
|
|
colorScheme?: string;
|
|
};
|
|
|
|
export type LegacyBoxPlotChartProps = ChartProps & {
|
|
formData: LegacyBoxPlotFormData;
|
|
queriesData: (LegacyQueryData & {
|
|
data?: RawBoxPlotDataRow[];
|
|
})[];
|
|
};
|
|
|
|
export default function transformProps(chartProps: LegacyBoxPlotChartProps) {
|
|
const { width, height, datasource, formData, queriesData } = chartProps;
|
|
const { verboseMap = {} } = datasource;
|
|
const { colorScheme, groupby = [], metrics = [] } = formData;
|
|
|
|
const data = (queriesData[0].data || []).map(({ label, values }) => ({
|
|
label,
|
|
min: values.whisker_low,
|
|
max: values.whisker_high,
|
|
firstQuartile: values.Q1,
|
|
median: values.Q2,
|
|
thirdQuartile: values.Q3,
|
|
outliers: values.outliers,
|
|
}));
|
|
|
|
const xAxisLabel = groupby.join('/');
|
|
|
|
let metric: QueryFormMetric = '';
|
|
if (Array.isArray(metrics)) {
|
|
metric = metrics.length > 0 ? metrics[0] : '';
|
|
} else {
|
|
metric = metrics;
|
|
}
|
|
const yAxisLabel =
|
|
typeof metric === 'string' ? verboseMap[metric] || metric : metric.label;
|
|
|
|
const boxPlotValues = data.reduce((r: number[], e: BoxPlotDataRow) => {
|
|
r.push(e.min, e.max, ...e.outliers);
|
|
|
|
return r;
|
|
}, []);
|
|
|
|
const minBoxPlotValue = Math.min(...boxPlotValues);
|
|
const maxBoxPlotValue = Math.max(...boxPlotValues);
|
|
const valueDomain = [
|
|
minBoxPlotValue - 0.1 * Math.abs(minBoxPlotValue),
|
|
maxBoxPlotValue + 0.1 * Math.abs(maxBoxPlotValue),
|
|
];
|
|
|
|
return {
|
|
data,
|
|
width,
|
|
height,
|
|
encoding: {
|
|
x: {
|
|
field: 'label',
|
|
type: 'nominal',
|
|
scale: {
|
|
type: 'band',
|
|
paddingInner: 0.15,
|
|
paddingOuter: 0.3,
|
|
},
|
|
axis: {
|
|
title: xAxisLabel,
|
|
},
|
|
},
|
|
y: {
|
|
field: 'value',
|
|
type: 'quantitative',
|
|
scale: {
|
|
type: 'linear',
|
|
domain: valueDomain,
|
|
},
|
|
axis: {
|
|
title: yAxisLabel,
|
|
numTicks: 5,
|
|
format: 'SMART_NUMBER',
|
|
},
|
|
},
|
|
color: {
|
|
field: 'label',
|
|
type: 'nominal',
|
|
scale: {
|
|
scheme: colorScheme,
|
|
},
|
|
legend: false,
|
|
},
|
|
},
|
|
};
|
|
}
|