mirror of
https://github.com/apache/superset.git
synced 2026-05-31 21:29:19 +00:00
153 lines
4.4 KiB
TypeScript
153 lines
4.4 KiB
TypeScript
/* eslint-disable no-underscore-dangle */
|
|
/**
|
|
* 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 { isEmpty } from 'lodash';
|
|
|
|
import {
|
|
Annotation,
|
|
AnnotationData,
|
|
AnnotationLayer,
|
|
AnnotationOpacity,
|
|
AnnotationType,
|
|
AxisType,
|
|
DataRecord,
|
|
evalExpression,
|
|
FormulaAnnotationLayer,
|
|
isRecordAnnotationResult,
|
|
isTableAnnotationLayer,
|
|
isTimeseriesAnnotationResult,
|
|
} from '@superset-ui/core';
|
|
import { EchartsTimeseriesChartProps } from '../types';
|
|
import { EchartsMixedTimeseriesProps } from '../MixedTimeseries/types';
|
|
|
|
export function evalFormula(
|
|
formula: FormulaAnnotationLayer,
|
|
data: DataRecord[],
|
|
xAxis: string,
|
|
xAxisType: AxisType,
|
|
): [any, number][] {
|
|
const { value: expression } = formula;
|
|
|
|
return data.map(row => {
|
|
let value = row[xAxis];
|
|
if (xAxisType === AxisType.Time) {
|
|
value = new Date(value as string).getTime();
|
|
}
|
|
return [value, evalExpression(expression, (value || 0) as number)];
|
|
});
|
|
}
|
|
|
|
export function parseAnnotationOpacity(opacity?: AnnotationOpacity): number {
|
|
switch (opacity) {
|
|
case AnnotationOpacity.Low:
|
|
return 0.2;
|
|
case AnnotationOpacity.Medium:
|
|
return 0.5;
|
|
case AnnotationOpacity.High:
|
|
return 0.8;
|
|
default:
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
const NATIVE_COLUMN_NAMES = {
|
|
descriptionColumns: ['long_descr'],
|
|
intervalEndColumn: 'end_dttm',
|
|
timeColumn: 'start_dttm',
|
|
titleColumn: 'short_descr',
|
|
};
|
|
|
|
export function extractRecordAnnotations(
|
|
annotationLayer: AnnotationLayer,
|
|
annotationData: AnnotationData,
|
|
): Annotation[] {
|
|
const { name } = annotationLayer;
|
|
const result = annotationData[name];
|
|
if (isRecordAnnotationResult(result)) {
|
|
const { records } = result;
|
|
const {
|
|
descriptionColumns = [],
|
|
intervalEndColumn = '',
|
|
timeColumn = '',
|
|
titleColumn = '',
|
|
} = isTableAnnotationLayer(annotationLayer)
|
|
? annotationLayer
|
|
: NATIVE_COLUMN_NAMES;
|
|
|
|
return records.map(record => ({
|
|
descriptions: descriptionColumns.map(
|
|
column => (record[column] || '') as string,
|
|
) as string[],
|
|
intervalEnd: (record[intervalEndColumn] || '') as string,
|
|
time: (record[timeColumn] || '') as string,
|
|
title: (record[titleColumn] || '') as string,
|
|
}));
|
|
}
|
|
throw new Error('Please rerun the query.');
|
|
}
|
|
|
|
export function formatAnnotationLabel(
|
|
name?: string,
|
|
title?: string,
|
|
descriptions: string[] = [],
|
|
): string {
|
|
const labels: string[] = [];
|
|
const titleLabels: string[] = [];
|
|
const filteredDescriptions = descriptions.filter(
|
|
description => !!description,
|
|
);
|
|
if (name) titleLabels.push(name);
|
|
if (title) titleLabels.push(title);
|
|
if (titleLabels.length > 0) labels.push(titleLabels.join(' - '));
|
|
if (filteredDescriptions.length > 0)
|
|
labels.push(filteredDescriptions.join('\n'));
|
|
return labels.join('\n\n');
|
|
}
|
|
|
|
export function extractAnnotationLabels(
|
|
layers: AnnotationLayer[],
|
|
data: AnnotationData,
|
|
): string[] {
|
|
const formulaAnnotationLabels = layers
|
|
.filter(anno => anno.annotationType === AnnotationType.Formula && anno.show)
|
|
.map(anno => anno.name);
|
|
const timeseriesAnnotationLabels = layers
|
|
.filter(
|
|
anno => anno.annotationType === AnnotationType.Timeseries && anno.show,
|
|
)
|
|
.flatMap(anno => {
|
|
const result = data[anno.name];
|
|
return isTimeseriesAnnotationResult(result)
|
|
? result.map(annoSeries => annoSeries.key)
|
|
: [];
|
|
});
|
|
|
|
return formulaAnnotationLabels.concat(timeseriesAnnotationLabels);
|
|
}
|
|
|
|
export function getAnnotationData(
|
|
chartProps: EchartsTimeseriesChartProps | EchartsMixedTimeseriesProps,
|
|
): AnnotationData {
|
|
const data = chartProps?.queriesData[0]?.annotation_data as AnnotationData;
|
|
if (!isEmpty(data)) {
|
|
return data;
|
|
}
|
|
return {};
|
|
}
|