From f4774ddc255378a123f9536eab844594b306dd18 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 6 Feb 2025 11:25:27 -0800 Subject: [PATCH] Added missing query. --- src/queries/sql/getChannelMetrics.ts | 66 ++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/queries/sql/getChannelMetrics.ts diff --git a/src/queries/sql/getChannelMetrics.ts b/src/queries/sql/getChannelMetrics.ts new file mode 100644 index 00000000..084b7a2c --- /dev/null +++ b/src/queries/sql/getChannelMetrics.ts @@ -0,0 +1,66 @@ +import prisma from '@/lib/prisma'; +import clickhouse from '@/lib/clickhouse'; +import { runQuery, CLICKHOUSE, PRISMA } from '@/lib/db'; +import { QueryFilters } from '@/lib/types'; + +export async function getChannelMetrics(...args: [websiteId: string, filters?: QueryFilters]) { + return runQuery({ + [PRISMA]: () => relationalQuery(...args), + [CLICKHOUSE]: () => clickhouseQuery(...args), + }); +} + +async function relationalQuery(websiteId: string, filters: QueryFilters) { + const { rawQuery, parseFilters } = prisma; + const { params, filterQuery, dateQuery } = await parseFilters(websiteId, filters); + + return rawQuery( + ` + select + website_event.session_id as "sessionId", + website_event.event_name as "eventName", + website_event.created_at as "createdAt", + session.browser, + session.os, + session.device, + session.country, + website_event.url_path as "urlPath", + website_event.referrer_domain as "referrerDomain" + from website_event + inner join session + on session.session_id = website_event.session_id + where website_event.website_id = {{websiteId::uuid}} + ${filterQuery} + ${dateQuery} + order by website_event.created_at desc + limit 100 + `, + params, + ); +} + +async function clickhouseQuery( + websiteId: string, + filters: QueryFilters, +): Promise<{ x: string; y: number }[]> { + const { rawQuery, parseFilters } = clickhouse; + const { params, filterQuery, dateQuery } = await parseFilters(websiteId, filters); + + const sql = ` + select + referrer_domain as x, + count(*) as y + from website_event + where website_id = {websiteId:UUID} + ${filterQuery} + ${dateQuery} + group by 1 + order by y desc + `; + + return rawQuery(sql, params).then(a => { + return Object.values(a).map(a => { + return { x: a.x, y: Number(a.y) }; + }); + }); +}