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(
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<any> {
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,
};

View File

@ -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,