Do you mean overloading "matchExp" and "matchAnyExp" with one-parameter methods?
2009/6/26 Andrus Adamchik <[email protected]> > 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, [email protected] 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))); >> + } >> } >> >> >> >> >
