support event filters for funnels

This commit is contained in:
Carl-Gerhard Lindesvärd
2024-03-09 08:10:45 +01:00
parent 22a37b698d
commit 79d2368cfc
4 changed files with 51 additions and 39 deletions

View File

@@ -21,14 +21,13 @@ export function getChartSql({
const { sb, join, getWhere, getFrom, getSelect, getOrderBy, getGroupBy } =
createSqlBuilder();
sb.where = getEventFiltersWhereClause(event.filters);
sb.where.projectId = `project_id = '${projectId}'`;
if (event.name !== '*') {
sb.select.label = `'${event.name}' as label`;
sb.where.eventName = `name = '${event.name}'`;
}
getEventFiltersWhereClause(sb, event.filters);
sb.select.count = `count(*) as count`;
switch (interval) {
case 'minute': {
@@ -109,10 +108,8 @@ export function getChartSql({
);
}
export function getEventFiltersWhereClause(
sb: SqlBuilderObject,
filters: IChartEventFilter[]
) {
export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
const where: Record<string, string> = {};
filters.forEach((filter, index) => {
const id = `f${index}`;
const { name, value, operator } = filter;
@@ -126,25 +123,25 @@ export function getEventFiltersWhereClause(
switch (operator) {
case 'is': {
sb.where[id] = `arrayExists(x -> ${value
where[id] = `arrayExists(x -> ${value
.map((val) => `x = '${String(val).trim()}'`)
.join(' OR ')}, ${whereFrom})`;
break;
}
case 'isNot': {
sb.where[id] = `arrayExists(x -> ${value
where[id] = `arrayExists(x -> ${value
.map((val) => `x != '${String(val).trim()}'`)
.join(' OR ')}, ${whereFrom})`;
break;
}
case 'contains': {
sb.where[id] = `arrayExists(x -> ${value
where[id] = `arrayExists(x -> ${value
.map((val) => `x LIKE '%${String(val).trim()}%'`)
.join(' OR ')}, ${whereFrom})`;
break;
}
case 'doesNotContain': {
sb.where[id] = `arrayExists(x -> ${value
where[id] = `arrayExists(x -> ${value
.map((val) => `x NOT LIKE '%${String(val).trim()}%'`)
.join(' OR ')}, ${whereFrom})`;
break;
@@ -153,25 +150,25 @@ export function getEventFiltersWhereClause(
} else {
switch (operator) {
case 'is': {
sb.where[id] = `${name} IN (${value
where[id] = `${name} IN (${value
.map((val) => `'${String(val).trim()}'`)
.join(', ')})`;
break;
}
case 'isNot': {
sb.where[id] = `${name} NOT IN (${value
where[id] = `${name} NOT IN (${value
.map((val) => `'${String(val).trim()}'`)
.join(', ')})`;
break;
}
case 'contains': {
sb.where[id] = value
where[id] = value
.map((val) => `${name} LIKE '%${String(val).trim()}%'`)
.join(' OR ');
break;
}
case 'doesNotContain': {
sb.where[id] = value
where[id] = value
.map((val) => `${name} NOT LIKE '%${String(val).trim()}%'`)
.join(' OR ');
break;
@@ -180,5 +177,5 @@ export function getEventFiltersWhereClause(
}
});
return sb;
return where;
}

View File

@@ -275,7 +275,10 @@ export async function getEventList({
}
if (filters) {
getEventFiltersWhereClause(sb, filters);
sb.where = {
...sb.where,
...getEventFiltersWhereClause(filters),
};
}
// if (cursor) {
@@ -307,7 +310,10 @@ export async function getEventsCount({
}
if (filters) {
getEventFiltersWhereClause(sb, filters);
sb.where = {
...sb.where,
...getEventFiltersWhereClause(filters),
};
}
const res = await chQuery<{ count: number }>(

View File

@@ -78,7 +78,10 @@ export async function getProfileList({
const { sb, getSql } = createSqlBuilder();
sb.from = getProfileInnerSelect(projectId);
if (filters) {
getEventFiltersWhereClause(sb, filters);
sb.where = {
...sb.where,
...getEventFiltersWhereClause(filters),
};
}
sb.limit = take;
sb.offset = (cursor ?? 0) * take;
@@ -95,7 +98,10 @@ export async function getProfileListCount({
sb.select.count = 'count(id) as count';
sb.from = getProfileInnerSelect(projectId);
if (filters) {
getEventFiltersWhereClause(sb, filters);
sb.where = {
...sb.where,
...getEventFiltersWhereClause(filters),
};
}
const [data] = await chQuery<{ count: number }>(getSql());
return data?.count ?? 0;