mirror of
https://github.com/kremalicious/umami.git
synced 2024-11-22 18:00:17 +01:00
match cloud stats in self hosted
This commit is contained in:
parent
8a4623eb7b
commit
76a5ac8e46
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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}}}
|
||||||
|
Loading…
Reference in New Issue
Block a user