Repository: cayenne
Updated Branches:
  refs/heads/master 200ac46e7 -> 6a4d83f63


CAY-2012 ObjectSelect, SelectById: eiliminating methods that reset query state

*    addOrderBy - gone
*    orderBy - append instead of reset

*    addPrefetch - gone
*    prefetch - merge instead of reset

*    where - behave as "and" instead of reset


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/6a4d83f6
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/6a4d83f6
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/6a4d83f6

Branch: refs/heads/master
Commit: 6a4d83f63b205e4f64fe90516b5eef9a11e9ca1f
Parents: 200ac46
Author: aadamchik <aadamc...@apache.org>
Authored: Mon May 11 02:00:30 2015 +0200
Committer: aadamchik <aadamc...@apache.org>
Committed: Mon May 11 07:03:05 2015 +0200

----------------------------------------------------------------------
 .../org/apache/cayenne/query/ObjectSelect.java  | 145 +++++--------------
 .../org/apache/cayenne/query/SelectById.java    |  26 +---
 .../apache/cayenne/query/ObjectSelectTest.java  | 127 +++++-----------
 .../apache/cayenne/query/SelectByIdTest.java    |  36 ++---
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 docs/doc/src/main/resources/UPGRADE.txt         |   3 +
 6 files changed, 103 insertions(+), 235 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a4d83f6/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
index bf1564a..f4fcb7b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
@@ -18,6 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.query;
 
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectContext;
@@ -30,12 +36,6 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
 /**
  * A selecting query providing chainable API. Can be viewed as an alternative 
to
  * {@link SelectQuery}.
@@ -231,23 +231,25 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
        }
 
        /**
-        * Initializes or resets a qualifier expression of this query.
+        * Appends a qualifier expression of this query. An equivalent to
+        * {@link #and(Expression...)} that can be used a syntactic sugar.
         * 
         * @return this object
         */
        public ObjectSelect<T> where(Expression expression) {
-               this.where = expression;
+               and(expression);
                return this;
        }
 
        /**
-        * Initializes or resets a qualifier expression of this query, using
-        * provided expression String and an array of position parameters.
+        * Appends a qualifier expression of this query, using provided 
expression
+        * String and an array of position parameters. This is an equivalent to
+        * calling "and".
         * 
         * @return this object
         */
        public ObjectSelect<T> where(String expressionString, Object... 
parameters) {
-               this.where = ExpressionFactory.exp(expressionString, 
parameters);
+               and(ExpressionFactory.exp(expressionString, parameters));
                return this;
        }
 
@@ -347,60 +349,12 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
        }
 
        /**
-        * Initializes or resets a list of orderings of this query.
+        * Adds a list of orderings of this query.
         * 
         * @return this object
         */
        public ObjectSelect<T> orderBy(Ordering... orderings) {
 
-               if (this.orderings != null) {
-                       this.orderings.clear();
-               }
-
-               return addOrderBy(orderings);
-       }
-
-       /**
-        * Initializes or resets a list of orderings of this query.
-        * 
-        * @return this object
-        */
-       public ObjectSelect<T> orderBy(Collection<Ordering> orderings) {
-
-               if (this.orderings != null) {
-                       this.orderings.clear();
-               }
-
-               return addOrderBy(orderings);
-       }
-
-       /**
-        * Adds a single ascending ordering on a given property to the existing
-        * ordering clause of this query.
-        * 
-        * @return this object
-        */
-       public ObjectSelect<T> addOrderBy(String property) {
-               return addOrderBy(new Ordering(property));
-       }
-
-       /**
-        * Adds a single ordering on a given property to the existing ordering
-        * clause of this query.
-        * 
-        * @return this object
-        */
-       public ObjectSelect<T> addOrderBy(String property, SortOrder sortOrder) 
{
-               return addOrderBy(new Ordering(property, sortOrder));
-       }
-
-       /**
-        * Adds new orderings to the list of the existing orderings.
-        * 
-        * @return this object
-        */
-       public ObjectSelect<T> addOrderBy(Ordering... orderings) {
-
                if (orderings == null || orderings == null) {
                        return this;
                }
@@ -417,11 +371,11 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
        }
 
        /**
-        * Adds new orderings to the list of orderings.
+        * Adds a list of orderings of this query.
         * 
         * @return this object
         */
-       public ObjectSelect<T> addOrderBy(Collection<Ordering> orderings) {
+       public ObjectSelect<T> orderBy(Collection<Ordering> orderings) {
 
                if (orderings == null || orderings == null) {
                        return this;
@@ -437,32 +391,11 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
        }
 
        /**
-        * Resets internal prefetches to the new value, which is a single 
prefetch
-        * with specified semantics.
-        * 
-        * @return this object
-        */
-       public ObjectSelect<T> prefetch(String path, int semantics) {
-               this.prefetches = PrefetchTreeNode.withPath(path, semantics);
-               return this;
-       }
-
-       /**
-        * Resets internal prefetches to the new value.
-        * 
-        * @return this object
-        */
-       public ObjectSelect<T> prefetch(PrefetchTreeNode prefetch) {
-               this.prefetches = prefetch;
-               return this;
-       }
-
-       /**
         * Merges prefetch into the query prefetch tree.
         * 
         * @return this object
         */
-       public ObjectSelect<T> addPrefetch(PrefetchTreeNode prefetch) {
+       public ObjectSelect<T> prefetch(PrefetchTreeNode prefetch) {
 
                if (prefetch == null) {
                        return this;
@@ -482,7 +415,7 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
         * 
         * @return this object
         */
-       public ObjectSelect<T> addPrefetch(String path, int semantics) {
+       public ObjectSelect<T> prefetch(String path, int semantics) {
 
                if (path == null) {
                        return this;
@@ -600,7 +533,7 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
                return cacheStrategy(QueryCacheStrategy.SHARED_CACHE, 
cacheGroups);
        }
 
-    public String[] getCacheGroups() {
+       public String[] getCacheGroups() {
                return cacheGroups;
        }
 
@@ -655,33 +588,33 @@ public class ObjectSelect<T> extends IndirectQuery 
implements Select<T> {
                return prefetches;
        }
 
-    @Override
-    public List<T> select(ObjectContext context) {
+       @Override
+       public List<T> select(ObjectContext context) {
                return context.select(this);
        }
 
-    @Override
-    public T selectOne(ObjectContext context) {
+       @Override
+       public T selectOne(ObjectContext context) {
                return context.selectOne(this);
        }
 
-    @Override
-    public T selectFirst(ObjectContext context) {
-        return context.selectFirst(limit(1));
-    }
+       @Override
+       public T selectFirst(ObjectContext context) {
+               return context.selectFirst(limit(1));
+       }
 
-    @Override
-    public void iterate(ObjectContext context, ResultIteratorCallback<T> 
callback) {
-        context.iterate((Select<T>) this, callback);
-    }
+       @Override
+       public void iterate(ObjectContext context, ResultIteratorCallback<T> 
callback) {
+               context.iterate((Select<T>) this, callback);
+       }
 
-    @Override
-    public ResultIterator<T> iterator(ObjectContext context) {
-        return context.iterator(this);
-    }
+       @Override
+       public ResultIterator<T> iterator(ObjectContext context) {
+               return context.iterator(this);
+       }
 
-    @Override
-    public ResultBatchIterator<T> batchIterator(ObjectContext context, int 
size) {
-        return context.batchIterator(this, size);
-    }
+       @Override
+       public ResultBatchIterator<T> batchIterator(ObjectContext context, int 
size) {
+               return context.batchIterator(this, size);
+       }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a4d83f6/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
index 489537c..f9e8209 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
@@ -255,32 +255,11 @@ public class SelectById<T> extends IndirectQuery 
implements Select<T> {
        }
 
        /**
-        * Resets internal prefetches to the new value, which is a single 
prefetch
-        * with specified semantics.
-        * 
-        * @return this object
-        */
-       public SelectById<T> prefetch(String path, int semantics) {
-               this.prefetches = PrefetchTreeNode.withPath(path, semantics);
-               return this;
-       }
-
-       /**
-        * Resets internal prefetches to the new value.
-        * 
-        * @return this object
-        */
-       public SelectById<T> prefetch(PrefetchTreeNode prefetch) {
-               this.prefetches = prefetch;
-               return this;
-       }
-
-       /**
         * Merges prefetch into the query prefetch tree.
         * 
         * @return this object
         */
-       public SelectById<T> addPrefetch(PrefetchTreeNode prefetch) {
+       public SelectById<T> prefetch(PrefetchTreeNode prefetch) {
 
                if (prefetch == null) {
                        return this;
@@ -300,7 +279,7 @@ public class SelectById<T> extends IndirectQuery implements 
Select<T> {
         * 
         * @return this object
         */
-       public SelectById<T> addPrefetch(String path, int semantics) {
+       public SelectById<T> prefetch(String path, int semantics) {
 
                if (path == null) {
                        return this;
@@ -318,6 +297,7 @@ public class SelectById<T> extends IndirectQuery implements 
Select<T> {
                return prefetches;
        }
 
+       @SuppressWarnings("deprecation")
        @Override
        protected Query createReplacementQuery(EntityResolver resolver) {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a4d83f6/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelectTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelectTest.java 
b/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelectTest.java
index 9a3056e..cb86ceb 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelectTest.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelectTest.java
@@ -18,25 +18,24 @@
  ****************************************************************/
 package org.apache.cayenne.query;
 
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.junit.Test;
+
 public class ObjectSelectTest {
 
        @Test
@@ -105,7 +104,7 @@ public class ObjectSelectTest {
                assertEquals("a = 3", q.getWhere().toString());
 
                q.where(ExpressionFactory.matchExp("b", 4));
-               assertEquals("b = 4", q.getWhere().toString());
+               assertEquals("(a = 3) and (b = 4)", q.getWhere().toString());
        }
 
        @Test
@@ -214,26 +213,6 @@ public class ObjectSelectTest {
                q.orderBy(o2);
 
                Object[] result2 = q.getOrderings().toArray();
-               assertEquals(1, result2.length);
-               assertSame(o2, result2[0]);
-       }
-
-       @Test
-       public void testAddOrderBy_Array() {
-
-               ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
-
-               Ordering o1 = new Ordering("x");
-               q.orderBy(o1);
-
-               Object[] result1 = q.getOrderings().toArray();
-               assertEquals(1, result1.length);
-               assertSame(o1, result1[0]);
-
-               Ordering o2 = new Ordering("y");
-               q.addOrderBy(o2);
-
-               Object[] result2 = q.getOrderings().toArray();
                assertEquals(2, result2.length);
                assertSame(o1, result2[0]);
                assertSame(o2, result2[1]);
@@ -255,50 +234,12 @@ public class ObjectSelectTest {
                q.orderBy(Collections.singletonList(o2));
 
                Object[] result2 = q.getOrderings().toArray();
-               assertEquals(1, result2.length);
-               assertSame(o2, result2[0]);
-       }
-
-       @Test
-       public void testAddOrderBy_Collection() {
-
-               ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
-
-               Ordering o1 = new Ordering("x");
-               q.orderBy(Collections.singletonList(o1));
-
-               Object[] result1 = q.getOrderings().toArray();
-               assertEquals(1, result1.length);
-               assertSame(o1, result1[0]);
-
-               Ordering o2 = new Ordering("y");
-               q.addOrderBy(Collections.singletonList(o2));
-
-               Object[] result2 = q.getOrderings().toArray();
                assertEquals(2, result2.length);
                assertSame(o1, result2[0]);
                assertSame(o2, result2[1]);
        }
 
        @Test
-       public void testOrderBy_Property() {
-
-               ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
-
-               q.orderBy("x");
-
-               Object[] result1 = q.getOrderings().toArray();
-               assertEquals(1, result1.length);
-               assertEquals(new Ordering("x", SortOrder.ASCENDING), 
result1[0]);
-
-               q.orderBy("y");
-
-               Object[] result2 = q.getOrderings().toArray();
-               assertEquals(1, result2.length);
-               assertEquals(new Ordering("y", SortOrder.ASCENDING), 
result2[0]);
-       }
-
-       @Test
        public void testOrderBy_PropertyStrategy() {
 
                ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
@@ -312,22 +253,22 @@ public class ObjectSelectTest {
                q.orderBy("y", SortOrder.DESCENDING);
 
                Object[] result2 = q.getOrderings().toArray();
-               assertEquals(1, result2.length);
-               assertEquals(new Ordering("y", SortOrder.DESCENDING), 
result2[0]);
+               assertEquals(2, result2.length);
+               assertEquals(new Ordering("y", SortOrder.DESCENDING), 
result2[1]);
        }
 
        @Test
-       public void testAddOrderBy_Property() {
+       public void testOrderBy_Property() {
 
                ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
 
-               q.addOrderBy("x");
+               q.orderBy("x");
 
                Object[] result1 = q.getOrderings().toArray();
                assertEquals(1, result1.length);
                assertEquals(new Ordering("x", SortOrder.ASCENDING), 
result1[0]);
 
-               q.addOrderBy("y");
+               q.orderBy("y");
 
                Object[] result2 = q.getOrderings().toArray();
                assertEquals(2, result2.length);
@@ -343,7 +284,10 @@ public class ObjectSelectTest {
                ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
                q.prefetch(root);
 
-               assertSame(root, q.getPrefetches());
+               PrefetchTreeNode root1 = q.getPrefetches();
+               assertNotNull(root1);
+               assertNotNull(root1.getNode("a.b"));
+               assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, 
root1.getNode("a.b").getSemantics());
        }
 
        @Test
@@ -361,26 +305,32 @@ public class ObjectSelectTest {
 
                assertNotNull(root2);
                assertNotNull(root2.getNode("a.c"));
-               assertNull(root2.getNode("a.b"));
-               assertNotSame(root1, root2);
+               assertNotNull(root2.getNode("a.b"));
        }
 
        @Test
-       public void testAddPrefetch() {
+       public void testPrefetch_Merge() {
 
                PrefetchTreeNode root = PrefetchTreeNode.withPath("a.b", 
PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
                ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
                q.prefetch(root);
 
-               assertSame(root, q.getPrefetches());
+               PrefetchTreeNode root1 = q.getPrefetches();
+               assertNotNull(root1);
+               assertNotNull(root1.getNode("a.b"));
+               assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, 
root1.getNode("a.b").getSemantics());
 
                PrefetchTreeNode subRoot = PrefetchTreeNode.withPath("a.b.c", 
PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-               q.addPrefetch(subRoot);
+               q.prefetch(subRoot);
 
-               assertSame(root, q.getPrefetches());
+               root1 = q.getPrefetches();
+               assertNotNull(root1);
+               assertNotNull(root1.getNode("a.b"));
+               assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, 
root1.getNode("a.b").getSemantics());
 
-               assertNotNull(root.getNode("a.b.c"));
+               assertNotNull(root1.getNode("a.b.c"));
+               assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, 
root1.getNode("a.b.c").getSemantics());
        }
 
        @Test
@@ -394,7 +344,7 @@ public class ObjectSelectTest {
                q.limit(3).limit(5);
                assertEquals(5, q.getLimit());
        }
-       
+
        @Test
        public void testOffset() {
                ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
@@ -406,7 +356,7 @@ public class ObjectSelectTest {
                q.offset(3).offset(5);
                assertEquals(5, q.getOffset());
        }
-       
+
        @Test
        public void testStatementFetchSize() {
                ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
@@ -418,8 +368,7 @@ public class ObjectSelectTest {
                q.statementFetchSize(3).statementFetchSize(5);
                assertEquals(5, q.getStatementFetchSize());
        }
-       
-       
+
        @Test
        public void testCacheGroups_Collection() {
                ObjectSelect<DataRow> q = 
ObjectSelect.dataRowQuery(Artist.class);
@@ -447,7 +396,7 @@ public class ObjectSelectTest {
                assertSame(QueryCacheStrategy.SHARED_CACHE, 
q.getCacheStrategy());
                assertNull(q.getCacheGroups());
        }
-       
+
        @Test
        public void testLocalCache() {
                ObjectSelect<DataRow> q = 
ObjectSelect.dataRowQuery(Artist.class);
@@ -463,7 +412,7 @@ public class ObjectSelectTest {
                assertSame(QueryCacheStrategy.LOCAL_CACHE, 
q.getCacheStrategy());
                assertNull(q.getCacheGroups());
        }
-       
+
        @Test
        public void testSharedCache() {
                ObjectSelect<DataRow> q = 
ObjectSelect.dataRowQuery(Artist.class);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a4d83f6/cayenne-server/src/test/java/org/apache/cayenne/query/SelectByIdTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectByIdTest.java 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectByIdTest.java
index 4dca1c8..668c8d9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectByIdTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectByIdTest.java
@@ -19,9 +19,6 @@
 package org.apache.cayenne.query;
 
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.junit.Test;
@@ -36,7 +33,10 @@ public class SelectByIdTest {
                SelectById<Artist> q = SelectById.query(Artist.class, 6);
                q.prefetch(root);
 
-               assertSame(root, q.getPrefetches());
+               PrefetchTreeNode prefetch = q.getPrefetches();
+
+               assertNotNull(prefetch);
+               assertNotNull(prefetch.getNode("a.b"));
        }
 
        @Test
@@ -44,35 +44,37 @@ public class SelectByIdTest {
 
                SelectById<Artist> q = SelectById.query(Artist.class, 7);
                q.prefetch("a.b", PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
-               PrefetchTreeNode root1 = q.getPrefetches();
+               PrefetchTreeNode prefetch = q.getPrefetches();
 
-               assertNotNull(root1);
-               assertNotNull(root1.getNode("a.b"));
+               assertNotNull(prefetch);
+               assertNotNull(prefetch.getNode("a.b"));
 
                q.prefetch("a.c", PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
-               PrefetchTreeNode root2 = q.getPrefetches();
+               prefetch = q.getPrefetches();
 
-               assertNotNull(root2);
-               assertNotNull(root2.getNode("a.c"));
-               assertNull(root2.getNode("a.b"));
-               assertNotSame(root1, root2);
+               assertNotNull(prefetch);
+               assertNotNull(prefetch.getNode("a.c"));
+               assertNotNull(prefetch.getNode("a.b"));
        }
 
        @Test
-       public void testAddPrefetch() {
+       public void testPrefetch_Subroot() {
 
                PrefetchTreeNode root = PrefetchTreeNode.withPath("a.b", 
PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
                SelectById<Artist> q = SelectById.query(Artist.class, 8);
                q.prefetch(root);
 
-               assertSame(root, q.getPrefetches());
+               PrefetchTreeNode prefetch = q.getPrefetches();
+
+               assertNotNull(prefetch.getNode("a.b"));
 
                PrefetchTreeNode subRoot = PrefetchTreeNode.withPath("a.b.c", 
PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-               q.addPrefetch(subRoot);
+               q.prefetch(subRoot);
 
-               assertSame(root, q.getPrefetches());
+               prefetch = q.getPrefetches();
 
-               assertNotNull(root.getNode("a.b.c"));
+               assertNotNull(prefetch.getNode("a.b"));
+               assertNotNull(prefetch.getNode("a.b.c"));
        }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a4d83f6/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt 
b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 35c97e0..a47eaec 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -25,6 +25,7 @@ CAY-2008 Connection pool refactoring and validation query 
support in Cayenne Dat
 CAY-2009 Non-blocking connection pool
 CAY-2010 Splitting DataSourceBuilder from ServerRuntimeBuilder
 CAY-2011 Support for Java 8 date and time types
+CAY-2012 ObjectSelect, SelectById: eliminating methods that reset query state
 
 Bug Fixes:
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a4d83f6/docs/doc/src/main/resources/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/UPGRADE.txt 
b/docs/doc/src/main/resources/UPGRADE.txt
index c29320d..c980f1d 100644
--- a/docs/doc/src/main/resources/UPGRADE.txt
+++ b/docs/doc/src/main/resources/UPGRADE.txt
@@ -22,6 +22,9 @@ UPGRADING TO 4.0.M3
   pooling DataSource. A replacement is non-blocking DataSource under 
org.apache.cayenne.datasource (PoolingDataSource, ManagedPoolingDataSource),
   best assembled using org.apache.cayenne.datasource.DataSourceBuilder.
 
+* Per CAY-2012 API for ObjectSelect and SelectById queries were changed to 
remove "reset" functionality. Methods like 'where', 'prefetch',
+  'orderBy' that would previously reset the corresponding option state now 
work as "append". Methods that would previously append to the
+  option state were removed as redundant. Please revisit your code if you 
previously relied on the reset behavior.
 
 UPGRADING TO 4.0.M2
 

Reply via email to