Skip to content

Commit 88940e2

Browse files
committed
feat: add event name field and filter support in WarehouseInsightsSqlBuilder
1 parent 0d3c841 commit 88940e2

File tree

2 files changed

+75
-11
lines changed

2 files changed

+75
-11
lines changed

src/server/model/insights/warehouse.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ describe('WarehouseInsightsSqlBuilder', () => {
1919
},
2020
eventParametersTable: {
2121
name: 'event_parameters',
22+
eventNameField: 'event_name',
2223
paramsNameField: 'event_param_key',
2324
paramsValueField: 'event_param_value',
2425
createdAtField: 'event_timestamp',
@@ -55,4 +56,40 @@ describe('WarehouseInsightsSqlBuilder', () => {
5556
const sql = builder.build();
5657
expect(unwrapSQL(sql)).toMatchSnapshot('sql');
5758
});
59+
60+
test('with filter', () => {
61+
const builder = new WarehouseInsightsSqlBuilder(
62+
{
63+
insightId,
64+
insightType,
65+
workspaceId: '',
66+
metrics: [
67+
{
68+
name: '$all_event',
69+
math: 'events',
70+
},
71+
],
72+
filters: [
73+
{
74+
name: 'name',
75+
value: 'value',
76+
operator: 'equals',
77+
type: 'string',
78+
},
79+
],
80+
time: {
81+
startAt: dayjs('2025-08-01').valueOf(),
82+
endAt: dayjs('2025-08-02').valueOf(),
83+
unit: 'day',
84+
},
85+
groups: [],
86+
},
87+
{
88+
timezone: 'UTC',
89+
}
90+
);
91+
92+
const sql = builder.build();
93+
expect(unwrapSQL(sql)).toMatchSnapshot('sql');
94+
});
5895
});

src/server/model/insights/warehouse.ts

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const warehouseInsightsApplicationSchema = z.object({
4141
}),
4242
eventParametersTable: z.object({
4343
name: z.string(),
44+
eventNameField: z.string(),
4445
paramsNameField: z.string(),
4546
paramsValueField: z.string(),
4647
paramsValueNumberField: z.string().optional(),
@@ -106,17 +107,6 @@ export class WarehouseInsightsSqlBuilder extends InsightsSqlBuilder {
106107
);
107108
}
108109

109-
private enableDateBasedOptimizedEventParametersTable() {
110-
const eventParametersTable = this.getEventParametersTable();
111-
const startAt = this.query.time.startAt;
112-
const endAt = this.query.time.endAt;
113-
114-
return (
115-
!!eventParametersTable.dateBasedCreatedAtField &&
116-
dayjs(endAt).diff(startAt, 'day') >= 1
117-
);
118-
}
119-
120110
private getEventTable() {
121111
return this.getApplication().eventTable;
122112
}
@@ -361,6 +351,43 @@ export class WarehouseInsightsSqlBuilder extends InsightsSqlBuilder {
361351
return groupSelectQueryArr;
362352
}
363353

354+
buildInnerJoinQuery() {
355+
const { filters, groups } = this.query;
356+
const eventTable = this.getEventTable();
357+
const eventParametersTable = this.getEventParametersTable();
358+
359+
let innerJoinQuery = Prisma.empty;
360+
if (filters.length > 0 || groups.length > 0) {
361+
innerJoinQuery = Prisma.sql`INNER JOIN "${Prisma.raw(eventParametersTable.name)}" ON "${Prisma.raw(eventTable.name)}"."${Prisma.raw(eventTable.eventNameField)}" = "${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.eventNameField)}"`;
362+
363+
if (filters.length > 0) {
364+
innerJoinQuery = Prisma.sql`${innerJoinQuery} AND ${Prisma.join(
365+
filters.map((filter) =>
366+
this.buildFilterQueryOperator(
367+
filter.type,
368+
filter.operator,
369+
filter.value
370+
)
371+
),
372+
' AND '
373+
)}`;
374+
}
375+
376+
if (groups.length > 0) {
377+
const groupConditions = groups.map(
378+
(g) =>
379+
Prisma.sql`"${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.eventNameField)}" = ${g.value}`
380+
);
381+
innerJoinQuery = Prisma.sql`${innerJoinQuery} AND ${Prisma.join(
382+
groupConditions,
383+
' OR '
384+
)}`;
385+
}
386+
}
387+
388+
return innerJoinQuery;
389+
}
390+
364391
buildWhereQueryArr() {
365392
const { metrics } = this.query;
366393
const eventTable = this.getEventTable();

0 commit comments

Comments
 (0)