Refactor filter handling for queries.

This commit is contained in:
Mike Cao 2025-07-02 01:44:12 -07:00
parent 5b300f1ff5
commit ee6c68d27c
107 changed files with 731 additions and 835 deletions

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 {

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,
);
}

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));
}

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]);
}

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);
}

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,
},
);
}

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,