mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
FieldOverrides: Optimize doStandardCalcs() (#67881)
Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
This commit is contained in:
parent
20dd8a4f46
commit
4ba6889df8
@ -1,7 +1,7 @@
|
||||
import { difference } from 'lodash';
|
||||
|
||||
import { createDataFrame, guessFieldTypeFromValue } from '../dataframe/processDataFrame';
|
||||
import { Field, FieldType } from '../types/index';
|
||||
import { Field, FieldType, NullValueMode } from '../types/index';
|
||||
|
||||
import { fieldReducers, ReducerID, reduceField } from './fieldReducer';
|
||||
|
||||
@ -171,4 +171,23 @@ describe('Stats Calculators', () => {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('count should ignoreNulls by default', () => {
|
||||
const someNulls = createField('x', [1, null, null, 1]);
|
||||
expect(reduce(someNulls, ReducerID.count)).toEqual(2);
|
||||
});
|
||||
|
||||
it('count should use fieldConfig nullValueMode.Ignore and not count nulls', () => {
|
||||
const someNulls = createField('x', [1, null, null, 1]);
|
||||
someNulls.config.nullValueMode = NullValueMode.Ignore;
|
||||
|
||||
expect(reduce(someNulls, ReducerID.count)).toEqual(2);
|
||||
});
|
||||
|
||||
it('count should use fieldConfig nullValueMode.Null and count nulls', () => {
|
||||
const someNulls = createField('x', [1, null, null, 1]);
|
||||
someNulls.config.nullValueMode = NullValueMode.Null;
|
||||
|
||||
expect(reduce(someNulls, ReducerID.count)).toEqual(4);
|
||||
});
|
||||
});
|
||||
|
@ -88,7 +88,9 @@ export function reduceField(options: ReduceFieldOptions): FieldCalcs {
|
||||
return (field.state.calcs = calcs);
|
||||
}
|
||||
|
||||
const { nullValueMode } = field.config;
|
||||
// Default to Ignore for nullValueMode.
|
||||
const { nullValueMode = NullValueMode.Ignore } = field.config;
|
||||
|
||||
const ignoreNulls = nullValueMode === NullValueMode.Ignore;
|
||||
const nullAsZero = nullValueMode === NullValueMode.AsZero;
|
||||
|
||||
@ -291,9 +293,8 @@ export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero:
|
||||
};
|
||||
|
||||
const data = field.values;
|
||||
calcs.count = ignoreNulls ? data.length : data.filter((val) => val != null).length;
|
||||
|
||||
const isNumberField = field.type === FieldType.number || FieldType.time;
|
||||
const isNumberField = field.type === FieldType.number || field.type === FieldType.time;
|
||||
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
let currentValue = data[i];
|
||||
@ -304,7 +305,7 @@ export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero:
|
||||
|
||||
calcs.last = currentValue;
|
||||
|
||||
if (currentValue === null) {
|
||||
if (currentValue == null) {
|
||||
if (ignoreNulls) {
|
||||
continue;
|
||||
}
|
||||
@ -313,6 +314,8 @@ export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero:
|
||||
}
|
||||
}
|
||||
|
||||
calcs.count++;
|
||||
|
||||
if (currentValue != null) {
|
||||
// null || undefined
|
||||
const isFirst = calcs.firstNotNull === null;
|
||||
|
@ -83,7 +83,7 @@ describe('GroupBy transformer', () => {
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] },
|
||||
{ name: 'message', type: FieldType.string, values: ['one', 'two', 'two', 'three', 'three', 'three'] },
|
||||
{ name: 'values', type: FieldType.string, values: [1, 2, 2, 3, 3, 3] },
|
||||
{ name: 'values', type: FieldType.number, values: [1, 2, 2, 3, 3, 3] },
|
||||
],
|
||||
});
|
||||
|
||||
@ -130,7 +130,7 @@ describe('GroupBy transformer', () => {
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] },
|
||||
{ name: 'message', type: FieldType.string, values: ['one', 'two', 'two', 'three', 'three', 'three'] },
|
||||
{ name: 'values', type: FieldType.string, values: [1, 2, 2, 3, 3, 3] },
|
||||
{ name: 'values', type: FieldType.number, values: [1, 2, 2, 3, 3, 3] },
|
||||
],
|
||||
});
|
||||
|
||||
@ -194,7 +194,7 @@ describe('GroupBy transformer', () => {
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] },
|
||||
{ name: 'message', type: FieldType.string, values: ['one', 'two', 'two', 'three', 'three', 'three'] },
|
||||
{ name: 'values', type: FieldType.string, values: [1, 2, 2, 3, 3, 3] },
|
||||
{ name: 'values', type: FieldType.number, values: [1, 2, 2, 3, 3, 3] },
|
||||
],
|
||||
}),
|
||||
toDataFrame({
|
||||
@ -202,7 +202,7 @@ describe('GroupBy transformer', () => {
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] },
|
||||
{ name: 'message', type: FieldType.string, values: ['one', 'two', 'two', 'three', 'three', 'three'] },
|
||||
{ name: 'values', type: FieldType.string, values: [0, 2, 5, 3, 3, 2] },
|
||||
{ name: 'values', type: FieldType.number, values: [0, 2, 5, 3, 3, 2] },
|
||||
],
|
||||
}),
|
||||
];
|
||||
|
Loading…
Reference in New Issue
Block a user