You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by an...@apache.org on 2009/06/26 13:25:15 UTC

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

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)));
+    }
 }



Re: 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

Posted by Andrus Adamchik <an...@objectstyle.org>.
Yes.

On Jun 26, 2009, at 2:38 PM, Andrey Razumovsky wrote:

> Do you mean overloading "matchExp" and "matchAnyExp" with one- 
> parameter
> methods?
>
> 2009/6/26 Andrus Adamchik <an...@objectstyle.org>
>
>> Andrey,
>>
>> thanks for applying this. Do you mind to perform this renaming that I
>> suggested earlier to better match the existing factory API:
>>
>> * s/matchObject/matchExp/
>> * s/matchObjects/matchAllExp|matchAnyExp/
>>
>> If not, no worries, I may do it myself.
>>
>> Andrus
>>
>>
>> On Jun 26, 2009, at 2:25 PM, andrey@apache.org wrote:
>>
>> 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)));
>>> +    }
>>> }
>>>
>>>
>>>
>>>
>>


Re: 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

Posted by Andrey Razumovsky <ra...@gmail.com>.
Do you mean overloading "matchExp" and "matchAnyExp" with one-parameter
methods?

2009/6/26 Andrus Adamchik <an...@objectstyle.org>

> Andrey,
>
> thanks for applying this. Do you mind to perform this renaming that I
> suggested earlier to better match the existing factory API:
>
> * s/matchObject/matchExp/
> * s/matchObjects/matchAllExp|matchAnyExp/
>
> If not, no worries, I may do it myself.
>
> Andrus
>
>
> On Jun 26, 2009, at 2:25 PM, andrey@apache.org wrote:
>
>  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)));
>> +    }
>> }
>>
>>
>>
>>
>

Re: 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

Posted by Andrus Adamchik <an...@objectstyle.org>.
Andrey,

thanks for applying this. Do you mind to perform this renaming that I  
suggested earlier to better match the existing factory API:

* s/matchObject/matchExp/
* s/matchObjects/matchAllExp|matchAnyExp/

If not, no worries, I may do it myself.

Andrus

On Jun 26, 2009, at 2:25 PM, andrey@apache.org wrote:

> 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)));
> +    }
> }
>
>
>