From dc95ae85990225ac2284e4d641b6b545958816d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rickard=20=C3=96berg?= Date: Fri, 16 Dec 2011 15:52:24 +0800 Subject: [PATCH] Fixed DATAGRAPH-148 --- .../data/neo4j/rest/SpringEndResult.java | 5 ++ .../data/neo4j/rest/SpringRestResult.java | 5 ++ .../data/neo4j/conversion/EndResult.java | 1 + .../neo4j/conversion/QueryResultBuilder.java | 12 +++++ .../repository/AbstractGraphRepository.java | 49 ++++++++++++------- .../data/neo4j/repository/CRUDRepository.java | 5 +- .../neo4j/repository/IndexRepository.java | 8 +-- .../repository/NamedIndexRepository.java | 8 +-- .../neo4j/repository/SpatialRepository.java | 8 +-- .../data/neo4j/support/Neo4jTemplate.java | 4 +- .../data/neo4j/template/Neo4jOperations.java | 3 +- 11 files changed, 72 insertions(+), 36 deletions(-) diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringEndResult.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringEndResult.java index 17db8bc30..05bea7aae 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringEndResult.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringEndResult.java @@ -53,4 +53,9 @@ class SpringEndResult implements EndResult { public > C as(Class container) { return ContainerConverter.toContainer(container,this); } + + @Override + public void finish() + { + } } diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestResult.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestResult.java index 5053810d3..bb1117681 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestResult.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestResult.java @@ -81,4 +81,9 @@ class SpringRestResult implements Result { public > C as(Class container) { return toContainer(container, this); } + + @Override + public void finish() + { + } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/EndResult.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/EndResult.java index 6bf97153e..c3edc5e43 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/EndResult.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/EndResult.java @@ -25,4 +25,5 @@ public interface EndResult extends Iterable { R singleOrNull(); void handle(Handler handler); > C as(Class container); + void finish(); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/QueryResultBuilder.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/QueryResultBuilder.java index 59fb928b6..62da9b90c 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/QueryResultBuilder.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/QueryResultBuilder.java @@ -70,6 +70,12 @@ public class QueryResultBuilder implements Result { } } + @Override + public void finish() + { + closeIfNeeded(); + } + @Override public EndResult to(final Class type, final ResultConverter resultConverter) { return new EndResult() { @@ -120,6 +126,12 @@ public class QueryResultBuilder implements Result { public > C as(Class container) { return ContainerConverter.toContainer(container, this); } + + @Override + public void finish() + { + closeIfNeeded(); + } }; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java index ecd609c91..6fa970d00 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java @@ -32,6 +32,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.neo4j.annotation.QueryType; import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.QueryResultBuilder; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.support.Neo4jTemplate; import org.springframework.data.neo4j.support.index.NoSuchIndexException; import org.springframework.data.neo4j.support.index.NullReadableIndex; @@ -61,23 +63,23 @@ public abstract class AbstractGraphRepository im */ @Override - public ClosableIterable findWithinWellKnownText( final String indexName, String wellKnownText) { + public EndResult findWithinWellKnownText( final String indexName, String wellKnownText) { return geoQuery(indexName, "withinWKTGeometry", wellKnownText); } @Override - public ClosableIterable findWithinDistance( final String indexName, final double lat, double lon, double distanceKm) { + public EndResult findWithinDistance( final String indexName, final double lat, double lon, double distanceKm) { return geoQuery(indexName, "withinDistance", map("point", new Double[] { lon, lat}, "distanceInKm", distanceKm)); } @Override - public ClosableIterable findWithinBoundingBox(final String indexName, final double lowerLeftLat, + public EndResult findWithinBoundingBox(final String indexName, final double lowerLeftLat, final double lowerLeftLon, final double upperRightLat, final double upperRightLon) { return geoQuery(indexName, "bbox", format("[%s, %s, %s, %s]", lowerLeftLon, upperRightLon, lowerLeftLat, upperRightLat)); } - private ClosableIterable geoQuery(String indexName, String geoQuery, Object params) { + private Result geoQuery(String indexName, String geoQuery, Object params) { final IndexHits indexHits = getIndex(indexName,null).query(geoQuery, params); - return new GeoNodeIndexHitsWrapper(indexHits); + return template.convert(new GeoNodeIndexHitsWrapper(indexHits)); } public static final ClosableIterable EMPTY_CLOSABLE_ITERABLE = new ClosableIterable() { @@ -127,7 +129,7 @@ public abstract class AbstractGraphRepository im * @return lazy Iterable over all instances of the target type. */ @Override - public ClosableIterable findAll() { + public EndResult findAll() { return template.findAll(clazz); } @@ -208,8 +210,8 @@ public abstract class AbstractGraphRepository im * @return Iterable over Entities with this property and value */ @Override - public ClosableIterable findAllByPropertyValue(final String indexName, final String property, final Object value) { - return query(indexName, new Query() { + public EndResult findAllByPropertyValue(final String indexName, final String property, final Object value) { + return queryResult(indexName, new Query() { public IndexHits query(ReadableIndex index) { return getIndexHits(indexName, property, value); } @@ -222,7 +224,7 @@ public abstract class AbstractGraphRepository im * @return Iterable over Entities with this property and value */ @Override - public ClosableIterable findAllByPropertyValue(final String property, final Object value) { + public EndResult findAllByPropertyValue(final String property, final Object value) { return findAllByPropertyValue(null, property, value); } @@ -233,7 +235,7 @@ public abstract class AbstractGraphRepository im *@param query lucene query object or query-string @return Iterable over Entities with this property and value */ @Override - public ClosableIterable findAllByQuery(final String key, final Object query) { + public EndResult findAllByQuery(final String key, final Object query) { return findAllByQuery(null, key,query); } /** @@ -244,8 +246,8 @@ public abstract class AbstractGraphRepository im *@param query lucene query object or query-string @return Iterable over Entities with this property and value */ @Override - public ClosableIterable findAllByQuery(final String indexName, final String property, final Object query) { - return query(indexName, new Query() { + public EndResult findAllByQuery(final String indexName, final String property, final Object query) { + return queryResult(indexName, new Query() { public IndexHits query(ReadableIndex index) { return getIndex(indexName, property).query(property, query); } @@ -255,7 +257,7 @@ public abstract class AbstractGraphRepository im interface Query { IndexHits query(ReadableIndex index); } - private ClosableIterable query(String indexName, Query query) { + private ClosableIterable quxery(String indexName, Query query) { try { final IndexHits indexHits = query.query(getIndex(indexName, null)); if (indexHits == null) return emptyClosableIterable(); @@ -265,18 +267,27 @@ public abstract class AbstractGraphRepository im } } + private EndResult queryResult(String indexName, Query query) { + try { + final IndexHits indexHits = query.query(getIndex(indexName, null)); + return template.convert(indexHits).to(clazz); + } catch (NotFoundException e) { + return null; + } + } + @SuppressWarnings({"unchecked"}) private ClosableIterable emptyClosableIterable() { return EMPTY_CLOSABLE_ITERABLE; } @Override - public ClosableIterable findAllByRange(final String property, final Number from, final Number to) { + public EndResult findAllByRange(final String property, final Number from, final Number to) { return findAllByRange(null,property,from,to); } @Override - public ClosableIterable findAllByRange(final String indexName, final String property, final Number from, final Number to) { - return query(indexName, new Query() { + public EndResult findAllByRange(final String indexName, final String property, final Number from, final Number to) { + return queryResult(indexName, new Query() { public IndexHits query(ReadableIndex index) { return index.query(property, createInclusiveRangeQuery(property, from, to)); } @@ -326,7 +337,7 @@ public abstract class AbstractGraphRepository im } @Override - public ClosableIterable findAll(Sort sort) { + public EndResult findAll(Sort sort) { return findAll(); // todo } @@ -334,10 +345,10 @@ public abstract class AbstractGraphRepository im public Page findAll(final Pageable pageable) { int count = pageable.getPageSize(); int offset = pageable.getOffset(); - ClosableIterable foundEntities = findAll(pageable.getSort()); + EndResult foundEntities = findAll(pageable.getSort()); final Iterator iterator = foundEntities.iterator(); final PageImpl page = extractPage(pageable, count, offset, iterator); - foundEntities.close(); + foundEntities.finish(); return page; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java index 14bcd24f7..92dc9a5a0 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java @@ -21,6 +21,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import org.springframework.data.neo4j.conversion.EndResult; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.transaction.annotation.Transactional; @@ -68,7 +69,7 @@ public interface CRUDRepository extends PagingAndSortingRepository { * @return all entities of the given type * NOTE: please close the iterable if it is not fully looped through */ - ClosableIterable findAll(); + EndResult findAll(); /** @@ -109,7 +110,7 @@ public interface CRUDRepository extends PagingAndSortingRepository { * @return all elements of the repository type, sorted according to the sort * NOTE: please close the iterable if it is not fully looped through */ - ClosableIterable findAll(Sort sort); + EndResult findAll(Sort sort); /** diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/IndexRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/IndexRepository.java index 679f6ce78..d7e1d4bf2 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/IndexRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/IndexRepository.java @@ -16,7 +16,7 @@ package org.springframework.data.neo4j.repository; -import org.neo4j.helpers.collection.ClosableIterable; +import org.springframework.data.neo4j.conversion.EndResult; /** @@ -26,10 +26,10 @@ import org.neo4j.helpers.collection.ClosableIterable; public interface IndexRepository { T findByPropertyValue(String property, Object value); - ClosableIterable findAllByPropertyValue(String property, Object value); + EndResult findAllByPropertyValue(String property, Object value); - ClosableIterable findAllByQuery(String key, Object query); + EndResult findAllByQuery(String key, Object query); - ClosableIterable findAllByRange(String property, Number from, Number to); + EndResult findAllByRange(String property, Number from, Number to); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/NamedIndexRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/NamedIndexRepository.java index 14a257a12..180231995 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/NamedIndexRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/NamedIndexRepository.java @@ -16,7 +16,7 @@ package org.springframework.data.neo4j.repository; -import org.neo4j.helpers.collection.ClosableIterable; +import org.springframework.data.neo4j.conversion.EndResult; /** @@ -26,10 +26,10 @@ import org.neo4j.helpers.collection.ClosableIterable; public interface NamedIndexRepository { T findByPropertyValue(String indexName, String property, Object value); - ClosableIterable findAllByPropertyValue(String indexName, String property, Object value); + EndResult findAllByPropertyValue(String indexName, String property, Object value); - ClosableIterable findAllByQuery(String indexName, String key, Object query); + EndResult findAllByQuery(String indexName, String key, Object query); - ClosableIterable findAllByRange(String indexName, String property, Number from, Number to); + EndResult findAllByRange(String indexName, String property, Number from, Number to); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SpatialRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SpatialRepository.java index a1538354e..427f3c069 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SpatialRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SpatialRepository.java @@ -16,7 +16,7 @@ package org.springframework.data.neo4j.repository; -import org.neo4j.helpers.collection.ClosableIterable; +import org.springframework.data.neo4j.conversion.EndResult; /** * Repository for spatial queries. @@ -26,13 +26,13 @@ import org.neo4j.helpers.collection.ClosableIterable; * inside the entity. */ public interface SpatialRepository { - ClosableIterable findWithinBoundingBox(String indexName, double lowerLeftLat, + EndResult findWithinBoundingBox(String indexName, double lowerLeftLat, double lowerLeftLon, double upperRightLat, double upperRightLon); - ClosableIterable findWithinDistance( final String indexName, final double lat, double lon, double distanceKm); + EndResult findWithinDistance( final String indexName, final double lat, double lon, double distanceKm); - ClosableIterable findWithinWellKnownText( final String indexName, String wellKnownText); + EndResult findWithinWellKnownText( final String indexName, String wellKnownText); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java index 10e6f8c29..c0e309e23 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java @@ -161,10 +161,10 @@ public class Neo4jTemplate implements Neo4jOperations, EntityPersister { } @Override - public ClosableIterable findAll(final Class entityClass) { + public EndResult findAll(final Class entityClass) { notNull(entityClass,"entity type"); final ClosableIterable all = infrastructure.getTypeRepresentationStrategies().findAll(entityClass); - return new EntityCreatingClosableIterable(all, entityClass,infrastructure.getEntityPersister()); + return new QueryResultBuilder(all, getDefaultConverter()).to(entityClass); } @Override diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java index 113cb2327..4e6b116ff 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java @@ -21,6 +21,7 @@ import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.helpers.collection.ClosableIterable; import org.springframework.data.neo4j.annotation.QueryType; +import org.springframework.data.neo4j.conversion.EndResult; import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.conversion.ResultConverter; import org.springframework.data.neo4j.core.GraphDatabase; @@ -217,7 +218,7 @@ public interface Neo4jOperations { * Provides all instances of a given entity type using the typerepresentation strategy configured for this template. * This method is also provided by the appropriate repository. */ - ClosableIterable findAll(Class entityClass); + EndResult findAll(Class entityClass); /** * Provies the instance count a given entity type using the typerepresentation strategy configured for this template.