From 928fca11e708b905e60ccb4fbea3451e11fd5dc8 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Mon, 31 Mar 2014 04:28:05 +0200 Subject: [PATCH] DATAGRAPH-453 Neo4jOperations' "lookup" method throws IllegalStateException lookup will now throw a more descriptive exception added `findByIndexedValue()` method to Neo4jOperations for label based operations --- .../support/SchemaIndexingEntityTestBase.java | 3 +- .../data/neo4j/rest/SpringEndResult.java | 75 ------------- .../rest/SpringRestCypherQueryEngine.java | 6 +- .../data/neo4j/rest/SpringRestResult.java | 103 ------------------ .../data/neo4j/conversion/EndResult.java | 34 ------ .../neo4j/conversion/QueryResultBuilder.java | 75 ++----------- .../data/neo4j/conversion/Result.java | 19 +++- .../repository/AbstractGraphRepository.java | 40 +++---- .../data/neo4j/repository/CRUDRepository.java | 10 +- .../neo4j/repository/CypherDslRepository.java | 4 +- .../data/neo4j/repository/GeoQueries.java | 16 +-- .../neo4j/repository/IndexRepository.java | 8 +- .../neo4j/repository/LegacyIndexSearcher.java | 9 +- .../repository/NamedIndexRepository.java | 8 +- .../repository/SchemaIndexRepository.java | 4 +- .../neo4j/repository/SpatialRepository.java | 22 ++-- .../query/GraphRepositoryQuery.java | 4 +- .../data/neo4j/support/Neo4jTemplate.java | 16 ++- .../support/schema/SchemaIndexProvider.java | 17 +-- .../data/neo4j/template/Neo4jOperations.java | 5 +- .../neo4j/repositories/PersonRepository.java | 4 +- ...edeclaringRepositoryMethodsRepository.java | 4 +- .../repository/NoIndexDerivedFinderTests.java | 5 +- .../RedeclaringRepositoryMethodsTests.java | 4 +- .../support/EntityNeo4jTemplateTests.java | 20 +++- 25 files changed, 141 insertions(+), 374 deletions(-) delete mode 100644 spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringEndResult.java delete mode 100644 spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestResult.java delete mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/EndResult.java diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/SchemaIndexingEntityTestBase.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/SchemaIndexingEntityTestBase.java index 4dadbc934..c8ad472b1 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/SchemaIndexingEntityTestBase.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/SchemaIndexingEntityTestBase.java @@ -25,7 +25,6 @@ import org.neo4j.graphdb.schema.IndexDefinition; import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.aspects.core.NodeBacked; -import org.springframework.data.neo4j.conversion.EndResult; import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.core.NodeTypeRepresentationStrategy; import org.springframework.data.neo4j.support.Neo4jTemplate; @@ -160,7 +159,7 @@ public abstract class SchemaIndexingEntityTestBase { "return DISTINCT ID(n)", params); assertNotNull(result); - EndResult results = result.to(Long.class); + Result results = result.to(Long.class); return IteratorUtil.asCollection(results.iterator()); } 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 deleted file mode 100644 index 4a0760064..000000000 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringEndResult.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright 2011 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.neo4j.rest; - -import org.neo4j.helpers.collection.IteratorUtil; -import org.neo4j.rest.graphdb.util.ConvertedResult; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.data.neo4j.conversion.ContainerConverter; -import org.springframework.data.neo4j.conversion.EndResult; - -import java.util.Iterator; - -class SpringEndResult implements EndResult { - private final ConvertedResult result; - - public SpringEndResult(ConvertedResult result) { - this.result = result; - } - - @Override - public R single() { - return result.single(); - } - - @Override - public R singleOrNull() { - return IteratorUtil.singleOrNull(result); - } - - @Override - public void handle(final org.springframework.data.neo4j.conversion.Handler rHandler) { - result.handle(new SpringHandler(rHandler)); - } - - @Override - public Iterator iterator() { - return result.iterator(); - } - - @Override - public > C as(Class container) { - return ContainerConverter.toContainer(container,this); - } - - @Override - public Slice slice(int page, int pageSize) { - return slice(new PageRequest(page,pageSize)); - } - - @Override - public Slice slice(Pageable page) { - return ContainerConverter.slice(this, page); - } - - @Override - public void finish() - { - } -} diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestCypherQueryEngine.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestCypherQueryEngine.java index 775413a9b..3ab3a6802 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestCypherQueryEngine.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestCypherQueryEngine.java @@ -20,6 +20,8 @@ import org.neo4j.rest.graphdb.RestAPI; import org.neo4j.rest.graphdb.query.RestCypherQueryEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.neo4j.conversion.QueryResultBuilder; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.conversion.ResultConverter; import org.springframework.data.neo4j.support.query.CypherQueryEngine; import org.springframework.data.neo4j.support.query.QueryEngine; @@ -40,10 +42,10 @@ public class SpringRestCypherQueryEngine implements CypherQueryEngine { } @Override - public SpringRestResult> query(String statement, Map params) { + public Result> query(String statement, Map params) { if (log.isDebugEnabled()) log.debug(String.format("Executing remote cypher query: %s params %s",statement,params)); - return new SpringRestResult>(restCypherQueryEngine.query(statement, params)); + return new QueryResultBuilder>(restCypherQueryEngine.query(statement, params), resultConverter); } public ResultConverter getResultConverter() { 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 deleted file mode 100644 index def190dfe..000000000 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestResult.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright 2011 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.neo4j.rest; - -import org.neo4j.rest.graphdb.util.ConvertedResult; -import org.neo4j.rest.graphdb.util.ResultConverter; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.data.neo4j.conversion.ContainerConverter; -import org.springframework.data.neo4j.conversion.EndResult; -import org.springframework.data.neo4j.conversion.Result; -import org.springframework.data.neo4j.mapping.MappingPolicy; - -import java.util.Iterator; - -import static org.springframework.data.neo4j.conversion.ContainerConverter.toContainer; - - -class SpringRestResult implements Result { - org.neo4j.rest.graphdb.util.QueryResult queryResult; - private MappingPolicy mappingPolicy; - - SpringRestResult(org.neo4j.rest.graphdb.util.QueryResult queryResult) { - this.queryResult = queryResult; - } - - @Override - public EndResult to(final Class type) { - return new SpringEndResult(queryResult.to(type)); - } - - public EndResult to(Class type, final org.springframework.data.neo4j.conversion.ResultConverter converter) { - ConvertedResult result = queryResult.to(type, new ResultConverter() { - @Override - public R convert(T value, Class type) { - return converter.convert(value,type,mappingPolicy); - } - }); - return new SpringEndResult(result); - } - - public void handle(org.springframework.data.neo4j.conversion.Handler handler) { - queryResult.handle(new SpringHandler(handler)); - } - - @Override - public Slice slice(int page, int pageSize) { - return slice(new PageRequest(page,pageSize)); - } - - @Override - public Slice slice(Pageable page) { - return ContainerConverter.slice( queryResult, page ); - } - - @Override - public Iterator iterator() { - return queryResult.iterator(); - } - - - @SuppressWarnings({"unchecked"}) - @Override - public T singleOrNull() { - return (T) to(Object.class).singleOrNull(); - } - - @SuppressWarnings("unchecked") - @Override - public T single() { - return (T) to(Object.class).single(); - } - - @Override - public Result with(MappingPolicy mappingPolicy) { - this.mappingPolicy = mappingPolicy; - return this; - } - - @Override - 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 deleted file mode 100644 index c9f62619c..000000000 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/EndResult.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright 2011 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.data.neo4j.conversion; - -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; - -/** -* @author mh -* @since 28.06.11 -*/ -public interface EndResult extends Iterable { - R single(); - R singleOrNull(); - void handle(Handler handler); - > C as(Class container); - Slice slice(int page, int pageSize); - Slice slice(Pageable page); - 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 96f31462a..e3c60c6a4 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 @@ -18,6 +18,7 @@ package org.springframework.data.neo4j.conversion; import org.neo4j.graphdb.index.IndexHits; import org.neo4j.helpers.collection.ClosableIterable; +import org.neo4j.helpers.collection.IterableWrapper; import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.helpers.collection.IteratorWrapper; import org.springframework.data.domain.PageRequest; @@ -46,13 +47,13 @@ public class QueryResultBuilder implements Result { public QueryResultBuilder(Iterable result, final ResultConverter defaultConverter) { this.result = result; - this.isClosableIterable = result instanceof IndexHits || result instanceof ClosableIterable; + this.isClosableIterable = result instanceof IndexHits || result instanceof ClosableIterable || result instanceof AutoCloseable; this.defaultConverter = defaultConverter; } @SuppressWarnings("unchecked") @Override - public EndResult to(Class type) { + public Result to(Class type) { return this.to(type, defaultConverter); } @@ -80,75 +81,17 @@ public class QueryResultBuilder implements Result { } @Override - public EndResult to(final Class type, final ResultConverter resultConverter) { - return new EndResult() { + public Result to(final Class type, final ResultConverter resultConverter) { + Iterable it = new IterableWrapper(result) { @Override - public R single() { - try { - final T value = IteratorUtil.single(result); - return convert(value); - } finally { - closeIfNeeded(); - } - } - @Override - public R singleOrNull() { - try { - final T value = IteratorUtil.singleOrNull(result); - if (value==null) return null; - return convert(value); - } finally { - closeIfNeeded(); - } - } - - private R convert(T value) { - return resultConverter.convert(value, type, mappingPolicy); - } - - @Override - public void handle(Handler handler) { - try { - for (T value : result) { - handler.handle(convert(value)); - } - } finally { - closeIfNeeded(); - } - } - - @Override - public Iterator iterator() { - return new IteratorWrapper(result.iterator()) { - protected R underlyingObjectToObject(T value) { - return convert(value); - } - }; - } - - @Override - public > C as(Class container) { - return ContainerConverter.toContainer(container, this); - } - - @Override - public Slice slice(Pageable page) { - return ContainerConverter.slice(this,page); - } - - @Override - public Slice slice(int page, int size) { - return ContainerConverter.slice(this,new PageRequest(page,size)); - } - - @Override - public void finish() - { - closeIfNeeded(); + protected R underlyingObjectToObject(T object) { + return resultConverter.convert(object,type,mappingPolicy); } }; + return new QueryResultBuilder(it,defaultConverter); } + @SuppressWarnings("unchecked") @Override public > C as(Class container) { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Result.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Result.java index 5e1c3429a..a74d936d9 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Result.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/conversion/Result.java @@ -16,15 +16,28 @@ package org.springframework.data.neo4j.conversion; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.neo4j.mapping.MappingPolicy; /** * @author mh * @since 28.06.11 */ -public interface Result extends EndResult { - EndResult to(Class type); - EndResult to(Class type, ResultConverter resultConverter); +public interface Result extends Iterable { + Result to(Class type); + Result to(Class type, ResultConverter resultConverter); Result with(MappingPolicy mappingPolicy); + T single(); + + T singleOrNull(); + + void handle(Handler handler); + + > C as(Class container);Slice slice(int page, int pageSize); + + Slice slice(Pageable page); + + void finish(); } 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 e7ef85961..64b4739f4 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 @@ -27,7 +27,7 @@ import org.springframework.data.domain.*; import org.springframework.data.geo.Box; import org.springframework.data.geo.Circle; import org.springframework.data.geo.Shape; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.mapping.Neo4jPersistentEntity; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.repository.query.CypherQuery; @@ -112,7 +112,7 @@ public abstract class AbstractGraphRepository im * @return lazy Iterable over all instances of the target type. */ @Override - public EndResult findAll() { + public Result findAll() { return template.findAll(clazz); } @@ -166,7 +166,7 @@ public abstract class AbstractGraphRepository im */ @Override @Deprecated - public EndResult findAllByPropertyValue(final String indexName, final String property, final Object value) { + public Result findAllByPropertyValue(final String indexName, final String property, final Object value) { return legacyIndexSearcher.findAllByPropertyValue(indexName, property, value); } @@ -177,7 +177,7 @@ public abstract class AbstractGraphRepository im * @return Iterable over Entities with this property and value */ @Override - public EndResult findAllByPropertyValue(final String property, final Object value) { + public Result findAllByPropertyValue(final String property, final Object value) { return findAllByPropertyValue(null, property, value); } @@ -189,7 +189,7 @@ public abstract class AbstractGraphRepository im */ @Override @Deprecated - public EndResult findAllByQuery(final String key, final Object query) { + public Result findAllByQuery(final String key, final Object query) { return findAllByQuery(null, key,query); } /** @@ -201,18 +201,18 @@ public abstract class AbstractGraphRepository im */ @Override @Deprecated - public EndResult findAllByQuery(final String indexName, final String property, final Object query) { + public Result findAllByQuery(final String indexName, final String property, final Object query) { return legacyIndexSearcher.findAllByQuery(indexName, property, query); } @Override @Deprecated - public EndResult findAllByRange(final String property, final Number from, final Number to) { + public Result findAllByRange(final String property, final Number from, final Number to) { return findAllByRange(null,property,from,to); } @Override @Deprecated - public EndResult findAllByRange(final String indexName, final String property, final Number from, final Number to) { + public Result findAllByRange(final String indexName, final String property, final Number from, final Number to) { return legacyIndexSearcher.findAllByRange(indexName, property, from, to); } @@ -238,7 +238,7 @@ public abstract class AbstractGraphRepository im * @return Iterable over Entities with this property and value */ @Override - public EndResult findAllBySchemaPropertyValue(String property, Object value) { + public Result findAllBySchemaPropertyValue(String property, Object value) { final String SCHEMA_PROP_MATCH_CLAUSE = "MATCH (entity:`%s`) where entity.`%s` = {propValue} return entity"; Neo4jPersistentEntity persistentEntity = template.getEntityType(clazz).getEntity(); @@ -297,13 +297,13 @@ public abstract class AbstractGraphRepository im } @Override - public EndResult findAll(Sort sort) { + public Result findAll(Sort sort) { CypherQuery cq = new CypherQuery(template.getEntityType(clazz).getEntity(),template, template.isLabelBased()); return query(cq.toQueryString(sort), Collections.EMPTY_MAP); } @Override - public EndResult query(String query, Map params) { + public Result query(String query, Map params) { return template.query(query, params).to(clazz); } @@ -311,7 +311,7 @@ public abstract class AbstractGraphRepository im public Page findAll(final Pageable pageable) { int count = pageable.getPageSize(); int offset = pageable.getOffset(); - EndResult foundEntities = findAll(pageable.getSort()); + Result foundEntities = findAll(pageable.getSort()); final Iterator iterator = foundEntities.iterator(); final PageImpl page = extractPage(pageable, count, offset, iterator); foundEntities.finish(); @@ -396,39 +396,39 @@ public abstract class AbstractGraphRepository im @SuppressWarnings("unchecked") @Override - public EndResult query(Execute query, Map params) { + public Result query(Execute query, Map params) { return template.queryEngineFor().query(query.toString(), params).to(clazz); } // SpatialRepository @Override - public EndResult findWithinWellKnownText( final String indexName, String wellKnownText) { + public Result findWithinWellKnownText(final String indexName, String wellKnownText) { return geoQueries.findWithinWellKnownText(indexName,wellKnownText); } @Override - public EndResult findWithinDistance( final String indexName, final double lat, double lon, double distanceKm) { + public Result findWithinDistance(final String indexName, final double lat, double lon, double distanceKm) { return geoQueries.findWithinDistance(indexName, lat, lon,distanceKm); } @Override - public EndResult findWithinBoundingBox(final String indexName, final double lowerLeftLat, - final double lowerLeftLon, final double upperRightLat, final double upperRightLon) { + public Result findWithinBoundingBox(final String indexName, final double lowerLeftLat, + final double lowerLeftLon, final double upperRightLat, final double upperRightLon) { return geoQueries.findWithinBoundingBox(indexName, lowerLeftLat, lowerLeftLon, upperRightLat, upperRightLon); } @Override - public EndResult findWithinBoundingBox(String indexName, Box box) { + public Result findWithinBoundingBox(String indexName, Box box) { return geoQueries.findWithinBoundingBox(indexName,box); } @Override - public EndResult findWithinDistance(String indexName, Circle circle) { + public Result findWithinDistance(String indexName, Circle circle) { return geoQueries.findWithinDistance(indexName, circle); } @Override - public EndResult findWithinShape(String indexName, Shape shape) { + public Result findWithinShape(String indexName, Shape shape) { return geoQueries.findWithinShape(indexName,shape); } } 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 132e45496..061ec5b92 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 @@ -19,7 +19,7 @@ package org.springframework.data.neo4j.repository; import java.util.Map; import org.springframework.data.domain.Sort; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.PagingAndSortingRepository; @@ -38,7 +38,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 */ - EndResult findAll(); + Result findAll(); /** @@ -48,11 +48,11 @@ 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 */ - EndResult findAll(Sort sort); + Result findAll(Sort sort); Class getStoredJavaType(Object entity); - EndResult query(String query, Map params); -} \ No newline at end of file + Result query(String query, Map params); +} diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CypherDslRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CypherDslRepository.java index 57378a309..d3374dc6e 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CypherDslRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CypherDslRepository.java @@ -18,7 +18,7 @@ package org.springframework.data.neo4j.repository; import org.neo4j.cypherdsl.grammar.Execute; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.transaction.annotation.Transactional; import java.util.Map; @@ -33,5 +33,5 @@ public interface CypherDslRepository { @Transactional Page query(Execute query, Execute countQuery, Map params, Pageable page); @Transactional - EndResult query(Execute query, Map params); + Result query(Execute query, Map params); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GeoQueries.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GeoQueries.java index fc70f1ed8..339e8f855 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GeoQueries.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GeoQueries.java @@ -21,7 +21,7 @@ import org.neo4j.graphdb.PropertyContainer; import org.neo4j.helpers.Pair; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.geo.*; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.repository.query.parser.Part; import org.springframework.util.Assert; @@ -40,12 +40,12 @@ public class GeoQueries implements SpatialReposi this.legacyIndexSearcher = legacyIndexSearcher; } @Override - public EndResult findWithinWellKnownText( final String indexName, String wellKnownText) { + public Result findWithinWellKnownText(final String indexName, String wellKnownText) { return legacyIndexSearcher.geoQuery(indexName, WITHIN_WKT_GEOMETRY, wellKnownText); } @Override - public EndResult findWithinShape(String indexName, Shape shape) { + public Result findWithinShape(String indexName, Shape shape) { Assert.notNull(indexName, "geo-index-name must not be null"); Assert.notNull(shape,"shape must not be null"); if (shape instanceof Circle) return findWithinDistance(indexName,(Circle)shape); @@ -55,7 +55,7 @@ public class GeoQueries implements SpatialReposi } @Override - public EndResult findWithinDistance( final String indexName, final double lat, double lon, double distanceKm) { + public Result findWithinDistance(final String indexName, final double lat, double lon, double distanceKm) { return legacyIndexSearcher.geoQuery(indexName, WITHIN_DISTANCE, toWithinDistanceParams(lat, lon, distanceKm)); } @@ -64,7 +64,7 @@ public class GeoQueries implements SpatialReposi } @Override - public EndResult findWithinDistance(String indexName, Circle circle) { + public Result findWithinDistance(String indexName, Circle circle) { return legacyIndexSearcher.geoQuery(indexName, WITHIN_DISTANCE, toWithinDistanceParams(circle)); } @@ -78,8 +78,8 @@ public class GeoQueries implements SpatialReposi } @Override - public EndResult findWithinBoundingBox(final String indexName, final double lowerLeftLat, - final double lowerLeftLon, final double upperRightLat, final double upperRightLon) { + public Result findWithinBoundingBox(final String indexName, final double lowerLeftLat, + final double lowerLeftLon, final double upperRightLat, final double upperRightLon) { return legacyIndexSearcher.geoQuery(indexName, BBOX, toBoundingBoxParams(lowerLeftLat, lowerLeftLon, upperRightLat, upperRightLon)); } @@ -88,7 +88,7 @@ public class GeoQueries implements SpatialReposi } @Override - public EndResult findWithinBoundingBox(String indexName, Box box) { + public Result findWithinBoundingBox(String indexName, Box box) { return legacyIndexSearcher.geoQuery(indexName,BBOX,toBoundingBoxParams(box)); } 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 89808e2d4..820f4fe91 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.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.transaction.annotation.Transactional; @@ -29,12 +29,12 @@ import org.springframework.transaction.annotation.Transactional; T findByPropertyValue(String property, Object value); @Transactional @Deprecated - EndResult findAllByPropertyValue(String property, Object value); + Result findAllByPropertyValue(String property, Object value); @Transactional @Deprecated - EndResult findAllByQuery(String key, Object query); + Result findAllByQuery(String key, Object query); @Transactional @Deprecated - EndResult findAllByRange(String property, Number from, Number to); + Result findAllByRange(String property, Number from, Number to); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/LegacyIndexSearcher.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/LegacyIndexSearcher.java index 90eb356af..b4b91ccbf 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/LegacyIndexSearcher.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/LegacyIndexSearcher.java @@ -7,7 +7,6 @@ import org.neo4j.graphdb.index.IndexHits; import org.neo4j.graphdb.index.ReadableIndex; import org.neo4j.helpers.collection.ClosableIterable; import org.neo4j.helpers.collection.IterableWrapper; -import org.springframework.data.neo4j.conversion.EndResult; import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.Neo4jTemplate; @@ -100,7 +99,7 @@ public class LegacyIndexSearcher { return (NumericRangeQuery) NumericRangeQuery.newIntRange(property, from.intValue(), to.intValue(), true, true); } - public EndResult findAllByRange(String indexName, final String property, final Number from, final Number to) { + public Result findAllByRange(String indexName, final String property, final Number from, final Number to) { return queryResult(indexName, new AbstractGraphRepository.Query() { public IndexHits query(ReadableIndex index) { return index.query(property, createInclusiveRangeQuery(property, from, to)); @@ -108,7 +107,7 @@ public class LegacyIndexSearcher { }); } - public EndResult findAllByQuery(final String indexName, final String property, final Object query) { + public Result findAllByQuery(final String indexName, final String property, final Object query) { return queryResult(indexName, new AbstractGraphRepository.Query() { public IndexHits query(ReadableIndex index) { return getIndex(indexName, property).query(property, query); @@ -127,7 +126,7 @@ public class LegacyIndexSearcher { } - public EndResult findAllByPropertyValue(final String indexName, final String property, final Object value) { + public Result findAllByPropertyValue(final String indexName, final String property, final Object value) { return queryResult(indexName, new AbstractGraphRepository.Query() { public IndexHits query(ReadableIndex index) { return getIndexHits(indexName, property, value); @@ -135,7 +134,7 @@ public class LegacyIndexSearcher { }); } - private EndResult queryResult(String indexName, AbstractGraphRepository.Query query) { + private Result queryResult(String indexName, AbstractGraphRepository.Query query) { try { final IndexHits indexHits = query.query(getIndex(indexName, null)); return template.convert(indexHits).to(clazz); 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 53a94bf5f..0ec86828f 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.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.transaction.annotation.Transactional; @@ -29,12 +29,12 @@ import org.springframework.transaction.annotation.Transactional; T findByPropertyValue(String indexName, String property, Object value); @Transactional @Deprecated - EndResult findAllByPropertyValue(String indexName, String property, Object value); + Result findAllByPropertyValue(String indexName, String property, Object value); @Transactional @Deprecated - EndResult findAllByQuery(String indexName, String key, Object query); + Result findAllByQuery(String indexName, String key, Object query); @Transactional @Deprecated - EndResult findAllByRange(String indexName, String property, Number from, Number to); + Result findAllByRange(String indexName, String property, Number from, Number to); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SchemaIndexRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SchemaIndexRepository.java index 6f72ee829..532bd0f86 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SchemaIndexRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/SchemaIndexRepository.java @@ -16,7 +16,7 @@ package org.springframework.data.neo4j.repository; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +30,6 @@ public interface SchemaIndexRepository { T findBySchemaPropertyValue(String property, Object value); @Transactional - EndResult findAllBySchemaPropertyValue(String property, Object value); + Result findAllBySchemaPropertyValue(String property, Object value); } 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 4a03ca639..d3bcfcd8a 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 @@ -18,11 +18,9 @@ package org.springframework.data.neo4j.repository; import org.springframework.data.geo.*; import org.springframework.data.geo.Shape; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.transaction.annotation.Transactional; -import java.awt.*; - /** * Repository for spatial queries. * @@ -35,27 +33,27 @@ import java.awt.*; */ public interface SpatialRepository { @Transactional - EndResult findWithinBoundingBox(String indexName, double lowerLeftLat, - double lowerLeftLon, - double upperRightLat, - double upperRightLon); + Result findWithinBoundingBox(String indexName, double lowerLeftLat, + double lowerLeftLon, + double upperRightLat, + double upperRightLon); @Transactional - EndResult findWithinBoundingBox(String indexName, Box box); + Result findWithinBoundingBox(String indexName, Box box); @Transactional - EndResult findWithinDistance( final String indexName, final double lat, double lon, double distanceKm); + Result findWithinDistance(final String indexName, final double lat, double lon, double distanceKm); @Transactional - EndResult findWithinDistance( final String indexName, Circle circle); + Result findWithinDistance(final String indexName, Circle circle); @Transactional - EndResult findWithinWellKnownText( final String indexName, String wellKnownText); + Result findWithinWellKnownText(final String indexName, String wellKnownText); /** * Converts the shape into a well-known text representation and executes the appropriate WKT query */ @Transactional - EndResult findWithinShape( final String indexName, Shape shape); + Result findWithinShape(final String indexName, Shape shape); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphRepositoryQuery.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphRepositoryQuery.java index c56adaaaa..7787e9718 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphRepositoryQuery.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphRepositoryQuery.java @@ -21,7 +21,7 @@ import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.SliceImpl; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.support.Neo4jTemplate; import org.springframework.data.neo4j.support.query.CypherQueryEngine; @@ -109,7 +109,7 @@ abstract class GraphRepositoryQuery implements RepositoryQuery, ParameterResolve return createPage(result, accessor.getPageable(),count, queryMethod.isPageQuery()); } if (queryMethod.isIterableResult()) { - final EndResult result = queryEngine.query(queryString, params).to(compoundType); + final Result result = queryEngine.query(queryString, params).to(compoundType); if (queryMethod.isSetResult()) return IteratorUtil.addToCollection(result,new LinkedHashSet()); if (queryMethod.isCollectionResult()) return IteratorUtil.addToCollection(result,new ArrayList()); return result; 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 942d259e7..f4f65106e 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 @@ -30,7 +30,6 @@ import org.springframework.core.convert.ConversionService; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.mapping.model.MappingException; -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.conversion.ResultConverter; @@ -202,7 +201,7 @@ public class Neo4jTemplate implements Neo4jOperations, ApplicationContextAware { } @Override - public EndResult findAll(final Class entityClass) { + public Result findAll(final Class entityClass) { notNull(entityClass, "entity type"); final ClosableIterable all = infrastructure.getTypeRepresentationStrategies().findAll(getEntityType(entityClass)); return new QueryResultBuilder(all, getDefaultConverter()).to(entityClass); @@ -369,7 +368,7 @@ public class Neo4jTemplate implements Neo4jOperations, ApplicationContextAware { final Class targetType = (Class) actualType.getType(); final Result> result = queryEngineFor().query(statement, params); final Class> containerType = (Class>) typeInformation.getType(); - if (EndResult.class.isAssignableFrom(containerType)) { + if (Result.class.isAssignableFrom(containerType)) { return result; } if (actualType.isMap()) { @@ -613,7 +612,6 @@ public class Neo4jTemplate implements Neo4jOperations, ApplicationContextAware { public Result lookup(final Class indexedType, String propertyName, final Object value) { notNull(propertyName, "property name", indexedType, "indexedType", value, "query value"); try { - final Index index = getIndex(indexedType, propertyName); return convert(index.query(propertyName, value)); } catch (RuntimeException e) { @@ -621,6 +619,13 @@ public class Neo4jTemplate implements Neo4jOperations, ApplicationContextAware { } } + @Override + public Result findByIndexedValue(final Class indexedType, String propertyName, Object value) { + Neo4jPersistentProperty persistentProperty = getPersistentProperty(indexedType, propertyName); + if (persistentProperty==null) throw new InvalidDataAccessApiUsageException("Unknown Property "+propertyName+" for "+indexedType); + return getSchemaIndexProvider().findByIndexedValue(persistentProperty, value); + } + @Override public Index getIndex(String indexName, Class indexedType) { final Neo4jPersistentEntityImpl persistentEntity = indexedType==null ? null : getPersistentEntity(indexedType); @@ -631,6 +636,9 @@ public class Neo4jTemplate implements Neo4jOperations, ApplicationContextAware { public Index getIndex(Class indexedType, String propertyName) { final Neo4jPersistentProperty property = getPersistentProperty(indexedType, propertyName); if (property == null) return getIndexProvider().getIndex(getPersistentEntity(indexedType), null); + if (property.isIndexed() && property.getIndexInfo().isLabelBased()) { + throw new InvalidDataAccessApiUsageException("Can lookup label based property from legacy index"); + } return getIndexProvider().getIndex(property, indexedType); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/schema/SchemaIndexProvider.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/schema/SchemaIndexProvider.java index c18be58ce..449e7c947 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/schema/SchemaIndexProvider.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/schema/SchemaIndexProvider.java @@ -4,11 +4,12 @@ import org.neo4j.graphdb.Node; import org.neo4j.helpers.collection.MapUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.mapping.IndexInfo; import org.springframework.data.neo4j.mapping.Neo4jPersistentEntity; import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; +import org.springframework.data.neo4j.support.conversion.EntityResultConverter; import org.springframework.data.neo4j.support.query.CypherQueryEngine; import java.util.Collection; @@ -52,18 +53,23 @@ public class SchemaIndexProvider { return property.getIndexInfo().getIndexName(); } - public EndResult findAll(Neo4jPersistentEntity entity) { + public Result findAll(Neo4jPersistentEntity entity) { String label = entity.getTypeAlias().toString(); String query = findByLabelQuery(label); return cypher.query(query, null).to(entity.getType()); } - public EndResult findAll(Neo4jPersistentProperty property, Object value) { + public Result findByIndexedValue(Neo4jPersistentProperty property, Object value) { + Result results = findAllNodes(property, value); + return results.to((Class) property.getOwner().getType()); + } + + private Result findAllNodes(Neo4jPersistentProperty property, Object value) { IndexInfo indexInfo = property.getIndexInfo(); String label = indexInfo.getIndexName(); String prop = getName(property); String query = findByLabelAndPropertyQuery(label, prop); - return cypher.query(query, map("value", value)).to((Class)property.getOwner().getType()); + return cypher.query(query, map("value", value)).to(Node.class); } private String findByLabelQuery(String label) { @@ -100,7 +106,4 @@ public class SchemaIndexProvider { return "CREATE INDEX ON :`"+ label +"`(`"+ prop +"`)"; } - interface IndexCreator { - void deferCreateIndex(Neo4jPersistentProperty property); - } } 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 e333d2a80..e8a190b2a 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 @@ -23,7 +23,6 @@ import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; -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; @@ -147,6 +146,8 @@ public interface Neo4jOperations { R createRelationshipBetween(Object start, Object end, Class relationshipEntityClass, String relationshipType, boolean allowDuplicates); + Result findByIndexedValue(Class indexedType, String propertyName, Object value); + /** * Retrieves an existing index for the given class and/or name * @param indexName might be null @@ -239,7 +240,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. */ - EndResult findAll(Class entityClass); + Result findAll(Class entityClass); /** * Provies the instance count a given entity type using the typerepresentation strategy configured for this template. diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/PersonRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/PersonRepository.java index 8fbfb4e93..6bffda13a 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/PersonRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/PersonRepository.java @@ -26,7 +26,7 @@ import org.springframework.data.geo.Polygon; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.annotation.QueryResult; import org.springframework.data.neo4j.annotation.ResultColumn; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.model.Group; import org.springframework.data.neo4j.model.Person; import org.springframework.data.neo4j.model.Personality; @@ -107,7 +107,7 @@ public interface PersonRepository extends GraphRepository, NamedIndexRep @Query("start person=node:`name-index`('name:*') return person.name as name, person order by name asc ") Iterable getAllNamesAndPeople(); - EndResult findByHeight( short height ); + Result findByHeight(short height); @QueryResult interface NameAndPersonResult diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/RedeclaringRepositoryMethodsRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/RedeclaringRepositoryMethodsRepository.java index aed579f08..fad86f656 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/RedeclaringRepositoryMethodsRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repositories/RedeclaringRepositoryMethodsRepository.java @@ -19,7 +19,7 @@ package org.springframework.data.neo4j.repositories; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.neo4j.annotation.Query; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.model.Person; import org.springframework.data.neo4j.repository.GraphRepository; @@ -32,7 +32,7 @@ public interface RedeclaringRepositoryMethodsRepository extends GraphRepository< * Should not find any persons at all. */ @Query("MATCH (n:Person) WHERE n.name='Bubu' return n") - EndResult findAll(); + Result findAll(); /** * Should only find persons with the name 'Oliver'. diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/NoIndexDerivedFinderTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/NoIndexDerivedFinderTests.java index 220d1d279..e236504eb 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/NoIndexDerivedFinderTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/NoIndexDerivedFinderTests.java @@ -25,12 +25,11 @@ import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.index.Index; import org.neo4j.helpers.collection.IteratorUtil; -import org.neo4j.test.ImpermanentGraphDatabase; import org.neo4j.test.TestGraphDatabaseFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.model.Group; import org.springframework.data.neo4j.model.Person; import org.springframework.data.neo4j.repositories.GroupRepository; @@ -65,7 +64,7 @@ public class NoIndexDerivedFinderTests { @Test @Transactional public void findAllInitiallyWithoutIndexCreation() { - EndResult result = personRepository.findByHeight( (short) 100 ); + Result result = personRepository.findByHeight((short) 100); assertEquals(0,IteratorUtil.count( result )); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/RedeclaringRepositoryMethodsTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/RedeclaringRepositoryMethodsTests.java index 789623a6a..42d7c5ca2 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/RedeclaringRepositoryMethodsTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/RedeclaringRepositoryMethodsTests.java @@ -23,7 +23,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.model.Person; import org.springframework.data.neo4j.repositories.RedeclaringRepositoryMethodsRepository; import org.springframework.transaction.annotation.Transactional; @@ -61,7 +61,7 @@ public class RedeclaringRepositoryMethodsTests extends AbstractEntityBasedGraphR repository.save(new Person("Oliver", 30)); repository.save(new Person("Thomas", 30)); - EndResult result = repository.findAll(); + Result result = repository.findAll(); assertThat(result.iterator().hasNext(), is(false)); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTests.java index 84d29779d..ecc075292 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTests.java @@ -29,7 +29,7 @@ import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.helpers.collection.MapUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataRetrievalFailureException; -import org.springframework.data.neo4j.conversion.EndResult; +import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.neo4j.conversion.Result; import org.springframework.data.neo4j.mapping.ManagedEntity; import org.springframework.data.neo4j.model.Friendship; @@ -38,7 +38,6 @@ import org.springframework.data.neo4j.model.Named; import org.springframework.data.neo4j.model.Person; import org.springframework.data.neo4j.repository.GraphRepository; import org.springframework.data.neo4j.support.query.CypherQueryEngine; -import org.springframework.data.neo4j.support.query.QueryEngine; import org.springframework.data.neo4j.template.Neo4jOperations; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -360,7 +359,7 @@ public class EntityNeo4jTemplateTests extends EntityTestBase { @Test @Transactional public void testConvert() throws Exception { - final EndResult groups = neo4jOperations.convert(Arrays.asList(getNodeState(testTeam.sdg))).to(Group.class); + final Result groups = neo4jOperations.convert(Arrays.asList(getNodeState(testTeam.sdg))).to(Group.class); assertEquals(testTeam.sdg.getName(),groups.iterator().next().getName()); } @@ -384,9 +383,24 @@ public class EntityNeo4jTemplateTests extends EntityTestBase { final Person found = neo4jOperations.lookup(Person.class, "name","name:Michael").to(Person.class).single(); assertEquals(testTeam.michael.getId(),found.getId()); } + @Test @Transactional public void testLookupExact() throws Exception { final Person found = neo4jOperations.lookup(Person.class, "name","Michael").to(Person.class).single(); assertEquals(testTeam.michael.getId(),found.getId()); } + + @Test(expected = InvalidDataAccessApiUsageException.class) + @Transactional + public void testLookupExactLabelIndex() throws Exception { + final Person found = neo4jOperations.lookup(Person.class, "alias","michaelAlias").to(Person.class).single(); + assertEquals(testTeam.michael.getId(),found.getId()); + } + + @Test + @Transactional + public void testFindAllSchemaIndex() throws Exception { + final Person found = neo4jOperations.findByIndexedValue(Person.class, "alias", "michaelAlias").single(); + assertEquals(testTeam.michael.getId(),found.getId()); + } }