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(
` `
@ -33,9 +36,10 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
count(*) as "total" count(*) as "total"
from event_data from event_data
join website_event on website_event.event_id = event_data.website_event_id join website_event on website_event.event_id = event_data.website_event_id
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,
@ -84,13 +87,13 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
referrer_domain as referrerDomain, referrer_domain as referrerDomain,
country as country, country as country,
city as city, city as city,
device as device, device as device,
os as os, os as os,
browser as browser, browser as browser,
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

@ -62,11 +62,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
${cohortQuery} ${cohortQuery}
${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,16 +46,19 @@ 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}
`, `,
queryParams, queryParams,
); );
@ -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,15 +88,17 @@ 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}
`, `,
queryParams, queryParams,
).then(results => results?.[0]); ).then(results => results?.[0]);

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' },
@ -30,7 +30,8 @@ async function relationalQuery(
data_key as "propertyName", data_key as "propertyName",
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
`, `,