cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From and...@apache.org
Subject svn commit: r788657 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/exp/ExpressionFactory.java test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java
Date Fri, 26 Jun 2009 11:25:15 GMT
Author: andrey
Date: Fri Jun 26 11:25:15 2009
New Revision: 788657

URL: http://svn.apache.org/viewvc?rev=788657&view=rev
Log:
CAY-1241 Add method to ExpressionFactory to match against the primary key of an object or
list of objects (based on patch by Laurentiu Cocanu)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java?rev=788657&r1=788656&r2=788657&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java
(original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java
Fri Jun 26 11:25:15 2009
@@ -25,6 +25,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.Persistent;
 import org.apache.cayenne.exp.parser.ASTAdd;
 import org.apache.cayenne.exp.parser.ASTAnd;
 import org.apache.cayenne.exp.parser.ASTBetween;
@@ -675,4 +677,55 @@
         }
         return exp;
     }
+    
+    /**
+     * Creates an expression that matches the primary key of object in
+     * <code>ObjectId</code>'s <code>IdSnapshot</code> for the argument
+     * <code>object</code>.
+     */
+    public static Expression matchObjectExp(Persistent object) {
+        ObjectId obid = object.getObjectId();
+        Map<String, ?> map = obid.getIdSnapshot();
+
+        List<Expression> pairs = new ArrayList<Expression>(map.size());
+
+        for (Map.Entry<String, ?> entry : map.entrySet()) {
+            Expression exp = expressionOfType(Expression.EQUAL_TO);
+            exp.setOperand(0, new ASTDbPath(entry.getKey()));
+            exp.setOperand(1, wrapPathOperand(entry.getValue()));
+            pairs.add(exp);
+        }
+
+        return joinExp(Expression.AND, pairs);
+    }
+
+    /**
+     * Creates an expression that matches any of the objects contained in the list
+     * <code>objects</code>
+     */
+    public static Expression matchObjectsExp(List<? extends Persistent> objects) {
+        if (objects == null || objects.size() == 0) {
+            return expFalse();
+        }
+        
+        return matchObjectsExp(objects.toArray(new Persistent[objects.size()]));
+    } 
+    
+    /**
+     * Creates an expression that matches any of the objects contained in the
+     * <code>objects</code> array
+     */
+    public static Expression matchObjectsExp(Persistent... objects) {
+        if (objects == null || objects.length == 0) {
+            return expFalse();
+        }
+        
+        List<Expression> pairs = new ArrayList<Expression>(objects.length);
+
+        for (Persistent object : objects) {
+            pairs.add(matchObjectExp(object));
+        }
+
+        return joinExp(Expression.OR, pairs);
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java?rev=788657&r1=788656&r2=788657&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java
(original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java
Fri Jun 26 11:25:15 2009
@@ -20,11 +20,15 @@
 package org.apache.cayenne.exp;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.art.Artist;
 import org.apache.art.Painting;
+import org.apache.cayenne.DataObjectUtils;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.unit.CayenneCase;
 
 public class ExpressionFactoryTest extends CayenneCase {
@@ -244,4 +248,35 @@
         assertTrue(ExpressionFactory.inExp("paintingTitle", "p1").match(p1));
         assertFalse(ExpressionFactory.notInExp("paintingTitle", "p3").match(p3));
     }
+    
+    public void testMatchObject() {
+        ObjectContext dc = createDataContext();
+        
+        Artist a1 = dc.newObject(Artist.class);
+        a1.setArtistName("a1");
+        Artist a2 = dc.newObject(Artist.class);
+        a2.setArtistName("a2");
+        Artist a3 = dc.newObject(Artist.class);
+        a3.setArtistName("a3");
+        dc.commitChanges();
+        
+        SelectQuery query = new SelectQuery(Artist.class);
+        
+        query.setQualifier(ExpressionFactory.matchObjectExp(a2));
+        Object res = DataObjectUtils.objectForQuery(dc, query);//exception if >1 result
+        assertSame(res, a2);
+        assertTrue(query.getQualifier().match(res));
+        
+        query.setQualifier(ExpressionFactory.matchObjectsExp(a1, a3));
+        query.addOrdering("artistName", true);
+        List<Persistent> list = dc.performQuery(query);
+        assertEquals(list.size(), 2);
+        assertSame(list.get(0), a1);
+        assertSame(list.get(1), a3);
+        assertTrue(query.getQualifier().match(a1));
+        assertTrue(query.getQualifier().match(a3));
+        
+        assertEquals(query.getQualifier(), 
+                ExpressionFactory.matchObjectsExp(Arrays.asList(a1, a3)));
+    }
 }



Mime
View raw message