update funnel dynamic built query

This commit is contained in:
Francis Cao 2023-07-27 15:23:20 -07:00
parent a03574e8d4
commit cdf745b6b4
2 changed files with 6 additions and 39 deletions

View File

@ -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( function getFunnelQuery(
urls: string[], urls: string[],
endDate: Date, endDate: Date,
@ -134,10 +116,7 @@ function getFunnelQuery(
): { ): {
levelQuery: string; levelQuery: string;
sumQuery: string; sumQuery: string;
urlParams: any[];
} { } {
const initParamLength = 3;
return urls.reduce( return urls.reduce(
(pv, cv, i) => { (pv, cv, i) => {
const levelNumber = i + 1; const levelNumber = i + 1;
@ -152,22 +131,20 @@ function getFunnelQuery(
on l.session_id = we.session_id on l.session_id = we.session_id
where we.created_at between l.created_at where we.created_at between l.created_at
and ${getAddMinutesQuery(`l.created_at `, windowMinutes)} and ${getAddMinutesQuery(`l.created_at `, windowMinutes)}
and we.referrer_path = $${i + initParamLength} and we.referrer_path = {{${i - 1}}}
and we.url_path = $${levelNumber + initParamLength} and we.url_path = {{${i}}}
and we.created_at <= {{endDate}} and we.created_at <= {{endDate}}
and we.website_id = {{websiteId}}${toUuid()} and we.website_id = {{websiteId}}${toUuid()}
)`; )`;
} }
pv.sumQuery += `\n${startSum}select ${levelNumber} as level, count(distinct(session_id)) as count from level${levelNumber}`; 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; return pv;
}, },
{ {
levelQuery: '', levelQuery: '',
sumQuery: '', sumQuery: '',
urlParams: [],
}, },
); );
} }
@ -179,10 +156,8 @@ async function rawQuery(sql: string, data: object): Promise<any> {
if (db !== POSTGRESQL && db !== MYSQL) { if (db !== POSTGRESQL && db !== MYSQL) {
return Promise.reject(new Error('Unknown database.')); return Promise.reject(new Error('Unknown database.'));
} }
const query = sql?.replaceAll(/\{\{\s*(\w+)(::\w+)?\s*}}/g, (...args) => { const query = sql?.replaceAll(/\{\{\s*(\w+)(::\w+)?\s*}}/g, (...args) => {
const [, name, type] = args; const [, name, type] = args;
params.push(data[name]); params.push(data[name]);
return db === MYSQL ? '?' : `$${params.length}${type ?? ''}`; return db === MYSQL ? '?' : `$${params.length}${type ?? ''}`;
@ -199,7 +174,6 @@ export default {
getFilterQuery, getFilterQuery,
toUuid, toUuid,
parseFilters, parseFilters,
getFunnelParams,
getFunnelQuery, getFunnelQuery,
rawQuery, rawQuery,
}; };

View File

@ -36,14 +36,7 @@ async function relationalQuery(
> { > {
const { windowMinutes, startDate, endDate, urls } = criteria; const { windowMinutes, startDate, endDate, urls } = criteria;
const { rawQuery, getFunnelQuery, toUuid } = prisma; const { rawQuery, getFunnelQuery, toUuid } = prisma;
const { levelQuery, sumQuery, urlParams } = getFunnelQuery( const { levelQuery, sumQuery } = getFunnelQuery(urls, endDate, websiteId, windowMinutes);
urls,
endDate,
websiteId,
windowMinutes,
);
const params: any = [websiteId, startDate, endDate, ...urlParams];
return rawQuery( return rawQuery(
`WITH level1 AS ( `WITH level1 AS (
@ -51,11 +44,11 @@ async function relationalQuery(
from website_event from website_event
where website_id = {{websiteId}}${toUuid()} where website_id = {{websiteId}}${toUuid()}
and created_at between {{startDate}} and {{endDate}} and created_at between {{startDate}} and {{endDate}}
and url_path = $4) and url_path = {{0}})
${levelQuery} ${levelQuery}
${sumQuery} ${sumQuery}
ORDER BY level;`, ORDER BY level;`,
params, { websiteId, startDate, endDate, ...urls },
).then(results => { ).then(results => {
return urls.map((a, i) => ({ return urls.map((a, i) => ({
x: a, x: a,