diff --git a/lib/db.js b/lib/db.js index 08e76261..10a08296 100644 --- a/lib/db.js +++ b/lib/db.js @@ -29,7 +29,7 @@ function logQuery(e) { console.log(chalk.yellow(e.params), '->', e.query, chalk.greenBright(`${e.duration}ms`)); } -function initializePrisma(options) { +function getPrismaClient(options) { const prisma = new PrismaClient(options); if (process.env.LOG_QUERY) { @@ -39,7 +39,7 @@ function initializePrisma(options) { return prisma; } -function initializeClickhouse() { +function getClickhouseClient() { if (!process.env.ANALYTICS_URL) { return null; } @@ -63,8 +63,8 @@ function initializeClickhouse() { }); } -const prisma = global.prisma || initializePrisma(options); -const clickhouse = global.clickhouse || initializeClickhouse(); +const prisma = global.prisma || getPrismaClient(options); +const clickhouse = global.clickhouse || getClickhouseClient(); if (process.env.NODE_ENV !== 'production') { global.prisma = prisma; @@ -142,15 +142,15 @@ export function getBetweenDatesClickhouse(field, start_at, end_at) { and ${getDateFormatClickhouse(end_at)}`; } -export function getTimestampInterval(maxColumn, minColumn) { +export function getTimestampInterval(field) { const db = getDatabase(); if (db === POSTGRESQL) { - return `floor(extract(epoch from (${maxColumn}) - (${minColumn})))`; + return `floor(extract(epoch from max(${field}) - min(${field})))`; } if (db === MYSQL) { - return `floor(unix_timestamp(${maxColumn}) - unix_timestamp(${minColumn}))`; + return `floor(unix_timestamp(max(${field})) - unix_timestamp(min(${field})))`; } } diff --git a/queries/analytics/pageview/getPageviewStats.js b/queries/analytics/pageview/getPageviewStats.js index 1cca2fca..0a320074 100644 --- a/queries/analytics/pageview/getPageviewStats.js +++ b/queries/analytics/pageview/getPageviewStats.js @@ -38,7 +38,7 @@ async function relationalQuery( return rawQuery( ` select ${getDateQuery('pageview.created_at', unit, timezone)} t, - count(${count != '*' ? `${count}${sessionKey}` : count}) y + count(${count !== '*' ? `${count}${sessionKey}` : count}) y from pageview ${joinSession} where pageview.website_id=$1 @@ -78,7 +78,7 @@ async function clickhouseQuery( from (select ${getDateQueryClickhouse('created_at', unit, timezone)} t, - count(${count != '*' ? `${count}${sessionKey}` : count}) y + count(${count !== '*' ? `${count}${sessionKey}` : count}) y from pageview ${joinSession} where pageview.website_id= $1 diff --git a/queries/analytics/stats/getWebsiteStats.js b/queries/analytics/stats/getWebsiteStats.js index 53e90b51..9328b85b 100644 --- a/queries/analytics/stats/getWebsiteStats.js +++ b/queries/analytics/stats/getWebsiteStats.js @@ -31,24 +31,19 @@ async function relationalQuery(website_id, start_at, end_at, filters = {}) { select sum(t.c) as "pageviews", count(distinct t.session_id) as "uniques", sum(case when t.c = 1 then 1 else 0 end) as "bounces", - sum(case when m2 < m1 + interval '1 hour' then ${getTimestampInterval( - 'm2', - 'm1', - )} else 0 end) as "totaltime" + sum(t.time) as "totaltime" from ( - select - pageview.session_id, - ${getDateQuery('pageview.created_at', 'hour')}, - count(*) c, - min(created_at) m1, - max(created_at) m2 - from pageview - ${joinSession} - where pageview.website_id=$1 - and pageview.created_at between $2 and $3 - ${pageviewQuery} - ${sessionQuery} - group by 1, 2 + select pageview.session_id, + ${getDateQuery('pageview.created_at', 'hour')}, + count(*) c, + ${getTimestampInterval('pageview.created_at')} as "time" + from pageview + ${joinSession} + where pageview.website_id=$1 + and pageview.created_at between $2 and $3 + ${pageviewQuery} + ${sessionQuery} + group by 1, 2 ) t `, params,