From e1f19f69bd5d9b76a0dba86d20d9cc678befb65f Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 11 Jul 2017 17:27:28 +0200 Subject: [PATCH] DATAMONGO-1739 - Changed TerminatingFindOperation.stream() to return Stream. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TerminatingFindOperation.stream() now returns a Stream directly, leveraging Spring Data Commons' StreamUtils.createStreamFromIterator(…) to create a Stream and register a callback to forward calls to Stream.close() to the iterator. Original pull request: #485. --- .../data/mongodb/core/ExecutableFindOperation.java | 8 ++++---- .../core/ExecutableFindOperationSupport.java | 6 ++++-- .../core/ExecutableFindOperationSupportTests.java | 13 ++++++------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java index 21cee1f39..81a9bccae 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java @@ -17,11 +17,11 @@ package org.springframework.data.mongodb.core; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import org.springframework.data.geo.GeoResults; import org.springframework.data.mongodb.core.query.NearQuery; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.data.util.CloseableIterator; /** * {@link ExecutableFindOperation} allows creation and execution of MongoDB find operations in a fluent API style. @@ -111,10 +111,10 @@ public interface ExecutableFindOperation { /** * Stream all matching elements. * - * @return a {@link CloseableIterator} that wraps the a Mongo DB {@link com.mongodb.Cursor} that needs to be closed. - * Never {@literal null}. + * @return a {@link Stream} that wraps the a Mongo DB {@link com.mongodb.Cursor} that needs to be closed. Never + * {@literal null}. */ - CloseableIterator stream(); + Stream stream(); /** * Get the number of matching elements. diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupport.java index 15a3952c4..c143f9583 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupport.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import org.bson.Document; import org.springframework.dao.IncorrectResultSizeDataAccessException; @@ -26,6 +27,7 @@ import org.springframework.data.mongodb.core.query.NearQuery; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.SerializationUtils; import org.springframework.data.util.CloseableIterator; +import org.springframework.data.util.StreamUtils; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -135,8 +137,8 @@ class ExecutableFindOperationSupport implements ExecutableFindOperation { } @Override - public CloseableIterator stream() { - return doStream(); + public Stream stream() { + return StreamUtils.createStreamFromIterator(doStream()); } @Override diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java index d6ee7afb7..369a753b7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java @@ -22,6 +22,8 @@ import static org.springframework.data.mongodb.core.query.Query.*; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.stream.Stream; + import org.junit.Before; import org.junit.Test; import org.springframework.dao.IncorrectResultSizeDataAccessException; @@ -33,7 +35,6 @@ import org.springframework.data.mongodb.core.index.GeospatialIndex; import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.NearQuery; -import org.springframework.data.util.CloseableIterator; import com.mongodb.MongoClient; @@ -168,7 +169,7 @@ public class ExecutableFindOperationSupportTests { @Test // DATAMONGO-1563 public void streamAll() { - try (CloseableIterator stream = template.query(Person.class).stream()) { + try (Stream stream = template.query(Person.class).stream()) { assertThat(stream).containsExactlyInAnyOrder(han, luke); } } @@ -176,7 +177,7 @@ public class ExecutableFindOperationSupportTests { @Test // DATAMONGO-1563 public void streamAllWithCollection() { - try (CloseableIterator stream = template.query(Human.class).inCollection(STAR_WARS).stream()) { + try (Stream stream = template.query(Human.class).inCollection(STAR_WARS).stream()) { assertThat(stream).hasSize(2); } } @@ -184,7 +185,7 @@ public class ExecutableFindOperationSupportTests { @Test // DATAMONGO-1563 public void streamAllWithProjection() { - try (CloseableIterator stream = template.query(Person.class).as(Jedi.class).stream()) { + try (Stream stream = template.query(Person.class).as(Jedi.class).stream()) { assertThat(stream).hasOnlyElementsOfType(Jedi.class).hasSize(2); } } @@ -192,9 +193,7 @@ public class ExecutableFindOperationSupportTests { @Test // DATAMONGO-1563 public void streamAllBy() { - try (CloseableIterator stream = template.query(Person.class).matching(query(where("firstname").is("luke"))) - .stream()) { - + try (Stream stream = template.query(Person.class).matching(query(where("firstname").is("luke"))).stream()) { assertThat(stream).containsExactlyInAnyOrder(luke); } }