import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; import { QueryFilters } from '@/lib/types'; export interface GoalParameters { startDate: Date; endDate: Date; type: string; value: string; operator?: string; property?: string; } export async function getGoal( ...args: [websiteId: string, params: GoalParameters, filters: QueryFilters] ) { return runQuery({ [PRISMA]: () => relationalQuery(...args), [CLICKHOUSE]: () => clickhouseQuery(...args), }); } async function relationalQuery( websiteId: string, parameters: GoalParameters, filters: QueryFilters, ) { const { startDate, endDate, type, value } = parameters; const { rawQuery, parseFilters } = prisma; const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent; const column = type === 'page' ? 'url_path' : 'event_name'; const { filterQuery, dateQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId, value, startDate, endDate, eventType, }); return rawQuery( ` select count(*) as num, ( select count(distinct session_id) from website_event ${cohortQuery} ${joinSessionQuery} where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} ) as total from website_event ${cohortQuery} ${joinSessionQuery} where website_id = {websiteId:UUID} and ${column} = {value:String} ${dateQuery} ${filterQuery} `, queryParams, ); } async function clickhouseQuery( websiteId: string, parameters: GoalParameters, filters: QueryFilters, ) { const { startDate, endDate, type, value } = parameters; const { rawQuery, parseFilters } = clickhouse; const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent; const column = type === 'page' ? 'url_path' : 'event_name'; const { filterQuery, dateQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId, value, startDate, endDate, eventType, }); return rawQuery( ` select count(*) as num, ( select count(distinct session_id) from website_event ${cohortQuery} where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} ) as total from website_event ${cohortQuery} where website_id = {websiteId:UUID} and ${column} = {value:String} ${dateQuery} ${filterQuery} `, queryParams, ).then(results => results?.[0]); }