Skip to content

Commit 530c21d

Browse files
committed
add limit 50 to event chart, metrics table, and UTM report
1 parent 09bc2ee commit 530c21d

File tree

6 files changed

+69
-9
lines changed

6 files changed

+69
-9
lines changed

src/app/(main)/websites/[websiteId]/events/EventsPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,14 @@ export function EventsPage({ websiteId }) {
8989
<TabPanel id="chart">
9090
<Column gap="6">
9191
<Column border="bottom" paddingBottom="6">
92-
<EventsChart websiteId={websiteId} />
92+
<EventsChart websiteId={websiteId} limit={50} />
9393
</Column>
9494
<MetricsTable
9595
websiteId={websiteId}
9696
type="event"
9797
title={t(labels.event)}
9898
metric={t(labels.count)}
99+
limit={50}
99100
/>
100101
</Column>
101102
</TabPanel>

src/app/api/websites/[websiteId]/events/series/route.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export async function GET(
1414
endAt: z.coerce.number().int(),
1515
unit: unitParam.optional(),
1616
timezone: timezoneParam,
17+
limit: z.coerce.number().optional(),
1718
...filterParams,
1819
});
1920

@@ -29,9 +30,10 @@ export async function GET(
2930
return unauthorized();
3031
}
3132

33+
const { limit } = query;
3234
const filters = await getQueryFilters(query, websiteId);
3335

34-
const data = await getEventStats(websiteId, filters);
36+
const data = await getEventStats(websiteId, { limit }, filters);
3537

3638
return json(data);
3739
}

src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,29 @@ import { useApi } from '../useApi';
33
import { useDateParameters } from '../useDateParameters';
44
import { useFilterParameters } from '../useFilterParameters';
55

6-
export function useWebsiteEventsSeriesQuery(websiteId: string, options?: ReactQueryOptions) {
6+
export function useWebsiteEventsSeriesQuery(
7+
websiteId: string,
8+
params?: { limit?: number },
9+
options?: ReactQueryOptions,
10+
) {
711
const { get, useQuery } = useApi();
812
const { startAt, endAt, unit, timezone } = useDateParameters();
913
const filters = useFilterParameters();
1014

1115
return useQuery({
12-
queryKey: ['websites:events:series', { websiteId, startAt, endAt, unit, timezone, ...filters }],
16+
queryKey: [
17+
'websites:events:series',
18+
{ websiteId, startAt, endAt, unit, timezone, ...filters, ...params },
19+
],
1320
queryFn: () =>
14-
get(`/websites/${websiteId}/events/series`, { startAt, endAt, unit, timezone, ...filters }),
21+
get(`/websites/${websiteId}/events/series`, {
22+
startAt,
23+
endAt,
24+
unit,
25+
timezone,
26+
...filters,
27+
...params,
28+
}),
1529
enabled: !!websiteId,
1630
...options,
1731
});

src/components/metrics/EventsChart.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,16 @@ import { generateTimeSeries } from '@/lib/date';
1515
export interface EventsChartProps extends BarChartProps {
1616
websiteId: string;
1717
focusLabel?: string;
18+
limit?: number;
1819
}
1920

20-
export function EventsChart({ websiteId, focusLabel }: EventsChartProps) {
21+
export function EventsChart({ websiteId, focusLabel, limit }: EventsChartProps) {
2122
const { timezone } = useTimezone();
2223
const {
2324
dateRange: { startDate, endDate, unit },
2425
} = useDateRange({ timezone: timezone });
2526
const { locale, dateLocale } = useLocale();
26-
const { data, isLoading, error } = useWebsiteEventsSeriesQuery(websiteId);
27+
const { data, isLoading, error } = useWebsiteEventsSeriesQuery(websiteId, { limit });
2728
const [label, setLabel] = useState<string>(focusLabel);
2829

2930
const chartData: any = useMemo(() => {

src/queries/sql/events/getEventStats.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,31 @@ import type { QueryFilters } from '@/lib/types';
66

77
const FUNCTION_NAME = 'getEventStats';
88

9+
export interface EventStatsParameters {
10+
limit?: number | string;
11+
}
12+
913
interface WebsiteEventMetric {
1014
x: string;
1115
t: string;
1216
y: number;
1317
}
1418

1519
export async function getEventStats(
16-
...args: [websiteId: string, filters: QueryFilters]
20+
...args: [websiteId: string, parameters: EventStatsParameters, filters: QueryFilters]
1721
): Promise<WebsiteEventMetric[]> {
1822
return runQuery({
1923
[PRISMA]: () => relationalQuery(...args),
2024
[CLICKHOUSE]: () => clickhouseQuery(...args),
2125
});
2226
}
2327

24-
async function relationalQuery(websiteId: string, filters: QueryFilters) {
28+
async function relationalQuery(
29+
websiteId: string,
30+
parameters: EventStatsParameters,
31+
filters: QueryFilters,
32+
) {
33+
const { limit } = parameters;
2534
const { timezone = 'utc', unit = 'day' } = filters;
2635
const { rawQuery, getDateSQL, parseFilters } = prisma;
2736
const { filterQuery, cohortQuery, joinSessionQuery, queryParams } = parseFilters({
@@ -30,6 +39,19 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
3039
eventType: EVENT_TYPE.customEvent,
3140
});
3241

42+
const limitQuery = limit
43+
? `and event_name in (
44+
select event_name
45+
from website_event
46+
where website_id = {{websiteId::uuid}}
47+
and created_at between {{startDate}} and {{endDate}}
48+
and event_type = 2
49+
group by event_name
50+
order by count(*) desc
51+
limit ${limit}
52+
)`
53+
: '';
54+
3355
return rawQuery(
3456
`
3557
select
@@ -42,6 +64,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
4264
where website_event.website_id = {{websiteId::uuid}}
4365
and website_event.created_at between {{startDate}} and {{endDate}}
4466
${filterQuery}
67+
${limitQuery}
4568
group by 1, 2
4669
order by 2
4770
`,
@@ -52,8 +75,10 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
5275

5376
async function clickhouseQuery(
5477
websiteId: string,
78+
parameters: EventStatsParameters,
5579
filters: QueryFilters,
5680
): Promise<{ x: string; t: string; y: number }[]> {
81+
const { limit } = parameters;
5782
const { timezone = 'UTC', unit = 'day' } = filters;
5883
const { rawQuery, getDateSQL, parseFilters } = clickhouse;
5984
const { filterQuery, cohortQuery, queryParams } = parseFilters({
@@ -62,6 +87,19 @@ async function clickhouseQuery(
6287
eventType: EVENT_TYPE.customEvent,
6388
});
6489

90+
const limitQuery = limit
91+
? `and event_name in (
92+
select event_name
93+
from website_event
94+
where website_id = {websiteId:UUID}
95+
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
96+
and event_type = {eventType:UInt32}
97+
group by event_name
98+
order by count(*) desc
99+
limit ${limit}
100+
)`
101+
: '';
102+
65103
let sql = '';
66104

67105
if (filterQuery || cohortQuery) {
@@ -75,6 +113,7 @@ async function clickhouseQuery(
75113
where website_id = {websiteId:UUID}
76114
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
77115
${filterQuery}
116+
${limitQuery}
78117
group by x, t
79118
order by t
80119
`;
@@ -91,6 +130,7 @@ async function clickhouseQuery(
91130
where website_id = {websiteId:UUID}
92131
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
93132
and event_type = {eventType:UInt32}
133+
${limitQuery}
94134
) as g
95135
group by x, t
96136
order by t

src/queries/sql/reports/getUTM.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ async function relationalQuery(
4747
${filterQuery}
4848
group by 1
4949
order by 2 desc
50+
limit 50
5051
`,
5152
queryParams,
5253
);
@@ -78,6 +79,7 @@ async function clickhouseQuery(
7879
${filterQuery}
7980
group by 1
8081
order by 2 desc
82+
limit 50
8183
`,
8284
queryParams,
8385
);

0 commit comments

Comments
 (0)