umami/src/queries/analytics/events/getEventDataValues.ts

73 lines
2 KiB
TypeScript
Raw Normal View History

2023-07-11 08:16:17 +00:00
import prisma from 'lib/prisma';
2023-06-03 06:10:59 +00:00
import clickhouse from 'lib/clickhouse';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
2023-08-16 15:49:22 +00:00
import { QueryFilters, WebsiteEventData } from 'lib/types';
2023-06-03 06:10:59 +00:00
2024-08-09 08:09:54 +00:00
export async function getEventDataValues(
...args: [websiteId: string, filters: QueryFilters & { propertyName?: string }]
2023-08-16 15:49:22 +00:00
): Promise<WebsiteEventData[]> {
2023-06-03 06:10:59 +00:00
return runQuery({
[PRISMA]: () => relationalQuery(...args),
[CLICKHOUSE]: () => clickhouseQuery(...args),
});
}
2024-08-09 08:09:54 +00:00
async function relationalQuery(
websiteId: string,
filters: QueryFilters & { propertyName?: string },
) {
2023-08-04 20:18:30 +00:00
const { rawQuery, parseFilters } = prisma;
2024-08-09 08:09:54 +00:00
const { filterQuery, params } = await parseFilters(websiteId, filters);
2023-06-03 06:10:59 +00:00
return rawQuery(
2023-07-25 06:06:16 +00:00
`
select
2024-08-09 08:09:54 +00:00
string_value as "value",
count(*) as "total"
2023-07-25 06:06:16 +00:00
from event_data
where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}}
2024-08-09 08:09:54 +00:00
and data_key = {{propertyName}}
${filterQuery}
2024-08-09 08:09:54 +00:00
group by string_value
order by 2 desc
2024-02-14 23:13:53 +00:00
limit 500
2023-07-11 08:16:17 +00:00
`,
2023-08-04 20:18:30 +00:00
params,
2023-06-03 06:10:59 +00:00
);
}
2023-09-29 18:00:06 +00:00
async function clickhouseQuery(
websiteId: string,
2024-08-09 08:09:54 +00:00
filters: QueryFilters & { propertyName?: string },
): Promise<{ propertyName: string; dataType: number; propertyValue: string; total: number }[]> {
2023-08-04 20:18:30 +00:00
const { rawQuery, parseFilters } = clickhouse;
2024-08-09 08:09:54 +00:00
const { filterQuery, params } = await parseFilters(websiteId, filters);
2023-06-03 06:10:59 +00:00
return rawQuery(
2023-07-25 06:06:16 +00:00
`
select
multiIf(data_type = 2, replaceAll(string_value, '.0000', ''),
data_type = 4, toString(date_trunc('hour', date_value)),
string_value) as "value",
2024-08-09 08:09:54 +00:00
count(*) as "total"
from umami.event_data
2023-07-25 06:06:16 +00:00
where website_id = {websiteId:UUID}
2023-09-29 18:00:06 +00:00
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
2024-08-09 08:09:54 +00:00
and data_key = {propertyName:String}
${filterQuery}
group by value
2024-08-09 08:09:54 +00:00
order by 2 desc
limit 500;
2023-07-11 08:16:17 +00:00
`,
2023-08-04 20:18:30 +00:00
params,
).then(result => {
return Object.values(result).map((a: any) => {
2023-09-29 18:00:06 +00:00
return {
2024-08-09 08:09:54 +00:00
...a,
2023-09-29 18:00:06 +00:00
total: Number(a.total),
};
});
});
2023-06-03 06:10:59 +00:00
}