mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-14 21:10:34 +01:00
build mysql funnel params
This commit is contained in:
parent
5a0908964c
commit
70367ffcc4
@ -32,7 +32,7 @@ function toUuid(): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAddMinutesQuery(field: string, minutes: number) {
|
function getAddMinutesQuery(field: string, minutes: number): string {
|
||||||
const db = getDatabaseType(process.env.DATABASE_URL);
|
const db = getDatabaseType(process.env.DATABASE_URL);
|
||||||
|
|
||||||
if (db === POSTGRESQL) {
|
if (db === POSTGRESQL) {
|
||||||
@ -134,13 +134,49 @@ function getFilterQuery(filters = {}, params = []): string {
|
|||||||
return query.join('\n');
|
return query.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseFilters(
|
||||||
|
filters: { [key: string]: any } = {},
|
||||||
|
params = [],
|
||||||
|
sessionKey = 'session_id',
|
||||||
|
) {
|
||||||
|
const { os, browser, device, country, region, city } = filters;
|
||||||
|
|
||||||
|
return {
|
||||||
|
joinSession:
|
||||||
|
os || browser || device || country || region || city
|
||||||
|
? `inner join session on website_event.${sessionKey} = session.${sessionKey}`
|
||||||
|
: '',
|
||||||
|
filterQuery: getFilterQuery(filters, params),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
|
websiteId: string,
|
||||||
windowMinutes: number,
|
windowMinutes: number,
|
||||||
): {
|
): {
|
||||||
levelQuery: string;
|
levelQuery: string;
|
||||||
sumQuery: string;
|
sumQuery: string;
|
||||||
urlFilterQuery: string;
|
urlParams: any[];
|
||||||
} {
|
} {
|
||||||
const initParamLength = 3;
|
const initParamLength = 3;
|
||||||
|
|
||||||
@ -148,7 +184,6 @@ function getFunnelQuery(
|
|||||||
(pv, cv, i) => {
|
(pv, cv, i) => {
|
||||||
const levelNumber = i + 1;
|
const levelNumber = i + 1;
|
||||||
const startSum = i > 0 ? 'union ' : '';
|
const startSum = i > 0 ? 'union ' : '';
|
||||||
const startFilter = i > 0 ? ', ' : '';
|
|
||||||
|
|
||||||
if (levelNumber >= 2) {
|
if (levelNumber >= 2) {
|
||||||
pv.levelQuery += `\n
|
pv.levelQuery += `\n
|
||||||
@ -167,35 +202,18 @@ function getFunnelQuery(
|
|||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
pv.urlFilterQuery += `${startFilter}$${levelNumber + initParamLength} `;
|
|
||||||
|
|
||||||
return pv;
|
return pv;
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
levelQuery: '',
|
levelQuery: '',
|
||||||
sumQuery: '',
|
sumQuery: '',
|
||||||
urlFilterQuery: '',
|
urlParams: [],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseFilters(
|
|
||||||
filters: { [key: string]: any } = {},
|
|
||||||
params = [],
|
|
||||||
sessionKey = 'session_id',
|
|
||||||
) {
|
|
||||||
const { os, browser, device, country, region, city } = filters;
|
|
||||||
|
|
||||||
return {
|
|
||||||
joinSession:
|
|
||||||
os || browser || device || country || region || city
|
|
||||||
? `inner join session on website_event.${sessionKey} = session.${sessionKey}`
|
|
||||||
: '',
|
|
||||||
filterQuery: getFilterQuery(filters, params),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async function rawQuery(query: string, params: never[] = []): Promise<any> {
|
async function rawQuery(query: string, params: never[] = []): Promise<any> {
|
||||||
const db = getDatabaseType(process.env.DATABASE_URL);
|
const db = getDatabaseType(process.env.DATABASE_URL);
|
||||||
|
|
||||||
@ -214,9 +232,10 @@ export default {
|
|||||||
getDateQuery,
|
getDateQuery,
|
||||||
getTimestampInterval,
|
getTimestampInterval,
|
||||||
getFilterQuery,
|
getFilterQuery,
|
||||||
getFunnelQuery,
|
|
||||||
getEventDataFilterQuery,
|
getEventDataFilterQuery,
|
||||||
toUuid,
|
toUuid,
|
||||||
parseFilters,
|
parseFilters,
|
||||||
|
getFunnelParams,
|
||||||
|
getFunnelQuery,
|
||||||
rawQuery,
|
rawQuery,
|
||||||
};
|
};
|
||||||
|
@ -36,16 +36,20 @@ 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, urlFilterQuery } = getFunnelQuery(urls, windowMinutes);
|
const { levelQuery, sumQuery, urlParams } = getFunnelQuery(
|
||||||
|
urls,
|
||||||
|
endDate,
|
||||||
|
websiteId,
|
||||||
|
windowMinutes,
|
||||||
|
);
|
||||||
|
|
||||||
const params: any = [websiteId, startDate, endDate, ...urls];
|
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 url_path in (${urlFilterQuery})
|
where website_id = $1${toUuid()}
|
||||||
and website_id = $1${toUuid()}
|
|
||||||
and created_at between $2 and $3
|
and created_at between $2 and $3
|
||||||
and url_path = $4)
|
and url_path = $4)
|
||||||
${levelQuery}
|
${levelQuery}
|
||||||
|
Loading…
Reference in New Issue
Block a user