From cdf745b6b431aee5fa0785a60151efc7bdac3a35 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Thu, 27 Jul 2023 15:23:20 -0700 Subject: [PATCH] update funnel dynamic built query --- lib/prisma.ts | 30 ++------------------------ queries/analytics/reports/getFunnel.ts | 15 ++++--------- 2 files changed, 6 insertions(+), 39 deletions(-) diff --git a/lib/prisma.ts b/lib/prisma.ts index 2aa2193c..06b42acf 100644 --- a/lib/prisma.ts +++ b/lib/prisma.ts @@ -108,24 +108,6 @@ function parseFilters( }; } -function getFunnelParams(endDate: Date, websiteId: string, urls: string[]): any[] { - const db = getDatabaseType(process.env.DATABASE_URL); - - if (db === POSTGRESQL) { - return urls; - } - - if (db === MYSQL) { - let params = []; - params.push(urls[0]); - for (let i = 0; i < urls.length - 1; i++) { - params = params.concat([urls[i], urls[i + 1], endDate, websiteId]); - } - - return params; - } -} - function getFunnelQuery( urls: string[], endDate: Date, @@ -134,10 +116,7 @@ function getFunnelQuery( ): { levelQuery: string; sumQuery: string; - urlParams: any[]; } { - const initParamLength = 3; - return urls.reduce( (pv, cv, i) => { const levelNumber = i + 1; @@ -152,22 +131,20 @@ function getFunnelQuery( on l.session_id = we.session_id where we.created_at between l.created_at and ${getAddMinutesQuery(`l.created_at `, windowMinutes)} - and we.referrer_path = $${i + initParamLength} - and we.url_path = $${levelNumber + initParamLength} + and we.referrer_path = {{${i - 1}}} + and we.url_path = {{${i}}} and we.created_at <= {{endDate}} and we.website_id = {{websiteId}}${toUuid()} )`; } pv.sumQuery += `\n${startSum}select ${levelNumber} as level, count(distinct(session_id)) as count from level${levelNumber}`; - pv.urlParams = getFunnelParams(endDate, websiteId, urls); return pv; }, { levelQuery: '', sumQuery: '', - urlParams: [], }, ); } @@ -179,10 +156,8 @@ async function rawQuery(sql: string, data: object): Promise { if (db !== POSTGRESQL && db !== MYSQL) { return Promise.reject(new Error('Unknown database.')); } - const query = sql?.replaceAll(/\{\{\s*(\w+)(::\w+)?\s*}}/g, (...args) => { const [, name, type] = args; - params.push(data[name]); return db === MYSQL ? '?' : `$${params.length}${type ?? ''}`; @@ -199,7 +174,6 @@ export default { getFilterQuery, toUuid, parseFilters, - getFunnelParams, getFunnelQuery, rawQuery, }; diff --git a/queries/analytics/reports/getFunnel.ts b/queries/analytics/reports/getFunnel.ts index 9e1fd123..e1718e84 100644 --- a/queries/analytics/reports/getFunnel.ts +++ b/queries/analytics/reports/getFunnel.ts @@ -36,26 +36,19 @@ async function relationalQuery( > { const { windowMinutes, startDate, endDate, urls } = criteria; const { rawQuery, getFunnelQuery, toUuid } = prisma; - const { levelQuery, sumQuery, urlParams } = getFunnelQuery( - urls, - endDate, - websiteId, - windowMinutes, - ); - - const params: any = [websiteId, startDate, endDate, ...urlParams]; + const { levelQuery, sumQuery } = getFunnelQuery(urls, endDate, websiteId, windowMinutes); return rawQuery( `WITH level1 AS ( select distinct session_id, created_at from website_event where website_id = {{websiteId}}${toUuid()} - and created_at between {{startDate}} and {{endDate}} - and url_path = $4) + and created_at between {{startDate}} and {{endDate}} + and url_path = {{0}}) ${levelQuery} ${sumQuery} ORDER BY level;`, - params, + { websiteId, startDate, endDate, ...urls }, ).then(results => { return urls.map((a, i) => ({ x: a,