Skip to content

Commit 56b01ca

Browse files
committed
feat: support filter by numbers
1 parent e5b9865 commit 56b01ca

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

packages/constants/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ export const operators = {
8787
regex: 'Regex',
8888
isNull: 'Is null',
8989
isNotNull: 'Is not null',
90+
gt: 'Greater than',
91+
lt: 'Less than',
92+
gte: 'Greater than or equal to',
93+
lte: 'Less than or equal to',
9094
} as const;
9195

9296
export const chartTypes = {

packages/db/src/services/chart.service.ts

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,11 @@ export function getChartSql({
369369
return sql;
370370
}
371371

372+
function isNumericColumn(columnName: string): boolean {
373+
const numericColumns = ['duration', 'revenue', 'longitude', 'latitude'];
374+
return numericColumns.includes(columnName);
375+
}
376+
372377
export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
373378
const where: Record<string, string> = {};
374379
filters.forEach((filter, index) => {
@@ -537,6 +542,78 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
537542
}
538543
break;
539544
}
545+
case 'gt': {
546+
if (isWildcard) {
547+
where[id] = `arrayExists(x -> ${value
548+
.map(
549+
(val) =>
550+
`toFloat64OrZero(x) > toFloat64(${sqlstring.escape(String(val).trim())})`,
551+
)
552+
.join(' OR ')}, ${whereFrom})`;
553+
} else {
554+
where[id] = `(${value
555+
.map(
556+
(val) =>
557+
`toFloat64OrZero(${whereFrom}) > toFloat64(${sqlstring.escape(String(val).trim())})`,
558+
)
559+
.join(' OR ')})`;
560+
}
561+
break;
562+
}
563+
case 'lt': {
564+
if (isWildcard) {
565+
where[id] = `arrayExists(x -> ${value
566+
.map(
567+
(val) =>
568+
`toFloat64OrZero(x) < toFloat64(${sqlstring.escape(String(val).trim())})`,
569+
)
570+
.join(' OR ')}, ${whereFrom})`;
571+
} else {
572+
where[id] = `(${value
573+
.map(
574+
(val) =>
575+
`toFloat64OrZero(${whereFrom}) < toFloat64(${sqlstring.escape(String(val).trim())})`,
576+
)
577+
.join(' OR ')})`;
578+
}
579+
break;
580+
}
581+
case 'gte': {
582+
if (isWildcard) {
583+
where[id] = `arrayExists(x -> ${value
584+
.map(
585+
(val) =>
586+
`toFloat64OrZero(x) >= toFloat64(${sqlstring.escape(String(val).trim())})`,
587+
)
588+
.join(' OR ')}, ${whereFrom})`;
589+
} else {
590+
where[id] = `(${value
591+
.map(
592+
(val) =>
593+
`toFloat64OrZero(${whereFrom}) >= toFloat64(${sqlstring.escape(String(val).trim())})`,
594+
)
595+
.join(' OR ')})`;
596+
}
597+
break;
598+
}
599+
case 'lte': {
600+
if (isWildcard) {
601+
where[id] = `arrayExists(x -> ${value
602+
.map(
603+
(val) =>
604+
`toFloat64OrZero(x) <= toFloat64(${sqlstring.escape(String(val).trim())})`,
605+
)
606+
.join(' OR ')}, ${whereFrom})`;
607+
} else {
608+
where[id] = `(${value
609+
.map(
610+
(val) =>
611+
`toFloat64OrZero(${whereFrom}) <= toFloat64(${sqlstring.escape(String(val).trim())})`,
612+
)
613+
.join(' OR ')})`;
614+
}
615+
break;
616+
}
540617
}
541618
} else {
542619
switch (operator) {
@@ -615,6 +692,70 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
615692
.join(' OR ')})`;
616693
break;
617694
}
695+
case 'gt': {
696+
if (isNumericColumn(name)) {
697+
where[id] = `(${value
698+
.map(
699+
(val) =>
700+
`toFloat64(${name}) > toFloat64(${sqlstring.escape(String(val).trim())})`,
701+
)
702+
.join(' OR ')})`;
703+
} else {
704+
where[id] = `(${value
705+
.map((val) => `${name} > ${sqlstring.escape(String(val).trim())}`)
706+
.join(' OR ')})`;
707+
}
708+
break;
709+
}
710+
case 'lt': {
711+
if (isNumericColumn(name)) {
712+
where[id] = `(${value
713+
.map(
714+
(val) =>
715+
`toFloat64(${name}) < toFloat64(${sqlstring.escape(String(val).trim())})`,
716+
)
717+
.join(' OR ')})`;
718+
} else {
719+
where[id] = `(${value
720+
.map((val) => `${name} < ${sqlstring.escape(String(val).trim())}`)
721+
.join(' OR ')})`;
722+
}
723+
break;
724+
}
725+
case 'gte': {
726+
if (isNumericColumn(name)) {
727+
where[id] = `(${value
728+
.map(
729+
(val) =>
730+
`toFloat64(${name}) >= toFloat64(${sqlstring.escape(String(val).trim())})`,
731+
)
732+
.join(' OR ')})`;
733+
} else {
734+
where[id] = `(${value
735+
.map(
736+
(val) => `${name} >= ${sqlstring.escape(String(val).trim())}`,
737+
)
738+
.join(' OR ')})`;
739+
}
740+
break;
741+
}
742+
case 'lte': {
743+
if (isNumericColumn(name)) {
744+
where[id] = `(${value
745+
.map(
746+
(val) =>
747+
`toFloat64(${name}) <= toFloat64(${sqlstring.escape(String(val).trim())})`,
748+
)
749+
.join(' OR ')})`;
750+
} else {
751+
where[id] = `(${value
752+
.map(
753+
(val) => `${name} <= ${sqlstring.escape(String(val).trim())}`,
754+
)
755+
.join(' OR ')})`;
756+
}
757+
break;
758+
}
618759
}
619760
}
620761
});

0 commit comments

Comments
 (0)