Merge branch 'dev' of https://github.com/umami-software/umami into feat/um-376-retention-report

This commit is contained in:
Francis Cao 2023-08-07 14:04:05 -07:00
commit fc5a1f458b
23 changed files with 156 additions and 168 deletions

View file

@ -14,10 +14,10 @@ export async function getEventDataEvents(
async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { rawQuery, parseFilters } = prisma;
const { eventName } = filters;
const { event } = filters;
const { params } = await parseFilters(websiteId, filters);
if (eventName) {
if (event) {
return rawQuery(
`
select
@ -31,7 +31,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
on website_event.event_id = event_data.website_event_id
where event_data.website_id = {{websiteId::uuid}}
and event_data.created_at between {{startDate}} and {{endDate}}
and websit_event.event_name = {{eventName}}
and website_event.event_name = {{event}}
group by website_event.event_name, event_data.event_key, event_data.data_type, event_data.string_value
order by 1 asc, 2 asc, 3 asc, 4 desc
`,
@ -61,10 +61,10 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
const { rawQuery, parseFilters } = clickhouse;
const { eventName } = filters;
const { event } = filters;
const { params } = await parseFilters(websiteId, filters);
if (eventName) {
if (event) {
return rawQuery(
`
select
@ -76,7 +76,7 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
from event_data
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime} and {endDate:DateTime}
and event_name = {eventName:String}
and event_name = {event:String}
group by event_key, data_type, string_value, event_name
order by 1 asc, 2 asc, 3 asc, 4 desc
limit 100

View file

@ -14,39 +14,23 @@ export async function getEventDataFields(
async function relationalQuery(websiteId: string, filters: QueryFilters & { field?: string }) {
const { rawQuery, parseFilters } = prisma;
const { field } = filters;
const { params } = await parseFilters(websiteId, filters);
if (field) {
return rawQuery(
`
select
event_key as field,
string_value as value,
count(*) as total
from event_data
where website_id = {{websiteId::uuid}}
and event_key = {{field}}
and created_at between {{startDate}} and {{endDate}}
group by event_key, string_value
order by 3 desc, 2 desc, 1 asc
limit 100
`,
params,
);
}
const { filterQuery, params } = await parseFilters(websiteId, filters, {
columns: { field: 'event_key' },
});
return rawQuery(
`
select
event_key as field,
data_type as type,
event_key as fieldName,
data_type as dataType,
string_value as fieldValue,
count(*) as total
from event_data
where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}}
group by event_key, data_type
order by 3 desc, 2 asc, 1 asc
${filterQuery}
group by event_key, data_type, string_value
order by 3 desc, 2 desc, 1 asc
limit 100
`,
params,
@ -55,39 +39,23 @@ async function relationalQuery(websiteId: string, filters: QueryFilters & { fiel
async function clickhouseQuery(websiteId: string, filters: QueryFilters & { field?: string }) {
const { rawQuery, parseFilters } = clickhouse;
const { field } = filters;
const { params } = await parseFilters(websiteId, filters);
if (field) {
return rawQuery(
`
select
event_key as field,
string_value as value,
count(*) as total
from event_data
where website_id = {websiteId:UUID}
and event_key = {field:String}
and created_at between {startDate:DateTime} and {endDate:DateTime}
group by event_key, string_value
order by 3 desc, 2 desc, 1 asc
limit 100
`,
params,
);
}
const { filterQuery, params } = await parseFilters(websiteId, filters, {
columns: { field: 'event_key' },
});
return rawQuery(
`
select
event_key as field,
data_type as type,
event_key as fieldName,
data_type as dataType,
string_value as fieldValue,
count(*) as total
from event_data
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime} and {endDate:DateTime}
group by event_key, data_type
order by 3 desc, 2 asc, 1 asc
${filterQuery}
group by event_key, data_type, string_value
order by 3 desc, 2 desc, 1 asc
limit 100
`,
params,

View file

@ -4,7 +4,9 @@ import clickhouse from 'lib/clickhouse';
import { EVENT_TYPE } from 'lib/constants';
import { QueryFilters } from 'lib/types';
export async function getInsights(...args: [websiteId: string, filters: QueryFilters]) {
export async function getInsights(
...args: [websiteId: string, groups: { name: string; type: string }[], filters: QueryFilters]
) {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
[CLICKHOUSE]: () => clickhouseQuery(...args),
@ -13,6 +15,7 @@ export async function getInsights(...args: [websiteId: string, filters: QueryFil
async function relationalQuery(
websiteId: string,
groups: { name: string; type: string }[],
filters: QueryFilters,
): Promise<
{
@ -45,6 +48,7 @@ async function relationalQuery(
async function clickhouseQuery(
websiteId: string,
groups: { name: string; type: string }[],
filters: QueryFilters,
): Promise<
{
@ -53,7 +57,6 @@ async function clickhouseQuery(
}[]
> {
const { parseFilters, rawQuery } = clickhouse;
const { fields } = filters;
const { filterQuery, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.pageView,
@ -62,14 +65,14 @@ async function clickhouseQuery(
return rawQuery(
`
select
${parseFields(fields)}
${parseFields(groups)}
from website_event
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime} and {endDate:DateTime}
and event_type = {eventType:UInt32}
${filterQuery}
group by ${fields.map(({ name }) => name).join(',')}
order by total desc
group by ${groups.map(({ name }) => name).join(',')}
order by 1 desc
limit 500
`,
params,
@ -77,22 +80,14 @@ async function clickhouseQuery(
}
function parseFields(fields) {
let count = false;
let distinct = false;
const query = fields.reduce(
(arr, field) => {
const { name } = field;
const query = fields.reduce((arr, field) => {
const { name, value } = field;
if (!count && value === 'total') {
count = true;
arr = arr.concat(`count(*) as views`);
} else if (!distinct && value === 'unique') {
distinct = true;
//arr = arr.concat(`count(distinct ${name})`);
}
return arr.concat(name);
}, []);
return arr.concat(name);
},
['count(*) as views', 'count(distinct session_id) as visitors'],
);
return query.join(',\n');
}