New event data screen.

This commit is contained in:
Mike Cao 2024-08-09 01:09:54 -07:00
parent 10c438d1de
commit 8ee37d1246
137 changed files with 4918 additions and 321 deletions

View file

@ -22,9 +22,9 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
`
select
website_event.event_name as "eventName",
event_data.data_key as "fieldName",
event_data.data_key as "propertyName",
event_data.data_type as "dataType",
event_data.string_value as "fieldValue",
event_data.string_value as "propertyValue",
count(*) as "total"
from event_data
inner join website_event
@ -43,7 +43,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
`
select
website_event.event_name as "eventName",
event_data.data_key as "fieldName",
event_data.data_key as "propertyName",
event_data.data_type as "dataType",
count(*) as "total"
from event_data
@ -62,7 +62,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
async function clickhouseQuery(
websiteId: string,
filters: QueryFilters,
): Promise<{ eventName: string; fieldName: string; dataType: number; total: number }[]> {
): Promise<{ eventName: string; propertyName: string; dataType: number; total: number }[]> {
const { rawQuery, parseFilters } = clickhouse;
const { event } = filters;
const { params } = await parseFilters(websiteId, filters);
@ -72,9 +72,9 @@ async function clickhouseQuery(
`
select
event_name as eventName,
data_key as fieldName,
data_key as propertyName,
data_type as dataType,
string_value as fieldValue,
string_value as propertyValue,
count(*) as total
from event_data
where website_id = {websiteId:UUID}
@ -89,9 +89,9 @@ async function clickhouseQuery(
return Object.values(result).map((a: any) => {
return {
eventName: a.eventName,
fieldName: a.fieldName,
propertyName: a.propertyName,
dataType: Number(a.dataType),
fieldValue: a.fieldValue,
propertyValue: a.propertyValue,
total: Number(a.total),
};
});
@ -102,7 +102,7 @@ async function clickhouseQuery(
`
select
event_name as eventName,
data_key as fieldName,
data_key as propertyName,
data_type as dataType,
count(*) as total
from event_data
@ -117,7 +117,7 @@ async function clickhouseQuery(
return Object.values(result).map((a: any) => {
return {
eventName: a.eventName,
fieldName: a.fieldName,
propertyName: a.propertyName,
dataType: Number(a.dataType),
total: Number(a.total),
};

View file

@ -3,8 +3,8 @@ import clickhouse from 'lib/clickhouse';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
import { QueryFilters, WebsiteEventData } from 'lib/types';
export async function getEventDataFields(
...args: [websiteId: string, filters: QueryFilters & { field?: string }]
export async function getEventDataProperties(
...args: [websiteId: string, filters: QueryFilters & { propertyName?: string }]
): Promise<WebsiteEventData[]> {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
@ -12,25 +12,26 @@ export async function getEventDataFields(
});
}
async function relationalQuery(websiteId: string, filters: QueryFilters & { field?: string }) {
async function relationalQuery(
websiteId: string,
filters: QueryFilters & { propertyName?: string },
) {
const { rawQuery, parseFilters } = prisma;
const { filterQuery, params } = await parseFilters(websiteId, filters, {
columns: { field: 'data_key' },
columns: { propertyName: 'data_key' },
});
return rawQuery(
`
select
data_key as "fieldName",
data_type as "dataType",
string_value as "fieldValue",
data_key as "propertyName",
count(*) as "total"
from event_data
where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}}
${filterQuery}
group by data_key, data_type, string_value
order by 3 desc, 2 desc, 1 asc
group by data_key
order by 2 desc
limit 500
`,
params,
@ -39,35 +40,33 @@ async function relationalQuery(websiteId: string, filters: QueryFilters & { fiel
async function clickhouseQuery(
websiteId: string,
filters: QueryFilters & { field?: string },
): Promise<{ fieldName: string; dataType: number; fieldValue: string; total: number }[]> {
filters: QueryFilters & { propertyName?: string },
): Promise<{ propertyName: string; dataType: number; propertyValue: string; total: number }[]> {
const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, params } = await parseFilters(websiteId, filters, {
columns: { field: 'data_key' },
columns: { propertyName: 'data_key' },
});
return rawQuery(
`
select
data_key as fieldName,
data_type as dataType,
string_value as fieldValue,
data_key as propertyName,
count(*) as total
from event_data
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
${filterQuery}
group by data_key, data_type, string_value
order by 3 desc, 2 desc, 1 asc
group by data_key
order by 2 desc
limit 500
`,
params,
).then(result => {
return Object.values(result).map((a: any) => {
return {
fieldName: a.fieldName,
propertyName: a.propertyName,
dataType: Number(a.dataType),
fieldValue: a.fieldValue,
propertyValue: a.propertyValue,
total: Number(a.total),
};
});

View file

@ -7,7 +7,7 @@ export async function getEventDataStats(
...args: [websiteId: string, filters: QueryFilters]
): Promise<{
events: number;
fields: number;
properties: number;
records: number;
}> {
return runQuery({
@ -24,7 +24,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
`
select
count(distinct t.website_event_id) as "events",
count(distinct t.data_key) as "fields",
count(distinct t.data_key) as "properties",
sum(t.total) as "records"
from (
select
@ -45,7 +45,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
async function clickhouseQuery(
websiteId: string,
filters: QueryFilters,
): Promise<{ events: number; fields: number; records: number }[]> {
): Promise<{ events: number; properties: number; records: number }[]> {
const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, params } = await parseFilters(websiteId, filters);
@ -53,7 +53,7 @@ async function clickhouseQuery(
`
select
count(distinct t.event_id) as "events",
count(distinct t.data_key) as "fields",
count(distinct t.data_key) as "properties",
sum(t.total) as "records"
from (
select
@ -72,7 +72,7 @@ async function clickhouseQuery(
return Object.values(result).map((a: any) => {
return {
events: Number(a.events),
fields: Number(a.fields),
properties: Number(a.properties),
records: Number(a.records),
};
});

View file

@ -0,0 +1,70 @@
import prisma from 'lib/prisma';
import clickhouse from 'lib/clickhouse';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
import { QueryFilters, WebsiteEventData } from 'lib/types';
export async function getEventDataValues(
...args: [websiteId: string, filters: QueryFilters & { propertyName?: string }]
): Promise<WebsiteEventData[]> {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
[CLICKHOUSE]: () => clickhouseQuery(...args),
});
}
async function relationalQuery(
websiteId: string,
filters: QueryFilters & { propertyName?: string },
) {
const { rawQuery, parseFilters } = prisma;
const { filterQuery, params } = await parseFilters(websiteId, filters);
return rawQuery(
`
select
string_value as "value",
count(*) as "total"
from event_data
where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}}
and data_key = {{propertyName}}
${filterQuery}
group by string_value
order by 2 desc
limit 500
`,
params,
);
}
async function clickhouseQuery(
websiteId: string,
filters: QueryFilters & { propertyName?: string },
): Promise<{ propertyName: string; dataType: number; propertyValue: string; total: number }[]> {
const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, params } = await parseFilters(websiteId, filters);
return rawQuery(
`
select
string_value as "value",
count(*) as "total"
from event_data
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and data_key = {propertyName:String}
${filterQuery}
group by string_value
order by 2 desc
limit 500
`,
params,
).then(result => {
return Object.values(result).map((a: any) => {
return {
...a,
total: Number(a.total),
};
});
});
}

View file

@ -4,7 +4,8 @@ export * from 'queries/prisma/teamUser';
export * from 'queries/prisma/user';
export * from 'queries/prisma/website';
export * from './analytics/events/getEventDataEvents';
export * from './analytics/events/getEventDataFields';
export * from './analytics/events/getEventDataProperties';
export * from './analytics/events/getEventDataValues';
export * from './analytics/events/getEventDataStats';
export * from './analytics/events/getEventDataUsage';
export * from './analytics/events/getEventMetrics';