mirror of
https://github.com/umami-software/umami.git
synced 2026-02-14 09:35:36 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
6c79175077
2 changed files with 83 additions and 30 deletions
|
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" fill="none" viewBox="0 0 64 64"><path fill="#000" d="m56.4 47.6-6-6c-.8-.8-2-.8-2.8 0s-.8 2 0 2.8l2.6 2.6H18.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5h27C51.3 34 56 29.3 56 23.5S51.3 13 45.5 13H22.7c-.9-3.4-4-6-7.7-6-4.4 0-8 3.6-8 8s3.6 8 8 8c3.7 0 6.8-2.6 7.7-6h22.8c3.6 0 6.5 2.9 6.5 6.5S49.1 30 45.5 30h-27C12.7 30 8 34.7 8 40.5S12.7 51 18.5 51h31.7l-2.6 2.6c-.8.8-.8 2 0 2.8.4.4.9.6 1.4.6s1-.2 1.4-.6l6-6c.8-.8.8-2 0-2.8M15 19c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" fill="none" viewBox="0 0 64 64"><path d="m56.4 47.6-6-6c-.8-.8-2-.8-2.8 0s-.8 2 0 2.8l2.6 2.6H18.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5h27C51.3 34 56 29.3 56 23.5S51.3 13 45.5 13H22.7c-.9-3.4-4-6-7.7-6-4.4 0-8 3.6-8 8s3.6 8 8 8c3.7 0 6.8-2.6 7.7-6h22.8c3.6 0 6.5 2.9 6.5 6.5S49.1 30 45.5 30h-27C12.7 30 8 34.7 8 40.5S12.7 51 18.5 51h31.7l-2.6 2.6c-.8.8-.8 2 0 2.8.4.4.9.6 1.4.6s1-.2 1.4-.6l6-6c.8-.8.8-2 0-2.8M15 19c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4"/></svg>
|
||||||
|
Before Width: | Height: | Size: 550 B After Width: | Height: | Size: 538 B |
|
|
@ -36,46 +36,99 @@ async function relationalQuery(
|
||||||
filters: {
|
filters: {
|
||||||
startDate: Date;
|
startDate: Date;
|
||||||
endDate: Date;
|
endDate: Date;
|
||||||
|
steps: number;
|
||||||
|
startStep?: string;
|
||||||
|
endStep?: string;
|
||||||
},
|
},
|
||||||
): Promise<JourneyResult[]> {
|
): Promise<JourneyResult[]> {
|
||||||
const { startDate, endDate } = filters;
|
const { startDate, endDate, steps, startStep, endStep } = filters;
|
||||||
const { rawQuery } = prisma;
|
const { rawQuery } = prisma;
|
||||||
|
const { sequenceQuery, startStepQuery, endStepQuery, params } = getJourneyQuery(
|
||||||
|
steps,
|
||||||
|
startStep,
|
||||||
|
endStep,
|
||||||
|
);
|
||||||
|
|
||||||
|
function getJourneyQuery(
|
||||||
|
steps: number,
|
||||||
|
startStep?: string,
|
||||||
|
endStep?: string,
|
||||||
|
): {
|
||||||
|
sequenceQuery: string;
|
||||||
|
startStepQuery: string;
|
||||||
|
endStepQuery: string;
|
||||||
|
params: { [key: string]: string };
|
||||||
|
} {
|
||||||
|
const params = {};
|
||||||
|
let sequenceQuery = '';
|
||||||
|
let startStepQuery = '';
|
||||||
|
let endStepQuery = '';
|
||||||
|
|
||||||
|
// create sequence query
|
||||||
|
let selectQuery = '';
|
||||||
|
let maxQuery = '';
|
||||||
|
let groupByQuery = '';
|
||||||
|
|
||||||
|
for (let i = 1; i <= steps; i++) {
|
||||||
|
const endQuery = i < steps ? ',' : '';
|
||||||
|
selectQuery += `s.e${i},`;
|
||||||
|
maxQuery += `\nmax(CASE WHEN event_number = ${i} THEN event ELSE NULL END) AS e${i}${endQuery}`;
|
||||||
|
groupByQuery += `s.e${i}${endQuery} `;
|
||||||
|
}
|
||||||
|
|
||||||
|
sequenceQuery = `\nsequences as (
|
||||||
|
select ${selectQuery}
|
||||||
|
count(*) count
|
||||||
|
FROM (
|
||||||
|
select visit_id,
|
||||||
|
${maxQuery}
|
||||||
|
FROM events
|
||||||
|
group by visit_id) s
|
||||||
|
group by ${groupByQuery})
|
||||||
|
`;
|
||||||
|
|
||||||
|
// create start Step params query
|
||||||
|
if (startStep) {
|
||||||
|
startStepQuery = `and e1 = {{startStep}}`;
|
||||||
|
params['startStep'] = startStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create end Step params query
|
||||||
|
if (endStep) {
|
||||||
|
for (let i = 1; i < steps; i++) {
|
||||||
|
const startQuery = i === 1 ? 'and (' : '\nor ';
|
||||||
|
endStepQuery += `${startQuery}(e${i} = {{endStep}} and e${i + 1} is null) `;
|
||||||
|
}
|
||||||
|
endStepQuery += `\nor (e${steps} = {{endStep}}))`;
|
||||||
|
|
||||||
|
params['endStep'] = endStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
sequenceQuery,
|
||||||
|
startStepQuery,
|
||||||
|
endStepQuery,
|
||||||
|
params,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return rawQuery(
|
return rawQuery(
|
||||||
`
|
`
|
||||||
WITH events AS (
|
WITH events AS (
|
||||||
select distinct
|
select distinct
|
||||||
session_id,
|
visit_id,
|
||||||
referrer_path,
|
referrer_path,
|
||||||
COALESCE(event_name, url_path) event,
|
coalesce(nullIf(event_name, ''), url_path) event,
|
||||||
ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at) AS event_number
|
row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number
|
||||||
from website_event
|
from website_event
|
||||||
where website_id = {{websiteId::uuid}}
|
where website_id = {{websiteId::uuid}}
|
||||||
and created_at between {{startDate}} and {{endDate}}
|
and created_at between {{startDate}} and {{endDate}}),
|
||||||
and referrer_path != url_path),
|
${sequenceQuery}
|
||||||
sequences as (
|
|
||||||
select s.e1,
|
|
||||||
s.e2,
|
|
||||||
s.e3,
|
|
||||||
s.e4,
|
|
||||||
s.e5,
|
|
||||||
count(*) count
|
|
||||||
FROM (
|
|
||||||
select session_id,
|
|
||||||
MAX(CASE WHEN event_number = 1 THEN event ELSE NULL END) AS e1,
|
|
||||||
MAX(CASE WHEN event_number = 2 THEN event ELSE NULL END) AS e2,
|
|
||||||
MAX(CASE WHEN event_number = 3 THEN event ELSE NULL END) AS e3,
|
|
||||||
MAX(CASE WHEN event_number = 4 THEN event ELSE NULL END) AS e4,
|
|
||||||
MAX(CASE WHEN event_number = 5 THEN event ELSE NULL END) AS e5
|
|
||||||
FROM events
|
|
||||||
group by session_id) s
|
|
||||||
group by s.e1,
|
|
||||||
s.e2,
|
|
||||||
s.e3,
|
|
||||||
s.e4,
|
|
||||||
s.e5)
|
|
||||||
select *
|
select *
|
||||||
from sequences
|
from sequences
|
||||||
|
where 1 = 1
|
||||||
|
${startStepQuery}
|
||||||
|
${endStepQuery}
|
||||||
order by count desc
|
order by count desc
|
||||||
limit 100
|
limit 100
|
||||||
`,
|
`,
|
||||||
|
|
@ -83,6 +136,7 @@ async function relationalQuery(
|
||||||
websiteId,
|
websiteId,
|
||||||
startDate,
|
startDate,
|
||||||
endDate,
|
endDate,
|
||||||
|
...params,
|
||||||
},
|
},
|
||||||
).then(parseResult);
|
).then(parseResult);
|
||||||
}
|
}
|
||||||
|
|
@ -173,7 +227,6 @@ async function clickhouseQuery(
|
||||||
WITH events AS (
|
WITH events AS (
|
||||||
select distinct
|
select distinct
|
||||||
visit_id,
|
visit_id,
|
||||||
referrer_path,
|
|
||||||
coalesce(nullIf(event_name, ''), url_path) event,
|
coalesce(nullIf(event_name, ''), url_path) event,
|
||||||
row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number
|
row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number
|
||||||
from umami.website_event
|
from umami.website_event
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue