mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-14 21:10:34 +01:00
update funnel dynamic built query
This commit is contained in:
parent
a03574e8d4
commit
cdf745b6b4
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -36,26 +36,19 @@ 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 (
|
||||||
select distinct session_id, created_at
|
select distinct session_id, created_at
|
||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user