From 5e90f6b5b370340260f90d8ed701ba567f4ee87c Mon Sep 17 00:00:00 2001 From: Nicki Watt Date: Tue, 1 Oct 2013 18:42:53 +0100 Subject: [PATCH] DATAGRAPH-387 : Minimal changes required to get LabelNodeTypeRepresentationStrategy working across the board (including REST) --- .../neo4j/rest/SpringRestGraphDatabase.java | 11 - .../src/test/resources/RestTests-context.xml | 1 + .../data/neo4j/core/GraphDatabase.java | 7 - .../neo4j/fieldaccess/RelationshipHelper.java | 37 ++- .../repository/AbstractGraphRepository.java | 5 +- .../neo4j/repository/query/CypherQuery.java | 62 ++++- .../repository/query/CypherQueryBuilder.java | 5 +- ...IndexBasedTypeRestrictingWhereClause.java} | 17 +- .../query/IndexRestrictingStartClause.java | 2 +- .../LabelBasedTypeRestrictingWhereClause.java | 59 ++++ .../repository/query/QueryTemplates.java | 7 +- .../support/DelegatingGraphDatabase.java | 38 ++- .../support/query/CypherQueryEngine.java | 4 + ...abelingNodeTypeRepresentationStrategy.java | 121 --------- .../LabelBasedStrategyCypherHelper.java | 7 +- .../TypeRepresentationStrategyFactory.java | 4 +- .../AbstractCypherQueryBuilderTestBase.java | 253 ++++++++++++++++++ ... AbstractDerivedFinderMethodTestBase.java} | 16 +- ...QueryBuilderForIndexBasedTRSUnitTests.java | 166 ++++++++++++ ...QueryBuilderForLabelBasedTRSUnitTests.java | 169 ++++++++++++ .../query/CypherQueryBuilderUnitTests.java | 180 ------------- ...edFinderMethodForIndexedBasedTRSTests.java | 63 +++++ ...ivedFinderMethodForLabelBasedTRSTests.java | 62 +++++ .../repository/query/ThingRepository.java | 4 +- .../SnippetNeo4jTemplateMethodsTests.java | 18 +- ...MethodForIndexedBasedTRSTests-context.xml} | 6 + ...derMethodForLabelBasedTRSTests-context.xml | 19 ++ 27 files changed, 960 insertions(+), 383 deletions(-) rename spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/{TypeRestrictingWhereClause.java => IndexBasedTypeRestrictingWhereClause.java} (71%) create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/LabelBasedTypeRestrictingWhereClause.java delete mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/CoreAPIBasedLabelingNodeTypeRepresentationStrategy.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/AbstractCypherQueryBuilderTestBase.java rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/{DerivedFinderMethodTests.java => AbstractDerivedFinderMethodTestBase.java} (94%) create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/CypherQueryBuilderForIndexBasedTRSUnitTests.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/CypherQueryBuilderForLabelBasedTRSUnitTests.java delete mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/CypherQueryBuilderUnitTests.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/DerivedFinderMethodForIndexedBasedTRSTests.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/query/DerivedFinderMethodForLabelBasedTRSTests.java rename spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/repository/query/{DerivedFinderMethodTests-context.xml => DerivedFinderMethodForIndexedBasedTRSTests-context.xml} (78%) create mode 100644 spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/repository/query/DerivedFinderMethodForLabelBasedTRSTests-context.xml diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java index 72f041244..3f419425d 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/SpringRestGraphDatabase.java @@ -33,8 +33,6 @@ import org.springframework.data.neo4j.annotation.QueryType; import org.springframework.data.neo4j.conversion.DefaultConverter; import org.springframework.data.neo4j.conversion.ResultConverter; import org.springframework.data.neo4j.core.GraphDatabase; -import org.springframework.data.neo4j.core.GraphDatabaseGlobalOperations; -import org.springframework.data.neo4j.support.DelegatingGraphDatabaseGlobalOperations; import org.springframework.data.neo4j.support.index.NoSuchIndexException; import org.springframework.data.neo4j.support.query.ConversionServiceQueryResultConverter; import org.springframework.data.neo4j.support.query.QueryEngine; @@ -48,7 +46,6 @@ public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDat } private ConversionService conversionService; private ResultConverter resultConverter; - private GraphDatabaseGlobalOperations globalOperations; public SpringRestGraphDatabase( RestAPI api){ super(api); @@ -62,14 +59,6 @@ public class SpringRestGraphDatabase extends org.neo4j.rest.graphdb.RestGraphDat this(new RestAPIFacade( uri, user, password )); } - @Override - public GraphDatabaseGlobalOperations getGlobalGraphOperations() { - if (this.globalOperations == null) { - this.globalOperations = new DelegatingGraphDatabaseGlobalOperations(this); - } - return globalOperations; - } - @Override public Node createNode(Map props) { return super.getRestAPI().createNode(props); diff --git a/spring-data-neo4j-rest/src/test/resources/RestTests-context.xml b/spring-data-neo4j-rest/src/test/resources/RestTests-context.xml index 6f3d2dd97..b943b99e0 100644 --- a/spring-data-neo4j-rest/src/test/resources/RestTests-context.xml +++ b/spring-data-neo4j-rest/src/test/resources/RestTests-context.xml @@ -6,4 +6,5 @@ + diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java index fae280af2..92c30350b 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/GraphDatabase.java @@ -30,13 +30,6 @@ import java.util.Map; public interface GraphDatabase { - - /** - * @return an object which is able to provide global graph - * type operations - */ - GraphDatabaseGlobalOperations getGlobalGraphOperations(); - /** * @return the reference node of the underlying graph database */ diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java index 16dca68f4..7aea4c4d6 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/RelationshipHelper.java @@ -15,13 +15,11 @@ */ package org.springframework.data.neo4j.fieldaccess; -import org.neo4j.graphdb.Direction; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.Relationship; -import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.*; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.neo4j.mapping.MappingPolicy; import org.springframework.data.neo4j.support.Neo4jTemplate; +import org.springframework.data.neo4j.support.typerepresentation.LabelBasedNodeTypeRepresentationStrategy; import org.springframework.util.Assert; import java.util.HashSet; @@ -75,8 +73,13 @@ public class RelationshipHelper { for ( Relationship relationship : node.getRelationships( type, direction ) ) { if ( !targetNodes.remove( relationship.getOtherNode( node ) ) ) { if ( targetType != null ) { - Object actualTargetType = relationship.getOtherNode( node ).getProperty( "__type__" ); - + Object actualTargetType = tryDetermineTypeAssumingIndexBasedStrategy(relationship, node); + if (actualTargetType == null) { + actualTargetType = tryDetermineTypeAssumingLabelBasedStrategy(relationship, node); + } + if (actualTargetType == null) { + throw new RuntimeException("Neither a property or Label could be found to work out what the type of the node is at the other end of the relationship "); + } try { if (! targetType.isAssignableFrom(Class.forName((String) actualTargetType))) { continue; @@ -91,6 +94,28 @@ public class RelationshipHelper { } } + private Object tryDetermineTypeAssumingLabelBasedStrategy(Relationship relationship,Node node) { + + ResourceIterable