diff options
| -rw-r--r-- | src/test/java/com/amazon/carbonado/cursor/TestFilteredCursor.java | 59 | ||||
| -rw-r--r-- | src/test/java/com/amazon/carbonado/filter/TestFilterExists.java | 62 | 
2 files changed, 115 insertions, 6 deletions
diff --git a/src/test/java/com/amazon/carbonado/cursor/TestFilteredCursor.java b/src/test/java/com/amazon/carbonado/cursor/TestFilteredCursor.java index 2279e9b..6f78c42 100644 --- a/src/test/java/com/amazon/carbonado/cursor/TestFilteredCursor.java +++ b/src/test/java/com/amazon/carbonado/cursor/TestFilteredCursor.java @@ -559,6 +559,65 @@ public class TestFilteredCursor extends TestCase {          assertEquals(3, matches.get(2).getOrderID());
      }
 +    public void testExistsNoParamsManyToOne() throws Exception {
 +        Repository repo = new ToyRepository();
 +        Storage<Order> orders = repo.storageFor(Order.class);
 +        Storage<OrderItem> items = repo.storageFor(OrderItem.class);
 +
 +        Order order = orders.prepare();
 +        order.setOrderID(1);
 +        order.setOrderNumber("one");
 +        order.setOrderTotal(100);
 +        order.setAddressID(0);
 +        order.insert();
 +
 +        OrderItem item = items.prepare();
 +        item.setOrderItemID(1);
 +        item.setOrderID(1);
 +        item.setItemDescription("desc one");
 +        item.setItemQuantity(1);
 +        item.setItemPrice(100);
 +        item.setShipmentID(0);
 +        item.insert();
 +
 +        item = items.prepare();
 +        item.setOrderItemID(2);
 +        item.setOrderID(1);
 +        item.setItemDescription("desc two");
 +        item.setItemQuantity(2);
 +        item.setItemPrice(5);
 +        item.setShipmentID(0);
 +        item.insert();
 +
 +        item = items.prepare();
 +        item.setOrderItemID(3);
 +        item.setOrderID(0);
 +        item.setItemDescription("desc three");
 +        item.setItemQuantity(1);
 +        item.setItemPrice(5);
 +        item.setShipmentID(0);
 +        item.insert();
 +
 +        // Query for items contained in an order.
 +        List<OrderItem> matches = items.query("order()").fetch().toList();
 +        assertEquals(2, matches.size());
 +        assertEquals(1, matches.get(0).getOrderItemID());
 +        assertEquals(2, matches.get(1).getOrderItemID());
 +
 +        // Query for items contained not in an order.
 +        matches = items.query("!order()").fetch().toList();
 +        assertEquals(1, matches.size());
 +        assertEquals(3, matches.get(0).getOrderItemID());
 +
 +        // Outer join.
 +        matches = items.query("itemPrice = ? & (order.orderTotal = ? | !order())")
 +            .with(5).with(100)
 +            .fetch().toList();
 +        assertEquals(2, matches.size());
 +        assertEquals(2, matches.get(0).getOrderItemID());
 +        assertEquals(3, matches.get(1).getOrderItemID());
 +    }
 +
      public void testExistsWithParams() throws Exception {
          Repository repo = new ToyRepository();
          Storage<Order> orders = repo.storageFor(Order.class);
 diff --git a/src/test/java/com/amazon/carbonado/filter/TestFilterExists.java b/src/test/java/com/amazon/carbonado/filter/TestFilterExists.java index e454d47..05aa535 100644 --- a/src/test/java/com/amazon/carbonado/filter/TestFilterExists.java +++ b/src/test/java/com/amazon/carbonado/filter/TestFilterExists.java @@ -100,12 +100,6 @@ public class TestFilterExists extends TestCase {      public void testParseErrors() {
          try {
 -            Filter.filterFor(Order.class, "address()");
 -            fail();
 -        } catch (MalformedFilterException e) {
 -        }
 -
 -        try {
              Filter.filterFor(Order.class, "shipments");
              fail();
          } catch (MalformedFilterException e) {
 @@ -124,6 +118,62 @@ public class TestFilterExists extends TestCase {          }
      }
 +    public void testManyToOneParsing() {
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "address()");
 +            assertTrue(f1 instanceof ExistsFilter);
 +            assertEquals("address", ((ExistsFilter) f1).getChainedProperty().toString());
 +            assertTrue(((ExistsFilter) f1).getSubFilter().isOpen());
 +            assertFalse(((ExistsFilter) f1).isNotExists());
 +        }
 +
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "!address()");
 +            assertTrue(f1 instanceof ExistsFilter);
 +            assertEquals("address", ((ExistsFilter) f1).getChainedProperty().toString());
 +            assertTrue(((ExistsFilter) f1).getSubFilter().isOpen());
 +            assertTrue(((ExistsFilter) f1).isNotExists());
 +        }
 +
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "address(addressCity = ?)");
 +            assertFalse(f1 instanceof ExistsFilter);
 +            assertEquals(Filter.filterFor(Order.class, "address.addressCity = ?"), f1);
 +        }
 +
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "!address(addressCity = ?)");
 +            assertFalse(f1 instanceof ExistsFilter);
 +            assertEquals(Filter.filterFor(Order.class, "address.addressCity != ?"), f1);
 +        }
 +    }
 +
 +    public void testClosedSubFilter() {
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "orderTotal = ?");
 +            f1 = f1.orExists("shipments", Filter.getClosedFilter(Shipment.class));
 +            assertEquals(Filter.filterFor(Order.class, "orderTotal = ?"), f1);
 +        }
 +
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "orderTotal = ?");
 +            f1 = f1.andExists("shipments", Filter.getClosedFilter(Shipment.class));
 +            assertTrue(f1.isClosed());
 +        }
 +
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "orderTotal = ?");
 +            f1 = f1.orNotExists("shipments", Filter.getClosedFilter(Shipment.class));
 +            assertTrue(f1.isOpen());
 +        }
 +
 +        {
 +            Filter<Order> f1 = Filter.filterFor(Order.class, "orderTotal = ?");
 +            f1 = f1.andNotExists("shipments", Filter.getClosedFilter(Shipment.class));
 +            assertEquals(Filter.filterFor(Order.class, "orderTotal = ?"), f1);
 +        }
 +    }
 +
      public void testVisitor() {
          Filter<Order> f1 = Filter.filterFor
              (Order.class, "orderTotal = ? & shipments(orderItems(itemPrice=?)) | orderTotal < ?");
  | 
