SYNC: chart autodetection improved

This commit is contained in:
Jan Prochazka
2025-07-02 10:50:07 +02:00
committed by Diflow
parent cd3a1bebff
commit 33b707aa68
3 changed files with 68 additions and 60 deletions

View File

@@ -17,7 +17,8 @@ export const ChartConstDefaults = {
}; };
export const ChartLimits = { export const ChartLimits = {
AUTODETECT_CHART_LIMIT: 10, // limit for auto-detecting charts, to avoid too many charts AUTODETECT_CHART_LIMIT: 10, // limit for auto-detecting charts, to avoid too many charts (after APPLY_LIMIT_AFTER_ROWS rows)
AUTODETECT_CHART_TOTAL_LIMIT: 32, // limit for auto-detecting charts, to avoid too many charts (for first APPLY_LIMIT_AFTER_ROWS rows)
AUTODETECT_MEASURES_LIMIT: 10, // limit for auto-detecting measures, to avoid too many measures AUTODETECT_MEASURES_LIMIT: 10, // limit for auto-detecting measures, to avoid too many measures
APPLY_LIMIT_AFTER_ROWS: 100, APPLY_LIMIT_AFTER_ROWS: 100,
MAX_DISTINCT_VALUES: 10, // max number of distinct values to keep in topDistinctValues MAX_DISTINCT_VALUES: 10, // max number of distinct values to keep in topDistinctValues

View File

@@ -74,19 +74,22 @@ export class ChartProcessor {
// return chart; // return chart;
// } // }
runAutoDetectCharts( runAutoDetectCharts(
row,
dateColumns: { [key: string]: ChartDateParsed }, dateColumns: { [key: string]: ChartDateParsed },
numericColumnsForAutodetect: { [key: string]: number }, numericColumnsForAutodetect: { [key: string]: number },
stringColumns: { [key: string]: string } stringColumns: { [key: string]: string }
) { ) {
// create charts from data, if there are no given definitions const processColumnType = (columns, transformTest, chartType, transformFunction) => {
for (const datecol in dateColumns) { for (const xcol in columns) {
for (const groupingField of [undefined, ...Object.keys(stringColumns)]) { for (const groupingField of [undefined, ...Object.keys(stringColumns)]) {
if (xcol == groupingField) {
continue;
}
let usedChart = this.chartsProcessing.find( let usedChart = this.chartsProcessing.find(
chart => chart =>
!chart.isGivenDefinition && !chart.isGivenDefinition &&
chart.definition.xdef.field === datecol && chart.definition.xdef.field === xcol &&
chart.definition.xdef.transformFunction?.startsWith('date:') && transformTest(chart.definition.xdef.transformFunction) &&
chart.definition.groupingField == groupingField chart.definition.groupingField == groupingField
); );
@@ -97,10 +100,10 @@ export class ChartProcessor {
) { ) {
usedChart = { usedChart = {
definition: { definition: {
chartType: 'timeline', chartType,
xdef: { xdef: {
field: datecol, field: xcol,
transformFunction: 'date:day', transformFunction,
}, },
ydefs: [], ydefs: [],
groupingField, groupingField,
@@ -141,6 +144,10 @@ export class ChartProcessor {
} }
} }
} }
};
processColumnType(dateColumns, transform => transform?.startsWith('date:'), 'timeline', 'date:day');
processColumnType(stringColumns, transform => transform == 'identity', 'bar', 'identity');
} }
addRow(row: any) { addRow(row: any) {
@@ -203,7 +210,7 @@ export class ChartProcessor {
// const sortedNumericColumnns = Object.keys(numericColumns).sort(); // const sortedNumericColumnns = Object.keys(numericColumns).sort();
if (this.autoDetectCharts) { if (this.autoDetectCharts) {
this.runAutoDetectCharts(row, dateColumns, numericColumnsForAutodetect, stringColumns); this.runAutoDetectCharts(dateColumns, numericColumnsForAutodetect, stringColumns);
} }
// apply on all charts with this date column // apply on all charts with this date column

View File

@@ -116,8 +116,8 @@ describe('Chart processor', () => {
const processor = new ChartProcessor(); const processor = new ChartProcessor();
processor.addRows(...DS1.slice(0, 3)); processor.addRows(...DS1.slice(0, 3));
processor.finalize(); processor.finalize();
expect(processor.charts.length).toEqual(2); expect(processor.charts.length).toEqual(3);
const chart = processor.charts.find(x => !x.definition.groupingField); const chart = processor.charts.find(x => !x.definition.groupingField && x.definition.xdef.field === 'timestamp');
expect(chart.definition.xdef.transformFunction).toEqual('date:day'); expect(chart.definition.xdef.transformFunction).toEqual('date:day');
expect(chart.definition.ydefs).toEqual([ expect(chart.definition.ydefs).toEqual([
expect.objectContaining({ expect.objectContaining({
@@ -130,8 +130,8 @@ describe('Chart processor', () => {
const processor = new ChartProcessor(); const processor = new ChartProcessor();
processor.addRows(...DS1.slice(0, 4)); processor.addRows(...DS1.slice(0, 4));
processor.finalize(); processor.finalize();
expect(processor.charts.length).toEqual(2); expect(processor.charts.length).toEqual(3);
const chart = processor.charts.find(x => !x.definition.groupingField); const chart = processor.charts.find(x => !x.definition.groupingField && x.definition.xdef.field === 'timestamp');
expect(chart.definition.xdef.transformFunction).toEqual('date:month'); expect(chart.definition.xdef.transformFunction).toEqual('date:month');
expect(chart.bucketKeysOrdered).toEqual([ expect(chart.bucketKeysOrdered).toEqual([
'2023-10', '2023-10',