Refactor filter handling for queries.

This commit is contained in:
Mike Cao committed 2025-07-02 01:44:12 -07:00
1 parent 5b300f1ff5
commit ee6c68d27c
107 files changed
+731 -835

No files matched your search

+9 -9
View File
@@ -244,7 +244,7 @@ async function clickhouseQuery(
const { rawQuery, parseFilters } = clickhouse;
const eventType = type === 'page' ? EVENT_TYPE.pageView : EVENT_TYPE.customEvent;
const column = type === 'page' ? 'url_path' : 'event_name';
const { filterQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, queryParams } = await parseFilters(criteria);
function getUTMQuery(utmColumn: string) {
return `
@@ -345,7 +345,7 @@ async function clickhouseQuery(
order by 2 desc
limit 20
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const paidAdsres = await rawQuery<
@@ -376,7 +376,7 @@ async function clickhouseQuery(
order by 2 desc
limit 20
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const sourceRes = await rawQuery<
@@ -390,7 +390,7 @@ async function clickhouseQuery(
${getModelQuery(model)}
${getUTMQuery('utm_source')}
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const mediumRes = await rawQuery<
@@ -404,7 +404,7 @@ async function clickhouseQuery(
${getModelQuery(model)}
${getUTMQuery('utm_medium')}
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const campaignRes = await rawQuery<
@@ -418,7 +418,7 @@ async function clickhouseQuery(
${getModelQuery(model)}
${getUTMQuery('utm_campaign')}
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const contentRes = await rawQuery<
@@ -432,7 +432,7 @@ async function clickhouseQuery(
${getModelQuery(model)}
${getUTMQuery('utm_content')}
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const termRes = await rawQuery<
@@ -446,7 +446,7 @@ async function clickhouseQuery(
${getModelQuery(model)}
${getUTMQuery('utm_term')}
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
);
const totalRes = await rawQuery<{ pageviews: number; visitors: number; visits: number }>(
@@ -462,7 +462,7 @@ async function clickhouseQuery(
and event_type = {eventType:UInt32}
${filterQuery}
`,
{ ...filterParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
{ ...queryParams, websiteId, startDate, endDate, conversionStep: step, eventType, currency },
).then(result => result?.[0]);
return {
+5 -6
View File
@@ -24,8 +24,7 @@ async function relationalQuery(
}[]
> {
const { getTimestampDiffSQL, parseFilters, rawQuery } = prisma;
const { filterQuery, joinSession, filterParams } = await parseFilters(
websiteId,
const { filterQuery, joinSessionQuery, queryParams } = await parseFilters(
{
...filters,
eventType: EVENT_TYPE.pageView,
@@ -53,7 +52,7 @@ async function relationalQuery(
min(website_event.created_at) as "min_time",
max(website_event.created_at) as "max_time"
from website_event
${joinSession}
${joinSessionQuery}
where website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}}
@@ -65,7 +64,7 @@ async function relationalQuery(
order by 1 desc, 2 desc
limit 500
`,
filterParams,
queryParams,
);
}
@@ -80,7 +79,7 @@ async function clickhouseQuery(
}[]
> {
const { parseFilters, rawQuery } = clickhouse;
const { filterQuery, filterParams } = await parseFilters(websiteId, {
const { filterQuery, queryParams } = await parseFilters({
...filters,
eventType: EVENT_TYPE.pageView,
});
@@ -114,7 +113,7 @@ async function clickhouseQuery(
order by 1 desc, 2 desc
limit 500
`,
filterParams,
queryParams,
);
}
+3 -3
View File
@@ -126,7 +126,7 @@ async function clickhouseQuery(
steps,
windowMinutes,
);
const { filterQuery, filterParams: filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, queryParams } = await parseFilters(criteria);
function getFunnelQuery(
steps: { type: string; value: string }[],
@@ -136,7 +136,7 @@ async function clickhouseQuery(
levelQuery: string;
sumQuery: string;
stepFilterQuery: string;
params: { [key: string]: string };
params: Record<string, string>;
} {
return steps.reduce(
(pv, cv, i) => {
@@ -215,7 +215,7 @@ async function clickhouseQuery(
startDate,
endDate,
...params,
...filterParams,
...queryParams,
},
).then(formatResults(steps));
}
+16 -6
View File
@@ -1,6 +1,7 @@
import clickhouse from '@/lib/clickhouse';
import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db';
import prisma from '@/lib/prisma';
import { QueryFilters } from '@/lib/types';
export interface GoalCriteria {
startDate: Date;
@@ -9,6 +10,7 @@ export interface GoalCriteria {
value: string;
operator?: string;
property?: string;
filters: QueryFilters;
}
export async function getGoal(...args: [websiteId: string, criteria: GoalCriteria]) {
@@ -19,9 +21,13 @@ export async function getGoal(...args: [websiteId: string, criteria: GoalCriteri
}
async function relationalQuery(websiteId: string, criteria: GoalCriteria) {
const { type, value } = criteria;
const { type, value, filters } = criteria;
const { rawQuery, parseFilters } = prisma;
const { filterQuery, dateQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, dateQuery, queryParams } = await parseFilters({
...filters,
websiteId,
value,
});
const isPage = type === 'page';
const column = isPage ? 'url_path' : 'event_name';
const eventType = isPage ? 1 : 2;
@@ -43,14 +49,18 @@ async function relationalQuery(websiteId: string, criteria: GoalCriteria) {
${dateQuery}
${filterQuery}
`,
{ ...filterParams, value },
queryParams,
);
}
async function clickhouseQuery(websiteId: string, criteria: GoalCriteria) {
const { type, value } = criteria;
const { type, value, filters } = criteria;
const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, dateQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, dateQuery, queryParams } = await parseFilters({
...filters,
websiteId,
value,
});
const isPage = type === 'page';
const column = isPage ? 'url_path' : 'event_name';
const eventType = isPage ? 1 : 2;
@@ -71,6 +81,6 @@ async function clickhouseQuery(websiteId: string, criteria: GoalCriteria) {
${dateQuery}
${filterQuery}
`,
{ ...filterParams, value },
queryParams,
).then(results => results?.[0]);
}
+6 -6
View File
@@ -57,7 +57,7 @@ async function relationalQuery(
sequenceQuery: string;
startStepQuery: string;
endStepQuery: string;
params: { [key: string]: string };
params: Record<string, string>;
} {
const params = {};
let sequenceQuery = '';
@@ -108,7 +108,7 @@ async function relationalQuery(
sequenceQuery,
startStepQuery,
endStepQuery,
filterParams: params,
params,
};
}
@@ -167,7 +167,7 @@ async function clickhouseQuery(
sequenceQuery: string;
startStepQuery: string;
endStepQuery: string;
params: { [key: string]: string };
params: Record<string, string>;
} {
const params = {};
let sequenceQuery = '';
@@ -218,11 +218,11 @@ async function clickhouseQuery(
sequenceQuery,
startStepQuery,
endStepQuery,
filterParams: params,
params,
};
}
const { filterQuery, filterParams: filterParams } = await parseFilters(websiteId, filters);
const { filterQuery, queryParams } = await parseFilters(filters);
return rawQuery(
`
@@ -249,7 +249,7 @@ async function clickhouseQuery(
startDate,
endDate,
...params,
...filterParams,
...queryParams,
},
).then(parseResult);
}
+4 -4
View File
@@ -31,7 +31,7 @@ async function relationalQuery(
const { getDateSQL, getDayDiffQuery, getCastColumnQuery, rawQuery, parseFilters } = prisma;
const unit = 'day';
const { filterQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, queryParams } = await parseFilters(criteria);
return rawQuery(
`
@@ -85,7 +85,7 @@ async function relationalQuery(
websiteId,
startDate,
endDate,
...filterParams,
...queryParams,
},
);
}
@@ -98,7 +98,7 @@ async function clickhouseQuery(
const { getDateSQL, rawQuery, parseFilters } = clickhouse;
const unit = 'day';
const { filterQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, queryParams } = await parseFilters(criteria);
return rawQuery(
`
@@ -154,7 +154,7 @@ async function clickhouseQuery(
websiteId,
startDate,
endDate,
...filterParams,
...queryParams,
},
);
}
+4 -4
View File
@@ -17,7 +17,7 @@ export async function getUTM(...args: [websiteId: string, criteria: UTMCriteria]
async function relationalQuery(websiteId: string, criteria: UTMCriteria) {
const { startDate, endDate } = criteria;
const { rawQuery, parseFilters } = prisma;
const { filterQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, queryParams } = await parseFilters(criteria);
return rawQuery(
`
@@ -31,7 +31,7 @@ async function relationalQuery(websiteId: string, criteria: UTMCriteria) {
group by 1
`,
{
...filterParams,
...queryParams,
websiteId,
startDate,
endDate,
@@ -42,7 +42,7 @@ async function relationalQuery(websiteId: string, criteria: UTMCriteria) {
async function clickhouseQuery(websiteId: string, criteria: UTMCriteria) {
const { startDate, endDate } = criteria;
const { rawQuery, parseFilters } = clickhouse;
const { filterQuery, filterParams } = await parseFilters(websiteId, criteria);
const { filterQuery, queryParams } = await parseFilters(criteria);
return rawQuery(
`
@@ -56,7 +56,7 @@ async function clickhouseQuery(websiteId: string, criteria: UTMCriteria) {
group by 1
`,
{
...filterParams,
...queryParams,
websiteId,
startDate,
endDate,