[#4337] Add Stream<R> ResultQuery.stream()

This commit is contained in:
lukaseder 2015-06-01 10:03:04 +02:00
parent 037c21270e
commit fe405d772c
3 changed files with 57 additions and 0 deletions

View File

@ -51,6 +51,9 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.stream.Stream;
import javax.sql.DataSource;
import org.jooq.conf.Settings;
import org.jooq.exception.DataAccessException;
@ -142,6 +145,31 @@ public interface ResultQuery<R extends Record> extends Query, Iterable<R> {
@Override
Iterator<R> iterator() throws DataAccessException;
/* [java-8] */
/**
* Stream this query.
* <p>
* This is essentially the same as {@link #fetchLazy()} but instead of
* returning a {@link Cursor}, a Java 8 {@link Stream} is returned. Clients
* should ensure the {@link Stream} is properly closed, e.g. in a
* try-with-resources statement:
* <p>
* <code><pre>
* try (Stream&lt;R> stream = query.stream()) {
* // Do things with stream
* }
* </pre></code>
* <p>
* If users prefer more fluent style streaming of queries, {@link ResultSet}
* can be registered and closed via {@link ExecuteListener}, or via "smart"
* third-party {@link DataSource}s.
*
* @return The result.
* @throws DataAccessException if something went wrong executing the query
*/
Stream<R> stream() throws DataAccessException;
/* [/java-8] */
/**
* Execute the query and "lazily" return the generated result.
* <p>

View File

@ -60,9 +60,13 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.jooq.Configuration;
import org.jooq.Converter;
@ -77,6 +81,7 @@ import org.jooq.RecordMapper;
import org.jooq.Result;
import org.jooq.ResultQuery;
import org.jooq.Table;
import org.jooq.exception.DataAccessException;
import org.jooq.tools.Convert;
import org.jooq.tools.JooqLogger;
@ -309,6 +314,22 @@ abstract class AbstractResultQuery<R extends Record> extends AbstractQuery imple
return fetch().iterator();
}
/* [java-8] */
@Override
public final Stream<R> stream() throws DataAccessException {
Cursor<R> c = fetchLazy();
return StreamSupport.stream(
Spliterators.spliterator(
c.iterator(),
0,
Spliterator.ORDERED | Spliterator.NONNULL
),
false
).onClose(() -> c.close());
}
/* [/java-8] */
@Override
public final Cursor<R> fetchLazy() {
return fetchLazy(fetchSize);

View File

@ -54,6 +54,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.stream.Stream;
import javax.annotation.Generated;
@ -2359,6 +2360,13 @@ class SelectImpl<R extends Record, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
return getDelegate().iterator();
}
/* [java-8] */
@Override
public final Stream<R> stream() {
return getDelegate().stream();
}
/* [/java-8] */
@Override
public final Cursor<R> fetchLazy() {
return getDelegate().fetchLazy();