feat: support filter by numbers
This commit is contained in:
@@ -87,6 +87,10 @@ export const operators = {
|
|||||||
regex: 'Regex',
|
regex: 'Regex',
|
||||||
isNull: 'Is null',
|
isNull: 'Is null',
|
||||||
isNotNull: 'Is not 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;
|
} as const;
|
||||||
|
|
||||||
export const chartTypes = {
|
export const chartTypes = {
|
||||||
|
|||||||
@@ -369,6 +369,11 @@ export function getChartSql({
|
|||||||
return sql;
|
return sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isNumericColumn(columnName: string): boolean {
|
||||||
|
const numericColumns = ['duration', 'revenue', 'longitude', 'latitude'];
|
||||||
|
return numericColumns.includes(columnName);
|
||||||
|
}
|
||||||
|
|
||||||
export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
|
export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
|
||||||
const where: Record<string, string> = {};
|
const where: Record<string, string> = {};
|
||||||
filters.forEach((filter, index) => {
|
filters.forEach((filter, index) => {
|
||||||
@@ -537,6 +542,78 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
|
|||||||
}
|
}
|
||||||
break;
|
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 {
|
} else {
|
||||||
switch (operator) {
|
switch (operator) {
|
||||||
@@ -615,6 +692,70 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
|
|||||||
.join(' OR ')})`;
|
.join(' OR ')})`;
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user