Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Mike Cao 2025-08-21 01:33:43 -07:00
commit 3a332b5947
40 changed files with 354 additions and 177 deletions

View file

@ -7,7 +7,7 @@ import { BoardAddButton } from './BoardAddButton';
export function BoardsPage() { export function BoardsPage() {
return ( return (
<PageBody> <PageBody>
<Column> <Column margin="2">
<PageHeader title="My Boards"> <PageHeader title="My Boards">
<BoardAddButton /> <BoardAddButton />
</PageHeader> </PageHeader>

View file

@ -13,7 +13,7 @@ export function LinksPage() {
return ( return (
<PageBody> <PageBody>
<Column gap="6"> <Column gap="6" margin="2">
<PageHeader title={formatMessage(labels.links)}> <PageHeader title={formatMessage(labels.links)}>
<LinkAddButton teamId={teamId} /> <LinkAddButton teamId={teamId} />
</PageHeader> </PageHeader>

View file

@ -13,7 +13,7 @@ export function PixelsPage() {
return ( return (
<PageBody> <PageBody>
<Column gap="6"> <Column gap="6" margin="2">
<PageHeader title={formatMessage(labels.pixels)}> <PageHeader title={formatMessage(labels.pixels)}>
<PixelAddButton teamId={teamId} /> <PixelAddButton teamId={teamId} />
</PageHeader> </PageHeader>

View file

@ -13,7 +13,7 @@ export function WebsitesPage() {
return ( return (
<PageBody> <PageBody>
<Column gap="6"> <Column gap="6" margin="2">
<PageHeader title={formatMessage(labels.websites)}> <PageHeader title={formatMessage(labels.websites)}>
<WebsiteAddButton teamId={teamId} /> <WebsiteAddButton teamId={teamId} />
</PageHeader> </PageHeader>

View file

@ -11,7 +11,7 @@ export function RevenuePage({ websiteId }: { websiteId: string }) {
return ( return (
<Column gap> <Column gap>
<WebsiteControls websiteId={websiteId} allowFilter={false} /> <WebsiteControls websiteId={websiteId} />
<Revenue websiteId={websiteId} startDate={startDate} endDate={endDate} /> <Revenue websiteId={websiteId} startDate={startDate} endDate={endDate} />
</Column> </Column>
); );

View file

@ -19,7 +19,7 @@ export function CohortDeleteButton({
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { del, useMutation } = useApi(); const { del, useMutation } = useApi();
const { mutate, isPending, error } = useMutation({ const { mutate, isPending, error } = useMutation({
mutationFn: () => del(`/websites/${websiteId}/cohorts/${cohortId}`), mutationFn: () => del(`/websites/${websiteId}/segments/${cohortId}`),
}); });
const { touch } = useModified(); const { touch } = useModified();

View file

@ -1,6 +1,6 @@
import { canUpdateWebsite, canViewWebsite } from '@/validations'; import { canUpdateWebsite, canViewWebsite } from '@/validations';
import { uuid } from '@/lib/crypto'; import { uuid } from '@/lib/crypto';
import { parseRequest } from '@/lib/request'; import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response'; import { json, unauthorized } from '@/lib/response';
import { segmentTypeParam, searchParams } from '@/lib/schema'; import { segmentTypeParam, searchParams } from '@/lib/schema';
import { createSegment, getWebsiteSegments } from '@/queries'; import { createSegment, getWebsiteSegments } from '@/queries';
@ -28,7 +28,9 @@ export async function GET(
return unauthorized(); return unauthorized();
} }
const segments = await getWebsiteSegments(websiteId, type); const filters = await getQueryFilters(query);
const segments = await getWebsiteSegments(websiteId, type, filters);
return json(segments); return json(segments);
} }

View file

@ -16,7 +16,7 @@ export function useWebsiteCohortsQuery(
return useQuery({ return useQuery({
queryKey: ['website:cohorts', { websiteId, modified, ...filters, ...params }], queryKey: ['website:cohorts', { websiteId, modified, ...filters, ...params }],
queryFn: pageParams => { queryFn: pageParams => {
return get(`/websites/${websiteId}/cohorts`, { ...pageParams, ...filters, ...params }); return get(`/websites/${websiteId}/segments`, { ...pageParams, ...filters, ...params });
}, },
enabled: !!websiteId, enabled: !!websiteId,
placeholderData: keepPreviousData, placeholderData: keepPreviousData,

View file

@ -15,7 +15,8 @@ export function useWebsiteSegmentsQuery(
return useQuery({ return useQuery({
queryKey: ['website:segments', { websiteId, modified, ...filters, ...params }], queryKey: ['website:segments', { websiteId, modified, ...filters, ...params }],
queryFn: () => get(`/websites/${websiteId}/segments`, { ...filters, ...params }), queryFn: pageParams =>
get(`/websites/${websiteId}/segments`, { ...pageParams, ...filters, ...params }),
enabled: !!websiteId, enabled: !!websiteId,
placeholderData: keepPreviousData, placeholderData: keepPreviousData,
...options, ...options,

View file

@ -1,5 +1,6 @@
import prisma from '@/lib/prisma'; import prisma from '@/lib/prisma';
import { Prisma, Segment } from '@/generated/prisma/client'; import { Prisma, Segment } from '@/generated/prisma/client';
import { PageResult, QueryFilters } from '@/lib/types';
async function findSegment(criteria: Prisma.SegmentFindUniqueArgs): Promise<Segment> { async function findSegment(criteria: Prisma.SegmentFindUniqueArgs): Promise<Segment> {
return prisma.client.Segment.findUnique(criteria); return prisma.client.Segment.findUnique(criteria);
@ -13,16 +14,45 @@ export async function getSegment(segmentId: string): Promise<Segment> {
}); });
} }
export async function getSegments(
criteria: Prisma.SegmentFindManyArgs,
filters: QueryFilters,
): Promise<PageResult<Segment[]>> {
const { search } = filters;
const { getSearchParameters, pagedQuery } = prisma;
const where: Prisma.SegmentWhereInput = {
...criteria.where,
...getSearchParameters(search, [
{
name: 'contains',
},
]),
};
return pagedQuery('segment', { ...criteria, where }, filters);
}
export async function getWebsiteSegment(websiteId: string, segmentId: string): Promise<Segment> { export async function getWebsiteSegment(websiteId: string, segmentId: string): Promise<Segment> {
return prisma.client.Segment.findFirst({ return prisma.client.Segment.findFirst({
where: { id: segmentId, websiteId }, where: { id: segmentId, websiteId },
}); });
} }
export async function getWebsiteSegments(websiteId: string, type: string): Promise<Segment[]> { export async function getWebsiteSegments(
return prisma.pagedQuery('segment', { websiteId: string,
where: { websiteId, type }, type: string,
}); filters?: QueryFilters,
): Promise<PageResult<Segment[]>> {
return getSegments(
{
where: {
websiteId,
type,
},
},
filters,
);
} }
export async function createSegment(data: Prisma.SegmentUncheckedCreateInput): Promise<Segment> { export async function createSegment(data: Prisma.SegmentUncheckedCreateInput): Promise<Segment> {

View file

@ -1,6 +1,6 @@
import prisma from '@/lib/prisma';
import clickhouse from '@/lib/clickhouse'; import clickhouse from '@/lib/clickhouse';
import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db';
import prisma from '@/lib/prisma';
import { QueryFilters } from '@/lib/types'; import { QueryFilters } from '@/lib/types';
export async function getEventDataFields(...args: [websiteId: string, filters: QueryFilters]) { export async function getEventDataFields(...args: [websiteId: string, filters: QueryFilters]) {
@ -12,7 +12,10 @@ export async function getEventDataFields(...args: [websiteId: string, filters: Q
async function relationalQuery(websiteId: string, filters: QueryFilters) { async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { rawQuery, parseFilters, getDateSQL } = prisma; const { rawQuery, parseFilters, getDateSQL } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters(filters); const { filterQuery, cohortQuery, joinSessionQuery, queryParams } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `
@ -30,6 +33,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
and website_event.website_id = {{websiteId::uuid}} and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where event_data.website_id = {{websiteId::uuid}} where event_data.website_id = {{websiteId::uuid}}
and event_data.created_at between {{startDate}} and {{endDate}} and event_data.created_at between {{startDate}} and {{endDate}}
${filterQuery} ${filterQuery}
@ -46,7 +50,7 @@ async function clickhouseQuery(
filters: QueryFilters, filters: QueryFilters,
): Promise<{ propertyName: string; dataType: number; propertyValue: string; total: number }[]> { ): Promise<{ propertyName: string; dataType: number; propertyValue: string; total: number }[]> {
const { rawQuery, parseFilters } = clickhouse; const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, cohortQuery, queryParams } = parseFilters(filters); const { filterQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId });
return rawQuery( return rawQuery(
` `

View file

@ -17,7 +17,7 @@ async function relationalQuery(
filters: QueryFilters & { propertyName?: string }, filters: QueryFilters & { propertyName?: string },
) { ) {
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters( const { filterQuery, cohortQuery, joinSessionQuery, queryParams } = parseFilters(
{ ...filters, websiteId }, { ...filters, websiteId },
{ {
columns: { propertyName: 'data_key' }, columns: { propertyName: 'data_key' },
@ -35,6 +35,7 @@ async function relationalQuery(
and website_event.website_id = {{websiteId::uuid}} and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where event_data.website_id = {{websiteId::uuid}} where event_data.website_id = {{websiteId::uuid}}
and event_data.created_at between {{startDate}} and {{endDate}} and event_data.created_at between {{startDate}} and {{endDate}}
${filterQuery} ${filterQuery}

View file

@ -18,7 +18,10 @@ export async function getEventDataStats(
async function relationalQuery(websiteId: string, filters: QueryFilters) { async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId }); const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `
@ -36,6 +39,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
and website_event.website_id = {{websiteId::uuid}} and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where event_data.website_id = {{websiteId::uuid}} where event_data.website_id = {{websiteId::uuid}}
and event_data.created_at between {{startDate}} and {{endDate}} and event_data.created_at between {{startDate}} and {{endDate}}
${filterQuery} ${filterQuery}

View file

@ -25,7 +25,10 @@ async function relationalQuery(
filters: QueryFilters & { eventName?: string; propertyName?: string }, filters: QueryFilters & { eventName?: string; propertyName?: string },
) { ) {
const { rawQuery, parseFilters, getDateSQL } = prisma; const { rawQuery, parseFilters, getDateSQL } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId }); const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `
@ -41,6 +44,7 @@ async function relationalQuery(
and website_event.website_id = {{websiteId::uuid}} and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where event_data.website_id = {{websiteId::uuid}} where event_data.website_id = {{websiteId::uuid}}
and event_data.created_at between {{startDate}} and {{endDate}} and event_data.created_at between {{startDate}} and {{endDate}}
and event_data.data_key = {{propertyName}} and event_data.data_key = {{propertyName}}

View file

@ -54,7 +54,6 @@ async function relationalQuery(
${joinSessionQuery} ${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1 group by 1
order by 2 desc order by 2 desc

View file

@ -51,7 +51,6 @@ async function relationalQuery(
${joinSessionQuery} ${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1 group by 1
order by 2 desc order by 2 desc

View file

@ -39,7 +39,6 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
${joinSessionQuery} ${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1, 2 group by 1, 2
order by 2 order by 2

View file

@ -31,6 +31,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
website_id as "websiteId", website_id as "websiteId",
session_id as "sessionId", session_id as "sessionId",
created_at as "createdAt", created_at as "createdAt",
hostname,
url_path as "urlPath", url_path as "urlPath",
url_query as "urlQuery", url_query as "urlQuery",
referrer_path as "referrerPath", referrer_path as "referrerPath",
@ -46,6 +47,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
event_name as "eventName" event_name as "eventName"
from website_event from website_event
${cohortQuery} ${cohortQuery}
join session on website_event.session_id = session.session_id
where website_id = {{websiteId::uuid}} where website_id = {{websiteId::uuid}}
${dateQuery} ${dateQuery}
${filterQuery} ${filterQuery}
@ -77,6 +79,7 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
website_id as websiteId, website_id as websiteId,
session_id as sessionId, session_id as sessionId,
created_at as createdAt, created_at as createdAt,
hostname,
url_path as urlPath, url_path as urlPath,
url_query as urlQuery, url_query as urlQuery,
referrer_path as referrerPath, referrer_path as referrerPath,
@ -90,7 +93,7 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
page_title as pageTitle, page_title as pageTitle,
event_type as eventType, event_type as eventType,
event_name as eventName, event_name as eventName,
event_id IN (SELECT event_id FROM event_data) AS hasData event_id IN (SELECT event_id FROM event_data) as hasData
from website_event from website_event
${cohortQuery} ${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}

View file

@ -40,7 +40,7 @@ async function relationalQuery(
filters: QueryFilters, filters: QueryFilters,
): Promise<ChannelExpandedMetricsData[]> { ): Promise<ChannelExpandedMetricsData[]> {
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { queryParams, filterQuery, cohortQuery, dateQuery } = parseFilters({ const { queryParams, filterQuery, joinSessionQuery, cohortQuery, dateQuery } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
eventType: EVENT_TYPE.pageView, eventType: EVENT_TYPE.pageView,
@ -65,8 +65,8 @@ async function relationalQuery(
count(distinct session_id) y count(distinct session_id) y
from website_event from website_event
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where website_id = {{websiteId::uuid}} where website_id = {{websiteId::uuid}}
and event_type = {{eventType}}
${dateQuery} ${dateQuery}
${filterQuery} ${filterQuery}
group by 1, 2 group by 1, 2

View file

@ -21,7 +21,7 @@ export async function getChannelMetrics(...args: [websiteId: string, filters?: Q
async function relationalQuery(websiteId: string, filters: QueryFilters) { async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { queryParams, filterQuery, cohortQuery, dateQuery } = parseFilters({ const { queryParams, filterQuery, joinSessionQuery, cohortQuery, dateQuery } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
eventType: EVENT_TYPE.pageView, eventType: EVENT_TYPE.pageView,
@ -46,8 +46,8 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
count(distinct session_id) y count(distinct session_id) y
from website_event from website_event
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where website_id = {{websiteId::uuid}} where website_id = {{websiteId::uuid}}
and event_type = {{eventType}}
${dateQuery} ${dateQuery}
${filterQuery} ${filterQuery}
group by 1, 2 group by 1, 2

View file

@ -12,7 +12,10 @@ export async function getRealtimeActivity(...args: [websiteId: string, filters:
async function relationalQuery(websiteId: string, filters: QueryFilters) { async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { queryParams, filterQuery, cohortQuery, dateQuery } = parseFilters(filters); const { queryParams, filterQuery, cohortQuery, dateQuery } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `

View file

@ -49,11 +49,10 @@ async function relationalQuery(
min(website_event.created_at) as "min_time", min(website_event.created_at) as "min_time",
max(website_event.created_at) as "max_time" max(website_event.created_at) as "max_time"
from website_event from website_event
${joinSessionQuery}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1, 2 group by 1, 2
) as t ) as t

View file

@ -76,12 +76,11 @@ async function relationalQuery(
select ${column} x, select ${column} x,
count(distinct website_event.session_id) as y count(distinct website_event.session_id) as y
from website_event from website_event
${joinSessionQuery}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
${entryExitQuery} ${entryExitQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${excludeDomain} ${excludeDomain}
${filterQuery} ${filterQuery}
group by 1 group by 1

View file

@ -73,12 +73,11 @@ async function relationalQuery(
select ${column} x, select ${column} x,
count(distinct website_event.session_id) as y count(distinct website_event.session_id) as y
from website_event from website_event
${joinSessionQuery}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
${entryExitQuery} ${entryExitQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${excludeDomain} ${excludeDomain}
${filterQuery} ${filterQuery}
group by 1 group by 1

View file

@ -26,11 +26,10 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
${getDateSQL('website_event.created_at', unit, timezone)} x, ${getDateSQL('website_event.created_at', unit, timezone)} x,
count(*) y count(*) y
from website_event from website_event
${joinSessionQuery}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1 group by 1
order by 1 order by 1

View file

@ -42,9 +42,10 @@ async function relationalQuery(
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent; const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent;
const column = type === 'page' ? 'url_path' : 'event_name'; const column = type === 'page' ? 'url_path' : 'event_name';
const { filterQuery, queryParams } = parseFilters({ const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
...parameters, ...parameters,
websiteId,
eventType, eventType,
}); });
@ -71,23 +72,32 @@ async function relationalQuery(
session_id, session_id,
max(created_at) max_dt max(created_at) max_dt
from website_event from website_event
${cohortQuery}
${joinSessionQuery}
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 ${column} = {{step}} and ${column} = {{step}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1),`; group by 1),`;
const revenueEventQuery = `WITH events AS ( const revenueEventQuery = `WITH events AS (
select select
session_id, revenue.session_id,
max(created_at) max_dt, max(revenue.created_at) max_dt,
sum(revenue) value sum(revenue.revenue) value
from revenue from revenue
where website_id = {{websiteId::uuid}} join website_event
and created_at between {{startDate}} and {{endDate}} on website_event.website_id = revenue.website_id
and ${column} = {{step}} and website_event.session_id = revenue.session_id
and currency = {{currency}} and website_event.event_id = revenue.event_id
and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery}
${joinSessionQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.${column} = {{step}}
and revenue.currency = {{currency}}
${filterQuery} ${filterQuery}
group by 1),`; group by 1),`;
@ -227,10 +237,11 @@ async function relationalQuery(
count(distinct session_id) as "visitors", count(distinct session_id) as "visitors",
count(distinct visit_id) as "visits" count(distinct visit_id) as "visits"
from website_event from website_event
${joinSessionQuery}
${cohortQuery}
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 ${column} = {{step}} and ${column} = {{step}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
`, `,
queryParams, queryParams,
@ -257,7 +268,7 @@ async function clickhouseQuery(
const { rawQuery, parseFilters } = clickhouse; const { rawQuery, parseFilters } = clickhouse;
const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent; const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent;
const column = type === 'page' ? 'url_path' : 'event_name'; const column = type === 'page' ? 'url_path' : 'event_name';
const { filterQuery, queryParams } = parseFilters({ const { filterQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
...parameters, ...parameters,
websiteId, websiteId,
@ -293,7 +304,6 @@ async function clickhouseQuery(
on we.session_id = e.session_id on we.session_id = e.session_id
where we.website_id = {websiteId:UUID} where we.website_id = {websiteId:UUID}
and we.created_at between {startDate:DateTime64} and {endDate:DateTime64} and we.created_at between {startDate:DateTime64} and {endDate:DateTime64}
${filterQuery}
group by e.session_id) group by e.session_id)
`; `;
} }
@ -307,7 +317,6 @@ async function clickhouseQuery(
where we.website_id = {websiteId:UUID} where we.website_id = {websiteId:UUID}
and we.created_at between {startDate:DateTime64} and {endDate:DateTime64} and we.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and we.created_at < e.max_dt and we.created_at < e.max_dt
${filterQuery}
group by e.session_id) group by e.session_id)
`; `;
} }
@ -317,22 +326,31 @@ async function clickhouseQuery(
session_id, session_id,
max(created_at) max_dt max(created_at) max_dt
from website_event from website_event
${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64} and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and ${column} = {step:String} and ${column} = {step:String}
and event_type = {eventType:UInt32} ${filterQuery}
group by 1),`; group by 1),`;
const revenueEventQuery = `WITH events AS ( const revenueEventQuery = `WITH events AS (
select select
session_id, website_revenue.session_id,
max(created_at) max_dt, max(website_revenue.created_at) max_dt,
sum(revenue) as value sum(website_revenue.revenue) as value
from website_revenue from website_revenue
where website_id = {websiteId:UUID} join website_event
and created_at between {startDate:DateTime64} and {endDate:DateTime64} on website_event.website_id = website_revenue.website_id
and ${column} = {step:String} and website_event.session_id = website_revenue.session_id
and currency = {currency:String} and website_event.event_id = website_revenue.event_id
and website_event.website_id = {websiteId:UUID}
and website_event.created_at between {startDate:DateTime64} and {endDate:DateTime64}
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and website_revenue.${column} = {step:String}
and website_revenue.currency = {currency:String}
${filterQuery}
group by 1),`; group by 1),`;
const referrerRes = await rawQuery< const referrerRes = await rawQuery<
@ -474,6 +492,7 @@ async function clickhouseQuery(
uniqExact(session_id) as "visitors", uniqExact(session_id) as "visitors",
uniqExact(visit_id) as "visits" uniqExact(visit_id) as "visits"
from website_event from website_event
${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64} and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and ${column} = {step:String} and ${column} = {step:String}

View file

@ -66,7 +66,6 @@ async function relationalQuery(
${joinSessionQuery} ${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by ${parseFieldsByName(fields)}, group by ${parseFieldsByName(fields)},
website_event.session_id, website_event.visit_id website_event.session_id, website_event.visit_id

View file

@ -34,7 +34,12 @@ async function relationalQuery(
const { rawQuery, getAddIntervalQuery, parseFilters } = prisma; const { rawQuery, getAddIntervalQuery, parseFilters } = prisma;
const { levelOneQuery, levelQuery, sumQuery, params } = getFunnelQuery(steps, window); const { levelOneQuery, levelQuery, sumQuery, params } = getFunnelQuery(steps, window);
const { filterQuery, queryParams } = parseFilters({ ...filters, websiteId, startDate, endDate }); const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
startDate,
endDate,
});
function getFunnelQuery( function getFunnelQuery(
steps: { type: string; value: string }[], steps: { type: string; value: string }[],
@ -65,6 +70,8 @@ async function relationalQuery(
WITH level1 AS ( WITH level1 AS (
select distinct session_id, created_at select distinct session_id, created_at
from website_event from website_event
${cohortQuery}
${joinSessionQuery}
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 ${column} ${operator} {{${i}}} and ${column} ${operator} {{${i}}}
@ -132,7 +139,12 @@ async function clickhouseQuery(
steps, steps,
window, window,
); );
const { filterQuery, queryParams } = parseFilters({ ...filters, websiteId, startDate, endDate }); const { filterQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
startDate,
endDate,
});
function getFunnelQuery( function getFunnelQuery(
steps: { type: string; value: string }[], steps: { type: string; value: string }[],
@ -204,6 +216,7 @@ async function clickhouseQuery(
WITH level0 AS ( WITH level0 AS (
select distinct session_id, url_path, referrer_path, event_name, created_at select distinct session_id, url_path, referrer_path, event_name, created_at
from website_event from website_event
${cohortQuery}
where (${stepFilterQuery}) where (${stepFilterQuery})
and website_id = {websiteId:UUID} and website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64} and created_at between {startDate:DateTime64} and {endDate:DateTime64}

View file

@ -1,4 +1,5 @@
import clickhouse from '@/lib/clickhouse'; import clickhouse from '@/lib/clickhouse';
import { EVENT_TYPE } from '@/lib/constants';
import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db';
import prisma from '@/lib/prisma'; import prisma from '@/lib/prisma';
import { QueryFilters } from '@/lib/types'; import { QueryFilters } from '@/lib/types';
@ -28,16 +29,16 @@ async function relationalQuery(
) { ) {
const { startDate, endDate, type, value } = parameters; const { startDate, endDate, type, value } = parameters;
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { filterQuery, dateQuery, queryParams } = parseFilters({ const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent;
const column = type === 'page' ? 'url_path' : 'event_name';
const { filterQuery, dateQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
value, value,
startDate, startDate,
endDate, endDate,
eventType,
}); });
const isPage = type === 'page';
const column = isPage ? 'url_path' : 'event_name';
const eventType = isPage ? 1 : 2;
return rawQuery( return rawQuery(
` `
@ -45,13 +46,16 @@ async function relationalQuery(
( (
select count(distinct session_id) select count(distinct session_id)
from website_event from website_event
${cohortQuery}
${joinSessionQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
and event_type = ${eventType}
${dateQuery} ${dateQuery}
${filterQuery}
) as total ) as total
from website_event from website_event
${cohortQuery}
${joinSessionQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
and event_type = ${eventType}
and ${column} = {value:String} and ${column} = {value:String}
${dateQuery} ${dateQuery}
${filterQuery} ${filterQuery}
@ -67,16 +71,16 @@ async function clickhouseQuery(
) { ) {
const { startDate, endDate, type, value } = parameters; const { startDate, endDate, type, value } = parameters;
const { rawQuery, parseFilters } = clickhouse; const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, dateQuery, queryParams } = parseFilters({ const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent;
const column = type === 'page' ? 'url_path' : 'event_name';
const { filterQuery, dateQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
value, value,
startDate, startDate,
endDate, endDate,
eventType,
}); });
const isPage = type === 'page';
const column = isPage ? 'url_path' : 'event_name';
const eventType = isPage ? 1 : 2;
return rawQuery( return rawQuery(
` `
@ -84,12 +88,14 @@ async function clickhouseQuery(
( (
select count(distinct session_id) select count(distinct session_id)
from website_event from website_event
${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
${dateQuery} ${dateQuery}
${filterQuery}
) as total ) as total
from website_event from website_event
${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
and event_type = ${eventType}
and ${column} = {value:String} and ${column} = {value:String}
${dateQuery} ${dateQuery}
${filterQuery} ${filterQuery}

View file

@ -43,7 +43,12 @@ async function relationalQuery(
startStep, startStep,
endStep, endStep,
); );
const { filterQuery, queryParams } = parseFilters({ ...filters, websiteId, startDate, endDate }); const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
startDate,
endDate,
});
function getJourneyQuery( function getJourneyQuery(
steps: number, steps: number,
@ -117,6 +122,8 @@ async function relationalQuery(
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 website_event from website_event
${cohortQuery}
${joinSessionQuery}
where website_id = {{websiteId::uuid}} where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}}), and created_at between {{startDate}} and {{endDate}}),
${filterQuery} ${filterQuery}
@ -148,7 +155,12 @@ async function clickhouseQuery(
startStep, startStep,
endStep, endStep,
); );
const { filterQuery, queryParams } = parseFilters({ ...filters, websiteId, startDate, endDate }); const { filterQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
startDate,
endDate,
});
function getJourneyQuery( function getJourneyQuery(
steps: number, steps: number,
@ -221,6 +233,7 @@ async function clickhouseQuery(
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 website_event from website_event
${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
${filterQuery} ${filterQuery}
and created_at between {startDate:DateTime64} and {endDate:DateTime64}), and created_at between {startDate:DateTime64} and {endDate:DateTime64}),

View file

@ -35,7 +35,7 @@ async function relationalQuery(
const { getDateSQL, getDayDiffQuery, getCastColumnQuery, rawQuery, parseFilters } = prisma; const { getDateSQL, getDayDiffQuery, getCastColumnQuery, rawQuery, parseFilters } = prisma;
const unit = 'day'; const unit = 'day';
const { filterQuery, queryParams } = parseFilters({ const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
startDate, startDate,
@ -54,11 +54,13 @@ async function relationalQuery(
), ),
user_activities AS ( user_activities AS (
select distinct select distinct
w.session_id, website_event.session_id,
${getDayDiffQuery(getDateSQL('created_at', unit, timezone), 'c.cohort_date')} as day_number ${getDayDiffQuery(getDateSQL('created_at', unit, timezone), 'cohort_items.cohort_date')} as day_number
from website_event w from website_event
join cohort_items c join cohort_items
on w.session_id = c.session_id on website_event.session_id = cohort_items.session_id
${cohortQuery}
${joinSessionQuery}
where website_id = {{websiteId::uuid}} where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}} and created_at between {{startDate}} and {{endDate}}
${filterQuery} ${filterQuery}
@ -104,7 +106,7 @@ async function clickhouseQuery(
const { getDateSQL, rawQuery, parseFilters } = clickhouse; const { getDateSQL, rawQuery, parseFilters } = clickhouse;
const unit = 'day'; const unit = 'day';
const { filterQuery, queryParams } = parseFilters({ const { filterQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
startDate, startDate,
@ -125,11 +127,12 @@ async function clickhouseQuery(
), ),
user_activities AS ( user_activities AS (
select distinct select distinct
w.session_id, website_event.session_id,
(${getDateSQL('created_at', unit, timezone)} - c.cohort_date) / 86400 as day_number (${getDateSQL('created_at', unit, timezone)} - cohort_items.cohort_date) / 86400 as day_number
from website_event w from website_event
join cohort_items c join cohort_items
on w.session_id = c.session_id on website_event.session_id = cohort_items.session_id
${cohortQuery}
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64} and created_at between {startDate:DateTime64} and {endDate:DateTime64}
${filterQuery} ${filterQuery}

View file

@ -38,18 +38,33 @@ async function relationalQuery(
): Promise<RevenueResult> { ): Promise<RevenueResult> {
const { startDate, endDate, currency, unit = 'day' } = parameters; const { startDate, endDate, currency, unit = 'day' } = parameters;
const { getDateSQL, rawQuery, parseFilters } = prisma; const { getDateSQL, rawQuery, parseFilters } = prisma;
const { queryParams } = parseFilters({ ...filters, websiteId, startDate, endDate, currency }); const { queryParams, filterQuery, cohortQuery, joinSessionQuery } = parseFilters({
...filters,
websiteId,
startDate,
endDate,
currency,
});
const chart = await rawQuery( const chart = await rawQuery(
` `
select select
event_name x, revenue.event_name x,
${getDateSQL('created_at', unit)} t, ${getDateSQL('revenue.created_at', unit)} t,
sum(revenue) y sum(revenue.revenue) y
from revenue from revenue
where website_id = {{websiteId::uuid}} join website_event
and created_at between {{startDate}} and {{endDate}} on website_event.website_id = revenue.website_id
and currency like {{currency}} and website_event.session_id = revenue.session_id
and website_event.event_id = revenue.event_id
and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery}
${joinSessionQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.currency like {{currency}}
${filterQuery}
group by x, t group by x, t
order by t order by t
`, `,
@ -59,15 +74,24 @@ async function relationalQuery(
const country = await rawQuery( const country = await rawQuery(
` `
select select
s.country as name, session.country as name,
sum(r.revenue) value sum(r.revenue) value
from revenue r from revenue
join session s join website_event
on s.session_id = r.session_id on website_event.website_id = revenue.website_id
where r.website_id = {{websiteId::uuid}} and website_event.session_id = revenue.session_id
and r.created_at between {{startDate}} and {{endDate}} and website_event.event_id = revenue.event_id
and r.currency = {{currency}} and website_event.website_id = {{websiteId::uuid}}
group by s.country and website_event.created_at between {{startDate}} and {{endDate}}
join session
on session.website_id = revenue.website_id
and session.session_id = revenue.session_id
${cohortQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.currency = {{currency}}
${filterQuery}
group by session.country
`, `,
queryParams, queryParams,
); );
@ -75,13 +99,22 @@ async function relationalQuery(
const total = await rawQuery( const total = await rawQuery(
` `
select select
sum(revenue) as sum, sum(revenue.revenue) as sum,
count(distinct event_id) as count, count(distinct revenue.event_id) as count,
count(distinct session_id) as unique_count count(distinct revenue.session_id) as unique_count
from revenue r from revenue
where website_id = {{websiteId::uuid}} join website_event
and created_at between {{startDate}} and {{endDate}} on website_event.website_id = revenue.website_id
and currency = {{currency}} and website_event.session_id = revenue.session_id
and website_event.event_id = revenue.event_id
and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery}
${joinSessionQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.currency = {{currency}}
${filterQuery}
`, `,
queryParams, queryParams,
).then(result => result?.[0]); ).then(result => result?.[0]);
@ -91,14 +124,23 @@ async function relationalQuery(
const table = await rawQuery( const table = await rawQuery(
` `
select select
currency, revenue.currency,
sum(revenue) as sum, sum(revenue.revenue) as sum,
count(distinct event_id) as count, count(distinct revenue.event_id) as count,
count(distinct session_id) as unique_count count(distinct revenue.session_id) as unique_count
from revenue r from revenue
where website_id = {{websiteId::uuid}} join website_event
and created_at between {{startDate}} and {{endDate}} on website_event.website_id = revenue.website_id
group by currency and website_event.session_id = revenue.session_id
and website_event.event_id = revenue.event_id
and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}}
${cohortQuery}
${joinSessionQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
${filterQuery}
group by revenue.currency
order by sum desc order by sum desc
`, `,
queryParams, queryParams,
@ -114,7 +156,7 @@ async function clickhouseQuery(
): Promise<RevenueResult> { ): Promise<RevenueResult> {
const { startDate, endDate, unit = 'day', currency } = parameters; const { startDate, endDate, unit = 'day', currency } = parameters;
const { getDateSQL, rawQuery, parseFilters } = clickhouse; const { getDateSQL, rawQuery, parseFilters } = clickhouse;
const { queryParams } = parseFilters({ const { filterQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
startDate, startDate,
@ -131,13 +173,21 @@ async function clickhouseQuery(
>( >(
` `
select select
event_name x, website_revenue.event_name x,
${getDateSQL('created_at', unit)} t, ${getDateSQL('website_revenue.created_at', unit)} t,
sum(revenue) y sum(website_revenue.revenue) y
from website_revenue from website_revenue
where website_id = {websiteId:UUID} join website_event
and created_at between {startDate:DateTime64} and {endDate:DateTime64} on website_event.website_id = website_revenue.website_id
and currency = {currency:String} and website_event.session_id = website_revenue.session_id
and website_event.event_id = website_revenue.event_id
and website_event.website_id = {websiteId:UUID}
and website_event.created_at between {startDate:DateTime64} and {endDate:DateTime64}
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and website_revenue.currency = {currency:String}
${filterQuery}
group by x, t group by x, t
order by t order by t
`, `,
@ -152,20 +202,21 @@ async function clickhouseQuery(
>( >(
` `
select select
s.country as name, website_event.country as name,
sum(w.revenue) as value sum(website_revenue.revenue) as value
from website_revenue w from website_revenue
join ( join website_event
select distinct website_id, session_id, country on website_event.website_id = website_revenue.website_id
from website_event and website_event.session_id = website_revenue.session_id
where website_id = {websiteId:UUID} and website_event.event_id = website_revenue.event_id
) s and website_event.website_id = {websiteId:UUID}
on w.website_id = s.website_id and website_event.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and w.session_id = s.session_id ${cohortQuery}
where w.website_id = {websiteId:UUID} where website_revenue.website_id = {websiteId:UUID}
and w.created_at between {startDate:DateTime64} and {endDate:DateTime64} and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and w.currency = {currency:String} and website_revenue.currency = {currency:String}
group by s.country ${filterQuery}
group by website_event.country
`, `,
queryParams, queryParams,
); );
@ -177,13 +228,21 @@ async function clickhouseQuery(
}>( }>(
` `
select select
sum(revenue) as sum, sum(website_revenue.revenue) as sum,
uniqExact(event_id) as count, uniqExact(website_revenue.event_id) as count,
uniqExact(session_id) as unique_count uniqExact(website_revenue.session_id) as unique_count
from website_revenue from website_revenue
where website_id = {websiteId:UUID} join website_event
and created_at between {startDate:DateTime64} and {endDate:DateTime64} on website_event.website_id = website_revenue.website_id
and currency = {currency:String} and website_event.session_id = website_revenue.session_id
and website_event.event_id = website_revenue.event_id
and website_event.website_id = {websiteId:UUID}
and website_event.created_at between {startDate:DateTime64} and {endDate:DateTime64}
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and website_revenue.currency = {currency:String}
${filterQuery}
`, `,
queryParams, queryParams,
).then(result => result?.[0]); ).then(result => result?.[0]);
@ -200,14 +259,22 @@ async function clickhouseQuery(
>( >(
` `
select select
currency, website_revenue.currency,
sum(revenue) as sum, sum(website_revenue.revenue) as sum,
uniqExact(event_id) as count, uniqExact(website_revenue.event_id) as count,
uniqExact(session_id) as unique_count uniqExact(website_revenue.session_id) as unique_count
from website_revenue from website_revenue
where website_id = {websiteId:UUID} join website_event
and created_at between {startDate:DateTime64} and {endDate:DateTime64} on website_event.website_id = website_revenue.website_id
group by currency and website_event.session_id = website_revenue.session_id
and website_event.event_id = website_revenue.event_id
and website_event.website_id = {websiteId:UUID}
and website_event.created_at between {startDate:DateTime64} and {endDate:DateTime64}
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
${filterQuery}
group by website_revenue.currency
order by sum desc order by sum desc
`, `,
queryParams, queryParams,

View file

@ -27,7 +27,7 @@ async function relationalQuery(
const { column, startDate, endDate } = parameters; const { column, startDate, endDate } = parameters;
const { parseFilters, rawQuery } = prisma; const { parseFilters, rawQuery } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters({ const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters, ...filters,
websiteId, websiteId,
startDate, startDate,
@ -40,6 +40,7 @@ async function relationalQuery(
select ${column} utm, count(*) as views select ${column} utm, count(*) as views
from website_event from website_event
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
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 coalesce(${column}, '') != '' and coalesce(${column}, '') != ''

View file

@ -17,7 +17,7 @@ async function relationalQuery(
filters: QueryFilters & { propertyName?: string }, filters: QueryFilters & { propertyName?: string },
) { ) {
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters( const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters(
{ ...filters, websiteId }, { ...filters, websiteId },
{ {
columns: { propertyName: 'data_key' }, columns: { propertyName: 'data_key' },
@ -31,6 +31,7 @@ async function relationalQuery(
count(distinct session_data.session_id) as "total" count(distinct session_data.session_id) as "total"
from website_event from website_event
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
join session_data join session_data
on session_data.session_id = website_event.session_id on session_data.session_id = website_event.session_id
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}

View file

@ -17,7 +17,10 @@ async function relationalQuery(
filters: QueryFilters & { propertyName?: string }, filters: QueryFilters & { propertyName?: string },
) { ) {
const { rawQuery, parseFilters, getDateSQL } = prisma; const { rawQuery, parseFilters, getDateSQL } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId }); const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `
@ -30,6 +33,7 @@ async function relationalQuery(
count(distinct session_data.session_id) as "total" count(distinct session_data.session_id) as "total"
from website_event from website_event
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
join session_data join session_data
on session_data.session_id = website_event.session_id on session_data.session_id = website_event.session_id
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}

View file

@ -63,7 +63,6 @@ async function relationalQuery(
${joinSessionQuery} ${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and website_event.event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1 group by 1
${includeCountry ? ', 3' : ''} ${includeCountry ? ', 3' : ''}

View file

@ -54,7 +54,6 @@ async function relationalQuery(
${joinSessionQuery} ${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and website_event.event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1 group by 1
${includeCountry ? ', 3' : ''} ${includeCountry ? ', 3' : ''}

View file

@ -26,11 +26,10 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
${getDateSQL('website_event.created_at', unit, timezone)} x, ${getDateSQL('website_event.created_at', unit, timezone)} x,
count(distinct website_event.session_id) y count(distinct website_event.session_id) y
from website_event from website_event
${joinSessionQuery}
${cohortQuery} ${cohortQuery}
${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}} where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1 group by 1
order by 1 order by 1

View file

@ -26,7 +26,10 @@ async function relationalQuery(
filters: QueryFilters, filters: QueryFilters,
): Promise<WebsiteSessionStatsData[]> { ): Promise<WebsiteSessionStatsData[]> {
const { parseFilters, rawQuery } = prisma; const { parseFilters, rawQuery } = prisma;
const { filterQuery, cohortQuery, queryParams } = parseFilters({ ...filters, websiteId }); const { filterQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `

View file

@ -14,9 +14,12 @@ export async function getWebsiteSessionsWeekly(
} }
async function relationalQuery(websiteId: string, filters: QueryFilters) { async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { timezone = 'utc' } = filters; const timezone = 'utc';
const { rawQuery, getDateWeeklySQL, parseFilters } = prisma; const { rawQuery, getDateWeeklySQL, parseFilters } = prisma;
const { queryParams } = parseFilters(filters); const { filterQuery, joinSessionQuery, cohortQuery, queryParams } = parseFilters({
...filters,
websiteId,
});
return rawQuery( return rawQuery(
` `
@ -24,8 +27,11 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
${getDateWeeklySQL('created_at', timezone)} as time, ${getDateWeeklySQL('created_at', timezone)} as time,
count(distinct session_id) as value count(distinct session_id) as value
from website_event from website_event
${cohortQuery}
${joinSessionQuery}
where website_id = {{websiteId::uuid}} where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}} and created_at between {{startDate}} and {{endDate}}
${filterQuery}
group by time group by time
order by 2 order by 2
`, `,