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',
fields: [
{ 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] },
],
});
@ -52,7 +52,14 @@ describe('Reducer Transformer', () => {
const cfg = {
id: DataTransformerID.reduce,
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],
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);

View File

@ -1,6 +1,6 @@
import { map } from 'rxjs/operators';
import { guessFieldTypeForField, guessFieldTypeFromValue } from '../../dataframe/processDataFrame';
import { guessFieldTypeForField } from '../../dataframe/processDataFrame';
import { getFieldDisplayName } from '../../field';
import { KeyValue } from '../../types/data';
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 reducers = calculators.map((c) => c.id);
const processed: DataFrame[] = [];
for (const series of data) {
const fields: Field[] = [];
for (const field of series.fields) {
@ -224,7 +223,7 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId
const value = results[reducer];
const copy = {
...field,
type: guessFieldTypeFromValue(value),
type: getFieldType(reducer, field),
values: [value],
};
copy.state = undefined;
@ -249,3 +248,18 @@ export function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId
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;
}
}