match cloud stats in self hosted

This commit is contained in:
Maxime-J 2023-11-02 17:34:06 +00:00
parent 8a4623eb7b
commit 76a5ac8e46
3 changed files with 20 additions and 16 deletions

View File

@ -23,15 +23,15 @@ const POSTGRESQL_DATE_FORMATS = {
year: 'YYYY-01-01', year: 'YYYY-01-01',
}; };
function getAddMinutesQuery(field: string, minutes: number): string { function getAddIntervalQuery(field: string, interval: string): string {
const db = getDatabaseType(process.env.DATABASE_URL); const db = getDatabaseType(process.env.DATABASE_URL);
if (db === POSTGRESQL) { if (db === POSTGRESQL) {
return `${field} + interval '${minutes} minute'`; return `${field} + interval '${interval}'`;
} }
if (db === MYSQL) { if (db === MYSQL) {
return `DATE_ADD(${field}, interval ${minutes} minute)`; return `DATE_ADD(${field}, interval ${interval})`;
} }
} }
@ -80,15 +80,15 @@ function getDateQuery(field: string, unit: string, timezone?: string): string {
} }
} }
function getTimestampIntervalQuery(field: string): string { function getTimestampDiffQuery(field1: string, field2: string): string {
const db = getDatabaseType(); const db = getDatabaseType();
if (db === POSTGRESQL) { if (db === POSTGRESQL) {
return `floor(extract(epoch from max(${field}) - min(${field})))`; return `floor(extract(epoch from (${field2} - ${field1})))`;
} }
if (db === MYSQL) { if (db === MYSQL) {
return `floor(unix_timestamp(max(${field})) - unix_timestamp(min(${field})))`; return `timestampdiff(second, ${field1}, ${field2})`;
} }
} }
@ -216,11 +216,11 @@ function getSearchMode(): { mode?: Prisma.QueryMode } {
export default { export default {
...prisma, ...prisma,
getAddMinutesQuery, getAddIntervalQuery,
getDayDiffQuery, getDayDiffQuery,
getCastColumnQuery, getCastColumnQuery,
getDateQuery, getDateQuery,
getTimestampIntervalQuery, getTimestampDiffQuery,
getFilterQuery, getFilterQuery,
parseFilters, parseFilters,
getPageFilters, getPageFilters,

View File

@ -12,7 +12,8 @@ export async function getWebsiteStats(...args: [websiteId: string, filters: Quer
} }
async function relationalQuery(websiteId: string, filters: QueryFilters) { async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { getDateQuery, getTimestampIntervalQuery, parseFilters, rawQuery } = prisma; const { getDateQuery, getAddIntervalQuery, getTimestampDiffQuery, parseFilters, rawQuery } =
prisma;
const { filterQuery, joinSession, params } = await parseFilters(websiteId, { const { filterQuery, joinSession, params } = await parseFilters(websiteId, {
...filters, ...filters,
eventType: EVENT_TYPE.pageView, eventType: EVENT_TYPE.pageView,
@ -24,13 +25,16 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
sum(t.c) as "pageviews", sum(t.c) as "pageviews",
count(distinct t.session_id) as "uniques", count(distinct t.session_id) as "uniques",
sum(case when t.c = 1 then 1 else 0 end) as "bounces", sum(case when t.c = 1 then 1 else 0 end) as "bounces",
sum(t.time) as "totaltime" sum(case when t.max_time < ${getAddIntervalQuery('t.min_time', '1 hour')}
then ${getTimestampDiffQuery('t.min_time', 't.max_time')}
else 0 end) as "totaltime"
from ( from (
select select
website_event.session_id, website_event.session_id,
${getDateQuery('website_event.created_at', 'hour')}, ${getDateQuery('website_event.created_at', 'day')},
count(*) as c, count(*) as "c",
${getTimestampIntervalQuery('website_event.created_at')} as "time" min(website_event.created_at) as "min_time",
max(website_event.created_at) as "max_time"
from website_event from website_event
join website join website
on website_event.website_id = website.website_id on website_event.website_id = website.website_id

View File

@ -35,7 +35,7 @@ async function relationalQuery(
}[] }[]
> { > {
const { windowMinutes, startDate, endDate, urls } = criteria; const { windowMinutes, startDate, endDate, urls } = criteria;
const { rawQuery, getAddMinutesQuery } = prisma; const { rawQuery, getAddIntervalQuery } = prisma;
const { levelQuery, sumQuery } = getFunnelQuery(urls, windowMinutes); const { levelQuery, sumQuery } = getFunnelQuery(urls, windowMinutes);
function getFunnelQuery( function getFunnelQuery(
@ -58,9 +58,9 @@ async function relationalQuery(
join website_event we join website_event we
on l.session_id = we.session_id on l.session_id = we.session_id
where we.website_id = {{websiteId::uuid}} where we.website_id = {{websiteId::uuid}}
and we.created_at between l.created_at and ${getAddMinutesQuery( and we.created_at between l.created_at and ${getAddIntervalQuery(
`l.created_at `, `l.created_at `,
windowMinutes, `${windowMinutes} minute`,
)} )}
and we.referrer_path = {{${i - 1}}} and we.referrer_path = {{${i - 1}}}
and we.url_path = {{${i}}} and we.url_path = {{${i}}}