Skip to content

Commit 0ca19ef

Browse files
Issue 33523 use day granularity by default (#34892)
This PR fixes: #33523
1 parent 4c8dbfe commit 0ca19ef

14 files changed

Lines changed: 36 additions & 281 deletions

File tree

core-web/libs/portlets/dot-analytics/data-access/src/lib/constants/dot-analytics.constants.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
export const TIME_RANGE_OPTIONS = {
2-
today: 'today',
3-
yesterday: 'yesterday',
42
last7days: 'last7days',
53
last30days: 'last30days',
64
custom: 'custom'
75
} as const;
86

97
/** Reverse mapping for Internal → URL-friendly */
108
export const TIME_RANGE_CUBEJS_MAPPING = {
11-
today: 'today',
12-
yesterday: 'yesterday',
139
last7days: 'from 7 days ago to now',
1410
last30days: 'from 30 days ago to now'
1511
} as const;

core-web/libs/portlets/dot-analytics/data-access/src/lib/services/dot-analytics.service.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createHttpFactory, HttpMethod, SpectatorHttp } from '@ngneat/spectator/
22

33
import { DotAnalyticsService } from './dot-analytics.service';
44

5-
import { CubeJSQuery } from '../types';
5+
import { CubeJSQuery, Granularity } from '../types';
66

77
const ANALYTICS_API_ENDPOINT = '/api/v1/analytics/content/_query/cube';
88

@@ -105,7 +105,7 @@ describe('DotAnalyticsService', () => {
105105
{
106106
dimension: 'request.createdAt',
107107
dateRange: 'from 7 days ago to now',
108-
granularity: 'day'
108+
granularity: Granularity.DAY
109109
}
110110
],
111111
order: { 'request.totalRequest': 'desc' },

core-web/libs/portlets/dot-analytics/data-access/src/lib/store/features/with-conversions.feature.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
ContentAttributionEntity,
2020
ConversionsOverviewEntity,
2121
ConvertingVisitorsEntity,
22+
DEFAULT_GRANULARITY,
2223
RequestState,
2324
TimeRangeInput,
2425
TotalConversionsEntity
@@ -30,7 +31,6 @@ import {
3031
createEmptyAnalyticsEntity,
3132
createEmptyTrafficVsConversionsEntity,
3233
createInitialRequestState,
33-
determineGranularityForTimeRange,
3434
fillMissingDates,
3535
toTimeRangeCubeJS,
3636
TrafficVsConversionsEntity
@@ -117,7 +117,7 @@ export function withConversions() {
117117
.conversions()
118118
.measures(['totalEvents'])
119119
.siteId(currentSiteId)
120-
.timeRange('day', toTimeRangeCubeJS(timeRange), 'day')
120+
.timeRange('day', toTimeRangeCubeJS(timeRange), DEFAULT_GRANULARITY)
121121
.build();
122122

123123
return analyticsService.cubeQuery<TotalConversionsEntity>(query).pipe(
@@ -177,17 +177,15 @@ export function withConversions() {
177177
.conversions()
178178
.measures(['totalEvents'])
179179
.siteId(currentSiteId)
180-
.timeRange('day', toTimeRangeCubeJS(timeRange), 'day')
180+
.timeRange('day', toTimeRangeCubeJS(timeRange), DEFAULT_GRANULARITY)
181181
.build();
182182

183-
const granularity = determineGranularityForTimeRange(timeRange);
184-
185183
return analyticsService.cubeQuery<ConversionTrendEntity>(query).pipe(
186184
map((entities) =>
187185
fillMissingDates<ConversionTrendEntity>(
188186
entities,
189187
timeRange,
190-
granularity,
188+
DEFAULT_GRANULARITY,
191189
createEmptyAnalyticsEntity
192190
)
193191
),
@@ -300,19 +298,17 @@ export function withConversions() {
300298
.fromCube('EventSummary')
301299
.measures(['uniqueVisitors', 'uniqueConvertingVisitors'])
302300
.siteId(currentSiteId)
303-
.timeRange('day', toTimeRangeCubeJS(timeRange), 'day')
301+
.timeRange('day', toTimeRangeCubeJS(timeRange), DEFAULT_GRANULARITY)
304302
.build();
305303

306-
const granularity = determineGranularityForTimeRange(timeRange);
307-
308304
return analyticsService
309305
.cubeQuery<TrafficVsConversionsEntity>(query)
310306
.pipe(
311307
map((entities) =>
312308
fillMissingDates(
313309
entities,
314310
timeRange,
315-
granularity,
311+
DEFAULT_GRANULARITY,
316312
createEmptyTrafficVsConversionsEntity
317313
)
318314
),

core-web/libs/portlets/dot-analytics/data-access/src/lib/store/features/with-engagement.feature.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { GlobalStore } from '@dotcms/store';
1515
import { FiltersState } from './with-filters.feature';
1616

1717
import { DotAnalyticsService } from '../../services/dot-analytics.service';
18+
import { DEFAULT_GRANULARITY } from '../../types';
1819
import { createCubeQuery } from '../../utils/cube/cube-query-builder.util';
1920
import {
2021
createInitialRequestState,
@@ -28,6 +29,7 @@ import {
2829
toEngagementSparklineData
2930
} from '../../utils/data/engagement-data.utils';
3031

32+
// eslint-disable-next-line no-duplicate-imports
3133
import type {
3234
ChartData,
3335
DimensionField,
@@ -278,7 +280,7 @@ export function withEngagement() {
278280
...ENGAGEMENT_TREND_MEASURES,
279281
...ENGAGEMENT_SPARKLINE_MEASURES
280282
])
281-
.timeRange('day', dateRange, 'day')
283+
.timeRange('day', dateRange, DEFAULT_GRANULARITY)
282284
.build();
283285

284286
const previousQuery = createCubeQuery()
@@ -288,7 +290,7 @@ export function withEngagement() {
288290
...ENGAGEMENT_TREND_MEASURES,
289291
...ENGAGEMENT_SPARKLINE_MEASURES
290292
])
291-
.timeRange('day', previousRange, 'day')
293+
.timeRange('day', previousRange, DEFAULT_GRANULARITY)
292294
.build();
293295

294296
return forkJoin({

core-web/libs/portlets/dot-analytics/data-access/src/lib/store/features/with-pageview.feature.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { FiltersState } from './with-filters.feature';
1717
import { DotAnalyticsService } from '../../services/dot-analytics.service';
1818
import {
1919
DEFAULT_COUNT_LIMIT,
20+
DEFAULT_GRANULARITY,
2021
PageViewDeviceBrowsersEntity,
2122
PageViewTimeLineEntity,
2223
RequestState,
@@ -30,7 +31,6 @@ import { createCubeQuery } from '../../utils/cube/cube-query-builder.util';
3031
import {
3132
createEmptyAnalyticsEntity,
3233
createInitialRequestState,
33-
determineGranularityForTimeRange,
3434
fillMissingDates,
3535
toTimeRangeCubeJS
3636
} from '../../utils/data/analytics-data.utils';
@@ -261,21 +261,20 @@ export function withPageview() {
261261
})
262262
),
263263
switchMap(({ timeRange, currentSiteId }) => {
264-
const granularity = determineGranularityForTimeRange(timeRange);
265264
const query = createCubeQuery()
266265
.fromCube('EventSummary')
267266
.pageviews()
268267
.measures(['totalEvents'])
269268
.siteId(currentSiteId)
270-
.timeRange('day', toTimeRangeCubeJS(timeRange), granularity)
269+
.timeRange('day', toTimeRangeCubeJS(timeRange), DEFAULT_GRANULARITY)
271270
.build();
272271

273272
return analyticsService.cubeQuery<PageViewTimeLineEntity>(query).pipe(
274273
map((entities) =>
275274
fillMissingDates<PageViewTimeLineEntity>(
276275
entities,
277276
timeRange,
278-
granularity,
277+
DEFAULT_GRANULARITY,
279278
createEmptyAnalyticsEntity
280279
)
281280
),

core-web/libs/portlets/dot-analytics/data-access/src/lib/types/cubequery.types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export type SortDirection = (typeof SortDirection)[keyof typeof SortDirection];
3535
* Granularity options for time-based queries.
3636
* Using const assertion for granularity management.
3737
*/
38-
const Granularity = {
38+
export const Granularity = {
3939
HOUR: 'hour',
4040
DAY: 'day',
4141
WEEK: 'week',
@@ -44,6 +44,8 @@ const Granularity = {
4444

4545
export type Granularity = (typeof Granularity)[keyof typeof Granularity];
4646

47+
export const DEFAULT_GRANULARITY = Granularity.DAY;
48+
4749
/**
4850
* CubeJS time dimension configuration
4951
*/

core-web/libs/portlets/dot-analytics/data-access/src/lib/utils/cube/cube-query-builder.util.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { CubeQueryBuilder, createCubeQuery } from './cube-query-builder.util';
22

33
import { TIME_RANGE_CUBEJS_MAPPING } from '../../constants';
4+
import { Granularity } from '../../types';
45

56
describe('CubeQueryBuilder', () => {
67
let builder: CubeQueryBuilder;
@@ -178,13 +179,13 @@ describe('CubeQueryBuilder', () => {
178179

179180
it('should add time range with granularity', () => {
180181
const query = builder
181-
.timeRange('createdAt', TIME_RANGE_CUBEJS_MAPPING.last30days, 'week')
182+
.timeRange('createdAt', TIME_RANGE_CUBEJS_MAPPING.last30days, Granularity.DAY)
182183
.build();
183184
expect(query.timeDimensions).toEqual([
184185
{
185186
dimension: 'request.createdAt',
186187
dateRange: TIME_RANGE_CUBEJS_MAPPING.last30days,
187-
granularity: 'week'
188+
granularity: Granularity.DAY
188189
}
189190
]);
190191
});
@@ -333,7 +334,7 @@ describe('CubeQueryBuilder', () => {
333334
{
334335
dimension: 'request.createdAt',
335336
dateRange: TIME_RANGE_CUBEJS_MAPPING.last7days,
336-
granularity: 'day'
337+
granularity: Granularity.DAY
337338
}
338339
]
339340
});

0 commit comments

Comments
 (0)