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();