FieldOverrides: Optimize doStandardCalcs() (#67881)

Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
This commit is contained in:
Leon Sorokin 2023-08-29 11:35:18 -05:00 committed by GitHub
parent 20dd8a4f46
commit 4ba6889df8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 9 deletions

View File

@ -1,7 +1,7 @@
import { difference } from 'lodash'; import { difference } from 'lodash';
import { createDataFrame, guessFieldTypeFromValue } from '../dataframe/processDataFrame'; 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'; 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);
});
}); });

View File

@ -88,7 +88,9 @@ export function reduceField(options: ReduceFieldOptions): FieldCalcs {
return (field.state.calcs = calcs); 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 ignoreNulls = nullValueMode === NullValueMode.Ignore;
const nullAsZero = nullValueMode === NullValueMode.AsZero; const nullAsZero = nullValueMode === NullValueMode.AsZero;
@ -291,9 +293,8 @@ export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero:
}; };
const data = field.values; 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++) { for (let i = 0; i < data.length; i++) {
let currentValue = data[i]; let currentValue = data[i];
@ -304,7 +305,7 @@ export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero:
calcs.last = currentValue; calcs.last = currentValue;
if (currentValue === null) { if (currentValue == null) {
if (ignoreNulls) { if (ignoreNulls) {
continue; continue;
} }
@ -313,6 +314,8 @@ export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero:
} }
} }
calcs.count++;
if (currentValue != null) { if (currentValue != null) {
// null || undefined // null || undefined
const isFirst = calcs.firstNotNull === null; const isFirst = calcs.firstNotNull === null;

View File

@ -83,7 +83,7 @@ describe('GroupBy transformer', () => {
fields: [ fields: [
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] }, { 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: '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: [ fields: [
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] }, { 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: '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: [ fields: [
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] }, { 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: '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({ toDataFrame({
@ -202,7 +202,7 @@ describe('GroupBy transformer', () => {
fields: [ fields: [
{ name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000, 7000, 8000] }, { 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: '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] },
], ],
}), }),
]; ];