|
21 | 21 | import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.LTE; |
22 | 22 | import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.NEQ; |
23 | 23 | import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.NOT_CONTAINS; |
| 24 | +import static org.hypertrace.core.documentstore.expression.operators.RelationalOperator.NOT_IN; |
24 | 25 | import static org.hypertrace.core.documentstore.expression.operators.SortOrder.ASC; |
25 | 26 | import static org.hypertrace.core.documentstore.expression.operators.SortOrder.DESC; |
26 | 27 | import static org.junit.jupiter.api.Assertions.assertEquals; |
@@ -1427,4 +1428,127 @@ void testCollectionInOtherSchema() { |
1427 | 1428 | assertEquals( |
1428 | 1429 | "SELECT * FROM test_schema.\"test_table.with_a_dot\"", postgresQueryParser.parse()); |
1429 | 1430 | } |
| 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 | + } |
1430 | 1554 | } |
0 commit comments