Transformations: Fix converting time fields to number in reduceFields (#81830)

* Fix bug converting time fields to number in reduce
---------

Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
This commit is contained in:
Galen Kistler 2024-02-08 11:29:10 -06:00 committed by GitHub
parent 903e54e622
commit 633e354a76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 5 deletions

View File

@ -21,7 +21,7 @@ const seriesAWithMultipleFields = toDataFrame({
name: 'A', name: 'A',
fields: [ fields: [
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] },
{ name: 'temperature', type: FieldType.number, values: [3, 4, 5, 6] }, { name: 'temperature', type: FieldType.number, values: [3, 4, 5, 6, 6] },
{ name: 'humidity', type: FieldType.number, values: [10000.3, 10000.4, 10000.5, 10000.6] }, { name: 'humidity', type: FieldType.number, values: [10000.3, 10000.4, 10000.5, 10000.6] },
], ],
}); });
@ -52,7 +52,14 @@ describe('Reducer Transformer', () => {
const cfg = { const cfg = {
id: DataTransformerID.reduce, id: DataTransformerID.reduce,
options: { options: {
reducers: [ReducerID.first, ReducerID.min, ReducerID.max, ReducerID.last], reducers: [
ReducerID.first,
ReducerID.min,
ReducerID.max,
ReducerID.last,
ReducerID.uniqueValues,
ReducerID.count,
],
}, },
}; };
@ -90,6 +97,25 @@ describe('Reducer Transformer', () => {
values: [6, 10000.6, 7, 11000.7], values: [6, 10000.6, 7, 11000.7],
config: {}, config: {},
}, },
{
// expect type other
name: 'All unique values',
type: FieldType.other,
values: [
[3, 4, 5, 6],
[10000.3, 10000.4, 10000.5, 10000.6],
[1, 3, 5, 7],
[11000.1, 11000.3, 11000.5, 11000.7],
],
config: {},
},
{
// expect type number
name: 'Count',
type: FieldType.number,
values: [5, 4, 4, 4],
config: {},
},
]; ];
expect(processed.length).toEqual(1); expect(processed.length).toEqual(1);

View File

@ -1,6 +1,6 @@
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { guessFieldTypeForField, guessFieldTypeFromValue } from '../../dataframe/processDataFrame'; import { guessFieldTypeForField } from '../../dataframe/processDataFrame';
import { getFieldDisplayName } from '../../field'; import { getFieldDisplayName } from '../../field';
import { KeyValue } from '../../types/data'; import { KeyValue } from '../../types/data';
import { DataFrame, Field, FieldType } from '../../types/dataFrame'; import { DataFrame, Field, FieldType } from '../../types/dataFrame';
@ -211,7 +211,6 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId
const calculators = fieldReducers.list(reducerId); const calculators = fieldReducers.list(reducerId);
const reducers = calculators.map((c) => c.id); const reducers = calculators.map((c) => c.id);
const processed: DataFrame[] = []; const processed: DataFrame[] = [];
for (const series of data) { for (const series of data) {
const fields: Field[] = []; const fields: Field[] = [];
for (const field of series.fields) { for (const field of series.fields) {
@ -224,7 +223,7 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId
const value = results[reducer]; const value = results[reducer];
const copy = { const copy = {
...field, ...field,
type: guessFieldTypeFromValue(value), type: getFieldType(reducer, field),
values: [value], values: [value],
}; };
copy.state = undefined; copy.state = undefined;
@ -249,3 +248,18 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId
return processed; return processed;
} }
function getFieldType(reducer: string, field: Field) {
switch (reducer) {
case ReducerID.allValues:
case ReducerID.uniqueValues:
return FieldType.other;
case ReducerID.first:
case ReducerID.firstNotNull:
case ReducerID.last:
case ReducerID.lastNotNull:
return field.type;
default:
return FieldType.number;
}
}