From 7a3aff12a5fa37c49b163583f4938402ded86d75 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 3 Mar 2015 21:00:43 +0100 Subject: [PATCH] DATAMONGO-1165 - Polishing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renamed MongoOperations executeAsStream(…) to stream(…). Make use of Spring Data Commons StreamUtils in AbstractMongoQuery's StreamExecution. Moved test case from PersonRepositoryIntegrationTests to AbstractPersonRepositoryIntegrationTests to make sure they're executed for all sub-types. Original pull request: #274. --- .../data/mongodb/core/MongoOperations.java | 2 +- .../data/mongodb/core/MongoTemplate.java | 9 +++--- .../repository/query/AbstractMongoQuery.java | 16 ++++------- ...tractPersonRepositoryIntegrationTests.java | 19 ++++++++++++- .../mongodb/repository/PersonRepository.java | 2 +- .../PersonRepositoryIntegrationTests.java | 28 +------------------ 6 files changed, 31 insertions(+), 45 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java index 2c41d5e13..81176cdc7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java @@ -179,7 +179,7 @@ public interface MongoOperations { * @return * @since 1.7 */ - CloseableIterator executeAsStream(Query query, Class entityType); + CloseableIterator stream(Query query, Class entityType); /** * Create an uncapped collection with a name based on the provided entity class. diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 6b99b8b89..e28a1a4a6 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -95,9 +95,8 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.NearQuery; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; -import org.springframework.data.util.CloseableIterator; -import org.springframework.data.mongodb.util.CloseableIterator; import org.springframework.data.mongodb.util.MongoClientVersion; +import org.springframework.data.util.CloseableIterator; import org.springframework.jca.cci.core.ConnectionCallback; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -318,11 +317,12 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { return this.mongoConverter; } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.mongodb.core.MongoOperations#executeAsStream(org.springframework.data.mongodb.core.query.Query, java.lang.Class) */ @Override - public CloseableIterator executeAsStream(final Query query, final Class entityType) { + public CloseableIterator stream(final Query query, final Class entityType) { return execute(entityType, new CollectionCallback>() { @@ -340,7 +340,6 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { return new CloseableIterableCusorAdapter(cursor, exceptionTranslator, readCallback); } }); - } public String getCollectionName(Class entityClass) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java index dce6f110d..425363f1a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java @@ -17,9 +17,6 @@ package org.springframework.data.mongodb.repository.query; import java.util.Collections; import java.util.List; -import java.util.Spliterator; -import java.util.Spliterators; -import java.util.stream.StreamSupport; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -36,7 +33,7 @@ import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.repository.query.ParameterAccessor; import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.data.util.CloseableIterator; -import org.springframework.data.util.CloseableIteratorDisposingRunnable; +import org.springframework.data.util.StreamUtils; import org.springframework.data.util.TypeInformation; import org.springframework.util.Assert; @@ -116,6 +113,7 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { if (method.hasQueryMetaAttributes()) { query.setMeta(method.getQueryMetaAttributes()); } + return query; } @@ -425,19 +423,17 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { */ final class StreamExecution extends Execution { - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.mongodb.repository.query.AbstractMongoQuery.Execution#execute(org.springframework.data.mongodb.core.query.Query) */ @Override + @SuppressWarnings("unchecked") Object execute(Query query) { Class entityType = getQueryMethod().getEntityInformation().getJavaType(); - @SuppressWarnings("unchecked") - CloseableIterator result = (CloseableIterator) operations.executeAsStream(query, entityType); - Spliterator spliterator = Spliterators.spliteratorUnknownSize(result, Spliterator.NONNULL); - - return StreamSupport.stream(spliterator, false).onClose(new CloseableIteratorDisposingRunnable(result)); + return StreamUtils.createStreamFromIterator((CloseableIterator) operations.stream(query, entityType)); } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index 3f2c07723..7cdf22bcf 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -23,6 +23,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.hamcrest.Matchers; import org.junit.Before; @@ -65,7 +67,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests { @Autowired MongoOperations operations; - protected Person dave, oliver, carter, boyd, stefan, leroi, alicia; + Person dave, oliver, carter, boyd, stefan, leroi, alicia; QPerson person; List all; @@ -1148,4 +1150,19 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(result, is(Matchers. iterableWithSize(persons.size()))); assertThat(result.iterator().next().getFirstname(), is("Siggi 2")); } + + /** + * @see DATAMONGO-1165 + */ + @Test + public void shouldAllowReturningJava8StreamInCustomQuery() throws Exception { + + Stream result = repository.findByCustomQueryWithStreamingCursorByFirstnames(Arrays.asList("Dave")); + + try { + assertThat(result.collect(Collectors. toList()), hasItems(dave)); + } finally { + result.close(); + } + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java index 2d5d0c12a..9d2ee73ee 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java @@ -325,6 +325,6 @@ public interface PersonRepository extends MongoRepository, Query /** * @see DATAMONGO-1165 */ - @Query("{firstname:{$in:?0}}") + @Query("{ firstname : { $in : ?0 }}") Stream findByCustomQueryWithStreamingCursorByFirstnames(List firstnames); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests.java index 98fdc43ae..2c5a72a03 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests.java @@ -15,15 +15,6 @@ */ package org.springframework.data.mongodb.repository; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.junit.Test; import org.springframework.test.context.ContextConfiguration; /** @@ -33,21 +24,4 @@ import org.springframework.test.context.ContextConfiguration; * @author Thomas Darimont */ @ContextConfiguration -public class PersonRepositoryIntegrationTests extends AbstractPersonRepositoryIntegrationTests { - - /** - * @see DATAMONGO-1165 - */ - @Test - public void shouldAllowReturningJava8StreamInCustomQuery() throws Exception { - - Stream result = repository.findByCustomQueryWithStreamingCursorByFirstnames(Arrays.asList("Dave")); - - try { - List readPersons = result.collect(Collectors. toList()); - assertThat(readPersons, hasItems(dave)); - } finally { - result.close(); - } - } -} +public class PersonRepositoryIntegrationTests extends AbstractPersonRepositoryIntegrationTests {}