summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian S. O'Neill <bronee@gmail.com>2007-10-21 00:46:26 +0000
committerBrian S. O'Neill <bronee@gmail.com>2007-10-21 00:46:26 +0000
commit924f0db8a087a3ae396ceeec88dc78d826a50f2a (patch)
tree098bc54943843618e4cdb6ecc6b17be5f33133f4
parent1b10ed688bd75f7c2535bab96c5ff705a5df314e (diff)
Allow open exists filter to operate on many-to-one join.
-rw-r--r--src/test/java/com/amazon/carbonado/cursor/TestFilteredCursor.java59
-rw-r--r--src/test/java/com/amazon/carbonado/filter/TestFilterExists.java62
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 < ?");