Skip to content

Commit 0a77495

Browse files
chore: Add EXISTS and NOT_EXISTS to relational operators (#305)
1 parent 948c1f3 commit 0a77495

4 files changed

Lines changed: 51 additions & 0 deletions

File tree

config-service-api/src/main/proto/org/hypertrace/config/service/v1/config_service.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ enum RelationalOperator {
212212
RELATIONAL_OPERATOR_LT = 6;
213213
RELATIONAL_OPERATOR_GTE = 7;
214214
RELATIONAL_OPERATOR_LTE = 8;
215+
RELATIONAL_OPERATOR_EXISTS = 9;
216+
RELATIONAL_OPERATOR_NOT_EXISTS = 10;
215217
}
216218

217219
enum LogicalOperator {

config-service-impl/src/main/java/org/hypertrace/config/service/store/FilterBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ private Filter evaluateLeafExpression(RelationalFilter relationalFilter) {
9292
case RELATIONAL_OPERATOR_GTE:
9393
return new Filter(
9494
Filter.Op.GTE, buildConfigFieldPath(relationalFilter.getConfigJsonPath()), value);
95+
case RELATIONAL_OPERATOR_EXISTS:
96+
return new Filter(
97+
Filter.Op.EXISTS, buildConfigFieldPath(relationalFilter.getConfigJsonPath()), value);
98+
case RELATIONAL_OPERATOR_NOT_EXISTS:
99+
return new Filter(
100+
Filter.Op.NOT_EXISTS,
101+
buildConfigFieldPath(relationalFilter.getConfigJsonPath()),
102+
value);
95103
case UNRECOGNIZED:
96104
default:
97105
throw Status.INVALID_ARGUMENT

config-service-impl/src/main/java/org/hypertrace/config/service/store/FilterExpressionBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ private FilterTypeExpression buildRelationalExpression(RelationalFilter relation
7878
case RELATIONAL_OPERATOR_GTE:
7979
operator = RelationalOperator.GTE;
8080
break;
81+
case RELATIONAL_OPERATOR_EXISTS:
82+
operator = RelationalOperator.EXISTS;
83+
break;
84+
case RELATIONAL_OPERATOR_NOT_EXISTS:
85+
operator = RelationalOperator.NOT_EXISTS;
86+
break;
8187
case UNRECOGNIZED:
8288
default:
8389
throw Status.INVALID_ARGUMENT

config-service-impl/src/test/java/org/hypertrace/config/service/store/FilterBuilderTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,41 @@ void buildDocStoreFilter2() {
8383
assertEquals(docFilter.toString(), filterBuilder.buildDocStoreFilter(filter).toString());
8484
}
8585

86+
@Test
87+
void testExistsAndNotExistsOperators() {
88+
// Test EXISTS operator
89+
Filter existsFilter =
90+
Filter.newBuilder()
91+
.setRelationalFilter(
92+
RelationalFilter.newBuilder()
93+
.setConfigJsonPath("testField")
94+
.setOperator(RelationalOperator.RELATIONAL_OPERATOR_EXISTS))
95+
.build();
96+
97+
org.hypertrace.core.documentstore.Filter expectedExistsFilter =
98+
new org.hypertrace.core.documentstore.Filter(
99+
org.hypertrace.core.documentstore.Filter.Op.EXISTS, "config.testField", null);
100+
assertEquals(
101+
expectedExistsFilter.toString(),
102+
filterBuilder.buildDocStoreFilter(existsFilter).toString());
103+
104+
// Test NOT_EXISTS operator
105+
Filter notExistsFilter =
106+
Filter.newBuilder()
107+
.setRelationalFilter(
108+
RelationalFilter.newBuilder()
109+
.setConfigJsonPath("anotherField")
110+
.setOperator(RelationalOperator.RELATIONAL_OPERATOR_NOT_EXISTS))
111+
.build();
112+
113+
org.hypertrace.core.documentstore.Filter expectedNotExistsFilter =
114+
new org.hypertrace.core.documentstore.Filter(
115+
org.hypertrace.core.documentstore.Filter.Op.NOT_EXISTS, "config.anotherField", null);
116+
assertEquals(
117+
expectedNotExistsFilter.toString(),
118+
filterBuilder.buildDocStoreFilter(notExistsFilter).toString());
119+
}
120+
86121
@Test
87122
void buildDocStoreFilter3() {
88123
Filter filter =

0 commit comments

Comments
 (0)