#892 - Refactor: Replace Ebean's QueryEachWhileConsumer with java.util.function.Predicate

This commit is contained in:
Rob Bygrave
2016-11-24 00:19:16 +13:00
parent 6f322dcfb2
commit f0044aba91
19 changed files with 51 additions and 136 deletions
@@ -7,6 +7,7 @@ import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Document storage operations.
@@ -162,7 +163,7 @@ public interface DocumentStore {
*
* }</pre>
*/
<T> void findEachWhile(DocQueryRequest<T> query, QueryEachWhileConsumer<T> consumer);
<T> void findEachWhile(DocQueryRequest<T> query, Predicate<T> consumer);
/**
* Process the queue entries sending updates to the document store or queuing them for later processing.
@@ -16,6 +16,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Provides the API for fetching and saving beans to a particular DataSource.
@@ -757,7 +758,7 @@ public interface EbeanServer {
* Return a QueryIterator for the query.
* <p>
* Generally using {@link #findEach(Query, Consumer, Transaction)} or
* {@link #findEachWhile(Query, QueryEachWhileConsumer, Transaction)} is preferred
* {@link #findEachWhile(Query, Predicate, 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).
* </p>
@@ -768,7 +769,7 @@ public interface EbeanServer {
*
* @see Query#findIterate()
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(QueryEachWhileConsumer)
* @see Query#findEachWhile(Predicate)
*/
<T> QueryIterator<T> findIterate(Query<T> query, Transaction transaction);
@@ -798,7 +799,7 @@ public interface EbeanServer {
* }</pre>
*
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(QueryEachWhileConsumer)
* @see Query#findEachWhile(Predicate)
*/
<T> void findEach(Query<T> query, Consumer<T> consumer, Transaction transaction);
@@ -835,9 +836,9 @@ public interface EbeanServer {
* }</pre>
*
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(QueryEachWhileConsumer)
* @see Query#findEachWhile(Predicate)
*/
<T> void findEachWhile(Query<T> query, QueryEachWhileConsumer<T> consumer, Transaction transaction);
<T> void findEachWhile(Query<T> query, Predicate<T> consumer, Transaction transaction);
/**
* Return versions of a @History entity bean.
@@ -1105,7 +1106,7 @@ public interface EbeanServer {
* This streaming type query is useful for large query execution as only 1 row needs to be held in memory.
* </p>
*/
void findEachWhile(SqlQuery query, QueryEachWhileConsumer<SqlRow> consumer, Transaction transaction);
void findEachWhile(SqlQuery query, Predicate<SqlRow> consumer, Transaction transaction);
/**
* Execute the sql query returning a single MapBean or null.
@@ -14,6 +14,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* List of Expressions that make up a where or having clause.
@@ -160,9 +161,9 @@ public interface ExpressionList<T> {
* Execute the query processing the beans one at a time with the ability to
* stop processing before reading all the beans.
*
* @see Query#findEachWhile(QueryEachWhileConsumer)
* @see Query#findEachWhile(Predicate)
*/
void findEachWhile(QueryEachWhileConsumer<T> consumer);
void findEachWhile(Predicate<T> consumer);
/**
* Execute the query returning a list.
+4 -3
View File
@@ -10,6 +10,7 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* A MappedSuperclass base class that provides convenience methods for inserting, updating and
@@ -606,7 +607,7 @@ public abstract class Model {
/**
* Execute the query consuming each bean one at a time.
* <p>
* Equivalent to {@link Query#findEachWhile(QueryEachWhileConsumer)}
* Equivalent to {@link Query#findEachWhile(Predicate)}
* <p>
* This is similar to #findEach except that you return boolean
* true to continue processing beans and return false to stop
@@ -617,9 +618,9 @@ public abstract class Model {
* you do not want to hold all the results in memory at once but instead
* process them one at a time (requiring far less memory).
* </p>
* Equivalent to {@link Query#findEachWhile(QueryEachWhileConsumer)}
* Equivalent to {@link Query#findEachWhile(Predicate)}
*/
public void findEachWhile(QueryEachWhileConsumer<T> consumer) {
public void findEachWhile(Predicate<T> consumer) {
query().findEachWhile(consumer);
}
+2 -1
View File
@@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Object relational query for finding a List, Set, Map or single entity bean.
@@ -663,7 +664,7 @@ public interface Query<T> {
*
* @param consumer the consumer used to process the queried beans.
*/
void findEachWhile(QueryEachWhileConsumer<T> consumer);
void findEachWhile(Predicate<T> consumer);
/**
* Execute the query returning the list of objects.
@@ -1,46 +0,0 @@
package com.avaje.ebean;
/**
* Used to process a query result one bean at a time via a callback to this
* visitor.
* <p>
* If you wish to stop further processing return false from the accept method.
* </p>
* <p>
* Unlike findList() and findSet() using a QueryResultVisitor does not require
* all the beans in the query result to be held in memory at once. This makes
* QueryResultVisitor useful for processing large queries.
* </p>
* <p/>
* <pre>{@code
*
* Query<Customer> query = server.find(Customer.class)
* .fetchQuery("contacts")
* .where().gt("id", 0)
* .orderBy("id")
* .setMaxRows(2);
*
* query.findEachWhile((Customer customer) -> {
*
* // do something with customer
* System.out.println("-- visit " + customer);
*
* // return true to continue processing or false to stop
* return (customer.getId() < 40);
* });
*
* }</pre>
*
* @param <T> the type of entity bean being queried.
*/
public interface QueryEachWhileConsumer<T> {
/**
* Process the bean and return true if you want to continue processing more
* beans. Return false if you want to stop processing further.
*
* @param bean the entity bean to process
* @return true to continue processing more beans or false to stop.
*/
boolean accept(T bean);
}
+2 -1
View File
@@ -3,6 +3,7 @@ package com.avaje.ebean;
import java.io.Serializable;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Query object for performing native SQL queries that return SqlRow's.
@@ -60,7 +61,7 @@ public interface SqlQuery extends Serializable {
* This streaming type query is useful for large query execution as only 1 row needs to be held in memory.
* </p>
*/
void findEachWhile(QueryEachWhileConsumer<SqlRow> consumer);
void findEachWhile(Predicate<SqlRow> consumer);
/**
* Execute the query returning a single row or null.
@@ -1,35 +1,6 @@
package com.avaje.ebeaninternal.server.core;
import com.avaje.ebean.AutoTune;
import com.avaje.ebean.BackgroundExecutor;
import com.avaje.ebean.BeanState;
import com.avaje.ebean.CallableSql;
import com.avaje.ebean.DocumentStore;
import com.avaje.ebean.ExpressionFactory;
import com.avaje.ebean.Filter;
import com.avaje.ebean.FutureIds;
import com.avaje.ebean.FutureList;
import com.avaje.ebean.FutureRowCount;
import com.avaje.ebean.PagedList;
import com.avaje.ebean.PersistenceContextScope;
import com.avaje.ebean.Query;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.QueryIterator;
import com.avaje.ebean.RawSql;
import com.avaje.ebean.SqlQuery;
import com.avaje.ebean.SqlRow;
import com.avaje.ebean.SqlUpdate;
import com.avaje.ebean.Transaction;
import com.avaje.ebean.TransactionCallback;
import com.avaje.ebean.TxCallable;
import com.avaje.ebean.TxIsolation;
import com.avaje.ebean.TxRunnable;
import com.avaje.ebean.TxScope;
import com.avaje.ebean.TxType;
import com.avaje.ebean.Update;
import com.avaje.ebean.UpdateQuery;
import com.avaje.ebean.ValuePair;
import com.avaje.ebean.Version;
import com.avaje.ebean.*;
import com.avaje.ebean.bean.BeanCollection;
import com.avaje.ebean.bean.CallStack;
import com.avaje.ebean.bean.EntityBean;
@@ -108,6 +79,7 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* The default server side implementation of EbeanServer.
@@ -1365,7 +1337,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
// no try finally - findEach guarantee's cleanup of the transaction if required
}
public <T> void findEachWhile(Query<T> query, QueryEachWhileConsumer<T> consumer, Transaction t) {
public <T> void findEachWhile(Query<T> query, Predicate<T> consumer, Transaction t) {
SpiOrmQueryRequest<T> request = createQueryRequest(Type.ITERATE, query, t);
if (request.isUseDocStore()) {
@@ -1433,7 +1405,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
}
@Override
public void findEachWhile(SqlQuery query, QueryEachWhileConsumer<SqlRow> consumer, Transaction transaction) {
public void findEachWhile(SqlQuery query, Predicate<SqlRow> consumer, Transaction transaction) {
RelationalQueryRequest request = new RelationalQueryRequest(this, relationalQueryEngine, query, transaction);
try {
@@ -1,7 +1,6 @@
package com.avaje.ebeaninternal.server.core;
import com.avaje.ebean.PersistenceContextScope;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.QueryIterator;
import com.avaje.ebean.RawSql;
import com.avaje.ebean.Version;
@@ -37,6 +36,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Wraps the objects involved in executing a Query.
@@ -321,16 +321,13 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
}
}
public void findEachWhile(QueryEachWhileConsumer<T> consumer) {
QueryIterator<T> it = queryEngine.findIterate(this);
try {
public void findEachWhile(Predicate<T> consumer) {
try (QueryIterator<T> it = queryEngine.findIterate(this)) {
while (it.hasNext()) {
if (!consumer.accept(it.next())) {
if (!consumer.test(it.next())) {
break;
}
}
} finally {
it.close();
}
}
@@ -1,11 +1,11 @@
package com.avaje.ebeaninternal.server.core;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.SqlRow;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
public interface RelationalQueryEngine {
@@ -22,6 +22,6 @@ public interface RelationalQueryEngine {
/**
* Find each while query using relational query.
*/
void findEach(RelationalQueryRequest request, QueryEachWhileConsumer<SqlRow> consumer);
void findEach(RelationalQueryRequest request, Predicate<SqlRow> consumer);
}
@@ -1,7 +1,6 @@
package com.avaje.ebeaninternal.server.core;
import com.avaje.ebean.EbeanServer;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.SqlQuery;
import com.avaje.ebean.SqlRow;
import com.avaje.ebean.Transaction;
@@ -25,6 +24,7 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Wraps the objects involved in executing a SqlQuery.
@@ -94,7 +94,7 @@ public final class RelationalQueryRequest {
queryEngine.findEach(this, consumer);
}
public void findEachWhile(QueryEachWhileConsumer<SqlRow> consumer) {
public void findEachWhile(Predicate<SqlRow> consumer) {
queryEngine.findEach(this, consumer);
}
@@ -1,6 +1,5 @@
package com.avaje.ebeaninternal.server.core;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.QueryIterator;
import com.avaje.ebean.Version;
import com.avaje.ebean.bean.BeanCollection;
@@ -12,6 +11,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Defines the ORM query request api.
@@ -81,7 +81,7 @@ public interface SpiOrmQueryRequest<T> extends DocQueryRequest<T> {
/**
* Execute the find returning a QueryIterator and visitor pattern.
*/
void findEachWhile(QueryEachWhileConsumer<T> consumer);
void findEachWhile(Predicate<T> consumer);
/**
* Execute the find returning a QueryIterator.
@@ -11,7 +11,6 @@ import com.avaje.ebean.Junction;
import com.avaje.ebean.OrderBy;
import com.avaje.ebean.PagedList;
import com.avaje.ebean.Query;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.QueryIterator;
import com.avaje.ebean.Version;
import com.avaje.ebean.event.BeanQueryRequest;
@@ -37,6 +36,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Default implementation of ExpressionList.
@@ -372,7 +372,7 @@ public class DefaultExpressionList<T> implements SpiExpressionList<T> {
}
@Override
public void findEachWhile(QueryEachWhileConsumer<T> consumer) {
public void findEachWhile(Predicate<T> consumer) {
query.findEachWhile(consumer);
}
@@ -10,7 +10,6 @@ import com.avaje.ebean.Junction;
import com.avaje.ebean.OrderBy;
import com.avaje.ebean.PagedList;
import com.avaje.ebean.Query;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.QueryIterator;
import com.avaje.ebean.Version;
import com.avaje.ebean.event.BeanQueryRequest;
@@ -34,6 +33,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Junction implementation.
@@ -378,7 +378,7 @@ class JunctionExpression<T> implements SpiJunction<T>, SpiExpression, Expression
}
@Override
public void findEachWhile(QueryEachWhileConsumer<T> consumer) {
public void findEachWhile(Predicate<T> consumer) {
exprList.findEachWhile(consumer);
}
@@ -1,6 +1,5 @@
package com.avaje.ebeaninternal.server.query;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.SqlRow;
import com.avaje.ebeaninternal.server.core.Message;
import com.avaje.ebeaninternal.server.core.RelationalQueryEngine;
@@ -12,6 +11,7 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Perform native sql fetches.
@@ -28,13 +28,13 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine {
}
@Override
public void findEach(RelationalQueryRequest request, QueryEachWhileConsumer<SqlRow> consumer) {
public void findEach(RelationalQueryRequest request, Predicate<SqlRow> consumer) {
long startTime = System.currentTimeMillis();
try {
request.executeSql(binder);
while (request.next()) {
if (!consumer.accept(readRow(request))) {
if (!consumer.test(readRow(request))) {
break;
}
}
@@ -1,23 +1,7 @@
package com.avaje.ebeaninternal.server.querydefn;
import com.avaje.ebean.EbeanServer;
import com.avaje.ebean.Expression;
import com.avaje.ebean.ExpressionFactory;
import com.avaje.ebean.ExpressionList;
import com.avaje.ebean.FetchConfig;
import com.avaje.ebean.FetchPath;
import com.avaje.ebean.FutureIds;
import com.avaje.ebean.FutureList;
import com.avaje.ebean.FutureRowCount;
import com.avaje.ebean.OrderBy;
import com.avaje.ebean.*;
import com.avaje.ebean.OrderBy.Property;
import com.avaje.ebean.PagedList;
import com.avaje.ebean.PersistenceContextScope;
import com.avaje.ebean.Query;
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.CallStack;
import com.avaje.ebean.bean.ObjectGraphNode;
import com.avaje.ebean.bean.ObjectGraphOrigin;
@@ -52,6 +36,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Default implementation of an Object Relational query.
@@ -1120,7 +1105,7 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
}
@Override
public void findEachWhile(QueryEachWhileConsumer<T> consumer) {
public void findEachWhile(Predicate<T> consumer) {
server.findEachWhile(this, consumer, null);
}
@@ -1,13 +1,13 @@
package com.avaje.ebeaninternal.server.querydefn;
import com.avaje.ebean.EbeanServer;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebean.SqlRow;
import com.avaje.ebeaninternal.api.BindParams;
import com.avaje.ebeaninternal.api.SpiSqlQuery;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Default implementation of SQuery - SQL Query.
@@ -52,7 +52,7 @@ public class DefaultRelationalQuery implements SpiSqlQuery {
}
@Override
public void findEachWhile(QueryEachWhileConsumer<SqlRow> consumer) {
public void findEachWhile(Predicate<SqlRow> consumer) {
server.findEachWhile(this, consumer, null);
}
@@ -4,13 +4,13 @@ import com.avaje.ebean.DocStoreQueueEntry;
import com.avaje.ebean.DocumentStore;
import com.avaje.ebean.PagedList;
import com.avaje.ebean.Query;
import com.avaje.ebean.QueryEachWhileConsumer;
import com.avaje.ebeanservice.docstore.api.DocQueryRequest;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* DocumentStore that barfs it is used.
@@ -87,7 +87,7 @@ public class NoneDocStore implements DocumentStore {
}
@Override
public <T> void findEachWhile(DocQueryRequest<T> query, QueryEachWhileConsumer<T> consumer) {
public <T> void findEachWhile(DocQueryRequest<T> query, Predicate<T> consumer) {
throw implementationNotInClassPath();
}