feat: support filter by numbers

This commit is contained in:
Carl-Gerhard Lindesvärd
2025-12-02 23:33:41 +01:00
parent e5b9865850
commit 56b01ca6d8
2 changed files with 145 additions and 0 deletions

View File

@@ -87,6 +87,10 @@ export const operators = {
regex: 'Regex',
isNull: 'Is null',
isNotNull: 'Is not null',
gt: 'Greater than',
lt: 'Less than',
gte: 'Greater than or equal to',
lte: 'Less than or equal to',
} as const;
export const chartTypes = {

View File

@@ -369,6 +369,11 @@ export function getChartSql({
return sql;
}
function isNumericColumn(columnName: string): boolean {
const numericColumns = ['duration', 'revenue', 'longitude', 'latitude'];
return numericColumns.includes(columnName);
}
export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
const where: Record<string, string> = {};
filters.forEach((filter, index) => {
@@ -537,6 +542,78 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
}
break;
}
case 'gt': {
if (isWildcard) {
where[id] = `arrayExists(x -> ${value
.map(
(val) =>
`toFloat64OrZero(x) > toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')}, ${whereFrom})`;
} else {
where[id] = `(${value
.map(
(val) =>
`toFloat64OrZero(${whereFrom}) > toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
}
break;
}
case 'lt': {
if (isWildcard) {
where[id] = `arrayExists(x -> ${value
.map(
(val) =>
`toFloat64OrZero(x) < toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')}, ${whereFrom})`;
} else {
where[id] = `(${value
.map(
(val) =>
`toFloat64OrZero(${whereFrom}) < toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
}
break;
}
case 'gte': {
if (isWildcard) {
where[id] = `arrayExists(x -> ${value
.map(
(val) =>
`toFloat64OrZero(x) >= toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')}, ${whereFrom})`;
} else {
where[id] = `(${value
.map(
(val) =>
`toFloat64OrZero(${whereFrom}) >= toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
}
break;
}
case 'lte': {
if (isWildcard) {
where[id] = `arrayExists(x -> ${value
.map(
(val) =>
`toFloat64OrZero(x) <= toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')}, ${whereFrom})`;
} else {
where[id] = `(${value
.map(
(val) =>
`toFloat64OrZero(${whereFrom}) <= toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
}
break;
}
}
} else {
switch (operator) {
@@ -615,6 +692,70 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
.join(' OR ')})`;
break;
}
case 'gt': {
if (isNumericColumn(name)) {
where[id] = `(${value
.map(
(val) =>
`toFloat64(${name}) > toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
} else {
where[id] = `(${value
.map((val) => `${name} > ${sqlstring.escape(String(val).trim())}`)
.join(' OR ')})`;
}
break;
}
case 'lt': {
if (isNumericColumn(name)) {
where[id] = `(${value
.map(
(val) =>
`toFloat64(${name}) < toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
} else {
where[id] = `(${value
.map((val) => `${name} < ${sqlstring.escape(String(val).trim())}`)
.join(' OR ')})`;
}
break;
}
case 'gte': {
if (isNumericColumn(name)) {
where[id] = `(${value
.map(
(val) =>
`toFloat64(${name}) >= toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
} else {
where[id] = `(${value
.map(
(val) => `${name} >= ${sqlstring.escape(String(val).trim())}`,
)
.join(' OR ')})`;
}
break;
}
case 'lte': {
if (isNumericColumn(name)) {
where[id] = `(${value
.map(
(val) =>
`toFloat64(${name}) <= toFloat64(${sqlstring.escape(String(val).trim())})`,
)
.join(' OR ')})`;
} else {
where[id] = `(${value
.map(
(val) => `${name} <= ${sqlstring.escape(String(val).trim())}`,
)
.join(' OR ')})`;
}
break;
}
}
}
});