You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/01/26 17:28:11 UTC

svn commit: r1561513 - /cayenne/main/trunk/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionTest.java

Author: aadamchik
Date: Sun Jan 26 16:28:10 2014
New Revision: 1561513

URL: http://svn.apache.org/r1561513
Log:
CAY-1796

patch by Oleg Artyukevich of Jan 21, 2014

Added:
    cayenne/main/trunk/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionTest.java

Added: cayenne/main/trunk/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionTest.java?rev=1561513&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionTest.java (added)
+++ cayenne/main/trunk/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionTest.java Sun Jan 26 16:28:10 2014
@@ -0,0 +1,298 @@
+package org.apache.cayenne.query;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.cayenne.CayenneContext;
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.exp.parser.ASTEqual;
+import org.apache.cayenne.exp.parser.ASTList;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class ClientExpressionTest extends ClientCase {
+    
+    @Inject
+    private CayenneContext context;
+    
+    @Inject
+    private DBHelper dbHelper;
+    
+    private TableHelper tMtTable1;
+    private TableHelper tMtTable2;
+    
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE1");
+        dbHelper.deleteAll("MT_TABLE2");
+        
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", "SERVER_ATTRIBUTE1");
+        
+        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
+        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE");
+    }
+    
+    protected void createDataSet() throws Exception {
+        for(int i = 1; i <= 10; i++) {
+            tMtTable1.insert(i ,"1_global" + i, "server" + i);
+            tMtTable2.insert(i , i, "2_global" + i);
+            tMtTable2.insert(i + 10, i, "2_global" + (i + 10));
+        }
+    }
+    
+    public void testPersistentValueInExpression() throws Exception {
+        ClientMtTable1 t1 = context.newObject(ClientMtTable1.class);
+        ClientMtTable1 t2 = context.newObject(ClientMtTable1.class);
+        
+        context.commitChanges();
+        
+        Expression scalar = ExpressionFactory.matchExp(null, t1);
+        Expression list = ExpressionFactory.matchAllExp("|", Arrays.asList(t1, t2));
+        
+        assertEquals(t1.getObjectId(), scalar.getOperand(1));
+        assertEquals(t1.getObjectId(), ((ASTEqual)list.getOperand(0)).getOperand(1));
+        assertEquals(t2.getObjectId(), ((ASTEqual)list.getOperand(1)).getOperand(1));
+    }
+    
+    public void testListInASTList() throws Exception {
+        ClientMtTable1 t1 = context.newObject(ClientMtTable1.class);
+        ClientMtTable1 t2 = context.newObject(ClientMtTable1.class);
+        
+        context.commitChanges();
+        
+        List<ClientMtTable1> table1List = new ArrayList<ClientMtTable1>();
+        table1List.add(t1);
+        table1List.add(t2);
+        
+        // send list in expression factory
+        Expression list = ExpressionFactory.inExp(ClientMtTable2.TABLE1_PROPERTY, table1List);
+        
+        Object[] values = (Object[])((ASTList)list.getOperand(1)).getOperand(0);
+        assertEquals(t1.getObjectId(), values[0]);
+        assertEquals(t2.getObjectId(), values[1]);
+        
+        ObjectId t1Id = new ObjectId("MtTable1", "TABLE1_ID", 1);
+        ObjectId t2Id = new ObjectId("MtTable1", "TABLE1_ID", 2);
+        t1.setObjectId(t1Id);
+        t2.setObjectId(t2Id);
+
+        //Expression and client have different copies of object
+        assertNotSame(t1.getObjectId(), values[0]);
+        assertNotSame(t2.getObjectId(), values[1]);
+    }
+    
+    public void testArrayInASTList() throws Exception {
+        ClientMtTable1 t1 = context.newObject(ClientMtTable1.class);
+        ClientMtTable1 t2 = context.newObject(ClientMtTable1.class);
+        ClientMtTable1 t3 = context.newObject(ClientMtTable1.class);
+        
+        context.commitChanges();
+        
+        Object[] tArray = new Object[3];
+        tArray[0] = t1;
+        tArray[1] = t2;
+        
+        // send array in expression factory
+        Expression list = ExpressionFactory.inExp(ClientMtTable2.TABLE1_PROPERTY, tArray);
+        tArray[2] = t3;
+        
+        Object[] values = (Object[])((ASTList)list.getOperand(1)).getOperand(0);
+        assertEquals(tArray.length, values.length);
+        assertNotSame(tArray[2], values[2]);
+        assertEquals(t1.getObjectId(), values[0]);
+        assertEquals(t2.getObjectId(), values[1]);
+        
+        ObjectId t1Id = new ObjectId("MtTable1", "TABLE1_ID", 1);
+        ObjectId t2Id = new ObjectId("MtTable1", "TABLE1_ID", 2);
+        t1.setObjectId(t1Id);
+        t2.setObjectId(t2Id);
+        
+        // Expression and client have different arrays
+        assertNotSame(t1.getObjectId(), values[0]);
+        assertNotSame(t2.getObjectId(), values[1]);
+    }
+    
+    public void testExpressionFactoryMatch() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable1> table1Query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class);
+        List<ClientMtTable1> table1List = context.select(table1Query);
+        
+        assertNotNull(table1List);
+        
+        ClientMtTable1 element_1 = table1List.get(0);
+        ClientMtTable1 element_2 = table1List.get(1);
+        
+        Expression exp = ExpressionFactory.matchExp(ClientMtTable2.TABLE1_PROPERTY, element_1);
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        assertNotNull(table2List);
+        assertEquals(2, table2List.size());
+        
+        exp = ExpressionFactory.matchExp(element_2);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+
+        assertNotNull(table2List);
+        assertEquals(2, table2List.size());
+    }
+    
+    public void testExpressionFactoryMatchAll() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        ClientMtTable2 element_1 = table2List.get(0);
+        ClientMtTable2 element_2 = table2List.get(10);
+        
+        assertEquals(element_1.getTable1(), element_2.getTable1());
+        
+        Expression exp = ExpressionFactory.matchAllExp("|"+ClientMtTable1.TABLE2ARRAY_PROPERTY, Arrays.asList(element_1, element_2));
+        SelectQuery<ClientMtTable1> table1Query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class, exp);
+        List<ClientMtTable1> table1List = context.select(table1Query);
+        
+        assertEquals(1, table1List.size());
+    }
+    
+    public void testExpressionFactoryMatchAny() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        ClientMtTable2 element_1 = table2List.get(0);
+        ClientMtTable2 element_2 = table2List.get(10);
+        
+        Expression exp = ExpressionFactory.matchAnyExp(element_1, element_2);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        assertEquals(2, table2List.size());
+    }
+    
+    public void testExpressionFactoryIn() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable1> table1Query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class);
+        List<ClientMtTable1> table1List = context.select(table1Query);
+        
+        ClientMtTable1 element_3 = table1List.get(2);
+        ClientMtTable1 element_8 = table1List.get(7);
+        
+        // IN expression via Collection
+        Expression exp = ExpressionFactory.inExp(ClientMtTable2.TABLE1_PROPERTY, table1List.subList(3, 6));
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        assertEquals(6, table2List.size());
+        
+        // IN expression via Array
+        exp = ExpressionFactory.inExp(ClientMtTable2.TABLE1_PROPERTY, element_3, element_8);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        assertEquals(4, table2List.size());
+    }
+    
+    public void testExpressionFactoryBetween() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable1> table1Query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class);
+        List<ClientMtTable1> table1List = context.select(table1Query);
+        
+        ClientMtTable1 element_1 = table1List.get(0);
+        ClientMtTable1 element_7 = table1List.get(6);
+        
+        // between
+        Expression exp = ExpressionFactory.betweenExp(ClientMtTable2.TABLE1_PROPERTY, element_1, element_7);
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        assertEquals(14, table2List.size());
+        
+        // not between
+        exp = ExpressionFactory.notBetweenExp(ClientMtTable2.TABLE1_PROPERTY, element_1, element_7);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        Object op2 = exp.getOperand(1);
+        Object op3 = exp.getOperand(2);
+        assertEquals(element_1.getObjectId(), op2);
+        assertEquals(element_7.getObjectId(), op3);
+        assertEquals(6, table2List.size());
+    }
+    
+    public void testExpressionFactoryOperators() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable1> table1Query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class);
+        List<ClientMtTable1> table1List = context.select(table1Query);
+        
+        ClientMtTable1 element_7 = table1List.get(6);
+        
+        // greater than, ">"
+        Expression exp = ExpressionFactory.greaterExp(ClientMtTable2.TABLE1_PROPERTY, element_7);
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        assertEquals(6, table2List.size());
+        
+        // greater than or equal, ">="
+        exp = ExpressionFactory.greaterOrEqualExp(ClientMtTable2.TABLE1_PROPERTY, element_7);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        assertEquals(8, table2List.size());
+        
+        // less than, "<"
+        exp = ExpressionFactory.lessExp(ClientMtTable2.TABLE1_PROPERTY, element_7);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        assertEquals(12, table2List.size());
+        
+        // less than or equal, "<="
+        exp = ExpressionFactory.lessOrEqualExp(ClientMtTable2.TABLE1_PROPERTY, element_7);
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        assertEquals(14, table2List.size());
+    }
+    
+    public void testExpressionWithParameters() throws Exception {
+        createDataSet();
+        
+        SelectQuery<ClientMtTable1> table1Query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class);
+        List<ClientMtTable1> table1List = context.select(table1Query);
+        
+        ClientMtTable1 element_1 = table1List.get(0);
+        ClientMtTable1 element_5 = table1List.get(4);
+        
+        Expression exp = Expression.fromString("table1 = $attr");
+        exp = exp.expWithParameters(Collections.singletonMap("attr", element_1));
+        SelectQuery<ClientMtTable2> table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        List<ClientMtTable2> table2List = context.select(table2Query);
+        
+        assertEquals(2, table2List.size());
+        
+        exp = exp.andExp(Expression.fromString("table1 = $attr"))
+                .expWithParameters(Collections.singletonMap("attr", element_5));
+        table2Query = new SelectQuery<ClientMtTable2>(ClientMtTable2.class, exp);
+        table2List = context.select(table2Query);
+        
+        assertEquals(0, table2List.size());
+    }
+}