From cbb0fd1cc4e42c75578f9d43803ba5222f0e1a3e Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Thu, 13 Jan 2022 00:06:20 -0800 Subject: [PATCH 1/6] refactor: adding filters and make largest auto value as default --- projects/common/src/time/interval-duration.service.ts | 3 ++- .../trace/trace-series-values-data-source.model.ts | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/projects/common/src/time/interval-duration.service.ts b/projects/common/src/time/interval-duration.service.ts index ce516e9a6..0d361e148 100644 --- a/projects/common/src/time/interval-duration.service.ts +++ b/projects/common/src/time/interval-duration.service.ts @@ -71,7 +71,8 @@ export class IntervalDurationService { throw Error('No intervals supported at requested time range'); } - return durations[0]; + // Get largest supported duration + return durations[durations.length - 1]; } private getAvailableIntervals(timeRange: TimeRange, minDataPoints: number, maxDataPoints: number): TimeDuration[] { diff --git a/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts b/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts index 0ef72dd80..1c4b2626a 100644 --- a/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts +++ b/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts @@ -1,3 +1,4 @@ +import { GraphQlFilter } from './../../../../graphql/model/schema/filter/graphql-filter'; import { TimeDuration } from '@hypertrace/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -15,17 +16,18 @@ export abstract class TraceSeriesValuesDataSourceModel extends GraphQlDat protected abstract specification: ExploreSpecification; protected fetchSpecificationData(interval: TimeDuration): Observable { - return this.query(() => this.buildRequest(interval)).pipe( - map(response => response.results) - ); + return this.query(inheritedFilters => + this.buildRequest(interval, inheritedFilters) + ).pipe(map(response => response.results)); } - private buildRequest(interval: TimeDuration): GraphQlExploreRequest { + private buildRequest(interval: TimeDuration, inheritedFilters: GraphQlFilter[] = []): GraphQlExploreRequest { return { requestType: EXPLORE_GQL_REQUEST, timeRange: this.getTimeRangeOrThrow(), context: ObservabilityTraceType.Api, interval: interval, + filters: [...inheritedFilters], limit: 10000, selections: [this.specification] }; From 866e57fff5e05935e5d1a0c0b14d7f16b57a4952 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Thu, 13 Jan 2022 00:12:23 -0800 Subject: [PATCH 2/6] refactor: fixing lint error --- .../data/graphql/trace/trace-series-values-data-source.model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts b/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts index 1c4b2626a..03b26a782 100644 --- a/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts +++ b/projects/observability/src/shared/dashboard/data/graphql/trace/trace-series-values-data-source.model.ts @@ -1,4 +1,3 @@ -import { GraphQlFilter } from './../../../../graphql/model/schema/filter/graphql-filter'; import { TimeDuration } from '@hypertrace/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -11,6 +10,7 @@ import { GraphQlExploreResult } from '../../../../graphql/request/handlers/explore/explore-query'; import { GraphQlDataSourceModel } from '../graphql-data-source.model'; +import { GraphQlFilter } from './../../../../graphql/model/schema/filter/graphql-filter'; export abstract class TraceSeriesValuesDataSourceModel extends GraphQlDataSourceModel { protected abstract specification: ExploreSpecification; From ff2ed17d6acea411f7ee4b40d75a931910b0a4e3 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Thu, 13 Jan 2022 00:20:51 -0800 Subject: [PATCH 3/6] refactor: fixing test --- projects/common/src/time/interval-duration.service.test.ts | 6 +++--- .../explore-query-interval-editor.component.test.ts | 4 ++-- .../trace-metric-timeseries-data-source.model.test.ts | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/projects/common/src/time/interval-duration.service.test.ts b/projects/common/src/time/interval-duration.service.test.ts index 221c93290..d2fe50f8c 100644 --- a/projects/common/src/time/interval-duration.service.test.ts +++ b/projects/common/src/time/interval-duration.service.test.ts @@ -170,7 +170,7 @@ describe('Interval duration service', () => { spectator.service.getAutoDuration( new FixedTimeRange(new Date('2019-09-19T16:40:45.141Z'), new Date('2019-09-21T16:40:45.141Z')) ) - ).toEqual(new TimeDuration(15, TimeUnit.Minute)); // Smallest in range + ).toEqual(new TimeDuration(12, TimeUnit.Hour)); // Smallest in range }); test('provides the value of the auto duration for an arbitrary time range with provided maximum data points', () => { @@ -180,7 +180,7 @@ describe('Interval duration service', () => { new FixedTimeRange(new Date('2019-09-19T16:40:45.141Z'), new Date('2019-09-21T16:40:45.141Z')), 100 ) - ).toEqual(new TimeDuration(30, TimeUnit.Minute)); // Smallest in range + ).toEqual(new TimeDuration(12, TimeUnit.Hour)); // Smallest in range }); test('calculates the exact match (or undefined if none) of an interval from a list', () => { @@ -194,6 +194,6 @@ describe('Interval duration service', () => { new TimeDuration(6, TimeUnit.Hour), new TimeDuration(12, TimeUnit.Hour) ]) - ).toEqual(new TimeDuration(15, TimeUnit.Minute)); + ).toEqual(new TimeDuration(12, TimeUnit.Hour)); }); }); diff --git a/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts b/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts index a4bb589b1..8cb7ab97b 100644 --- a/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts +++ b/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts @@ -71,7 +71,7 @@ describe('Explore Query Interval Editor component', () => { expect(onChange).toHaveBeenCalledTimes(1); expect(onChange).toHaveBeenCalledWith('AUTO'); - expect(spectator.element).toHaveText('Auto (15s)'); + expect(spectator.element).toHaveText('Auto (15m)'); flush(); })); @@ -86,7 +86,7 @@ describe('Explore Query Interval Editor component', () => { spectator.click(spectator.query(byText('None'))!); const options = spectator.queryAll('.select-option', { root: true }); expect(options.length).toBe(7); - expect(options[1]).toHaveText('Auto (15s)'); + expect(options[1]).toHaveText('Auto (15m)'); spectator.inject(TimeRangeService).setRelativeRange(3, TimeUnit.Hour); spectator.detectChanges(); const newOptions = spectator.queryAll('.select-option', { root: true }); diff --git a/projects/observability/src/shared/dashboard/data/graphql/trace/timeseries/trace-metric-timeseries-data-source.model.test.ts b/projects/observability/src/shared/dashboard/data/graphql/trace/timeseries/trace-metric-timeseries-data-source.model.test.ts index 9a4165a11..ad6a831fa 100644 --- a/projects/observability/src/shared/dashboard/data/graphql/trace/timeseries/trace-metric-timeseries-data-source.model.test.ts +++ b/projects/observability/src/shared/dashboard/data/graphql/trace/timeseries/trace-metric-timeseries-data-source.model.test.ts @@ -32,6 +32,7 @@ describe('Trace metric timeseries data source model', () => { requestType: EXPLORE_GQL_REQUEST, timeRange: new GraphQlTimeRange(testTimeRange.startTime, testTimeRange.endTime), context: ObservabilityTraceType.Api, + filters: [], interval: testInterval, limit: 10000, selections: [model.specification] From 02c2f3daff3dc6e844895eb5fc2f79f76b04b1f6 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Thu, 13 Jan 2022 12:07:23 -0800 Subject: [PATCH 4/6] refactor: fixing tests --- .../src/pages/explorer/explorer.component.test.ts | 8 ++++---- .../explore-query-interval-editor.component.test.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/observability/src/pages/explorer/explorer.component.test.ts b/projects/observability/src/pages/explorer/explorer.component.test.ts index a77f92535..f2215f19c 100644 --- a/projects/observability/src/pages/explorer/explorer.component.test.ts +++ b/projects/observability/src/pages/explorer/explorer.component.test.ts @@ -157,7 +157,7 @@ describe('Explorer component', () => { requestType: EXPLORE_GQL_REQUEST, context: ObservabilityTraceType.Api, limit: 1000, - interval: new TimeDuration(15, TimeUnit.Second) + interval: new TimeDuration(5, TimeUnit.Minute) }), expect.objectContaining({}) ); @@ -205,7 +205,7 @@ describe('Explorer component', () => { context: ObservabilityTraceType.Api, filters: [new GraphQlFieldFilter('first', GraphQlOperatorType.Equals, 'foo')], limit: 1000, - interval: new TimeDuration(15, TimeUnit.Second) + interval: new TimeDuration(5, TimeUnit.Minute) }), expect.objectContaining({}) ); @@ -239,7 +239,7 @@ describe('Explorer component', () => { requestType: EXPLORE_GQL_REQUEST, context: SPAN_SCOPE, limit: 1000, - interval: new TimeDuration(15, TimeUnit.Second) + interval: new TimeDuration(5, TimeUnit.Minute) }), expect.objectContaining({}) ); @@ -289,7 +289,7 @@ describe('Explorer component', () => { requestType: EXPLORE_GQL_REQUEST, context: SPAN_SCOPE, limit: 1000, - interval: new TimeDuration(15, TimeUnit.Second), + interval: new TimeDuration(5, TimeUnit.Minute), filters: [new GraphQlFieldFilter('first', GraphQlOperatorType.Equals, 'foo')] }), expect.objectContaining({}) diff --git a/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts b/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts index 8cb7ab97b..c21049d95 100644 --- a/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts +++ b/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts @@ -91,7 +91,7 @@ describe('Explore Query Interval Editor component', () => { spectator.detectChanges(); const newOptions = spectator.queryAll('.select-option', { root: true }); expect(newOptions.length).toBe(8); - expect(newOptions[1]).toHaveText('Auto (30s)'); + expect(newOptions[1]).toHaveText('Auto (1h)'); flush(); })); From 7091100396d8553b2cd46de790543cf5ecf8b707 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Thu, 13 Jan 2022 14:09:45 -0800 Subject: [PATCH 5/6] refactor: addressing review comments --- .../src/time/interval-duration.service.test.ts | 6 +++--- .../common/src/time/interval-duration.service.ts | 13 ++++++++----- .../src/pages/explorer/explorer.component.test.ts | 8 ++++---- .../explore-query-interval-editor.component.test.ts | 6 +++--- .../cartesian-widget-renderer.component.ts | 6 +++++- .../cartesian-widget/cartesian-widget.model.ts | 8 ++++++++ 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/projects/common/src/time/interval-duration.service.test.ts b/projects/common/src/time/interval-duration.service.test.ts index d2fe50f8c..221c93290 100644 --- a/projects/common/src/time/interval-duration.service.test.ts +++ b/projects/common/src/time/interval-duration.service.test.ts @@ -170,7 +170,7 @@ describe('Interval duration service', () => { spectator.service.getAutoDuration( new FixedTimeRange(new Date('2019-09-19T16:40:45.141Z'), new Date('2019-09-21T16:40:45.141Z')) ) - ).toEqual(new TimeDuration(12, TimeUnit.Hour)); // Smallest in range + ).toEqual(new TimeDuration(15, TimeUnit.Minute)); // Smallest in range }); test('provides the value of the auto duration for an arbitrary time range with provided maximum data points', () => { @@ -180,7 +180,7 @@ describe('Interval duration service', () => { new FixedTimeRange(new Date('2019-09-19T16:40:45.141Z'), new Date('2019-09-21T16:40:45.141Z')), 100 ) - ).toEqual(new TimeDuration(12, TimeUnit.Hour)); // Smallest in range + ).toEqual(new TimeDuration(30, TimeUnit.Minute)); // Smallest in range }); test('calculates the exact match (or undefined if none) of an interval from a list', () => { @@ -194,6 +194,6 @@ describe('Interval duration service', () => { new TimeDuration(6, TimeUnit.Hour), new TimeDuration(12, TimeUnit.Hour) ]) - ).toEqual(new TimeDuration(12, TimeUnit.Hour)); + ).toEqual(new TimeDuration(15, TimeUnit.Minute)); }); }); diff --git a/projects/common/src/time/interval-duration.service.ts b/projects/common/src/time/interval-duration.service.ts index 0d361e148..03197fabf 100644 --- a/projects/common/src/time/interval-duration.service.ts +++ b/projects/common/src/time/interval-duration.service.ts @@ -58,21 +58,24 @@ export class IntervalDurationService { public getAutoDuration( timeRange: TimeRange = this.timeRangeService.getCurrentTimeRange(), - maximumDataPoints?: number + maximumDataPoints?: number, + useHighestGranularityAutoInterval?: boolean ): TimeDuration { // Currently sorted smallest to largest const availableDurations = this.getAvailableIntervalsForTimeRange(timeRange, maximumDataPoints); - return this.getAutoDurationFromTimeDurations(availableDurations); + return this.getAutoDurationFromTimeDurations(availableDurations, useHighestGranularityAutoInterval); } - public getAutoDurationFromTimeDurations(durations: TimeDuration[]): TimeDuration { + public getAutoDurationFromTimeDurations( + durations: TimeDuration[], + useHighestGranularityAutoInterval: boolean = false + ): TimeDuration { if (durations.length === 0) { throw Error('No intervals supported at requested time range'); } - // Get largest supported duration - return durations[durations.length - 1]; + return !useHighestGranularityAutoInterval ? durations[0] : durations[durations.length - 1]; } private getAvailableIntervals(timeRange: TimeRange, minDataPoints: number, maxDataPoints: number): TimeDuration[] { diff --git a/projects/observability/src/pages/explorer/explorer.component.test.ts b/projects/observability/src/pages/explorer/explorer.component.test.ts index f77afe8ff..03c94343a 100644 --- a/projects/observability/src/pages/explorer/explorer.component.test.ts +++ b/projects/observability/src/pages/explorer/explorer.component.test.ts @@ -157,7 +157,7 @@ describe('Explorer component', () => { requestType: EXPLORE_GQL_REQUEST, context: ObservabilityTraceType.Api, limit: 1000, - interval: new TimeDuration(5, TimeUnit.Minute) + interval: new TimeDuration(15, TimeUnit.Second) }), expect.objectContaining({}) ); @@ -205,7 +205,7 @@ describe('Explorer component', () => { context: ObservabilityTraceType.Api, filters: [new GraphQlFieldFilter({ key: 'first' }, GraphQlOperatorType.Equals, 'foo')], limit: 1000, - interval: new TimeDuration(5, TimeUnit.Minute) + interval: new TimeDuration(15, TimeUnit.Second) }), expect.objectContaining({}) ); @@ -239,7 +239,7 @@ describe('Explorer component', () => { requestType: EXPLORE_GQL_REQUEST, context: SPAN_SCOPE, limit: 1000, - interval: new TimeDuration(5, TimeUnit.Minute) + interval: new TimeDuration(15, TimeUnit.Second) }), expect.objectContaining({}) ); @@ -289,7 +289,7 @@ describe('Explorer component', () => { requestType: EXPLORE_GQL_REQUEST, context: SPAN_SCOPE, limit: 1000, - interval: new TimeDuration(5, TimeUnit.Minute), + interval: new TimeDuration(15, TimeUnit.Second), filters: [new GraphQlFieldFilter({ key: 'first' }, GraphQlOperatorType.Equals, 'foo')] }), expect.objectContaining({}) diff --git a/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts b/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts index c21049d95..a4bb589b1 100644 --- a/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts +++ b/projects/observability/src/shared/components/explore-query-editor/interval/explore-query-interval-editor.component.test.ts @@ -71,7 +71,7 @@ describe('Explore Query Interval Editor component', () => { expect(onChange).toHaveBeenCalledTimes(1); expect(onChange).toHaveBeenCalledWith('AUTO'); - expect(spectator.element).toHaveText('Auto (15m)'); + expect(spectator.element).toHaveText('Auto (15s)'); flush(); })); @@ -86,12 +86,12 @@ describe('Explore Query Interval Editor component', () => { spectator.click(spectator.query(byText('None'))!); const options = spectator.queryAll('.select-option', { root: true }); expect(options.length).toBe(7); - expect(options[1]).toHaveText('Auto (15m)'); + expect(options[1]).toHaveText('Auto (15s)'); spectator.inject(TimeRangeService).setRelativeRange(3, TimeUnit.Hour); spectator.detectChanges(); const newOptions = spectator.queryAll('.select-option', { root: true }); expect(newOptions.length).toBe(8); - expect(newOptions[1]).toHaveText('Auto (1h)'); + expect(newOptions[1]).toHaveText('Auto (30s)'); flush(); })); diff --git a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts index 0e3298da3..c43356efc 100644 --- a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts +++ b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts @@ -94,7 +94,11 @@ export class CartesianWidgetRendererComponent extends Interacti private resolveInterval(value?: IntervalValue): TimeDuration { return value instanceof TimeDuration ? value - : this.intervalDurationService.getAutoDuration(this.timeRange, this.model.maxSeriesDataPoints); + : this.intervalDurationService.getAutoDuration( + this.timeRange, + this.model.maxSeriesDataPoints, + this.model.useHighestGranularityAutoInterval + ); } private buildIntervalOptions(): IntervalValue[] { diff --git a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts index f8043407a..dbf6cf302 100644 --- a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts +++ b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts @@ -146,6 +146,14 @@ export class CartesianWidgetModel { }) public maxSeriesDataPoints?: number; + @ModelProperty({ + key: 'use-highest-granularity-auto-interval', + required: false, + displayName: 'Use Highest Granularity Auto Interval', + type: BOOLEAN_PROPERTY.type + }) + public useHighestGranularityAutoInterval?: boolean; + @ModelInject(MODEL_API) private readonly api!: ModelApi; From 9c9f0d86d9a834f6ceeced7d12b2ff605cd00858 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Thu, 13 Jan 2022 14:47:05 -0800 Subject: [PATCH 6/6] revert: auto interval chagnes --- .../common/src/time/interval-duration.service.ts | 12 ++++-------- .../cartesian-widget-renderer.component.ts | 6 +----- .../cartesian-widget/cartesian-widget.model.ts | 8 -------- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/projects/common/src/time/interval-duration.service.ts b/projects/common/src/time/interval-duration.service.ts index 03197fabf..ce516e9a6 100644 --- a/projects/common/src/time/interval-duration.service.ts +++ b/projects/common/src/time/interval-duration.service.ts @@ -58,24 +58,20 @@ export class IntervalDurationService { public getAutoDuration( timeRange: TimeRange = this.timeRangeService.getCurrentTimeRange(), - maximumDataPoints?: number, - useHighestGranularityAutoInterval?: boolean + maximumDataPoints?: number ): TimeDuration { // Currently sorted smallest to largest const availableDurations = this.getAvailableIntervalsForTimeRange(timeRange, maximumDataPoints); - return this.getAutoDurationFromTimeDurations(availableDurations, useHighestGranularityAutoInterval); + return this.getAutoDurationFromTimeDurations(availableDurations); } - public getAutoDurationFromTimeDurations( - durations: TimeDuration[], - useHighestGranularityAutoInterval: boolean = false - ): TimeDuration { + public getAutoDurationFromTimeDurations(durations: TimeDuration[]): TimeDuration { if (durations.length === 0) { throw Error('No intervals supported at requested time range'); } - return !useHighestGranularityAutoInterval ? durations[0] : durations[durations.length - 1]; + return durations[0]; } private getAvailableIntervals(timeRange: TimeRange, minDataPoints: number, maxDataPoints: number): TimeDuration[] { diff --git a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts index c43356efc..0e3298da3 100644 --- a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts +++ b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget-renderer.component.ts @@ -94,11 +94,7 @@ export class CartesianWidgetRendererComponent extends Interacti private resolveInterval(value?: IntervalValue): TimeDuration { return value instanceof TimeDuration ? value - : this.intervalDurationService.getAutoDuration( - this.timeRange, - this.model.maxSeriesDataPoints, - this.model.useHighestGranularityAutoInterval - ); + : this.intervalDurationService.getAutoDuration(this.timeRange, this.model.maxSeriesDataPoints); } private buildIntervalOptions(): IntervalValue[] { diff --git a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts index dbf6cf302..f8043407a 100644 --- a/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts +++ b/projects/observability/src/shared/dashboard/widgets/charts/cartesian-widget/cartesian-widget.model.ts @@ -146,14 +146,6 @@ export class CartesianWidgetModel { }) public maxSeriesDataPoints?: number; - @ModelProperty({ - key: 'use-highest-granularity-auto-interval', - required: false, - displayName: 'Use Highest Granularity Auto Interval', - type: BOOLEAN_PROPERTY.type - }) - public useHighestGranularityAutoInterval?: boolean; - @ModelInject(MODEL_API) private readonly api!: ModelApi;