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, andre..pache.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)));
> + }
> }
>
>
>
This archive was generated by hypermail 2.0.0 : Fri Jun 26 2009 - 07:31:50 EDT