Skip to content

Commit b64ad8c

Browse files
committed
Add more test cases to PostgresQueryParserTest.java
1 parent f115bc3 commit b64ad8c

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

document-store/src/test/java/org/hypertrace/core/documentstore/postgres/query/v1/PostgresQueryParserTest.java

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.LTE;
2222
import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.NEQ;
2323
import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.NOT_CONTAINS;
24+
import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.NOT_IN;
2425
import static org.hypertrace.core.documentstore.expression.operators.SortOrder.ASC;
2526
import static org.hypertrace.core.documentstore.expression.operators.SortOrder.DESC;
2627
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -1427,4 +1428,127 @@ void testCollectionInOtherSchema() {
14271428
assertEquals(
14281429
"SELECT * FROM test_schema.\"test_table.with_a_dot\"", postgresQueryParser.parse());
14291430
}
1431+
1432+
@Test
1433+
void testNotContainsWithFlatCollectionNonJsonField() {
1434+
Query query =
1435+
Query.builder()
1436+
.setFilter(
1437+
RelationalExpression.of(
1438+
IdentifierExpression.of("tags"),
1439+
NOT_CONTAINS,
1440+
ConstantExpression.of("premium")))
1441+
.build();
1442+
1443+
PostgresQueryParser postgresQueryParser =
1444+
new PostgresQueryParser(
1445+
TEST_TABLE,
1446+
PostgresQueryTransformer.transform(query),
1447+
new FlatPostgresFieldTransformer());
1448+
1449+
String sql = postgresQueryParser.parse();
1450+
assertEquals(
1451+
"SELECT * FROM \"testCollection\" WHERE \"tags\" IS NULL OR NOT (\"tags\" @> ARRAY[?]::text[])",
1452+
sql);
1453+
1454+
Params params = postgresQueryParser.getParamsBuilder().build();
1455+
assertEquals(1, params.getObjectParams().size());
1456+
assertEquals(List.of("premium"), params.getObjectParams().get(1));
1457+
}
1458+
1459+
@Test
1460+
void testNotContainsWithNestedCollectionJsonField() {
1461+
Query query =
1462+
Query.builder()
1463+
.setFilter(
1464+
RelationalExpression.of(
1465+
IdentifierExpression.of("attributes"),
1466+
NOT_CONTAINS,
1467+
ConstantExpression.of("value1")))
1468+
.build();
1469+
1470+
PostgresQueryParser postgresQueryParser =
1471+
new PostgresQueryParser(TEST_TABLE, PostgresQueryTransformer.transform(query));
1472+
1473+
String sql = postgresQueryParser.parse();
1474+
assertEquals(
1475+
"SELECT * FROM \"testCollection\" WHERE document->'attributes' IS NULL OR NOT document->'attributes' @> ?::jsonb",
1476+
sql);
1477+
1478+
Params params = postgresQueryParser.getParamsBuilder().build();
1479+
assertEquals(1, params.getObjectParams().size());
1480+
assertEquals("[\"value1\"]", params.getObjectParams().get(1));
1481+
}
1482+
1483+
@Test
1484+
void testNotInWithFlatCollectionNonJsonField() {
1485+
Query query =
1486+
Query.builder()
1487+
.setFilter(
1488+
RelationalExpression.of(
1489+
IdentifierExpression.of("category"),
1490+
NOT_IN,
1491+
ConstantExpression.ofStrings(List.of("electronics", "clothing"))))
1492+
.build();
1493+
1494+
PostgresQueryParser postgresQueryParser =
1495+
new PostgresQueryParser(
1496+
TEST_TABLE,
1497+
PostgresQueryTransformer.transform(query),
1498+
new FlatPostgresFieldTransformer());
1499+
1500+
String sql = postgresQueryParser.parse();
1501+
assertEquals(
1502+
"SELECT * FROM \"testCollection\" WHERE \"category\" IS NULL OR NOT (ARRAY[\"category\"]::text[] && ARRAY[?, ?]::text[])",
1503+
sql);
1504+
1505+
Params params = postgresQueryParser.getParamsBuilder().build();
1506+
assertEquals(2, params.getObjectParams().size());
1507+
}
1508+
1509+
@Test
1510+
void testNotInWithNestedCollectionJsonField() {
1511+
Query query =
1512+
Query.builder()
1513+
.setFilter(
1514+
RelationalExpression.of(
1515+
IdentifierExpression.of("status"),
1516+
NOT_IN,
1517+
ConstantExpression.ofStrings(List.of("active", "pending"))))
1518+
.build();
1519+
1520+
PostgresQueryParser postgresQueryParser =
1521+
new PostgresQueryParser(TEST_TABLE, PostgresQueryTransformer.transform(query));
1522+
1523+
String sql = postgresQueryParser.parse();
1524+
assertEquals(
1525+
"SELECT * FROM \"testCollection\" WHERE document->'status' IS NULL OR NOT ((((jsonb_typeof(to_jsonb(document->'status')) = 'array' AND to_jsonb(document->'status') @> jsonb_build_array(?)) OR (jsonb_build_array(document->'status') @> jsonb_build_array(?))) OR ((jsonb_typeof(to_jsonb(document->'status')) = 'array' AND to_jsonb(document->'status') @> jsonb_build_array(?)) OR (jsonb_build_array(document->'status') @> jsonb_build_array(?)))))",
1526+
sql);
1527+
1528+
Params params = postgresQueryParser.getParamsBuilder().build();
1529+
assertEquals(4, params.getObjectParams().size());
1530+
}
1531+
1532+
@Test
1533+
void testContainsWithFlatCollectionNonJsonField() {
1534+
Query query =
1535+
Query.builder()
1536+
.setFilter(
1537+
RelationalExpression.of(
1538+
IdentifierExpression.of("keywords"), CONTAINS, ConstantExpression.of("java")))
1539+
.build();
1540+
1541+
PostgresQueryParser postgresQueryParser =
1542+
new PostgresQueryParser(
1543+
TEST_TABLE,
1544+
PostgresQueryTransformer.transform(query),
1545+
new FlatPostgresFieldTransformer());
1546+
1547+
String sql = postgresQueryParser.parse();
1548+
assertEquals("SELECT * FROM \"testCollection\" WHERE \"keywords\" @> ARRAY[?]::text[]", sql);
1549+
1550+
Params params = postgresQueryParser.getParamsBuilder().build();
1551+
assertEquals(1, params.getObjectParams().size());
1552+
assertEquals(List.of("java"), params.getObjectParams().get(1));
1553+
}
14301554
}

0 commit comments

Comments
 (0)