From 924f0db8a087a3ae396ceeec88dc78d826a50f2a Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Sun, 21 Oct 2007 00:46:26 +0000 Subject: Allow open exists filter to operate on many-to-one join. --- .../carbonado/cursor/TestFilteredCursor.java | 59 ++++++++++++++++++++ .../amazon/carbonado/filter/TestFilterExists.java | 62 +++++++++++++++++++--- 2 files changed, 115 insertions(+), 6 deletions(-) (limited to 'src/test') 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 orders = repo.storageFor(Order.class); + Storage 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 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 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 @@ -99,12 +99,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(); @@ -124,6 +118,62 @@ public class TestFilterExists extends TestCase { } } + public void testManyToOneParsing() { + { + Filter 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 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 f1 = Filter.filterFor(Order.class, "address(addressCity = ?)"); + assertFalse(f1 instanceof ExistsFilter); + assertEquals(Filter.filterFor(Order.class, "address.addressCity = ?"), f1); + } + + { + Filter f1 = Filter.filterFor(Order.class, "!address(addressCity = ?)"); + assertFalse(f1 instanceof ExistsFilter); + assertEquals(Filter.filterFor(Order.class, "address.addressCity != ?"), f1); + } + } + + public void testClosedSubFilter() { + { + Filter f1 = Filter.filterFor(Order.class, "orderTotal = ?"); + f1 = f1.orExists("shipments", Filter.getClosedFilter(Shipment.class)); + assertEquals(Filter.filterFor(Order.class, "orderTotal = ?"), f1); + } + + { + Filter f1 = Filter.filterFor(Order.class, "orderTotal = ?"); + f1 = f1.andExists("shipments", Filter.getClosedFilter(Shipment.class)); + assertTrue(f1.isClosed()); + } + + { + Filter f1 = Filter.filterFor(Order.class, "orderTotal = ?"); + f1 = f1.orNotExists("shipments", Filter.getClosedFilter(Shipment.class)); + assertTrue(f1.isOpen()); + } + + { + Filter 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 f1 = Filter.filterFor (Order.class, "orderTotal = ? & shipments(orderItems(itemPrice=?)) | orderTotal < ?"); -- cgit v1.2.3