diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 220987c7..d441bcec 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -118,6 +118,7 @@ function getCohortQuery(filters: QueryFilters = {}) { (select distinct website_event.session_id from website_event join session on session.session_id = website_event.session_id + and session.website_id = website_event.website_id where website_event.website_id = {{websiteId}} and website_event.created_at between {{cohort_startDate}} and {{cohort_endDate}} ${filterQuery} @@ -165,7 +166,7 @@ function parseFilters(filters: Record, options?: QueryOptions) { return { joinSessionQuery: options?.joinSession || joinSession - ? `inner join session on website_event.session_id = session.session_id` + ? `inner join session on website_event.session_id = session.session_id and website_event.website_id = session.website_id` : '', dateQuery: getDateQuery(filters), filterQuery: getFilterQuery(filters, options), @@ -225,8 +226,8 @@ async function pagedQuery(model: string, criteria: T, filters?: QueryFilters) async function pagedRawQuery( query: string, - filters: QueryFilters, queryParams: Record, + filters: QueryFilters, name?: string, ) { const { page = 1, pageSize, orderBy, sortDescending = false } = filters; diff --git a/src/queries/sql/events/getEventData.ts b/src/queries/sql/events/getEventData.ts index 52cb5300..42dc2040 100644 --- a/src/queries/sql/events/getEventData.ts +++ b/src/queries/sql/events/getEventData.ts @@ -19,17 +19,17 @@ async function relationalQuery(websiteId: string, eventId: string) { return rawQuery( ` - select website_id as websiteId, - session_id as sessionId, - event_id as eventId, - url_path as urlPath, - event_name as eventName, - data_key as dataKey, - string_value as stringValue, - number_value as numberValue, - date_value as dateValue, - data_type as dataType, - created_at as createdAt + select website_id as "websiteId", + session_id as "sessionId", + event_id as "eventId", + url_path as "urlPath", + event_name as "eventName", + data_key as "dataKey", + string_value as "stringValue", + number_value as "numberValue", + date_value as "dateValue", + data_type as "dataType", + created_at as "createdAt" from event_data website_id = {{websiteId::uuid}} event_id = {{eventId::uuid}} diff --git a/src/queries/sql/events/getWebsiteEvents.ts b/src/queries/sql/events/getWebsiteEvents.ts index 52113daf..ef4f300c 100644 --- a/src/queries/sql/events/getWebsiteEvents.ts +++ b/src/queries/sql/events/getWebsiteEvents.ts @@ -18,7 +18,6 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { const { filterQuery, dateQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId, - search: `%${search}%`, }); const searchQuery = search @@ -29,32 +28,33 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { return pagedRawQuery( ` select - event_id as "id", - website_id as "websiteId", - session_id as "sessionId", - created_at as "createdAt", - hostname, - url_path as "urlPath", - url_query as "urlQuery", - referrer_path as "referrerPath", - referrer_query as "referrerQuery", - referrer_domain as "referrerDomain", - country as country, + website_event.event_id as "id", + website_event.website_id as "websiteId", + website_event.session_id as "sessionId", + website_event.created_at as "createdAt", + website_event.hostname, + website_event.url_path as "urlPath", + website_event.url_query as "urlQuery", + website_event.referrer_path as "referrerPath", + website_event.referrer_query as "referrerQuery", + website_event.referrer_domain as "referrerDomain", + session.country as country, city as city, device as device, os as os, browser as browser, page_title as "pageTitle", - event_type as "eventType", - event_name as "eventName" + website_event.event_type as "eventType", + website_event.event_name as "eventName" from website_event ${cohortQuery} - join session on website_event.session_id = session.session_id - where website_id = {{websiteId::uuid}} + join session on session.session_id = website_event.session_id + and session.website_id = website_event.website_id + where website_event.website_id = {{websiteId::uuid}} ${dateQuery} ${filterQuery} ${searchQuery} - order by created_at desc + order by website_event.created_at desc `, queryParams, filters, diff --git a/src/queries/sql/getActiveVisitors.ts b/src/queries/sql/getActiveVisitors.ts index 693efd63..20327424 100644 --- a/src/queries/sql/getActiveVisitors.ts +++ b/src/queries/sql/getActiveVisitors.ts @@ -18,7 +18,7 @@ async function relationalQuery(websiteId: string) { const result = await rawQuery( ` - select count(distinct session_id) as visitors + select count(distinct session_id) as "visitors" from website_event where website_id = {{websiteId::uuid}} and created_at >= {{startDate}} diff --git a/src/queries/sql/getChannelExpandedMetrics.ts b/src/queries/sql/getChannelExpandedMetrics.ts index 4515ddd6..5ce884ad 100644 --- a/src/queries/sql/getChannelExpandedMetrics.ts +++ b/src/queries/sql/getChannelExpandedMetrics.ts @@ -49,19 +49,19 @@ async function relationalQuery( return rawQuery( ` WITH prefix AS ( - select case when utm_medium LIKE 'p%' OR - utm_medium LIKE '%ppc%' OR - utm_medium LIKE '%retargeting%' OR - utm_medium LIKE '%paid%' then 'paid' else 'organic' end prefix, - referrer_domain, - url_query, - utm_medium, - utm_source, - session_id, - visit_id, + select case when website_event.utm_medium LIKE 'p%' OR + website_event.utm_medium LIKE '%ppc%' OR + website_event.utm_medium LIKE '%retargeting%' OR + website_event.utm_medium LIKE '%paid%' then 'paid' else 'organic' end prefix, + website_event.referrer_domain, + website_event.url_query, + website_event.utm_medium, + website_event.utm_source, + website_event.session_id, + website_event.visit_id, count(*) c, - min(created_at) min_time, - max(created_at) max_time + min(website_event.created_at) min_time, + max(website_event.created_at) max_time from website_event ${cohortQuery} ${joinSessionQuery} @@ -70,12 +70,12 @@ async function relationalQuery( ${dateQuery} ${filterQuery} group by prefix, - referrer_domain, - url_query, - utm_medium, - utm_source, - session_id, - visit_id), + website_event.referrer_domain, + website_event.url_query, + website_event.utm_medium, + website_event.utm_source, + website_event.session_id, + website_event.visit_id), channels as ( select case diff --git a/src/queries/sql/getChannelMetrics.ts b/src/queries/sql/getChannelMetrics.ts index 592ed212..a608ec5e 100644 --- a/src/queries/sql/getChannelMetrics.ts +++ b/src/queries/sql/getChannelMetrics.ts @@ -30,15 +30,15 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { return rawQuery( ` WITH prefix AS ( - select case when utm_medium LIKE 'p%' OR - utm_medium LIKE '%ppc%' OR - utm_medium LIKE '%retargeting%' OR - utm_medium LIKE '%paid%' then 'paid' else 'organic' end prefix, - referrer_domain, - url_query, - utm_medium, - utm_source, - session_id + select case when website_event.utm_medium LIKE 'p%' OR + website_event.utm_medium LIKE '%ppc%' OR + website_event.utm_medium LIKE '%retargeting%' OR + website_event.utm_medium LIKE '%paid%' then 'paid' else 'organic' end prefix, + website_event.referrer_domain, + website_event.url_query, + website_event.utm_medium, + website_event.utm_source, + website_event.session_id from website_event ${cohortQuery} ${joinSessionQuery} diff --git a/src/queries/sql/getRealtimeActivity.ts b/src/queries/sql/getRealtimeActivity.ts index ec9a104f..d7aa06e9 100644 --- a/src/queries/sql/getRealtimeActivity.ts +++ b/src/queries/sql/getRealtimeActivity.ts @@ -35,6 +35,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { ${cohortQuery} inner join session on session.session_id = website_event.session_id + and session.website_id = website_event.website_id where website_event.website_id = {{websiteId::uuid}} ${filterQuery} ${dateQuery} diff --git a/src/queries/sql/getValues.ts b/src/queries/sql/getValues.ts index 42673156..6251fe3b 100644 --- a/src/queries/sql/getValues.ts +++ b/src/queries/sql/getValues.ts @@ -51,6 +51,7 @@ async function relationalQuery(websiteId: string, column: string, filters: Query from website_event inner join session on session.session_id = website_event.session_id + and session.website_id = website_event.website_id where website_event.website_id = {{websiteId::uuid}} and website_event.created_at between {{startDate}} and {{endDate}} ${searchQuery} diff --git a/src/queries/sql/getWebsiteDateRange.ts b/src/queries/sql/getWebsiteDateRange.ts index 2f7f9f19..58d8ab25 100644 --- a/src/queries/sql/getWebsiteDateRange.ts +++ b/src/queries/sql/getWebsiteDateRange.ts @@ -20,8 +20,8 @@ async function relationalQuery(websiteId: string) { const result = await rawQuery( ` select - min(created_at) as startDate, - max(created_at) as endDate + min(created_at) as "startDate", + max(created_at) as "endDate" from website_event where website_id = {{websiteId::uuid}} and created_at >= {{startDate}} diff --git a/src/queries/sql/getWeeklyTraffic.ts b/src/queries/sql/getWeeklyTraffic.ts index 2ea37067..ea202993 100644 --- a/src/queries/sql/getWeeklyTraffic.ts +++ b/src/queries/sql/getWeeklyTraffic.ts @@ -24,13 +24,13 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { return rawQuery( ` select - ${getDateWeeklySQL('created_at', timezone)} as time, - count(distinct session_id) as value + ${getDateWeeklySQL('website_event.created_at', timezone)} as time, + count(distinct website_event.session_id) as value from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} - and created_at between {{startDate}} and {{endDate}} + where website_event.website_id = {{websiteId::uuid}} + and website_event.created_at between {{startDate}} and {{endDate}} ${filterQuery} group by time order by 2 diff --git a/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts b/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts index c5f467dc..2e234ab1 100644 --- a/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts +++ b/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts @@ -103,6 +103,7 @@ async function relationalQuery( ${filterQuery} group by name, website_event.session_id, website_event.visit_id ) as t + where name != '' group by name order by visitors desc, visits desc limit ${limit} diff --git a/src/queries/sql/reports/getAttribution.ts b/src/queries/sql/reports/getAttribution.ts index 3db2ff08..9277bbf7 100644 --- a/src/queries/sql/reports/getAttribution.ts +++ b/src/queries/sql/reports/getAttribution.ts @@ -69,14 +69,14 @@ async function relationalQuery( const eventQuery = `WITH events AS ( select distinct - session_id, - max(created_at) max_dt + website_event.session_id, + max(website_event.created_at) max_dt from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} - and created_at between {{startDate}} and {{endDate}} - and ${column} = {{step}} + where website_event.website_id = {{websiteId::uuid}} + and website_event.created_at between {{startDate}} and {{endDate}} + and website_event.${column} = {{step}} ${filterQuery} group by 1),`; @@ -234,14 +234,14 @@ async function relationalQuery( ` select count(*) as "pageviews", - count(distinct session_id) as "visitors", - count(distinct visit_id) as "visits" + count(distinct website_event.session_id) as "visitors", + count(distinct website_event.visit_id) as "visits" from website_event ${joinSessionQuery} ${cohortQuery} - where website_id = {{websiteId::uuid}} - and created_at between {{startDate}} and {{endDate}} - and ${column} = {{step}} + where website_event.website_id = {{websiteId::uuid}} + and website_event.created_at between {{startDate}} and {{endDate}} + and website_event.${column} = {{step}} ${filterQuery} `, queryParams, diff --git a/src/queries/sql/reports/getFunnel.ts b/src/queries/sql/reports/getFunnel.ts index a56439db..ada5eeb2 100644 --- a/src/queries/sql/reports/getFunnel.ts +++ b/src/queries/sql/reports/getFunnel.ts @@ -67,12 +67,12 @@ async function relationalQuery( if (levelNumber === 1) { pv.levelOneQuery = ` WITH level1 AS ( - select distinct session_id, created_at + select distinct website_event.session_id, website_event.created_at from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} - and created_at between {{startDate}} and {{endDate}} + where website_event.website_id = {{websiteId::uuid}} + and website_event.created_at between {{startDate}} and {{endDate}} and ${column} ${operator} {{${i}}} ${filterQuery} )`; diff --git a/src/queries/sql/reports/getGoal.ts b/src/queries/sql/reports/getGoal.ts index 81ec80ab..702c160a 100644 --- a/src/queries/sql/reports/getGoal.ts +++ b/src/queries/sql/reports/getGoal.ts @@ -42,26 +42,26 @@ async function relationalQuery( return rawQuery( ` - select count(*) as num, + select count(distinct website_event.session_id) as num, ( - select count(distinct session_id) + select count(distinct website_event.session_id) from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} + where website_event.website_id = {{websiteId::uuid}} ${dateQuery} ${filterQuery} ) as total from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} + where website_event.website_id = {{websiteId::uuid}} and ${column} = {{value}} ${dateQuery} ${filterQuery} `, queryParams, - ); + ).then(results => results?.[0]); } async function clickhouseQuery( @@ -84,7 +84,7 @@ async function clickhouseQuery( return rawQuery( ` - select count(*) as num, + select count(distinct session_id) as num, ( select count(distinct session_id) from website_event diff --git a/src/queries/sql/reports/getJourney.ts b/src/queries/sql/reports/getJourney.ts index 3ed4acc9..8d1a90d4 100644 --- a/src/queries/sql/reports/getJourney.ts +++ b/src/queries/sql/reports/getJourney.ts @@ -117,16 +117,16 @@ async function relationalQuery( ` WITH events AS ( select distinct - visit_id, - referrer_path, - coalesce(nullIf(event_name, ''), url_path) event, - row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number + website_event.visit_id, + website_event.referrer_path, + coalesce(nullIf(website_event.event_name, ''), website_event.url_path) event, + row_number() OVER (PARTITION BY visit_id ORDER BY website_event.created_at) AS event_number from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} - and created_at between {{startDate}} and {{endDate}}), - ${filterQuery} + where website_event.website_id = {{websiteId::uuid}} + and website_event.created_at between {{startDate}} and {{endDate}} + ${filterQuery}), ${sequenceQuery} select * from sequences diff --git a/src/queries/sql/reports/getUTM.ts b/src/queries/sql/reports/getUTM.ts index 61a3c042..5dee7a7b 100644 --- a/src/queries/sql/reports/getUTM.ts +++ b/src/queries/sql/reports/getUTM.ts @@ -37,13 +37,13 @@ async function relationalQuery( return rawQuery( ` - select ${column} utm, count(*) as views + select website_event.${column} utm, count(*) as views from website_event ${cohortQuery} ${joinSessionQuery} - where website_id = {{websiteId::uuid}} - and created_at between {{startDate}} and {{endDate}} - and coalesce(${column}, '') != '' + where website_event.website_id = {{websiteId::uuid}} + and website_event.created_at between {{startDate}} and {{endDate}} + and coalesce(website_event.${column}, '') != '' ${filterQuery} group by 1 order by 2 desc diff --git a/src/queries/sql/sessions/getSessionActivity.ts b/src/queries/sql/sessions/getSessionActivity.ts index 6b79338e..360db530 100644 --- a/src/queries/sql/sessions/getSessionActivity.ts +++ b/src/queries/sql/sessions/getSessionActivity.ts @@ -21,20 +21,23 @@ async function relationalQuery(websiteId: string, sessionId: string, filters: Qu return rawQuery( ` select - created_at as createdAt, - url_path as urlPath, - url_query as urlQuery, - referrer_domain as referrerDomain, - event_id as eventId, - event_type as eventType, - event_name as eventName, - visit_id as visitId, - event_id IN (SELECT event_id FROM event_data) AS hasData - from website_event e - where e.website_id = {websiteId:UUID} - and e.session_id = {sessionId:UUID} - and e.created_at between {startDate:DateTime64} and {endDate:DateTime64} - order by e.created_at desc + created_at as "createdAt", + url_path as "urlPath", + url_query as "urlQuery", + referrer_domain as "referrerDomain", + event_id as "eventId", + event_type as "eventType", + event_name as "eventName", + visit_id as "visitId", + event_id IN (select event_id + from event_data + where website_id = {{websiteId::uuid}} + and session_id = {{sessionId::uuid}}) AS "hasData" + from website_event + where website_id = {{websiteId::uuid}} + and session_id = {{sessionId::uuid}} + and created_at between {{startDate}} and {{endDate}} + order by created_at desc limit 500 `, { websiteId, sessionId, startDate, endDate }, diff --git a/src/queries/sql/sessions/getSessionDataProperties.ts b/src/queries/sql/sessions/getSessionDataProperties.ts index 78e4cba4..96cc17bf 100644 --- a/src/queries/sql/sessions/getSessionDataProperties.ts +++ b/src/queries/sql/sessions/getSessionDataProperties.ts @@ -31,6 +31,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { ${joinSessionQuery} join session_data on session_data.session_id = website_event.session_id + and session_data.website_id = website_event.website_id where website_event.website_id = {{websiteId::uuid}} and website_event.created_at between {{startDate}} and {{endDate}} ${filterQuery} diff --git a/src/queries/sql/sessions/getSessionDataValues.ts b/src/queries/sql/sessions/getSessionDataValues.ts index efc85090..0093575d 100644 --- a/src/queries/sql/sessions/getSessionDataValues.ts +++ b/src/queries/sql/sessions/getSessionDataValues.ts @@ -38,6 +38,7 @@ async function relationalQuery( ${joinSessionQuery} join session_data on session_data.session_id = website_event.session_id + and session_data.website_id = website_event.website_id where website_event.website_id = {{websiteId::uuid}} and website_event.created_at between {{startDate}} and {{endDate}} and session_data.data_key = {{propertyName}} diff --git a/src/queries/sql/sessions/getWebsiteSessionStats.ts b/src/queries/sql/sessions/getWebsiteSessionStats.ts index be90d4cd..2e824f0d 100644 --- a/src/queries/sql/sessions/getWebsiteSessionStats.ts +++ b/src/queries/sql/sessions/getWebsiteSessionStats.ts @@ -44,6 +44,7 @@ async function relationalQuery( from website_event ${cohortQuery} join session on website_event.session_id = session.session_id + and website_event.website_id = session.website_id where website_event.website_id = {{websiteId::uuid}} and website_event.created_at between {{startDate}} and {{endDate}} ${filterQuery} diff --git a/src/queries/sql/sessions/getWebsiteSessions.ts b/src/queries/sql/sessions/getWebsiteSessions.ts index 302deca6..5ebd1740 100644 --- a/src/queries/sql/sessions/getWebsiteSessions.ts +++ b/src/queries/sql/sessions/getWebsiteSessions.ts @@ -52,6 +52,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { from website_event ${cohortQuery} join session on session.session_id = website_event.session_id + and session.website_id = website_event.website_id where website_event.website_id = {{websiteId::uuid}} ${dateQuery} ${filterQuery}