From caf94b051e8af802605828c3ef15610ca6784c69 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 1 Apr 2020 12:53:55 +0300 Subject: [PATCH 1/8] Created tests for time_buckets. Clean up code. Removed getConfig method. --- src/plugins/data/public/index.ts | 1 + .../search/aggs/buckets/date_histogram.ts | 23 ++-- .../data/public/search/aggs/buckets/index.ts | 1 + .../aggs/buckets/lib/time_buckets/index.ts | 2 +- .../lib/time_buckets/time_buckets.test.ts | 126 ++++++++++++++++++ .../buckets/lib/time_buckets/time_buckets.ts | 30 ++--- .../public/legacy/build_pipeline.ts | 3 +- 7 files changed, 152 insertions(+), 34 deletions(-) create mode 100644 src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index efafea44167d46..636edde5431122 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -370,6 +370,7 @@ export { EsQuerySortValue, SortDirection, FetchOptions, + Bounds, // tabify TabbedAggColumn, TabbedAggRow, diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts index 7701f1bbcb4d0a..e977ead8eb1722 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -22,7 +22,7 @@ import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; import { IUiSettingsClient } from 'src/core/public'; -import { TimeBuckets } from './lib/time_buckets'; +import { TimeBuckets, Bounds } from './lib/time_buckets'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { createFilterDateHistogram } from './create_filter/date_histogram'; @@ -46,25 +46,21 @@ const updateTimeBuckets = ( ) => { const bounds = agg.params.timeRange ? timefilter.calculateBounds(agg.params.timeRange) : null; const buckets = customBuckets || agg.buckets; - buckets.setBounds(agg.fieldIsTimeField() && bounds); + if (agg.fieldIsTimeField()) { + buckets.setBounds(bounds as Bounds); + } else { + buckets.setBounds(); + } buckets.setInterval(agg.params.interval); }; -// TODO: Need to incorporate these properly into TimeBuckets -interface ITimeBuckets { - setBounds: Function; - getScaledDateFormat: TimeBuckets['getScaledDateFormat']; - setInterval: Function; - getInterval: Function; -} - export interface DateHistogramBucketAggDependencies { uiSettings: IUiSettingsClient; query: QuerySetup; } export interface IBucketDateHistogramAggConfig extends IBucketAggConfig { - buckets: ITimeBuckets; + buckets: TimeBuckets; } export function isDateHistogramBucketAggConfig(agg: any): agg is IBucketDateHistogramAggConfig { @@ -202,7 +198,8 @@ export const getDateHistogramBucketAgg = ({ ...dateHistogramInterval(interval.expression), }; - const scaleMetrics = scaleMetricValues && interval.scaled && interval.scale < 1; + const scaleMetrics = + scaleMetricValues && interval.scaled && interval.scale && interval.scale < 1; if (scaleMetrics && aggs) { const metrics = aggs.aggs.filter(a => isMetricAggType(a.type)); const all = every(metrics, (a: IBucketAggConfig) => { @@ -214,7 +211,7 @@ export const getDateHistogramBucketAgg = ({ }); if (all) { output.metricScale = interval.scale; - output.metricScaleText = interval.preScaled.description; + output.metricScaleText = interval.preScaled ? interval.preScaled.description : ''; } } }, diff --git a/src/plugins/data/public/search/aggs/buckets/index.ts b/src/plugins/data/public/search/aggs/buckets/index.ts index 3a402b1498a775..ebd406d0ff85f9 100644 --- a/src/plugins/data/public/search/aggs/buckets/index.ts +++ b/src/plugins/data/public/search/aggs/buckets/index.ts @@ -25,5 +25,6 @@ export * from './ip_range'; export * from './lib/cidr_mask'; export * from './lib/date_range'; export * from './lib/ip_range'; +export { Bounds } from './lib/time_buckets'; export * from './migrate_include_exclude_format'; export * from './terms'; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts index 32c09403b6ce53..119139e2484b5e 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts @@ -17,4 +17,4 @@ * under the License. */ -export { TimeBuckets } from './time_buckets'; +export { TimeBuckets, Bounds } from './time_buckets'; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts new file mode 100644 index 00000000000000..cd1a0f47573b70 --- /dev/null +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts @@ -0,0 +1,126 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import moment from 'moment'; +import { coreMock } from '../../../../../../../../../src/core/public/mocks'; + +import { TimeBuckets, Bounds } from './time_buckets'; + +describe('TimeBuckets', () => { + const { uiSettings } = coreMock.createSetup(); + uiSettings.get.mockImplementation((key: string) => { + if (key === 'histogram:maxBars') { + return 4; + } else if (key === 'histogram:barTarget') { + return 2; + } else if (key === 'dateFormat:scaled') { + return [ + ['', 'HH:mm:ss.SSS'], + ['PT1S', 'HH:mm:ss'], + ['PT1M', 'HH:mm'], + ['PT1H', 'YYYY-MM-DD HH:mm'], + ['P1DT', 'YYYY-MM-DD'], + ['P1YT', 'YYYY'], + ]; + } + }); + + test('setBounds/getBounds - bounds is correct', () => { + const timeBuckets = new TimeBuckets({ uiSettings }); + const bounds: Bounds = { + min: moment('2020-03-25'), + max: moment('2020-03-31'), + }; + timeBuckets.setBounds(bounds); + const timeBucketsBounds = timeBuckets.getBounds(); + + expect(timeBucketsBounds).toEqual(bounds); + }); + + test('setBounds/getBounds - bounds is undefined', () => { + const timeBuckets = new TimeBuckets({ uiSettings }); + const bounds: Bounds = { + min: moment('2020-03-25'), + max: moment('2020-03-31'), + }; + timeBuckets.setBounds(bounds); + let timeBucketsBounds = timeBuckets.getBounds(); + + expect(timeBucketsBounds).toEqual(bounds); + + timeBuckets.setBounds(); + timeBucketsBounds = timeBuckets.getBounds(); + + expect(timeBucketsBounds).toBeUndefined(); + }); + + test('setInterval/getInterval - intreval is a string', () => { + const timeBuckets = new TimeBuckets({ uiSettings }); + timeBuckets.setInterval('20m'); + const interval = timeBuckets.getInterval(); + + expect(interval.description).toEqual('20 minutes'); + expect(interval.esValue).toEqual(20); + expect(interval.esUnit).toEqual('m'); + expect(interval.expression).toEqual('20m'); + }); + + test('setInterval/getInterval - intreval is a string and bounds is defined', () => { + const timeBuckets = new TimeBuckets({ uiSettings }); + const bounds: Bounds = { + min: moment('2020-03-25'), + max: moment('2020-03-31'), + }; + timeBuckets.setBounds(bounds); + timeBuckets.setInterval('20m'); + const interval = timeBuckets.getInterval(); + + expect(interval.description).toEqual('day'); + expect(interval.esValue).toEqual(1); + expect(interval.esUnit).toEqual('d'); + expect(interval.expression).toEqual('1d'); + expect(interval.scaled).toBeTruthy(); + expect(interval.scale).toEqual(0.013888888888888888); + + if (interval.preScaled) { + expect(interval.preScaled.description).toEqual('20 minutes'); + expect(interval.preScaled.esValue).toEqual(20); + expect(interval.preScaled.esUnit).toEqual('m'); + expect(interval.preScaled.expression).toEqual('20m'); + } + }); + + test('setInterval/getInterval - intreval is a "auto"', () => { + const timeBuckets = new TimeBuckets({ uiSettings }); + timeBuckets.setInterval('auto'); + const interval = timeBuckets.getInterval(); + + expect(interval.description).toEqual('0 milliseconds'); + expect(interval.esValue).toEqual(0); + expect(interval.esUnit).toEqual('ms'); + expect(interval.expression).toEqual('0ms'); + }); + + test('getScaledDateFormat', () => { + const timeBuckets = new TimeBuckets({ uiSettings }); + timeBuckets.setInterval('20m'); + timeBuckets.getScaledDateFormat(); + const format = timeBuckets.getScaledDateFormat(); + expect(format).toEqual('HH:mm'); + }); +}); diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index c14f02e7decdfd..e16de65e9472d3 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import moment from 'moment'; +import moment, { Moment } from 'moment'; import { IUiSettingsClient } from 'src/core/public'; import { parseInterval } from '../../../../../../common'; @@ -29,9 +29,9 @@ import { EsInterval, } from './calc_es_interval'; -interface Bounds { - min: Date | number | null; - max: Date | number | null; +export interface Bounds { + min: Moment | Date | number | null; + max: Moment | Date | number | null; } interface TimeBucketsInterval extends moment.Duration { @@ -40,8 +40,7 @@ interface TimeBucketsInterval extends moment.Duration { esValue: EsInterval['value']; esUnit: EsInterval['unit']; expression: EsInterval['expression']; - overflow: moment.Duration | boolean; - preScaled?: moment.Duration; + preScaled?: TimeBucketsInterval; scale?: number; scaled?: boolean; } @@ -70,8 +69,6 @@ interface TimeBucketsConfig { * @param {[type]} display [description] */ export class TimeBuckets { - private getConfig: (key: string) => any; - private _lb: Bounds['min'] = null; private _ub: Bounds['max'] = null; private _originalInterval: string | null = null; @@ -170,7 +167,7 @@ export class TimeBuckets { } constructor({ uiSettings }: TimeBucketsConfig) { - this.getConfig = (key: string) => uiSettings.get(key); + this.uiSettings = uiSettings; return TimeBuckets.__cached__(this); } @@ -278,11 +275,10 @@ export class TimeBuckets { * - Any object from src/legacy/ui/agg_types.js * - "auto" * - Pass a valid moment unit - * - a moment.duration object. * * @param {object|string|moment.duration} input - see desc */ - setInterval(input: null | string | Record | moment.Duration) { + setInterval(input: null | string | Record) { let interval = input; // selection object -> val @@ -351,7 +347,7 @@ export class TimeBuckets { const readInterval = () => { const interval = this._i; if (moment.isDuration(interval)) return interval; - return calcAutoIntervalNear(this.getConfig('histogram:barTarget'), Number(duration)); + return calcAutoIntervalNear(this.uiSettings.get('histogram:barTarget'), Number(duration)); }; const parsedInterval = readInterval(); @@ -362,7 +358,7 @@ export class TimeBuckets { return interval; } - const maxLength: number = this.getConfig('histogram:maxBars'); + const maxLength: number = this.uiSettings.get('histogram:maxBars'); const approxLen = Number(duration) / Number(interval); let scaled; @@ -396,10 +392,6 @@ export class TimeBuckets { esValue: esInterval.value, esUnit: esInterval.unit, expression: esInterval.expression, - overflow: - Number(duration) > Number(interval) - ? moment.duration(Number(interval) - Number(duration)) - : false, }); }; @@ -423,7 +415,7 @@ export class TimeBuckets { */ getScaledDateFormat() { const interval = this.getInterval(); - const rules = this.getConfig('dateFormat:scaled'); + const rules = this.uiSettings.get('dateFormat:scaled'); for (let i = rules.length - 1; i >= 0; i--) { const rule = rules[i]; @@ -432,6 +424,6 @@ export class TimeBuckets { } } - return this.getConfig('dateFormat'); + return this.uiSettings.get('dateFormat'); } } diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 18af94c919247b..748f39e9f63f2e 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -25,6 +25,7 @@ import { fieldFormats, search, TimefilterContract, + Bounds, } from '../../../../plugins/data/public'; import { Vis, VisParams } from '../types'; const { isDateHistogramBucketAggConfig } = search.aggs; @@ -95,7 +96,7 @@ const getSchemas = ( if (isDateHistogramBucketAggConfig(agg)) { agg.params.timeRange = timeRange; const bounds = agg.params.timeRange ? timefilter.calculateBounds(agg.params.timeRange) : null; - agg.buckets.setBounds(agg.fieldIsTimeField() && bounds); + agg.buckets.setBounds(agg.fieldIsTimeField() ? (bounds as Bounds) : undefined); agg.buckets.setInterval(agg.params.interval); } From 1e2a9204259c4290f4b5071e07c0f79e341a36fa Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 1 Apr 2020 15:22:25 +0300 Subject: [PATCH 2/8] Fixed comments --- .../search/aggs/buckets/date_histogram.ts | 10 +++------ .../data/public/search/aggs/buckets/index.ts | 1 - .../aggs/buckets/lib/time_buckets/index.ts | 2 +- .../lib/time_buckets/time_buckets.test.ts | 8 +++---- .../buckets/lib/time_buckets/time_buckets.ts | 22 ++++++++----------- .../utils/calculate_auto_time_expression.ts | 6 ++--- .../public/legacy/build_pipeline.ts | 3 +-- 7 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts index e977ead8eb1722..f00b63836679d7 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -22,7 +22,7 @@ import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; import { IUiSettingsClient } from 'src/core/public'; -import { TimeBuckets, Bounds } from './lib/time_buckets'; +import { TimeBuckets } from './lib/time_buckets'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { createFilterDateHistogram } from './create_filter/date_histogram'; @@ -46,11 +46,7 @@ const updateTimeBuckets = ( ) => { const bounds = agg.params.timeRange ? timefilter.calculateBounds(agg.params.timeRange) : null; const buckets = customBuckets || agg.buckets; - if (agg.fieldIsTimeField()) { - buckets.setBounds(bounds as Bounds); - } else { - buckets.setBounds(); - } + buckets.setBounds(agg.fieldIsTimeField() ? bounds : null); buckets.setInterval(agg.params.interval); }; @@ -211,7 +207,7 @@ export const getDateHistogramBucketAgg = ({ }); if (all) { output.metricScale = interval.scale; - output.metricScaleText = interval.preScaled ? interval.preScaled.description : ''; + output.metricScaleText = interval.preScaled?.description || ''; } } }, diff --git a/src/plugins/data/public/search/aggs/buckets/index.ts b/src/plugins/data/public/search/aggs/buckets/index.ts index ebd406d0ff85f9..3a402b1498a775 100644 --- a/src/plugins/data/public/search/aggs/buckets/index.ts +++ b/src/plugins/data/public/search/aggs/buckets/index.ts @@ -25,6 +25,5 @@ export * from './ip_range'; export * from './lib/cidr_mask'; export * from './lib/date_range'; export * from './lib/ip_range'; -export { Bounds } from './lib/time_buckets'; export * from './migrate_include_exclude_format'; export * from './terms'; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts index 119139e2484b5e..32c09403b6ce53 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts @@ -17,4 +17,4 @@ * under the License. */ -export { TimeBuckets, Bounds } from './time_buckets'; +export { TimeBuckets } from './time_buckets'; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts index cd1a0f47573b70..cbb43350443302 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts @@ -19,7 +19,7 @@ import moment from 'moment'; import { coreMock } from '../../../../../../../../../src/core/public/mocks'; -import { TimeBuckets, Bounds } from './time_buckets'; +import { TimeBuckets } from './time_buckets'; describe('TimeBuckets', () => { const { uiSettings } = coreMock.createSetup(); @@ -42,7 +42,7 @@ describe('TimeBuckets', () => { test('setBounds/getBounds - bounds is correct', () => { const timeBuckets = new TimeBuckets({ uiSettings }); - const bounds: Bounds = { + const bounds = { min: moment('2020-03-25'), max: moment('2020-03-31'), }; @@ -54,7 +54,7 @@ describe('TimeBuckets', () => { test('setBounds/getBounds - bounds is undefined', () => { const timeBuckets = new TimeBuckets({ uiSettings }); - const bounds: Bounds = { + const bounds = { min: moment('2020-03-25'), max: moment('2020-03-31'), }; @@ -82,7 +82,7 @@ describe('TimeBuckets', () => { test('setInterval/getInterval - intreval is a string and bounds is defined', () => { const timeBuckets = new TimeBuckets({ uiSettings }); - const bounds: Bounds = { + const bounds = { min: moment('2020-03-25'), max: moment('2020-03-31'), }; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index e16de65e9472d3..b5ef8ea878612e 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -18,10 +18,11 @@ */ import _ from 'lodash'; -import moment, { Moment } from 'moment'; +import moment from 'moment'; import { IUiSettingsClient } from 'src/core/public'; import { parseInterval } from '../../../../../../common'; +import { TimeRangeBounds } from '../../../../../query'; import { calcAutoIntervalLessThan, calcAutoIntervalNear } from './calc_auto_interval'; import { convertDurationToNormalizedEsInterval, @@ -29,11 +30,6 @@ import { EsInterval, } from './calc_es_interval'; -export interface Bounds { - min: Moment | Date | number | null; - max: Moment | Date | number | null; -} - interface TimeBucketsInterval extends moment.Duration { // TODO double-check whether all of these are needed description: string; @@ -69,8 +65,8 @@ interface TimeBucketsConfig { * @param {[type]} display [description] */ export class TimeBuckets { - private _lb: Bounds['min'] = null; - private _ub: Bounds['max'] = null; + private _lb: TimeRangeBounds['min']; + private _ub: TimeRangeBounds['max']; private _originalInterval: string | null = null; private _i?: moment.Duration | 'auto'; @@ -179,10 +175,10 @@ export class TimeBuckets { * @return {moment.duration|undefined} */ private getDuration(): moment.Duration | undefined { - if (this._ub === null || this._lb === null || !this.hasBounds()) { + if (this._ub === undefined || this._lb === undefined || !this.hasBounds()) { return; } - const difference = (this._ub as number) - (this._lb as number); + const difference = this._ub.valueOf() - this._lb.valueOf(); return moment.duration(difference, 'ms'); } @@ -197,7 +193,7 @@ export class TimeBuckets { * * @returns {undefined} */ - setBounds(input?: Bounds | Bounds[]) { + setBounds(input?: null | TimeRangeBounds | TimeRangeBounds[]) { if (!input) return this.clearBounds(); let bounds; @@ -233,7 +229,7 @@ export class TimeBuckets { * @return {undefined} */ clearBounds() { - this._lb = this._ub = null; + this._lb = this._ub = undefined; } /** @@ -259,7 +255,7 @@ export class TimeBuckets { * object * */ - getBounds(): Bounds | undefined { + getBounds(): TimeRangeBounds | undefined { if (!this.hasBounds()) return; return { min: this._lb, diff --git a/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts b/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts index 459de66d057d43..649095f21e2eea 100644 --- a/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts +++ b/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ - +import moment from 'moment'; import { IUiSettingsClient } from 'src/core/public'; import { TimeBuckets } from '../buckets/lib/time_buckets'; import { toAbsoluteDates, TimeRange } from '../../../../common'; @@ -32,8 +32,8 @@ export function getCalculateAutoTimeExpression(uiSettings: IUiSettingsClient) { buckets.setInterval('auto'); buckets.setBounds({ - min: dates.from, - max: dates.to, + min: moment(dates.from), + max: moment(dates.to), }); return buckets.getInterval().expression; diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 748f39e9f63f2e..23919c62f5ecec 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -25,7 +25,6 @@ import { fieldFormats, search, TimefilterContract, - Bounds, } from '../../../../plugins/data/public'; import { Vis, VisParams } from '../types'; const { isDateHistogramBucketAggConfig } = search.aggs; @@ -96,7 +95,7 @@ const getSchemas = ( if (isDateHistogramBucketAggConfig(agg)) { agg.params.timeRange = timeRange; const bounds = agg.params.timeRange ? timefilter.calculateBounds(agg.params.timeRange) : null; - agg.buckets.setBounds(agg.fieldIsTimeField() ? (bounds as Bounds) : undefined); + agg.buckets.setBounds(agg.fieldIsTimeField() ? bounds : null); agg.buckets.setInterval(agg.params.interval); } From bb688e668c18e40dc309592548a8f88d9f2303b6 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 1 Apr 2020 15:26:33 +0300 Subject: [PATCH 3/8] Fixed comments (2) --- src/plugins/data/public/index.ts | 1 - .../aggs/buckets/lib/time_buckets/time_buckets.ts | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 636edde5431122..efafea44167d46 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -370,7 +370,6 @@ export { EsQuerySortValue, SortDirection, FetchOptions, - Bounds, // tabify TabbedAggColumn, TabbedAggRow, diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index b5ef8ea878612e..ce918201582d00 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -65,6 +65,7 @@ interface TimeBucketsConfig { * @param {[type]} display [description] */ export class TimeBuckets { + private _uiSettings: IUiSettingsClient; private _lb: TimeRangeBounds['min']; private _ub: TimeRangeBounds['max']; private _originalInterval: string | null = null; @@ -163,7 +164,7 @@ export class TimeBuckets { } constructor({ uiSettings }: TimeBucketsConfig) { - this.uiSettings = uiSettings; + this._uiSettings = uiSettings; return TimeBuckets.__cached__(this); } @@ -343,7 +344,7 @@ export class TimeBuckets { const readInterval = () => { const interval = this._i; if (moment.isDuration(interval)) return interval; - return calcAutoIntervalNear(this.uiSettings.get('histogram:barTarget'), Number(duration)); + return calcAutoIntervalNear(this._uiSettings.get('histogram:barTarget'), Number(duration)); }; const parsedInterval = readInterval(); @@ -354,7 +355,7 @@ export class TimeBuckets { return interval; } - const maxLength: number = this.uiSettings.get('histogram:maxBars'); + const maxLength: number = this._uiSettings.get('histogram:maxBars'); const approxLen = Number(duration) / Number(interval); let scaled; @@ -411,7 +412,7 @@ export class TimeBuckets { */ getScaledDateFormat() { const interval = this.getInterval(); - const rules = this.uiSettings.get('dateFormat:scaled'); + const rules = this._uiSettings.get('dateFormat:scaled'); for (let i = rules.length - 1; i >= 0; i--) { const rule = rules[i]; @@ -420,6 +421,6 @@ export class TimeBuckets { } } - return this.uiSettings.get('dateFormat'); + return this._uiSettings.get('dateFormat'); } } From 3a93cc24a9662c68af1a729cbdff9dfb314b68b9 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 1 Apr 2020 16:21:18 +0300 Subject: [PATCH 4/8] Fixes --- .../data/public/search/aggs/buckets/date_histogram.ts | 6 ++++-- .../aggs/buckets/lib/time_buckets/time_buckets.ts | 10 ++++------ .../visualizations/public/legacy/build_pipeline.ts | 6 ++++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts index f00b63836679d7..0c222bbf7cc120 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -44,9 +44,11 @@ const updateTimeBuckets = ( timefilter: TimefilterContract, customBuckets?: IBucketDateHistogramAggConfig['buckets'] ) => { - const bounds = agg.params.timeRange ? timefilter.calculateBounds(agg.params.timeRange) : null; + const bounds = agg.params.timeRange + ? timefilter.calculateBounds(agg.params.timeRange) + : undefined; const buckets = customBuckets || agg.buckets; - buckets.setBounds(agg.fieldIsTimeField() ? bounds : null); + buckets.setBounds(agg.fieldIsTimeField() ? bounds : undefined); buckets.setInterval(agg.params.interval); }; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index ce918201582d00..fb593c874a644b 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import moment from 'moment'; +import moment, { Moment } from 'moment'; import { IUiSettingsClient } from 'src/core/public'; import { parseInterval } from '../../../../../../common'; @@ -194,7 +194,7 @@ export class TimeBuckets { * * @returns {undefined} */ - setBounds(input?: null | TimeRangeBounds | TimeRangeBounds[]) { + setBounds(input?: TimeRangeBounds | TimeRangeBounds[]) { if (!input) return this.clearBounds(); let bounds; @@ -205,11 +205,9 @@ export class TimeBuckets { bounds = Array.isArray(input) ? input : []; } - const moments = _(bounds) - .map(_.ary(moment, 1)) - .sortBy(Number); + const moments: Moment[] = _.sortBy(bounds, Number); - const valid = moments.size() === 2 && moments.every(isValidMoment); + const valid = moments.length === 2 && moments.every(isValidMoment); if (!valid) { this.clearBounds(); throw new Error('invalid bounds set: ' + input); diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 23919c62f5ecec..7961e3cfc89851 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -94,8 +94,10 @@ const getSchemas = ( const createSchemaConfig = (accessor: number, agg: IAggConfig): SchemaConfig => { if (isDateHistogramBucketAggConfig(agg)) { agg.params.timeRange = timeRange; - const bounds = agg.params.timeRange ? timefilter.calculateBounds(agg.params.timeRange) : null; - agg.buckets.setBounds(agg.fieldIsTimeField() ? bounds : null); + const bounds = agg.params.timeRange + ? timefilter.calculateBounds(agg.params.timeRange) + : undefined; + agg.buckets.setBounds(agg.fieldIsTimeField() ? bounds : undefined); agg.buckets.setInterval(agg.params.interval); } From 8f1862b3272b46005b9203ef86ab33f7d78d4a67 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 1 Apr 2020 18:02:34 +0300 Subject: [PATCH 5/8] Removed __cached__ --- .../buckets/lib/time_buckets/time_buckets.ts | 90 ------------------- 1 file changed, 90 deletions(-) diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index fb593c874a644b..a2200ea35c9847 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -74,98 +74,8 @@ export class TimeBuckets { // because other parts of Kibana arbitrarily add properties [key: string]: any; - static __cached__(self: TimeBuckets) { - let cache: any = {}; - const sameMoment = same(moment.isMoment); - const sameDuration = same(moment.isDuration); - - const desc: Record = { - __cached__: { - value: self, - }, - }; - - const breakers: Record = { - setBounds: 'bounds', - clearBounds: 'bounds', - setInterval: 'interval', - }; - - const resources: Record = { - bounds: { - setup() { - return [self._lb, self._ub]; - }, - changes(prev: any) { - return !sameMoment(prev[0], self._lb) || !sameMoment(prev[1], self._ub); - }, - }, - interval: { - setup() { - return self._i; - }, - changes(prev: any) { - return !sameDuration(prev, self._i); - }, - }, - }; - - function cachedGetter(prop: string) { - return { - value: (...rest: any) => { - if (cache.hasOwnProperty(prop)) { - return cache[prop]; - } - - return (cache[prop] = self[prop](...rest)); - }, - }; - } - - function cacheBreaker(prop: string) { - const resource = resources[breakers[prop]]; - const setup = resource.setup; - const changes = resource.changes; - const fn = self[prop]; - - return { - value: (...args: any) => { - const prev = setup.call(self); - const ret = fn.apply(self, ...args); - - if (changes.call(self, prev)) { - cache = {}; - } - - return ret; - }, - }; - } - - function same(checkType: any) { - return function(a: any, b: any) { - if (a === b) return true; - if (checkType(a) === checkType(b)) return +a === +b; - return false; - }; - } - - _.forOwn(TimeBuckets.prototype, (fn, prop) => { - if (!prop || prop[0] === '_') return; - - if (breakers.hasOwnProperty(prop)) { - desc[prop] = cacheBreaker(prop); - } else { - desc[prop] = cachedGetter(prop); - } - }); - - return Object.create(self, desc); - } - constructor({ uiSettings }: TimeBucketsConfig) { this._uiSettings = uiSettings; - return TimeBuckets.__cached__(this); } /** From d676bdad0b174b00a3351810da9fd89694e9637a Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Thu, 2 Apr 2020 13:28:35 +0300 Subject: [PATCH 6/8] Fixes for comments --- .../lib/time_buckets/time_buckets.test.ts | 27 ++++++++++--------- .../buckets/lib/time_buckets/time_buckets.ts | 12 +++------ 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts index cbb43350443302..3ca8e9b321ead1 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts @@ -24,19 +24,20 @@ import { TimeBuckets } from './time_buckets'; describe('TimeBuckets', () => { const { uiSettings } = coreMock.createSetup(); uiSettings.get.mockImplementation((key: string) => { - if (key === 'histogram:maxBars') { - return 4; - } else if (key === 'histogram:barTarget') { - return 2; - } else if (key === 'dateFormat:scaled') { - return [ - ['', 'HH:mm:ss.SSS'], - ['PT1S', 'HH:mm:ss'], - ['PT1M', 'HH:mm'], - ['PT1H', 'YYYY-MM-DD HH:mm'], - ['P1DT', 'YYYY-MM-DD'], - ['P1YT', 'YYYY'], - ]; + switch (key) { + case 'histogram:maxBars': + return 4; + case 'histogram:barTarget': + return 2; + case 'dateFormat:scaled': + return [ + ['', 'HH:mm:ss.SSS'], + ['PT1S', 'HH:mm:ss'], + ['PT1M', 'HH:mm'], + ['PT1H', 'YYYY-MM-DD HH:mm'], + ['P1DT', 'YYYY-MM-DD'], + ['P1YT', 'YYYY'], + ]; } }); diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index a2200ea35c9847..8affd1987184cd 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -17,7 +17,7 @@ * under the License. */ -import _ from 'lodash'; +import { isString, isObject as isObjectLodash, isPlainObject, sortBy } from 'lodash'; import moment, { Moment } from 'moment'; import { IUiSettingsClient } from 'src/core/public'; @@ -42,11 +42,7 @@ interface TimeBucketsInterval extends moment.Duration { } function isObject(o: any): o is Record { - return _.isObject(o); -} - -function isString(s: any): s is string { - return _.isString(s); + return isObjectLodash(o); } function isValidMoment(m: any): boolean { @@ -108,14 +104,14 @@ export class TimeBuckets { if (!input) return this.clearBounds(); let bounds; - if (_.isPlainObject(input) && !Array.isArray(input)) { + if (isPlainObject(input) && !Array.isArray(input)) { // accept the response from timefilter.getActiveBounds() bounds = [input.min, input.max]; } else { bounds = Array.isArray(input) ? input : []; } - const moments: Moment[] = _.sortBy(bounds, Number); + const moments: Moment[] = sortBy(bounds, Number); const valid = moments.length === 2 && moments.every(isValidMoment); if (!valid) { From a4ea0d6a8cd767aace62eb03e62011db4920c462 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Sat, 4 Apr 2020 16:02:51 +0300 Subject: [PATCH 7/8] some refactoring --- .../data/public/search/aggs/buckets/date_histogram.ts | 9 +++++---- .../visualizations/public/legacy/build_pipeline.ts | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts index 0c222bbf7cc120..deb384f10dd99a 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -44,11 +44,12 @@ const updateTimeBuckets = ( timefilter: TimefilterContract, customBuckets?: IBucketDateHistogramAggConfig['buckets'] ) => { - const bounds = agg.params.timeRange - ? timefilter.calculateBounds(agg.params.timeRange) - : undefined; + const bounds = + agg.params.timeRange && agg.fieldIsTimeField() + ? timefilter.calculateBounds(agg.params.timeRange) + : undefined; const buckets = customBuckets || agg.buckets; - buckets.setBounds(agg.fieldIsTimeField() ? bounds : undefined); + buckets.setBounds(bounds); buckets.setInterval(agg.params.interval); }; diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index 7961e3cfc89851..f3192ba3da81f8 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -94,10 +94,11 @@ const getSchemas = ( const createSchemaConfig = (accessor: number, agg: IAggConfig): SchemaConfig => { if (isDateHistogramBucketAggConfig(agg)) { agg.params.timeRange = timeRange; - const bounds = agg.params.timeRange - ? timefilter.calculateBounds(agg.params.timeRange) - : undefined; - agg.buckets.setBounds(agg.fieldIsTimeField() ? bounds : undefined); + const bounds = + agg.params.timeRange && agg.fieldIsTimeField() + ? timefilter.calculateBounds(agg.params.timeRange) + : undefined; + agg.buckets.setBounds(bounds); agg.buckets.setInterval(agg.params.interval); } From 7c6cf77146df10d6d0561b48cc65ba7f84581c50 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Tue, 7 Apr 2020 18:41:24 +0300 Subject: [PATCH 8/8] Fixed comment about config --- .../search/aggs/buckets/date_histogram.ts | 7 ++- .../lib/time_buckets/time_buckets.test.ts | 46 ++++++++----------- .../buckets/lib/time_buckets/time_buckets.ts | 22 +++++---- .../utils/calculate_auto_time_expression.ts | 7 ++- 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts index 665443e7c435ed..57f3aa85ad9443 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -108,7 +108,12 @@ export const getDateHistogramBucketAgg = ({ if (buckets) return buckets; const { timefilter } = query.timefilter; - buckets = new TimeBuckets({ uiSettings }); + buckets = new TimeBuckets({ + 'histogram:maxBars': uiSettings.get('histogram:maxBars'), + 'histogram:barTarget': uiSettings.get('histogram:barTarget'), + dateFormat: uiSettings.get('dateFormat'), + 'dateFormat:scaled': uiSettings.get('dateFormat:scaled'), + }); updateTimeBuckets(this, timefilter, buckets); return buckets; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts index 3ca8e9b321ead1..af3c15167295cb 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts @@ -17,32 +17,26 @@ * under the License. */ import moment from 'moment'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; -import { TimeBuckets } from './time_buckets'; +import { TimeBuckets, TimeBucketsConfig } from './time_buckets'; describe('TimeBuckets', () => { - const { uiSettings } = coreMock.createSetup(); - uiSettings.get.mockImplementation((key: string) => { - switch (key) { - case 'histogram:maxBars': - return 4; - case 'histogram:barTarget': - return 2; - case 'dateFormat:scaled': - return [ - ['', 'HH:mm:ss.SSS'], - ['PT1S', 'HH:mm:ss'], - ['PT1M', 'HH:mm'], - ['PT1H', 'YYYY-MM-DD HH:mm'], - ['P1DT', 'YYYY-MM-DD'], - ['P1YT', 'YYYY'], - ]; - } - }); + const timeBucketConfig: TimeBucketsConfig = { + 'histogram:maxBars': 4, + 'histogram:barTarget': 3, + dateFormat: 'YYYY-MM-DD', + 'dateFormat:scaled': [ + ['', 'HH:mm:ss.SSS'], + ['PT1S', 'HH:mm:ss'], + ['PT1M', 'HH:mm'], + ['PT1H', 'YYYY-MM-DD HH:mm'], + ['P1DT', 'YYYY-MM-DD'], + ['P1YT', 'YYYY'], + ], + }; test('setBounds/getBounds - bounds is correct', () => { - const timeBuckets = new TimeBuckets({ uiSettings }); + const timeBuckets = new TimeBuckets(timeBucketConfig); const bounds = { min: moment('2020-03-25'), max: moment('2020-03-31'), @@ -54,7 +48,7 @@ describe('TimeBuckets', () => { }); test('setBounds/getBounds - bounds is undefined', () => { - const timeBuckets = new TimeBuckets({ uiSettings }); + const timeBuckets = new TimeBuckets(timeBucketConfig); const bounds = { min: moment('2020-03-25'), max: moment('2020-03-31'), @@ -71,7 +65,7 @@ describe('TimeBuckets', () => { }); test('setInterval/getInterval - intreval is a string', () => { - const timeBuckets = new TimeBuckets({ uiSettings }); + const timeBuckets = new TimeBuckets(timeBucketConfig); timeBuckets.setInterval('20m'); const interval = timeBuckets.getInterval(); @@ -82,7 +76,7 @@ describe('TimeBuckets', () => { }); test('setInterval/getInterval - intreval is a string and bounds is defined', () => { - const timeBuckets = new TimeBuckets({ uiSettings }); + const timeBuckets = new TimeBuckets(timeBucketConfig); const bounds = { min: moment('2020-03-25'), max: moment('2020-03-31'), @@ -107,7 +101,7 @@ describe('TimeBuckets', () => { }); test('setInterval/getInterval - intreval is a "auto"', () => { - const timeBuckets = new TimeBuckets({ uiSettings }); + const timeBuckets = new TimeBuckets(timeBucketConfig); timeBuckets.setInterval('auto'); const interval = timeBuckets.getInterval(); @@ -118,7 +112,7 @@ describe('TimeBuckets', () => { }); test('getScaledDateFormat', () => { - const timeBuckets = new TimeBuckets({ uiSettings }); + const timeBuckets = new TimeBuckets(timeBucketConfig); timeBuckets.setInterval('20m'); timeBuckets.getScaledDateFormat(); const format = timeBuckets.getScaledDateFormat(); diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts index 8affd1987184cd..b8d6586652d6b1 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -20,7 +20,6 @@ import { isString, isObject as isObjectLodash, isPlainObject, sortBy } from 'lodash'; import moment, { Moment } from 'moment'; -import { IUiSettingsClient } from 'src/core/public'; import { parseInterval } from '../../../../../../common'; import { TimeRangeBounds } from '../../../../../query'; import { calcAutoIntervalLessThan, calcAutoIntervalNear } from './calc_auto_interval'; @@ -49,8 +48,11 @@ function isValidMoment(m: any): boolean { return m && 'isValid' in m && m.isValid(); } -interface TimeBucketsConfig { - uiSettings: IUiSettingsClient; +export interface TimeBucketsConfig { + 'histogram:maxBars': number; + 'histogram:barTarget': number; + dateFormat: string; + 'dateFormat:scaled': string[][]; } /** @@ -61,7 +63,7 @@ interface TimeBucketsConfig { * @param {[type]} display [description] */ export class TimeBuckets { - private _uiSettings: IUiSettingsClient; + private _timeBucketConfig: TimeBucketsConfig; private _lb: TimeRangeBounds['min']; private _ub: TimeRangeBounds['max']; private _originalInterval: string | null = null; @@ -70,8 +72,8 @@ export class TimeBuckets { // because other parts of Kibana arbitrarily add properties [key: string]: any; - constructor({ uiSettings }: TimeBucketsConfig) { - this._uiSettings = uiSettings; + constructor(timeBucketConfig: TimeBucketsConfig) { + this._timeBucketConfig = timeBucketConfig; } /** @@ -248,7 +250,7 @@ export class TimeBuckets { const readInterval = () => { const interval = this._i; if (moment.isDuration(interval)) return interval; - return calcAutoIntervalNear(this._uiSettings.get('histogram:barTarget'), Number(duration)); + return calcAutoIntervalNear(this._timeBucketConfig['histogram:barTarget'], Number(duration)); }; const parsedInterval = readInterval(); @@ -259,7 +261,7 @@ export class TimeBuckets { return interval; } - const maxLength: number = this._uiSettings.get('histogram:maxBars'); + const maxLength: number = this._timeBucketConfig['histogram:maxBars']; const approxLen = Number(duration) / Number(interval); let scaled; @@ -316,7 +318,7 @@ export class TimeBuckets { */ getScaledDateFormat() { const interval = this.getInterval(); - const rules = this._uiSettings.get('dateFormat:scaled'); + const rules = this._timeBucketConfig['dateFormat:scaled']; for (let i = rules.length - 1; i >= 0; i--) { const rule = rules[i]; @@ -325,6 +327,6 @@ export class TimeBuckets { } } - return this._uiSettings.get('dateFormat'); + return this._timeBucketConfig.dateFormat; } } diff --git a/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts b/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts index 649095f21e2eea..9d976784329ccf 100644 --- a/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts +++ b/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts @@ -28,7 +28,12 @@ export function getCalculateAutoTimeExpression(uiSettings: IUiSettingsClient) { return; } - const buckets = new TimeBuckets({ uiSettings }); + const buckets = new TimeBuckets({ + 'histogram:maxBars': uiSettings.get('histogram:maxBars'), + 'histogram:barTarget': uiSettings.get('histogram:barTarget'), + dateFormat: uiSettings.get('dateFormat'), + 'dateFormat:scaled': uiSettings.get('dateFormat:scaled'), + }); buckets.setInterval('auto'); buckets.setBounds({