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 { 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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -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;
|
||||||
|
@ -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] },
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
Loading…
Reference in New Issue
Block a user