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

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Jun 26 2009 - 07:49:43 EDT

  • Next message: Aristedes Maniatis: "Re: Poleposition for Cayenne?"

    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 <andru..bjectstyle.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, 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:50:16 EDT