Repository: cayenne
Updated Branches:
  refs/heads/master 1223c5423 -> d31b01466


CAY-2068 ObjectSelect limit bug


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

Branch: refs/heads/master
Commit: d31b0146637733a21e37c079c254f3388c5ee17e
Parents: de67c5a
Author: Savva Kolbachev <s.kolbac...@gmail.com>
Authored: Wed Apr 27 16:39:57 2016 +0300
Committer: Savva Kolbachev <s.kolbac...@gmail.com>
Committed: Wed Apr 27 16:45:50 2016 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/QueryLimitTest.java |  96 -------------
 .../cayenne/query/ClientObjectSelectIT.java     | 137 +++++++++++++++++++
 .../access/ClientServerChannelQueryAction.java  |  18 ++-
 3 files changed, 145 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d31b0146/cayenne-client/src/test/java/org/apache/cayenne/QueryLimitTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/QueryLimitTest.java 
b/cayenne-client/src/test/java/org/apache/cayenne/QueryLimitTest.java
deleted file mode 100644
index 6ad93e8..0000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/QueryLimitTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.query.QueryCacheStrategy;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.*;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @since 4.0
- */
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class QueryLimitTest extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    DataChannelInterceptor serverCaseDataChannelInterceptor;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper mtTable;
-
-    @Before
-    public void setUp() throws Exception {
-        mtTable = new TableHelper(dbHelper, "MT_TABLE1");
-        mtTable.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1", "SUBCLASS_ATTRIBUTE1");
-    }
-
-    protected void createDataSet() throws Exception{
-
-        for (int i = 1; i <= 10; i++){
-            mtTable.insert(i, "sub2", "sub2_" + i, "sub2attr");
-        }
-
-        for (int i = 11; i <= 20; i++){
-            mtTable.insert(i, "sub1", "sub1_" + i, "sub1attr");
-        }
-
-    }
-
-    //setting limit and cache strategy
-    @Test
-    public void testLimitWhenCacheSetted() throws Exception {
-        createDataSet();
-
-        final ObjectSelect objectSelect = ObjectSelect.query(MtTable1.class).
-                limit(2).
-                cacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-
-        final List<MtTable1> artistList1 = objectSelect.select(context);
-        final List<MtTable1> artistList2 = new ArrayList<>();
-
-        serverCaseDataChannelInterceptor.runWithQueriesBlocked(new 
UnitTestClosure() {
-            public void execute() {
-
-                artistList2.addAll(objectSelect.select(context));
-                assertEquals(artistList1, artistList2);
-            }
-        });
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d31b0146/cayenne-client/src/test/java/org/apache/cayenne/query/ClientObjectSelectIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/query/ClientObjectSelectIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/query/ClientObjectSelectIT.java
new file mode 100644
index 0000000..f1f7e7a
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/query/ClientObjectSelectIT.java
@@ -0,0 +1,137 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.query;
+
+import org.apache.cayenne.CayenneContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.remote.RemoteIncrementalFaultList;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.CayenneProjects;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
+public class ClientObjectSelectIT extends ClientCase {
+
+    @Inject
+    private CayenneContext context;
+
+    @Inject
+    DataChannelInterceptor serverCaseDataChannelInterceptor;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    private TableHelper mtTable;
+
+    @Before
+    public void setUp() throws Exception {
+        mtTable = new TableHelper(dbHelper, "MT_TABLE1");
+        mtTable.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+
+        for (int i = 1; i <= 20; i++) {
+            mtTable.insert(i, "globalAttr" + i, "serverAttr" + i);
+        }
+    }
+
+    @Test
+    public void testSelect() throws Exception{
+        List<ClientMtTable1> list = ObjectSelect.query(ClientMtTable1.class).
+                select(context);
+
+        assertNotNull(list);
+        assertEquals(20, list.size());
+    }
+
+    @Test
+    public void testCacheSelect() throws Exception{
+        final ObjectSelect objectSelect = 
ObjectSelect.query(ClientMtTable1.class).
+                cacheStrategy(QueryCacheStrategy.SHARED_CACHE);
+
+        final List<ClientMtTable1> list1 = objectSelect.select(context);
+        assertNotNull(list1);
+        assertFalse(list1.isEmpty());
+
+        serverCaseDataChannelInterceptor.runWithQueriesBlocked(new 
UnitTestClosure() {
+            public void execute() {
+                List<ClientMtTable1> list2 = objectSelect.select(context);
+                assertNotNull(list2);
+                assertFalse(list2.isEmpty());
+                assertEquals(list1, list2);
+            }
+        });
+    }
+
+    @Test
+    public void testLimitSelect() throws Exception{
+        List<ClientMtTable1> list = ObjectSelect.query(ClientMtTable1.class).
+                offset(5).
+                limit(10).
+                select(context);
+
+        assertNotNull(list);
+        assertEquals(10, list.size());
+    }
+
+    @Test
+    public void testCacheLimitSelect() throws Exception {
+        final ObjectSelect objectSelect = 
ObjectSelect.query(ClientMtTable1.class).
+                cacheStrategy(QueryCacheStrategy.SHARED_CACHE).
+                offset(5).
+                limit(10);
+
+        final List<ClientMtTable1> list1 = objectSelect.select(context);
+        assertEquals(10, list1.size());
+
+        serverCaseDataChannelInterceptor.runWithQueriesBlocked(new 
UnitTestClosure() {
+            public void execute() {
+                List<ClientMtTable1> list2 = objectSelect.select(context);
+                assertNotNull(list2);
+                assertEquals(10, list2.size());
+                assertEquals(list1, list2);
+            }
+        });
+    }
+
+    @Test
+    public void testPageSelect() throws Exception{
+        final ObjectSelect objectSelect = 
ObjectSelect.query(ClientMtTable1.class).
+                pageSize(5);
+
+        List<ClientMtTable1> list = objectSelect.select(context);
+        assertNotNull(list);
+        assertEquals(RemoteIncrementalFaultList.class, list.getClass());
+        assertEquals("globalAttr1", list.get(0).getGlobalAttribute1Direct());
+        assertEquals("globalAttr6", list.get(5).getGlobalAttribute1Direct());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d31b0146/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
index df69ee1..0be21c6 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
@@ -19,9 +19,6 @@
 
 package org.apache.cayenne.access;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.Persistent;
@@ -37,6 +34,9 @@ import org.apache.cayenne.util.IncrementalListResponse;
 import org.apache.cayenne.util.ListResponse;
 import org.apache.cayenne.util.ObjectDetachOperation;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A query handler used by ClientServerChannel.
  * 
@@ -83,23 +83,21 @@ class ClientServerChannelQueryAction {
             if (cachedList == null) {
 
                 // attempt to refetch... respawn the action...
-
                 Query originatingQuery = serverMetadata.getOrginatingQuery();
                 if (originatingQuery != null) {
-
                     ClientServerChannelQueryAction subaction = new 
ClientServerChannelQueryAction(
                             channel,
                             originatingQuery);
                     subaction.execute();
+
                     cachedList = channel.getQueryCache().get(serverMetadata);
+                    if (cachedList == null) {
+                        throw new CayenneRuntimeException("No cached list for "
+                                + serverMetadata.getCacheKey());
+                    }
                 } else {
                     return !DONE;
                 }
-
-                if (cachedList == null) {
-                    throw new CayenneRuntimeException("No cached list for "
-                            + serverMetadata.getCacheKey());
-                }
             }
 
             int startIndex = serverMetadata.getFetchOffset();

Reply via email to