diff --git a/src/main/java/com/avaje/ebean/EbeanServer.java b/src/main/java/com/avaje/ebean/EbeanServer.java index e5b21a1e6..91c14fa5a 100644 --- a/src/main/java/com/avaje/ebean/EbeanServer.java +++ b/src/main/java/com/avaje/ebean/EbeanServer.java @@ -696,24 +696,6 @@ public interface EbeanServer { */ List findIds(Query query, Transaction transaction); - /** - * Return a QueryIterator for the query. - *

- * Generally using {@link #findEach(Query, QueryEachConsumer, Transaction)} or - * {@link #findEachWhile(Query, QueryEachWhileConsumer, Transaction)} is preferred - * to findIterate(). The reason is that those methods automatically take care of - * closing the queryIterator (and the underlying jdbc statement and resultSet). - *

- *

- * This is similar to findEach in that not all the result beans need to be held - * in memory at the same time and as such is good for processing large queries. - *

- * - * @see Query#findEach(QueryEachConsumer) - * @see Query#findEachWhile(QueryEachWhileConsumer) - */ - QueryIterator findIterate(Query query, Transaction transaction); - /** * Execute the query visiting the each bean one at a time. *

diff --git a/src/main/java/com/avaje/ebean/ExpressionList.java b/src/main/java/com/avaje/ebean/ExpressionList.java index f468d698a..7c8dc93a7 100644 --- a/src/main/java/com/avaje/ebean/ExpressionList.java +++ b/src/main/java/com/avaje/ebean/ExpressionList.java @@ -139,13 +139,6 @@ public interface ExpressionList { */ int delete(); - /** - * Execute the query iterating over the results. - * - * @see Query#findIterate() - */ - QueryIterator findIterate(); - /** * Execute the query process the beans one at a time. * diff --git a/src/main/java/com/avaje/ebean/Query.java b/src/main/java/com/avaje/ebean/Query.java index 287df64e6..e883ebbbb 100644 --- a/src/main/java/com/avaje/ebean/Query.java +++ b/src/main/java/com/avaje/ebean/Query.java @@ -547,25 +547,6 @@ public interface Query { */ List findIds(); - /** - * Execute the query iterating over the results. - *

- * Remember that with {@link QueryIterator} you must call - * {@link QueryIterator#close()} when you have finished iterating the results - * (typically in a finally block). - *

- *

- * findEach() and findEachWhile() are preferred to findIterate() as they ensure - * the jdbc statement and resultSet are closed at the end of the iteration. - *

- *

- * This query will execute against the EbeanServer that was used to create it. - *

- */ - QueryIterator findIterate(); - - - /** * Execute the query processing the beans one at a time. *

diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index 657277c48..14fd8205b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -1249,7 +1249,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { request.initTransIfRequired(); request.findEach(consumer); - // no try finally - findVisit guarantee's cleanup of the transaction if required + // no try finally - findEach guarantee's cleanup of the transaction if required } public void findEachWhile(Query query, QueryEachWhileConsumer consumer, Transaction t) { @@ -1262,21 +1262,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { request.initTransIfRequired(); request.findEachWhile(consumer); - // no try finally - findVisit guarantee's cleanup of the transaction if required - } - - public QueryIterator findIterate(Query query, Transaction t) { - - SpiOrmQueryRequest request = createQueryRequest(Type.ITERATE, query, t); - - try { - request.initTransIfRequired(); - return request.findIterate(); - - } catch (RuntimeException ex) { - request.endTransIfRequired(); - throw ex; - } + // no try finally - findEachWhile guarantee's cleanup of the transaction if required } @Override diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryEngine.java index 75b04fa35..8223af5a3 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryEngine.java @@ -1,6 +1,5 @@ package com.avaje.ebeaninternal.server.core; -import com.avaje.ebean.QueryIterator; import com.avaje.ebean.Version; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebeaninternal.api.BeanIdList; diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java index 6cfc2822c..f6ed671f6 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java @@ -3,7 +3,6 @@ package com.avaje.ebeaninternal.server.core; import com.avaje.ebean.PersistenceContextScope; import com.avaje.ebean.QueryEachConsumer; import com.avaje.ebean.QueryEachWhileConsumer; -import com.avaje.ebean.QueryIterator; import com.avaje.ebean.RawSql; import com.avaje.ebean.Version; import com.avaje.ebean.bean.BeanCollection; diff --git a/src/main/java/com/avaje/ebean/QueryIterator.java b/src/main/java/com/avaje/ebeaninternal/server/core/QueryIterator.java similarity index 96% rename from src/main/java/com/avaje/ebean/QueryIterator.java rename to src/main/java/com/avaje/ebeaninternal/server/core/QueryIterator.java index 589c352c5..148a7d8c1 100644 --- a/src/main/java/com/avaje/ebean/QueryIterator.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/QueryIterator.java @@ -1,4 +1,4 @@ -package com.avaje.ebean; +package com.avaje.ebeaninternal.server.core; import java.util.Iterator; diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java index 9c4a21fef..b36cd132b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/SpiOrmQueryRequest.java @@ -2,7 +2,6 @@ package com.avaje.ebeaninternal.server.core; import com.avaje.ebean.QueryEachConsumer; import com.avaje.ebean.QueryEachWhileConsumer; -import com.avaje.ebean.QueryIterator; import com.avaje.ebean.Version; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebeaninternal.api.SpiQuery; diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java b/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java index 8fa03ca5a..e81664a99 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/DefaultExpressionList.java @@ -322,11 +322,6 @@ public class DefaultExpressionList implements SpiExpressionList { query.findEachWhile(consumer); } - @Override - public QueryIterator findIterate() { - return query.findIterate(); - } - @Override public List findList() { return query.findList(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java index 27f445e83..3c03c24c5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/JunctionExpression.java @@ -12,7 +12,6 @@ import com.avaje.ebean.PagedList; import com.avaje.ebean.Query; import com.avaje.ebean.QueryEachConsumer; import com.avaje.ebean.QueryEachWhileConsumer; -import com.avaje.ebean.QueryIterator; import com.avaje.ebean.Version; import com.avaje.ebean.event.BeanQueryRequest; import com.avaje.ebean.search.Match; @@ -345,11 +344,6 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression exprList.findEachWhile(consumer); } - @Override - public QueryIterator findIterate() { - return exprList.findIterate(); - } - @Override public List findList() { return exprList.findList(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java index b69526d6f..f2b768c3a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java @@ -1,6 +1,6 @@ package com.avaje.ebeaninternal.server.query; -import com.avaje.ebean.QueryIterator; +import com.avaje.ebeaninternal.server.core.QueryIterator; import com.avaje.ebean.Version; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebean.bean.EntityBean; diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java index 26153674d..72a9d3e0c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java @@ -1,6 +1,6 @@ package com.avaje.ebeaninternal.server.query; -import com.avaje.ebean.QueryIterator; +import com.avaje.ebeaninternal.server.core.QueryIterator; import com.avaje.ebean.ValuePair; import com.avaje.ebean.Version; import com.avaje.ebean.bean.BeanCollection; diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorSimple.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorSimple.java index 88dba323a..2fe591939 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorSimple.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorSimple.java @@ -4,7 +4,7 @@ import java.sql.SQLException; import javax.persistence.PersistenceException; -import com.avaje.ebean.QueryIterator; +import com.avaje.ebeaninternal.server.core.QueryIterator; import com.avaje.ebeaninternal.server.core.OrmQueryRequest; /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorWithBuffer.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorWithBuffer.java index 163fdfc2f..fc042d264 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorWithBuffer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryIteratorWithBuffer.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import javax.persistence.PersistenceException; -import com.avaje.ebean.QueryIterator; +import com.avaje.ebeaninternal.server.core.QueryIterator; import com.avaje.ebeaninternal.server.core.OrmQueryRequest; /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java index f49c17e4a..f32c791da 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -1,6 +1,6 @@ package com.avaje.ebeaninternal.server.query; -import com.avaje.ebean.QueryIterator; +import com.avaje.ebeaninternal.server.core.QueryIterator; import com.avaje.ebean.Version; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebean.bean.EntityBean; diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java index cf47df856..6e463c093 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -1084,11 +1084,6 @@ public class DefaultOrmQuery implements SpiQuery { return server.findVersions(this, null); } - @Override - public QueryIterator findIterate() { - return server.findIterate(this, null); - } - @Override public List findList() { return server.findList(this, null); diff --git a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java index 0f4be7aea..62e52ad2d 100644 --- a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java @@ -445,11 +445,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } - @Override - public QueryIterator findIterate(Query query, Transaction transaction) { - return null; - } - @Override public void findEach(Query query, QueryEachConsumer consumer, Transaction transaction) { diff --git a/src/test/java/com/avaje/tests/query/TestOneToManyCorrectGrouping.java b/src/test/java/com/avaje/tests/query/TestOneToManyCorrectGrouping.java index 981f1b134..f639ee2da 100644 --- a/src/test/java/com/avaje/tests/query/TestOneToManyCorrectGrouping.java +++ b/src/test/java/com/avaje/tests/query/TestOneToManyCorrectGrouping.java @@ -3,12 +3,14 @@ package com.avaje.tests.query; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.Query; -import com.avaje.ebean.QueryIterator; +import com.avaje.ebean.QueryEachConsumer; import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.Order; import com.avaje.tests.model.basic.ResetBasicData; import org.junit.Test; +import java.util.concurrent.atomic.AtomicInteger; + import static org.junit.Assert.assertEquals; public class TestOneToManyCorrectGrouping extends BaseTestCase { @@ -24,21 +26,17 @@ public class TestOneToManyCorrectGrouping extends BaseTestCase { .where().le("id", 2) .query(); - QueryIterator customerQueryIterator = customerQuery.findIterate(); + final AtomicInteger count = new AtomicInteger(); - try { - int count = 0; - while (customerQueryIterator.hasNext()) { - Customer customer = customerQueryIterator.next(); + customerQuery.findEach(new QueryEachConsumer() { + @Override + public void accept(Customer customer) { for (Order order : customer.getOrders()) { order.getId(); } - count++; + count.incrementAndGet(); } - assertEquals(EXPECTED_ITERATIONS, count); - - } finally { - customerQueryIterator.close(); - } + }); + assertEquals(EXPECTED_ITERATIONS, count.get()); } } diff --git a/src/test/java/com/avaje/tests/query/TestQueryFindIterate.java b/src/test/java/com/avaje/tests/query/TestQueryFindIterate.java index 78caff0bd..f03b6da6c 100644 --- a/src/test/java/com/avaje/tests/query/TestQueryFindIterate.java +++ b/src/test/java/com/avaje/tests/query/TestQueryFindIterate.java @@ -12,6 +12,7 @@ import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.ResetBasicData; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; @@ -31,20 +32,16 @@ public class TestQueryFindIterate extends BaseTestCase { //.fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).orderBy("id") .setMaxRows(2); - int count = 0; + final AtomicInteger count = new AtomicInteger(); - QueryIterator it = query.findIterate(); - try { - while (it.hasNext()) { - Customer customer = it.next(); - customer.hashCode(); - count++; + query.findEach(new QueryEachConsumer() { + @Override + public void accept(Customer bean) { + count.incrementAndGet(); } - } finally { - it.close(); - } + }); - assertEquals(2, count); + assertEquals(2, count.get()); } @Test @@ -52,25 +49,20 @@ public class TestQueryFindIterate extends BaseTestCase { ResetBasicData.reset(); - QueryIterator queryIterator = Ebean.find(Order.class) + Ebean.find(Order.class) //.select("orderDate") .where().gt("id",0).le("id",10) - .findIterate(); - - try { - while (queryIterator.hasNext()) { - Order order = queryIterator.next(); - Customer customer = order.getCustomer(); - // invoke lazy loading on customer, order details and order shipments - order.getId(); - customer.getName(); - order.getDetails().size(); - order.getShipments().size(); - } - - } finally { - queryIterator.close(); - } + .findEach(new QueryEachConsumer() { + @Override + public void accept(Order order) { + Customer customer = order.getCustomer(); + // invoke lazy loading on customer, order details and order shipments + order.getId(); + customer.getName(); + order.getDetails().size(); + order.getShipments().size(); + } + }); } @@ -81,26 +73,22 @@ public class TestQueryFindIterate extends BaseTestCase { LoggedSqlCollector.start(); - QueryIterator queryIterator = Ebean.find(Order.class) - .setLazyLoadBatchSize(10) - .select("status, orderDate") - .fetch("customer", "name") - .where().gt("id",0).le("id",10) - .setUseCache(false) - .findIterate(); + Ebean.find(Order.class) + .setLazyLoadBatchSize(10) + .select("status, orderDate") + .fetch("customer", "name") + .where().gt("id",0).le("id",10) + .setUseCache(false) + .findEach(new QueryEachConsumer() { + @Override + public void accept(Order order) { + Customer customer = order.getCustomer(); + customer.getName(); + order.getDetails().size(); + order.getShipments().size(); + } + }); - try { - while (queryIterator.hasNext()) { - Order order = queryIterator.next(); - Customer customer = order.getCustomer(); - customer.getName(); - order.getDetails().size(); - order.getShipments().size(); - } - - } finally { - queryIterator.close(); - } List loggedSql = LoggedSqlCollector.stop(); @@ -123,29 +111,24 @@ public class TestQueryFindIterate extends BaseTestCase { Ebean.getServerCacheManager().getBeanCache(OrderShipment.class).clear(); Ebean.getServerCacheManager().getQueryCache(OrderShipment.class).clear(); - QueryIterator queryIterator = Ebean.find(Order.class) - .setLazyLoadBatchSize(10) - .setUseCache(false) - .select("status, orderDate") - .fetch("customer", "name") - .fetch("details") - .where().gt("id",0).le("id",10) - .order().asc("id") - .findIterate(); - - try { - while (queryIterator.hasNext()) { - Order order = queryIterator.next(); - Customer customer = order.getCustomer(); - order.getId(); - customer.getName(); - order.getDetails().size(); - order.getShipments().size(); - } - - } finally { - queryIterator.close(); - } + Ebean.find(Order.class) + .setLazyLoadBatchSize(10) + .setUseCache(false) + .select("status, orderDate") + .fetch("customer", "name") + .fetch("details") + .where().gt("id",0).le("id",10) + .order().asc("id") + .findEach(new QueryEachConsumer() { + @Override + public void accept(Order order) { + Customer customer = order.getCustomer(); + order.getId(); + customer.getName(); + order.getDetails().size(); + order.getShipments().size(); + } + }); List loggedSql = LoggedSqlCollector.stop(); @@ -168,8 +151,12 @@ public class TestQueryFindIterate extends BaseTestCase { .setMaxRows(2); // this throws an exception immediately - QueryIterator it = query.findIterate(); - it.close(); + query.findEach(new QueryEachConsumer() { + @Override + public void accept(Customer bean) { + + } + }); if (!server.getName().equals("h2")) { // MySql allows the query with type conversion? @@ -191,17 +178,13 @@ public class TestQueryFindIterate extends BaseTestCase { .where().gt("id", 0) .setMaxRows(2); - QueryIterator it = query.findIterate(); - try { - while (it.hasNext()) { - Customer customer = it.next(); + query.findEach(new QueryEachConsumer() { + @Override + public void accept(Customer customer) { if (customer != null) { throw new IllegalStateException("cause an exception"); } } - - } finally { - it.close(); - } + }); } } diff --git a/src/test/java/com/avaje/tests/query/other/TestFindIterateHeapDump.java b/src/test/java/com/avaje/tests/query/other/TestFindIterateHeapDump.java index 69947e578..bd7b2b8ac 100644 --- a/src/test/java/com/avaje/tests/query/other/TestFindIterateHeapDump.java +++ b/src/test/java/com/avaje/tests/query/other/TestFindIterateHeapDump.java @@ -11,7 +11,6 @@ import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.EbeanServer; -import com.avaje.ebean.QueryIterator; import com.avaje.ebean.Transaction; import com.avaje.tests.model.basic.EBasic; import com.sun.management.HotSpotDiagnosticMXBean; @@ -52,33 +51,24 @@ public class TestFindIterateHeapDump extends BaseTestCase { transaction.end(); } - QueryIterator iterate = server.find(EBasic.class).findIterate(); - iterate.hashCode(); - try { - - // Intentionally not iterating through the iterator to - - // try { - // while (iterate.hasNext()) { - // EBasic eBasic = iterate.next(); - // eBasic.getDescription(); - // } - // } finally { - // iterate.close(); - // } - - String fileName = "heap-dump6.snapshot"; - - File file = new File(fileName); - if (file.exists()) - file.delete(); - - dumpHeap(fileName, true); - - } finally { - iterate.close(); - } - + // Intentionally not iterating through the iterator to + + // try { + // while (iterate.hasNext()) { + // EBasic eBasic = iterate.next(); + // eBasic.getDescription(); + // } + // } finally { + // iterate.close(); + // } + + String fileName = "heap-dump6.snapshot"; + + File file = new File(fileName); + if (file.exists()) + file.delete(); + + dumpHeap(fileName, true); } static void dumpHeap(String fileName, boolean live) {