mirror of
https://github.com/ebean-orm/ebean.git
synced 2026-11-13 06:42:57 +00:00
#2200 - ENH: Add DtoQuery findEach with batch consumer - findEach(int batchSize, Consumer<List<T>> consumer)
This commit is contained in:
1 parent
bb73c30bb7
commit
e40a539406
10 files changed
+129
-1
No files matched your search
@@ -264,6 +264,11 @@ public interface SpiEbeanServer extends ExtendedServer, EbeanServer, BeanCollect
|
||||
*/
|
||||
<T> void findDtoEach(SpiDtoQuery<T> query, Consumer<T> consumer);
|
||||
|
||||
/**
|
||||
* DTO findEach batch query.
|
||||
*/
|
||||
<T> void findDtoEach(SpiDtoQuery<T> query, int batch, Consumer<List<T>> consumer);
|
||||
|
||||
/**
|
||||
* DTO findEachWhile query.
|
||||
*/
|
||||
|
||||
@@ -1597,6 +1597,17 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void findDtoEach(SpiDtoQuery<T> query, int batch, Consumer<List<T>> consumer) {
|
||||
DtoQueryRequest<T> request = new DtoQueryRequest<>(this, dtoQueryEngine, query);
|
||||
try {
|
||||
request.initTransIfRequired();
|
||||
request.findEach(batch, consumer);
|
||||
} finally {
|
||||
request.endTransIfRequired();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void findDtoEachWhile(SpiDtoQuery<T> query, Predicate<T> consumer) {
|
||||
DtoQueryRequest<T> request = new DtoQueryRequest<>(this, dtoQueryEngine, query);
|
||||
|
||||
@@ -92,6 +92,11 @@ public final class DtoQueryRequest<T> extends AbstractSqlQueryRequest {
|
||||
queryEngine.findEach(this, consumer);
|
||||
}
|
||||
|
||||
public void findEach(int batch, Consumer<List<T>> consumer) {
|
||||
flushJdbcBatchOnQuery();
|
||||
queryEngine.findEach(this, batch, consumer);
|
||||
}
|
||||
|
||||
public void findEachWhile(Predicate<T> consumer) {
|
||||
flushJdbcBatchOnQuery();
|
||||
queryEngine.findEachWhile(this, consumer);
|
||||
|
||||
@@ -42,7 +42,28 @@ public class DtoQueryEngine {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new PersistenceException(errMsg(e.getMessage(), request.getSql()), e);
|
||||
} finally {
|
||||
request.close();
|
||||
}
|
||||
}
|
||||
|
||||
public <T> void findEach(DtoQueryRequest<T> request, int batchSize, Consumer<List<T>> consumer) {
|
||||
try {
|
||||
List<T> buffer = new ArrayList<>();
|
||||
request.executeSql(binder, SpiQuery.Type.ITERATE);
|
||||
while (request.next()) {
|
||||
buffer.add(request.readNextBean());
|
||||
if (buffer.size() >= batchSize) {
|
||||
consumer.accept(buffer);
|
||||
buffer.clear();
|
||||
}
|
||||
}
|
||||
if (!buffer.isEmpty()) {
|
||||
// consume the remainder
|
||||
consumer.accept(buffer);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new PersistenceException(errMsg(e.getMessage(), request.getSql()), e);
|
||||
} finally {
|
||||
request.close();
|
||||
}
|
||||
|
||||
@@ -102,6 +102,11 @@ public class DefaultDtoQuery<T> implements SpiDtoQuery<T> {
|
||||
server.findDtoEach(this, consumer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void findEach(int batch, Consumer<List<T>> consumer) {
|
||||
server.findDtoEach(this, batch, consumer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void findEachWhile(Predicate<T> consumer) {
|
||||
server.findDtoEachWhile(this, consumer);
|
||||
|
||||
Reference in new issue
Block a user