Skip to content

Commit

Permalink
pass interval through
Browse files Browse the repository at this point in the history
  • Loading branch information
flash1293 committed Feb 15, 2021
1 parent 16eb41b commit d4837cf
Show file tree
Hide file tree
Showing 9 changed files with 304 additions and 13 deletions.
23 changes: 23 additions & 0 deletions src/plugins/data/common/search/aggs/buckets/histogram.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { AggTypesDependencies } from '../agg_types';
import { BUCKET_TYPES } from './bucket_agg_types';
import { IBucketHistogramAggConfig, getHistogramBucketAgg, AutoBounds } from './histogram';
import { BucketAggType } from './bucket_agg_type';
import { SerializableState } from 'src/plugins/expressions/common';
import { isSerializedAutoInterval } from '../utils/get_number_histogram_interval';

describe('Histogram Agg', () => {
let aggTypesDependencies: AggTypesDependencies;
Expand Down Expand Up @@ -230,6 +232,27 @@ describe('Histogram Agg', () => {
expect(params.interval).toBeNaN();
});

test('will serialize the auto interval along with the actually chosen interval and deserialize correctly', () => {
const aggConfigs = getAggConfigs({
interval: 'auto',
field: {
name: 'field',
},
});
(aggConfigs.aggs[0] as IBucketHistogramAggConfig).setAutoBounds({ min: 0, max: 1000 });
const serializedAgg = aggConfigs.aggs[0].serialize();
const serializedIntervalParam = (serializedAgg.params as SerializableState).interval;
expect(isSerializedAutoInterval(serializedIntervalParam as string | number)).toBe(true);
const freshHistogramAggConfig = getAggConfigs({
interval: 100,
field: {
name: 'field',
},
}).aggs[0];
freshHistogramAggConfig.setParams(serializedAgg.params);
expect(freshHistogramAggConfig.getParam('interval')).toEqual('auto');
});

describe('interval scaling', () => {
const getInterval = (
maxBars: number,
Expand Down
27 changes: 27 additions & 0 deletions src/plugins/data/common/search/aggs/buckets/histogram.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ import { aggHistogramFnName } from './histogram_fn';
import { ExtendedBounds } from './lib/extended_bounds';
import { isAutoInterval, autoInterval } from './_interval_options';
import { calculateHistogramInterval } from './lib/histogram_calculate_interval';
import {
buildSerializedAutoInterval,
isSerializedAutoInterval,
} from '../utils/get_number_histogram_interval';

export interface AutoBounds {
min: number;
Expand Down Expand Up @@ -152,6 +156,29 @@ export const getHistogramBucketAgg = ({
esTypes: aggConfig.params.field?.spec?.esTypes || [],
});
},
serialize(val, aggConfig) {
// store actually used auto interval in serialized agg config to be able to read it from the result data table meta information
const autoBounds = aggConfig?.getAutoBounds();
if (aggConfig && autoBounds) {
const usedInterval = calculateHistogramInterval({
values: autoBounds,
interval: aggConfig.params.interval,
maxBucketsUiSettings: getConfig(UI_SETTINGS.HISTOGRAM_MAX_BARS),
maxBucketsUserInput: aggConfig.params.maxBars,
intervalBase: aggConfig.params.intervalBase,
esTypes: aggConfig.params.field?.spec?.esTypes || [],
});
return buildSerializedAutoInterval(usedInterval);
} else {
return val;
}
},
deserialize(val) {
if (isSerializedAutoInterval(val)) {
return autoInterval;
}
return val;
},
},
{
name: 'maxBars',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import { getNumberHistogramIntervalByDatatableColumn } from '.';
import { BUCKET_TYPES } from '../buckets';

describe('getNumberHistogramIntervalByDatatableColumn', () => {
it('returns nothing on column from other data source', () => {
expect(
getNumberHistogramIntervalByDatatableColumn({
id: 'test',
name: 'test',
meta: {
type: 'date',
source: 'essql',
},
})
).toEqual(undefined);
});

it('returns nothing on non histogram column', () => {
expect(
getNumberHistogramIntervalByDatatableColumn({
id: 'test',
name: 'test',
meta: {
type: 'date',
source: 'esaggs',
sourceParams: {
type: BUCKET_TYPES.TERMS,
},
},
})
).toEqual(undefined);
});

it('returns interval on resolved auto interval', () => {
expect(
getNumberHistogramIntervalByDatatableColumn({
id: 'test',
name: 'test',
meta: {
type: 'date',
source: 'esaggs',
sourceParams: {
type: BUCKET_TYPES.HISTOGRAM,
params: {
interval: 'auto$$$20',
},
},
},
})
).toEqual(20);
});

it('returns interval on fixed interval', () => {
expect(
getNumberHistogramIntervalByDatatableColumn({
id: 'test',
name: 'test',
meta: {
type: 'date',
source: 'esaggs',
sourceParams: {
type: BUCKET_TYPES.HISTOGRAM,
params: {
interval: 7,
},
},
},
})
).toEqual(7);
});

it('returns undefined if information is not available', () => {
expect(
getNumberHistogramIntervalByDatatableColumn({
id: 'test',
name: 'test',
meta: {
type: 'date',
source: 'esaggs',
sourceParams: {
type: BUCKET_TYPES.HISTOGRAM,
params: {},
},
},
})
).toEqual(undefined);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import { DatatableColumn } from 'src/plugins/expressions/common';
import type { AggParamsHistogram } from '../buckets';
import { BUCKET_TYPES } from '../buckets/bucket_agg_types';

const SEPARATOR = '$$$';

function parseSerializedInterval(interval: string | number) {
if (typeof interval === 'number') {
return interval;
}
if (interval === 'auto') {
return 'auto';
}
return Number(interval.split(SEPARATOR)[1]);
}

export function buildSerializedAutoInterval(usedInterval: number) {
return `auto${SEPARATOR}${usedInterval}`;
}

export function isSerializedAutoInterval(interval: string | number) {
return typeof interval === 'string' && interval.startsWith('auto');
}

/**
* Helper function returning the used interval for data table column created by the histogramm agg type.
* "auto" will get expanded to the actually used interval.
* If the column is not a column created by a histogram aggregation of the esaggs data source,
* this function will return undefined.
*/
export const getNumberHistogramIntervalByDatatableColumn = (column: DatatableColumn) => {
if (column.meta.source !== 'esaggs') return;
if (column.meta.sourceParams?.type !== BUCKET_TYPES.HISTOGRAM) return;
const params = (column.meta.sourceParams.params as unknown) as AggParamsHistogram;

if (!params.interval) {
return undefined;
}
return parseSerializedInterval(params.interval);
};
1 change: 1 addition & 0 deletions src/plugins/data/common/search/aggs/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

export * from './calculate_auto_time_expression';
export { getNumberHistogramIntervalByDatatableColumn } from './get_number_histogram_interval';
export * from './date_interval_utils';
export * from './get_format_with_aggs';
export * from './ipv4_address';
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/data/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ import {
parseInterval,
toAbsoluteDates,
boundsDescendingRaw,
getNumberHistogramIntervalByDatatableColumn,
// expressions utils
getRequestInspectorStats,
getResponseInspectorStats,
Expand Down Expand Up @@ -416,6 +417,7 @@ export const search = {
termsAggFilter,
toAbsoluteDates,
boundsDescendingRaw,
getNumberHistogramIntervalByDatatableColumn,
},
getRequestInspectorStats,
getResponseInspectorStats,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit d4837cf

Please sign in to comment.