import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; import { QueryFilters } from '@/lib/types'; export async function getWebsiteSessions(...args: [websiteId: string, filters: QueryFilters]) { return runQuery({ [PRISMA]: () => relationalQuery(...args), [CLICKHOUSE]: () => clickhouseQuery(...args), }); } async function relationalQuery(websiteId: string, filters: QueryFilters) { const { pagedRawQuery, parseFilters } = prisma; const { search } = filters; const { filterQuery, dateQuery, queryParams } = parseFilters({ ...filters, websiteId, search: search ? `%${search}%` : undefined, }); const searchQuery = search ? `and session.distinct_id ilike {{search}}` : ''; return pagedRawQuery( ` select session.session_id as "id", session.website_id as "websiteId", website_event.hostname, session.browser, session.os, session.device, session.screen, session.language, session.country, session.region, session.city, min(website_event.created_at) as "firstAt", max(website_event.created_at) as "lastAt", count(distinct website_event.visit_id) as "visits", sum(case when website_event.event_type = 1 then 1 else 0 end) as "views", max(website_event.created_at) as "createdAt" from website_event join session on session.session_id = website_event.session_id where website_event.website_id = {{websiteId::uuid}} ${dateQuery} ${filterQuery} ${searchQuery} group by session.session_id, session.website_id, website_event.hostname, session.browser, session.os, session.device, session.screen, session.language, session.country, session.region, session.city order by max(website_event.created_at) desc `, queryParams, filters, ); } async function clickhouseQuery(websiteId: string, filters: QueryFilters) { const { pagedRawQuery, parseFilters, getDateStringSQL } = clickhouse; const { search } = filters; const { filterQuery, dateQuery, queryParams } = parseFilters({ ...filters, websiteId, }); const searchQuery = search ? `and positionCaseInsensitive(distinct_id, {search:String}) > 0` : ''; return pagedRawQuery( ` select session_id as id, website_id as websiteId, hostname, browser, os, device, screen, language, country, region, city, ${getDateStringSQL('min(min_time)')} as firstAt, ${getDateStringSQL('max(max_time)')} as lastAt, uniq(visit_id) as visits, sumIf(views, event_type = 1) as views, lastAt as createdAt from website_event_stats_hourly where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} ${searchQuery} group by session_id, website_id, hostname, browser, os, device, screen, language, country, region, city order by lastAt desc `, queryParams, filters, ); }