diff --git a/packages/constants/index.ts b/packages/constants/index.ts index 6d331626..17cd2d15 100644 --- a/packages/constants/index.ts +++ b/packages/constants/index.ts @@ -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 = { diff --git a/packages/db/src/services/chart.service.ts b/packages/db/src/services/chart.service.ts index 5a67f747..bc643228 100644 --- a/packages/db/src/services/chart.service.ts +++ b/packages/db/src/services/chart.service.ts @@ -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 = {}; 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; + } } } });