You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ol...@apache.org on 2012/01/30 17:17:55 UTC

svn commit: r1237755 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/exp/parser/ASTEqual.java test/java/org/apache/cayenne/CayenneDataObjectTest.java test/java/org/apache/cayenne/exp/ExpressionTest.java

Author: oltka
Date: Mon Jan 30 16:17:54 2012
New Revision: 1237755

URL: http://svn.apache.org/viewvc?rev=1237755&view=rev
Log:
CAY-1657 Expression: in-memory comparison requires persistent to be in the same context as exp parameters to match (added test)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTEqual.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneDataObjectTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTEqual.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTEqual.java?rev=1237755&r1=1237754&r2=1237755&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTEqual.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTEqual.java Mon Jan 30 16:17:54 2012
@@ -22,6 +22,8 @@ package org.apache.cayenne.exp.parser;
 import java.math.BigDecimal;
 import java.util.List;
 
+import org.apache.cayenne.DataObject;
+import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ValueInjector;
 import org.apache.commons.logging.Log;
@@ -121,6 +123,18 @@ public class ASTEqual extends ConditionN
             return false;
         }
 
+        if (o1 instanceof DataObject) {
+            if (o2 instanceof DataObject && ((DataObject)o1).getObjectId().equals(((DataObject)o2).getObjectId())) {
+                if (((DataObject)o1).getObjectContext().equals(((DataObject)o2).getObjectContext())) {
+                    return o1.equals(o2);
+                } else if (((DataObject)o1).getPersistenceState() == ((DataObject)o2).getPersistenceState()) {
+                    DataObject o1_context = (((DataObject)o2).getObjectContext()).localObject(((DataObject)o1));
+                    return ((DataObject)o2).equals(o1_context);
+                }
+            }
+            return false;
+        }
+        
         return o1.equals(o2);
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneDataObjectTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneDataObjectTest.java?rev=1237755&r1=1237754&r2=1237755&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneDataObjectTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneDataObjectTest.java Mon Jan 30 16:17:54 2012
@@ -37,7 +37,7 @@ public class CayenneDataObjectTest exten
 
     @Inject
     private ObjectContext context;
-
+    
     public void testSetObjectId() throws Exception {
         CayenneDataObject object = new CayenneDataObject();
         ObjectId oid = new ObjectId("T");

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java?rev=1237755&r1=1237754&r2=1237755&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java Mon Jan 30 16:17:54 2012
@@ -22,13 +22,27 @@ package org.apache.cayenne.exp;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.Collections;
+import java.util.List;
 
-import junit.framework.TestCase;
-
+import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.testdo.testmap.Artist;
-
-public class ExpressionTest extends TestCase {
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class ExpressionTest extends ServerCase {
+    
+    @Inject
+    private ObjectContext context;
+    
+    @Inject
+    private ServerRuntime runtime;
 
     public void testFromStringLong() {
         Expression e = Expression.fromString("216201000180L");
@@ -212,4 +226,69 @@ public class ExpressionTest extends Test
 
         assertEquals("a = enum:org.apache.cayenne.exp.ExpEnum1.TWO", buffer.toString());
     }
+    
+    public void testEqualsObjects() {
+        
+        assertTrue(context instanceof DataContext);
+        
+        DataContext context2 = (DataContext) runtime.getContext();
+        
+        Artist a1 = context.newObject(Artist.class);
+        a1.setArtistName("Equals");
+        Painting p1 = context.newObject(Painting.class);
+        p1.setToArtist(a1);
+        p1.setPaintingTitle("painting1");
+        
+        SelectQuery query = new SelectQuery(Painting.class);
+        Expression e = ExpressionFactory.matchExp(Painting.TO_ARTIST_PROPERTY, a1); 
+        query.setQualifier(e);
+        
+        context.commitChanges();
+        
+        assertNotSame(context2, context);
+        
+        List<Artist> objects = context2.performQuery(query);
+        assertEquals(1, objects.size());
+        
+        // 2 same objects in different contexts
+        assertTrue(e.match(objects.get(0))); 
+        
+        // we change one object - so the objects are different now (PersistenceState different)
+        a1.setArtistName("newName");
+        
+        SelectQuery q2 = new SelectQuery(Painting.class);
+        Expression ex2 = ExpressionFactory.matchExp(Painting.TO_ARTIST_PROPERTY, a1); 
+        q2.setQualifier(ex2);
+        
+        assertFalse(ex2.match(objects.get(0))); 
+        
+        Artist a2 = context.newObject(Artist.class);
+        a1.setArtistName("Equals");
+        
+        SelectQuery q = new SelectQuery(Painting.class);
+        Expression ex = ExpressionFactory.matchExp(Painting.TO_ARTIST_PROPERTY, a2); 
+        q.setQualifier(ex);
+        
+        // 2 different objects in different contexts
+        assertFalse(ex.match(objects.get(0))); 
+    }
+    
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        
+        SelectQuery query = new SelectQuery(Artist.class);
+        Expression qual = ExpressionFactory.likeExp("artistName", "Equals");
+        query.setQualifier(qual);
+        List<?> objects = context.performQuery(query);
+        
+        if (objects.size() > 0) {
+            SelectQuery query1 = new SelectQuery(Painting.class);
+            Expression e = ExpressionFactory.matchExp(Painting.TO_ARTIST_PROPERTY, objects.get(0)); 
+            query.setQualifier(e);
+            objects.addAll(context.performQuery(query1));
+        }
+        
+        
+        context.deleteObjects(objects);
+    }
 }