diff --git a/packages/grafana-data/src/transformations/fieldReducer.test.ts b/packages/grafana-data/src/transformations/fieldReducer.test.ts index 243479b7f2d..34de7c94f90 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.test.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.test.ts @@ -97,6 +97,15 @@ describe('Stats Calculators', () => { expect(stats.delta).toEqual(300); }); + it('should calculate unique values', () => { + const stats = reduceField({ + field: createField('x', [1, 2, 2, 3, 1]), + reducers: [ReducerID.uniqueValues], + }); + + expect(stats.uniqueValues).toEqual([1, 2, 3]); + }); + it('consistently check allIsNull/allIsZero', () => { const empty = createField('x'); const allNull = createField('x', [null, null, null, null]); diff --git a/packages/grafana-data/src/transformations/fieldReducer.ts b/packages/grafana-data/src/transformations/fieldReducer.ts index aaf400ba105..c593ac47346 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.ts @@ -25,6 +25,7 @@ export enum ReducerID { allIsZero = 'allIsZero', allIsNull = 'allIsNull', allValues = 'allValues', + uniqueValues = 'uniqueValues', } // Internal function @@ -237,6 +238,15 @@ export const fieldReducers = new Registry(() => [ standard: false, reduce: (field: Field) => ({ allValues: field.values.toArray() }), }, + { + id: ReducerID.uniqueValues, + name: 'All unique values', + description: 'Returns an array with all unique values', + standard: false, + reduce: (field: Field) => ({ + uniqueValues: [...new Set(field.values.toArray())], + }), + }, ]); export function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {