blob: c9390140b5a22a3c0742d52b066ee8f693cde390 [file] [log] [blame]
/**
* 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,
},
},
};
}