From 3bb22d88083b81142a3128c6ce01a53a30743038 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 4 Oct 2011 01:39:04 +0200 Subject: [PATCH 1/5] fixed failing tests (OOM), added cypher parameters, fixed broken package names --- .gitignore | 1 + .../data/neo4j/aspects/Person.java | 8 ++-- .../data/neo4j/aspects/PersonRepository.java | 24 +++++------ .../neo4j/aspects/support/FinderTest.java | 1 - .../aspects/support/GraphRepositoryTest.java | 17 ++++---- .../data/neo4j/aspects/support/TestTeam.java | 5 +++ .../support/query/GremlinQueryEngineTest.java | 10 ++--- .../support/query/QueryEngineTest.java | 17 ++++---- .../Neo4jGraphPersistenceTest-context.xml | 2 +- .../repository-namespace-config-context.xml | 2 +- .../config/CrossStoreNeo4jConfiguration.java | 6 +-- .../CrossStoreNodeEntityInstantiator.java | 3 +- .../node/CrossStoreNodeEntityState.java | 2 +- .../CrossStoreNodeEntityStateFactory.java | 4 +- .../Neo4jGraphRecommendationTest-context.xml | 4 +- spring-data-neo4j-cross-store/template.mf | 42 +++++++++++++++++++ .../hellograph/WorldRepositoryTest.java | 2 +- .../neo4j/rest/RestCypherQueryEngine.java | 7 ++-- .../neo4j/rest/support/LocalTestServer.java | 6 +++ .../rest/support/RestQueryEngineTest.java | 2 + .../neo4j/rest/support/RestTestHelper.java | 4 +- .../data/neo4j/annotation/Query.java | 2 +- .../config/DataGraphBeanDefinitionParser.java | 4 +- .../neo4j/conversion/QueryResultBuilder.java | 11 +---- .../fieldaccess/DetachedEntityState.java | 4 +- .../Neo4jConversionServiceFactoryBean.java | 2 + .../QueryFieldAccessorFactory.java | 2 +- .../mapping/Neo4JPersistentPropertyImpl.java | 1 + .../mapping/Neo4jPersistentEntityImpl.java | 1 + .../GraphMetamodelEntityInformation.java | 1 + .../RelationshipGraphRepository.java | 1 + .../neo4j/server/SpringPluginInitializer.java | 6 ++- .../neo4j/support/EntityStateHandler.java | 1 + .../conversion/EntityResultConverter.java | 1 + .../support/query/CypherQueryEngine.java | 8 ++-- .../neo4j/support/query/GremlinExecutor.java | 9 ++-- ...ndexingNodeTypeRepresentationStrategy.java | 10 ++--- ...elationshipTypeRepresentationStrategy.java | 8 ++-- ...ferenceNodeTypeRepresentationStrategy.java | 3 +- .../data/neo4j/template/Neo4jTemplate.java | 7 +--- .../config/DataGraphNamespaceHandlerTest.java | 2 +- .../mapping/Neo4jMappingContextTest.java | 2 +- .../neo4j/mapping/Neo4jNodeConverterTest.java | 4 +- .../data/neo4j/{ => model}/Attribute.java | 2 +- .../data/neo4j/{ => model}/Car.java | 2 +- .../data/neo4j/{ => model}/Developer.java | 2 +- .../data/neo4j/{ => model}/Friendship.java | 2 +- .../{ => model}/FriendshipRepository.java | 2 +- .../data/neo4j/{ => model}/Group.java | 3 +- .../neo4j/{ => model}/GroupRepository.java | 2 +- .../{ => model}/InvalidOneToNEntity.java | 2 +- .../InvalidReadOnlyOneToNEntity.java | 2 +- .../data/neo4j/{ => model}/Named.java | 2 +- .../data/neo4j/{ => model}/Person.java | 10 ++--- .../data/neo4j/{ => model}/PersonCreator.java | 2 +- .../neo4j/{ => model}/PersonRepository.java | 24 +++++------ .../data/neo4j/{ => model}/Personality.java | 2 +- .../data/neo4j/{ => model}/SubGroup.java | 2 +- .../data/neo4j/{ => model}/Toyota.java | 2 +- .../data/neo4j/{ => model}/Volvo.java | 2 +- .../support/GraphDatabaseFactoryTest.java | 23 +++++----- .../neo4j/template/Neo4jTemplateApiTest.java | 24 +++++------ .../data/neo4j/template/NeoTraversalTest.java | 2 +- ...leanContextCacheTestExecutionListener.java | 4 +- .../META-INF/neo4j-named-queries.properties | 2 +- .../programming-model/introducedmethods.xml | 6 +-- .../programming-model/node-entities.xml | 6 +-- .../programming-model/repositories.xml | 4 +- src/docbkx/reference/template.xml | 2 +- 69 files changed, 226 insertions(+), 171 deletions(-) rename spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/{ => cross_store}/config/CrossStoreNeo4jConfiguration.java (93%) rename spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/{ => cross_store}/support/node/CrossStoreNodeEntityInstantiator.java (94%) rename spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/{ => cross_store}/support/node/CrossStoreNodeEntityState.java (99%) rename spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/{ => cross_store}/support/node/CrossStoreNodeEntityStateFactory.java (94%) create mode 100644 spring-data-neo4j-cross-store/template.mf rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Attribute.java (95%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Car.java (95%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Developer.java (95%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Friendship.java (98%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/FriendshipRepository.java (94%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Group.java (98%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/GroupRepository.java (95%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/InvalidOneToNEntity.java (95%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/InvalidReadOnlyOneToNEntity.java (94%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Named.java (94%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Person.java (89%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/PersonCreator.java (95%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/PersonRepository.java (59%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Personality.java (93%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/SubGroup.java (94%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Toyota.java (93%) rename spring-data-neo4j/src/test/java/org/springframework/data/neo4j/{ => model}/Volvo.java (93%) rename {spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects => spring-data-neo4j/src/test/java/org/springframework/data/neo4j}/support/GraphDatabaseFactoryTest.java (68%) diff --git a/.gitignore b/.gitignore index e8008d6b1..5e11727c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*.hprof* ajcore* .project .classpath diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java index f548972e4..1bb832a0f 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Person.java @@ -76,16 +76,16 @@ public class Person { @RelatedToVia(type = "knows", elementClass = Friendship.class) private Iterable friendships; - @Query(value = "start person=(%start) match (person)<-[:boss]-(boss) return boss") + @Query(value = "start person=node({self}) match (person)<-[:boss]-(boss) return boss") private Person bossByQuery; - @Query(value = "start person=(%start) match (person)<-[:boss]-(boss) return boss.%property",params = {"property","name"}) + @Query(value = "start person=node({self}) match (person)<-[:boss]-(boss) return boss.name") private String bossName; - @Query(value = "start person=(%start) match (person)<-[:persons]-(team)-[:persons]->(member) return member",elementClass = Person.class) + @Query(value = "start person=node({self}) match (person)<-[:persons]-(team)-[:persons]->(member) return member",elementClass = Person.class) private Iterable otherTeamMembers; - @Query(value = "start person=(%start) match (person)<-[:persons]-(team)-[:persons]->(member) return member.name, member.age") + @Query(value = "start person=node({self}) match (person)<-[:persons]-(team)-[:persons]->(member) return member.name, member.age") private Iterable> otherTeamMemberData; public Person(Node n) { diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/PersonRepository.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/PersonRepository.java index 2d4d484a3..baa8ddf24 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/PersonRepository.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/PersonRepository.java @@ -19,8 +19,6 @@ package org.springframework.data.neo4j.aspects; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.data.neo4j.aspects.Group; -import org.springframework.data.neo4j.aspects.Person; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.annotation.QueryType; import org.springframework.data.neo4j.repository.GraphRepository; @@ -35,22 +33,22 @@ import java.util.Map; */ public interface PersonRepository extends GraphRepository, NamedIndexRepository { - @Query("start team=(%team) match (team)-[:persons]->(member) return member") - Iterable findAllTeamMembers(@Param("team") Group team); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member") + Iterable findAllTeamMembers(@Param("p_team") Group team); @Query(value = "g.v(team).out('persons')", type = QueryType.Gremlin) Iterable findAllTeamMembersGremlin(@Param("team") Group team); - @Query("start team=(%team) match (team)-[:persons]->(member) return member.name,member.age") - Iterable> findAllTeamMemberData(@Param("team") Group team); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member.name,member.age") + Iterable> findAllTeamMemberData(@Param("p_team") Group team); - @Query("start person=(%person) match (boss)-[:boss]->(person) return boss") - Person findBoss(@Param("person") Person person); + @Query("start person=node({p_person}) match (person)<-[:boss]-(boss) return boss") + Person findBoss(@Param("p_person") Person person); - Group findTeam(@Param("person") Person person); + Group findTeam(@Param("p_person") Person person); - @Query("start team=(%team) match (team)-[:persons]->(member) return member") - Page findAllTeamMembersPaged(@Param("team") Group team, Pageable page); - @Query("start team=(%team) match (team)-[:persons]->(member) return member") - Iterable findAllTeamMembersSorted(@Param("team") Group team, Sort sort); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member") + Page findAllTeamMembersPaged(@Param("p_team") Group team, Pageable page); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member") + Iterable findAllTeamMembersSorted(@Param("p_team") Group team, Sort sort); } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/FinderTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/FinderTest.java index 9bb55b0d0..61dc834ac 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/FinderTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/FinderTest.java @@ -21,7 +21,6 @@ import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; -import org.neo4j.helpers.collection.ClosableIterable; import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphRepositoryTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphRepositoryTest.java index e0d90ff30..805b1ec5f 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphRepositoryTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphRepositoryTest.java @@ -25,7 +25,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; -import org.springframework.data.neo4j.aspects.*; +import org.springframework.data.neo4j.aspects.Group; +import org.springframework.data.neo4j.aspects.Person; +import org.springframework.data.neo4j.aspects.PersonRepository; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.data.neo4j.support.node.Neo4jHelper; import org.springframework.test.context.CleanContextCacheTestExecutionListener; @@ -37,6 +39,7 @@ import org.springframework.test.context.transaction.BeforeTransaction; import org.springframework.test.context.transaction.TransactionalTestExecutionListener; import org.springframework.transaction.annotation.Transactional; +import java.util.HashSet; import java.util.Map; import static java.util.Arrays.asList; @@ -45,6 +48,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.internal.matchers.IsCollectionContaining.hasItem; import static org.junit.internal.matchers.IsCollectionContaining.hasItems; +import static org.neo4j.helpers.collection.IteratorUtil.addToCollection; import static org.neo4j.helpers.collection.IteratorUtil.asCollection; @RunWith(SpringJUnit4ClassRunner.class) @@ -61,17 +65,16 @@ public class GraphRepositoryTest { private PersonRepository personRepository; private TestTeam testTeam; + @BeforeTransaction + public void cleanDb() { + Neo4jHelper.cleanDb(graphDatabaseContext); + } @Before public void setUp() throws Exception { testTeam = new TestTeam(); testTeam.createSDGTeam(); } - @BeforeTransaction - public void cleanDb() { - Neo4jHelper.cleanDb(graphDatabaseContext); - } - @Test @Transactional public void testFindIterableOfPersonWithQueryAnnotation() { @@ -117,7 +120,7 @@ public class GraphRepositoryTest { @Transactional public void testFindPagedNull() { Page teamMemberPage1 = personRepository.findAllTeamMembersPaged(testTeam.sdg,null); - assertEquals(asList(testTeam.michael, testTeam.emil,testTeam.david), asCollection(teamMemberPage1)); + assertEquals(new HashSet(asList(testTeam.david, testTeam.emil, testTeam.michael)), addToCollection(teamMemberPage1, new HashSet())); assertThat(teamMemberPage1.isFirstPage(), is(true)); assertThat(teamMemberPage1.isLastPage(), is(false)); } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TestTeam.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TestTeam.java index ebedb2d83..dfe77ec11 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TestTeam.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TestTeam.java @@ -46,7 +46,12 @@ public class TestTeam { sdg.addPerson(michael); sdg.addPerson(emil); sdg.addPerson(david); + // todo those should be attached and automatically written through to the db + david.persist(); + emil.persist(); + michael.persist(); sdg.persist(); + } public Map simpleRowFor(final Person person, String prefix) { diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java index 4589ecd6d..78be8c55e 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java @@ -94,14 +94,14 @@ public class GremlinQueryEngineTest { /* @Test public void testQueryListOfTypeNode() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; + final String queryString = "start person=(name_index,name,\"{name}\") match (person) <-[:boss]- (boss) return boss"; final Collection result = IteratorUtil.asCollection(queryEngine.query(queryString, michaelsName()).to(Node.class)); assertEquals(asList(nodeFor(testTeam.emil)),result); } @Test public void testQueryListOfTypePerson() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; + final String queryString = "start person=(name_index,name,\"{name}\") match (person) <-[:boss]- (boss) return boss"; final Collection result = IteratorUtil.asCollection(queryEngine.query(queryString, michaelsName()).to(Person.class, new EntityResultConverter(graphDatabaseContext))); assertEquals(asList(testTeam.emil),result); @@ -110,7 +110,7 @@ public class GremlinQueryEngineTest { @Test public void testQuerySingleOfTypePerson() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; + final String queryString = "start person=(name_index,name,\"{name}\") match (person) <-[:boss]- (boss) return boss"; final Person result = queryEngine.query(queryString, michaelsName()).to(Person.class, new EntityResultConverter,Person>(graphDatabaseContext)).single(); assertEquals(testTeam.emil,result); @@ -132,14 +132,14 @@ public class GremlinQueryEngineTest { @Test public void testQueryForObjectAsString() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:persons]- (team) return team.name"; + final String queryString = "start person=(name_index,name,\"{name}\") match (person) <-[:persons]- (team) return team.name"; final String result = queryEngine.query(queryString, michaelsName()).to(String.class).single(); assertEquals(testTeam.sdg.getName(),result); } @Test public void testQueryForObjectAsEnum() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") return person.personality"; + final String queryString = "start person=(name_index,name,\"{name}\") return person.personality"; final Personality result = queryEngine.query(queryString, michaelsName()).to(Personality.class).single(); assertEquals(michael.getPersonality(),result); diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/QueryEngineTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/QueryEngineTest.java index 7cd85ac65..f5da3733b 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/QueryEngineTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/QueryEngineTest.java @@ -87,17 +87,16 @@ public class QueryEngineTest { } @Test - @Transactional public void testQueryList() throws Exception { - final String queryString = "start person=(%michael,%david) return person.name, person.age"; - final Collection> result = IteratorUtil.asCollection(queryEngine.query(queryString, MapUtil.map("michael",idFor(michael), "david",idFor(testTeam.david)))); + final String queryString = "start person=node({people}) return person.name, person.age"; + final Collection> result = IteratorUtil.asCollection(queryEngine.query(queryString, MapUtil.map("people",asList(idFor(michael),idFor(testTeam.david))))); assertEquals(asList(testTeam.simpleRowFor(michael,"person"),testTeam.simpleRowFor(testTeam.david,"person")),result); } @Test public void testQueryListOfTypeNode() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; + final String queryString = "start person=node:name_index(name={name}) match (person) <-[:boss]- (boss) return boss"; final QueryResult> queryResult = queryEngine.query(queryString, michaelsName()); final Collection result = IteratorUtil.asCollection(queryResult.to(Node.class)); @@ -105,7 +104,7 @@ public class QueryEngineTest { } @Test public void testQueryListOfTypePerson() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; + final String queryString = "start person=node:name_index(name={name}) match (person) <-[:boss]- (boss) return boss"; final Collection result = IteratorUtil.asCollection(queryEngine.query(queryString, michaelsName()).to(Person.class, new EntityResultConverter(graphDatabaseContext))); assertEquals(asList(testTeam.emil),result); @@ -117,7 +116,7 @@ public class QueryEngineTest { @Test public void testQuerySingleOfTypePerson() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:boss]- (boss) return boss"; + final String queryString = "start person=node:name_index(name={name}) match (person) <-[:boss]- (boss) return boss"; final Person result = queryEngine.query(queryString, michaelsName()).to(Person.class, new EntityResultConverter,Person>(graphDatabaseContext)).single(); assertEquals(testTeam.emil,result); @@ -125,7 +124,7 @@ public class QueryEngineTest { @Test public void testQueryListWithCustomConverter() throws Exception { - final String queryString = String.format("start person=(name_index,name,\"%s\") match (person) <-[:boss]- (boss) return boss", michael.getName()); + final String queryString = "start person=node:name_index(name={name}) match (person) <-[:boss]- (boss) return boss"; final Collection result = IteratorUtil.asCollection(queryEngine.query(queryString, michaelsName()).to(String.class, new ResultConverter, String>() { @Override public String convert(Map row, Class target) { @@ -145,14 +144,14 @@ public class QueryEngineTest { @Test public void testQueryForObjectAsString() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") match (person) <-[:persons]- (team) return team.name"; + final String queryString = "start person=node:name_index(name={name}) match (person) <-[:persons]- (team) return team.name"; final String result = queryEngine.query(queryString, michaelsName()).to(String.class).single(); assertEquals(testTeam.sdg.getName(),result); } @Test public void testQueryForObjectAsEnum() throws Exception { - final String queryString = "start person=(name_index,name,\"%name\") return person.personality"; + final String queryString = "start person=node:name_index(name={name}) return person.personality"; final Personality result = queryEngine.query(queryString, michaelsName()).to(Personality.class).single(); assertEquals(michael.getPersonality(),result); diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml index 16a328dbb..291772e66 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml +++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml @@ -172,7 +172,7 @@ - start p=(%person) match (p)<-[:persons]-(group) return group + start p=node({p_person}) match (p)<-[:persons]-(group) return group diff --git a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/repository-namespace-config-context.xml b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/repository-namespace-config-context.xml index 5e256f0aa..d0a15ffc7 100644 --- a/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/repository-namespace-config-context.xml +++ b/spring-data-neo4j-aspects/src/test/resources/org/springframework/data/neo4j/aspects/support/repository-namespace-config-context.xml @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java similarity index 93% rename from spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java rename to spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java index 6399d9026..16a093fb9 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/config/CrossStoreNeo4jConfiguration.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/config/CrossStoreNeo4jConfiguration.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.neo4j.config; +package org.springframework.data.neo4j.cross_store.config; import org.neo4j.graphdb.Node; import org.springframework.beans.factory.annotation.Autowired; @@ -21,11 +21,11 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.neo4j.aspects.config.Neo4jAspectConfiguration; +import org.springframework.data.neo4j.cross_store.support.node.CrossStoreNodeEntityInstantiator; +import org.springframework.data.neo4j.cross_store.support.node.CrossStoreNodeEntityStateFactory; import org.springframework.data.neo4j.support.EntityInstantiator; -import org.springframework.data.neo4j.support.node.CrossStoreNodeEntityStateFactory; import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; import org.springframework.data.neo4j.support.node.NodeEntityStateFactory; -import org.springframework.data.neo4j.support.node.CrossStoreNodeEntityInstantiator; import org.springframework.data.neo4j.transaction.ChainedTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.transaction.PlatformTransactionManager; diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityInstantiator.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityInstantiator.java similarity index 94% rename from spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityInstantiator.java rename to spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityInstantiator.java index e0b12df97..60b9549e6 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityInstantiator.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityInstantiator.java @@ -14,11 +14,12 @@ * limitations under the License. */ -package org.springframework.data.neo4j.support.node; +package org.springframework.data.neo4j.cross_store.support.node; import org.neo4j.graphdb.Node; import org.springframework.data.neo4j.aspects.core.NodeBacked; import org.springframework.data.neo4j.support.EntityInstantiator; +import org.springframework.data.neo4j.support.node.NodeEntityInstantiator; import org.springframework.orm.jpa.EntityManagerFactoryUtils; import javax.persistence.EntityManager; diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityState.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java similarity index 99% rename from spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityState.java rename to spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java index 5dc105b18..10a18304e 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityState.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j.support.node; +package org.springframework.data.neo4j.cross_store.support.node; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.NotInTransactionException; diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityStateFactory.java similarity index 94% rename from spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java rename to spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityStateFactory.java index d691c98b2..da62b19af 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/support/node/CrossStoreNodeEntityStateFactory.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityStateFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.neo4j.support.node; +package org.springframework.data.neo4j.cross_store.support.node; import org.neo4j.graphdb.Node; import org.springframework.data.neo4j.annotation.NodeEntity; @@ -21,6 +21,8 @@ import org.springframework.data.neo4j.aspects.core.NodeBacked; import org.springframework.data.neo4j.core.EntityState; import org.springframework.data.neo4j.fieldaccess.DetachedEntityState; import org.springframework.data.neo4j.mapping.Neo4jPersistentEntity; +import org.springframework.data.neo4j.support.node.NodeEntityState; +import org.springframework.data.neo4j.support.node.NodeEntityStateFactory; import javax.annotation.PostConstruct; import javax.persistence.EntityManagerFactory; diff --git a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml index 337120376..c450f0a7a 100644 --- a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml +++ b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml @@ -96,7 +96,7 @@ - + @@ -121,7 +121,7 @@ - + diff --git a/spring-data-neo4j-cross-store/template.mf b/spring-data-neo4j-cross-store/template.mf new file mode 100644 index 000000000..9252af0ce --- /dev/null +++ b/spring-data-neo4j-cross-store/template.mf @@ -0,0 +1,42 @@ +Bundle-SymbolicName: org.springframework.data.neo4j +Bundle-Name: Spring Data Neo4J +Bundle-Vendor: SpringSource +Bundle-ManifestVersion: 2 +Import-Package: + sun.reflect;version="0";resolution:=optional +Import-Template: + org.springframework.beans.*;version="[3.0.0, 4.0.0)", + org.springframework.context.*;version="[3.0.0, 4.0.0)", + org.springframework.core.*;version="[3.0.0, 4.0.0)", + org.springframework.dao.*;version="[3.0.0, 4.0.0)", + org.springframework.jdbc.*;version="[3.0.0, 4.0.0)", + org.springframework.stereotype.*;version="[3.0.0, 4.0.0)", + org.springframework.orm.*;version="[3.0.0, 4.0.0)", + org.springframework.transaction.*;version="[3.0.0, 4.0.0)", + org.springframework.util.*;version="[3.0.0, 4.0.0)", + org.springframework.data.*;version="[1.0.0, 2.0.0)", + org.springframework.persistence.*;version="[1.0.0, 2.0.0)", + org.springframework.data.neo4j.*;version="0", + org.neo4j.*;version="0", + org.neo4j.cypher.*;version="0";resolution:=optional, + org.w3c.dom.*;version="0", + org.aspectj.*;version="[1.6.5, 2.0.0)", + org.apache.commons.logging.*;version="[1.1.1, 2.0.0)", + org.apache.commons.configuration.*;version="0", + org.objectweb.jotm.*;version="0", + org.apache.lucene.*;version="0", + javax.validation.*;version="0";resolution:=optional, + javax.annotation.*;version="0";resolution:=optional, + javax.naming.*;version="0";resolution:=optional, + javax.script.*;version="0";resolution:=optional, + javax.persistence.*;version="[1.0.0, 3.0.0)";resolution:=optional, + javax.persistence.spi.*;version="[1.0.0, 3.0.0)";resolution:=optional, + javax.transaction.*;version="[1.0.1, 2.0.0)";resolution:=optional, + com.tinkerpop.blueprints.*;version="[0.8,1.0)";resolution:=optional, + com.tinkerpop.gremlin.*;version="[1.1,2.0)";resolution:=optional, + com.tinkerpop.pipes.util.*;version="[0.8,1.0)";resolution:=optional +Import-Package: + net.sf.cglib.proxy;version="[2.2.0,3.0.0)", + net.sf.cglib.core;version="[2.2.0,3.0.0)", + net.sf.cglib.reflect;version="[2.2.0,3.0.0)" +DynamicImport-Package: * diff --git a/spring-data-neo4j-examples/hello-worlds/src/test/java/org/springframework/data/neo4j/examples/hellograph/WorldRepositoryTest.java b/spring-data-neo4j-examples/hello-worlds/src/test/java/org/springframework/data/neo4j/examples/hellograph/WorldRepositoryTest.java index a12bba0dd..52f26dd53 100644 --- a/spring-data-neo4j-examples/hello-worlds/src/test/java/org/springframework/data/neo4j/examples/hellograph/WorldRepositoryTest.java +++ b/spring-data-neo4j-examples/hello-worlds/src/test/java/org/springframework/data/neo4j/examples/hellograph/WorldRepositoryTest.java @@ -3,7 +3,7 @@ package org.springframework.data.neo4j.examples.hellograph; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.neo4j.core.NodeBacked; +import org.springframework.data.neo4j.aspects.core.NodeBacked; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.data.neo4j.support.node.Neo4jHelper; import org.springframework.test.annotation.Rollback; diff --git a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestCypherQueryEngine.java b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestCypherQueryEngine.java index 219b8d462..2b03c0d8a 100644 --- a/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestCypherQueryEngine.java +++ b/spring-data-neo4j-rest/src/main/java/org/springframework/data/neo4j/rest/RestCypherQueryEngine.java @@ -45,9 +45,10 @@ public class RestCypherQueryEngine implements QueryEngine> { @Override public QueryResult> query(String statement, Map params) { - final String parametrizedStatement = QueryResultBuilder.replaceParams(statement, params); - final RequestResult requestResult = restRequest.get("ext/CypherPlugin/graphdb/execute_query", JsonHelper.createJsonFrom(MapUtil.map("query", parametrizedStatement))); - return new RestQueryResult(restRequest.toMap(requestResult),restGraphDatabase,resultConverter); + final RequestResult requestResult = restRequest.get("ext/CypherPlugin/graphdb/execute_query", JsonHelper.createJsonFrom(MapUtil.map("query", statement, "params", params))); + final Map resultMap = restRequest.toMap(requestResult); + if (RestResultException.isExceptionResult(resultMap)) throw new RestResultException(resultMap); + return new RestQueryResult(resultMap,restGraphDatabase,resultConverter); } static class RestQueryResult implements QueryResult> { diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java index 6e2724b2c..841b8e2c4 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/LocalTestServer.java @@ -116,6 +116,12 @@ public class LocalTestServer { startupListener.await(); } + + @Override + public void stop() { + getJetty().setStopAtShutdown(false); + super.stop(); + } }; neoServer = new NeoServerWithEmbeddedWebServer(bootstrapper , addressResolver, new StartupHealthCheck(), new PropertyFileConfigurator(new File(url.getPath())), jettyWebServer, serverModules) { diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java index 56fe69628..bbe626c47 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java @@ -18,6 +18,7 @@ package org.springframework.data.neo4j.rest.support; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.aspects.support.query.QueryEngineTest; @@ -39,6 +40,7 @@ import org.springframework.test.context.transaction.TransactionalTestExecutionLi @ContextConfiguration(locations = {"classpath:org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml", "classpath:RestTest-context.xml"}) @TestExecutionListeners({CleanContextCacheTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class}) +@Ignore("until the cypher plugin supports parameters") public class RestQueryEngineTest extends QueryEngineTest { @Autowired diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java index 429725060..dfc8c4ff3 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestTestHelper.java @@ -30,11 +30,12 @@ public class RestTestHelper protected RestGraphDatabase graphDb; private static final String HOSTNAME = "localhost"; private static final int PORT = 7473; - private static LocalTestServer neoServer = new LocalTestServer(HOSTNAME,PORT).withPropertiesFile("test-db.properties"); + private static LocalTestServer neoServer; private static final String SERVER_ROOT_URI = "http://" + HOSTNAME + ":" + PORT + "/db/data/"; public void startServer() throws Exception { BasicConfigurator.configure(); + neoServer = new LocalTestServer(HOSTNAME,PORT).withPropertiesFile("test-db.properties"); neoServer.start(); } @@ -48,5 +49,6 @@ public class RestTestHelper public static void shutdownServer() { neoServer.stop(); + neoServer = null; } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/Query.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/Query.java index f732c367a..eb87fd5b6 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/Query.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/Query.java @@ -36,7 +36,7 @@ import java.lang.annotation.Target; @Target({ElementType.FIELD,ElementType.METHOD}) public @interface Query { /** - * @return Query to be executed %start will be replaced by the node-id of the current entity other placeholders (%name) by the given named params + * @return Query to be executed {self} will be provided by the node-id of the current entity other parameters (e.g. {name}) by the given named params */ String value() default ""; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java index 135d44090..9b858351d 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/DataGraphBeanDefinitionParser.java @@ -33,8 +33,8 @@ import static org.springframework.util.StringUtils.hasText; public class DataGraphBeanDefinitionParser extends AbstractBeanDefinitionParser { private static final String GRAPH_DATABASE_SERVICE = "graphDatabaseService"; - public static final String ASPECTJ_CONFIG = "org.springframework.data.neo4j.config.Neo4jAspectConfiguration"; - public static final String CROSS_STORE_CONFIG = "org.springframework.data.neo4j.config.CrossStoreNeo4jConfiguration"; + public static final String ASPECTJ_CONFIG = "org.springframework.data.neo4j.aspects.config.Neo4jAspectConfiguration"; + public static final String CROSS_STORE_CONFIG = "org.springframework.data.neo4j.cross_store.config.CrossStoreNeo4jConfiguration"; @Override protected AbstractBeanDefinition parseInternal(Element element, ParserContext context) { 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 5e1e932b1..9475293a0 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 @@ -21,7 +21,6 @@ import org.neo4j.helpers.collection.ClosableIterable; import org.neo4j.helpers.collection.IteratorWrapper; import java.util.Iterator; -import java.util.Map; /** * @author mh @@ -33,6 +32,7 @@ public class QueryResultBuilder implements QueryResult { private final boolean isClosableIterable; private boolean isClosed; + @SuppressWarnings("unchecked") public QueryResultBuilder(Iterable result) { this(result, new DefaultConverter()); } @@ -43,14 +43,7 @@ public class QueryResultBuilder implements QueryResult { this.defaultConverter = defaultConverter; } - public static String replaceParams(String statement, Map params) { - if (params==null || params.isEmpty()) return statement; - for (Map.Entry param : params.entrySet()) { - statement = statement.replaceAll("%"+param.getKey()+"\\b",""+param.getValue()); - } - return statement; - } - + @SuppressWarnings("unchecked") @Override public ConvertedResult to(Class type) { return this.to(type, defaultConverter); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java index bf1864bc7..61a349e1f 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/DetachedEntityState.java @@ -143,13 +143,10 @@ public class DetachedEntityState implements EntityState { if (isDetached()) { final Field field = property.getField(); if (!isDirty(field) && isWritable(field)) { - Object existingValue; if (hasPersistentState()) { addDirty(field, unwrap(delegate.getValue(field)), true); } else { - // existingValue = getValueFromEntity(field); - // if (existingValue == null) existingValue = getDefaultValue(field.getType()); addDirty(field, newVal, false); } } @@ -170,6 +167,7 @@ public class DetachedEntityState implements EntityState { return null; } + @SuppressWarnings("deprecation") @Override public void createAndAssignState() { if (graphDatabaseContext.transactionIsRunning()) { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/Neo4jConversionServiceFactoryBean.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/Neo4jConversionServiceFactoryBean.java index 279189d20..34e95788a 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/Neo4jConversionServiceFactoryBean.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/Neo4jConversionServiceFactoryBean.java @@ -86,6 +86,7 @@ public class Neo4jConversionServiceFactoryBean implements FactoryBean { + @SuppressWarnings("unchecked") public Converter getConverter(Class targetType) { return new StringToEnum(targetType); } @@ -97,6 +98,7 @@ public class Neo4jConversionServiceFactoryBean implements FactoryBean enumType) { this.enumType = enumType; } + @SuppressWarnings("RedundantCast") public T convert(String source) { if (source == null) return null; final String trimmed=source.trim(); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/QueryFieldAccessorFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/QueryFieldAccessorFactory.java index 555be4a99..066da424c 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/QueryFieldAccessorFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/QueryFieldAccessorFactory.java @@ -99,7 +99,7 @@ public class QueryFieldAccessorFactory implements FieldAccessorFactory { private Map createPlaceholderParams(Object entity) { Map params=new HashMap(); final Node startNode = graphDatabaseContext.getPersistentState(entity); - params.put("start", startNode.getId()); + params.put("self", startNode.getId()); if (annotationParams.length==0) return params; for (int i = 0; i < annotationParams.length; i+=2) { params.put(annotationParams[i],annotationParams[i+1]); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JPersistentPropertyImpl.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JPersistentPropertyImpl.java index 173badd68..a3eba8b94 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JPersistentPropertyImpl.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4JPersistentPropertyImpl.java @@ -69,6 +69,7 @@ class Neo4jPersistentPropertyImpl extends AbstractPersistentProperty T getAnnotation(Class annotationType) { return (T) annotations.get(annotationType); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentEntityImpl.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentEntityImpl.java index eef283cb9..7b6014bee 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentEntityImpl.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentEntityImpl.java @@ -68,6 +68,7 @@ public class Neo4jPersistentEntityImpl extends BasicPersistentEntity T getAnnotation(Class annotationType) { return (T) annotations.get(annotationType); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphMetamodelEntityInformation.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphMetamodelEntityInformation.java index 2d6cacaee..c61c3acde 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphMetamodelEntityInformation.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/GraphMetamodelEntityInformation.java @@ -38,6 +38,7 @@ public class GraphMetamodelEntityInformation ext private final RelationshipEntity relationshipEntity; private final NodeEntity nodeEntity; + @SuppressWarnings("unchecked") public GraphMetamodelEntityInformation(Class domainClass, GraphDatabaseContext graphDatabaseContext) { super(domainClass); this.graphDatabaseContext = graphDatabaseContext; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/RelationshipGraphRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/RelationshipGraphRepository.java index c4aca4152..d709374e4 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/RelationshipGraphRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/RelationshipGraphRepository.java @@ -43,6 +43,7 @@ public class RelationshipGraphRepository extends AbstractGraphRepository save(Iterable entities) { return (Iterable) entities; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/server/SpringPluginInitializer.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/server/SpringPluginInitializer.java index 586f3ec25..416e6649b 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/server/SpringPluginInitializer.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/server/SpringPluginInitializer.java @@ -67,7 +67,8 @@ public abstract class SpringPluginInitializer implements PluginLifecycle { ProvidedClassPathXmlApplicationContext appCtx = SpringPluginInitializer.this.ctx; for ( final Pair exposedBean : exposedBeans ) { // Class concreteType = ctx.getType( exposedBean ); - result.add( new SpringBeanInjectable( appCtx, exposedBean.first(), exposedBean.other() ) ); + @SuppressWarnings("unchecked") final SpringBeanInjectable injectable = new SpringBeanInjectable(appCtx, exposedBean.first(), exposedBean.other()); + result.add(injectable); } return result; } @@ -86,7 +87,7 @@ public abstract class SpringPluginInitializer implements PluginLifecycle { * * @param optional type of the bean */ - private static class SpringBeanInjectable implements Injectable { + private static class SpringBeanInjectable implements Injectable { private final String exposedBean; protected ApplicationContext ctx; private final Class clazz; @@ -97,6 +98,7 @@ public abstract class SpringPluginInitializer implements PluginLifecycle { this.clazz = clazz; } + @SuppressWarnings("unchecked") public T getValue() { return (T)ctx.getBean( exposedBean ); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityStateHandler.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityStateHandler.java index a8fb0cefe..449c49156 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityStateHandler.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/EntityStateHandler.java @@ -34,6 +34,7 @@ public class EntityStateHandler { this.service = service; } + @SuppressWarnings("unchecked") public void setPersistentState(Object entity, S state) { if (entity instanceof PropertyContainer) { return; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/conversion/EntityResultConverter.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/conversion/EntityResultConverter.java index 6f94cf41e..b6fd8a584 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/conversion/EntityResultConverter.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/conversion/EntityResultConverter.java @@ -37,6 +37,7 @@ public class EntityResultConverter extends DefaultConverter { conversionService = this.ctx.getConversionService(); } + @SuppressWarnings("unchecked") @Override protected Object doConvert(Object value, Class sourceType, Class targetType) { if (ctx.isNodeEntity(targetType)) { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/CypherQueryEngine.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/CypherQueryEngine.java index 0bf5aa2f0..2f8609d65 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/CypherQueryEngine.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/CypherQueryEngine.java @@ -27,6 +27,7 @@ import org.springframework.data.neo4j.conversion.QueryResult; import org.springframework.data.neo4j.conversion.QueryResultBuilder; import org.springframework.data.neo4j.conversion.ResultConverter; +import java.util.Collections; import java.util.Map; public class CypherQueryEngine implements QueryEngine> { @@ -48,19 +49,18 @@ public class CypherQueryEngine implements QueryEngine> { @Override public QueryResult> query(String statement, Map params) { try { - String parametrizedQuery = QueryResultBuilder.replaceParams(statement,params); - ExecutionResult result = parseAndExecuteQuery(parametrizedQuery); + ExecutionResult result = parseAndExecuteQuery(statement,params); return new QueryResultBuilder>(result,resultConverter); } catch (Exception e) { throw new InvalidDataAccessResourceUsageException("Error executing statement " + statement, e); } } - private ExecutionResult parseAndExecuteQuery(String statement) { + private ExecutionResult parseAndExecuteQuery(String statement, Map params) { try { CypherParser parser = new CypherParser(); Query query = parser.parse(statement); - return executionEngine.execute(query); + return executionEngine.execute(query,params==null ? Collections.emptyMap() : params); } catch(Exception e) { throw new InvalidDataAccessResourceUsageException("Error executing statement " + statement, e); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java index f8f0461e4..e1da74503 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/query/GremlinExecutor.java @@ -31,11 +31,10 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -@SuppressWarnings("ALL") public class GremlinExecutor { public static final int REFRESH_ENGINE_COUNT = 10000; - private final String g = "g"; + private static final String GRAPH_VARIABLE = "g"; private volatile ScriptEngine engine; private ScriptEngine createScriptEngine() { @@ -49,6 +48,7 @@ public class GremlinExecutor { this.graphDatabaseService = graphDatabaseService; } + @SuppressWarnings("unchecked") public Iterable query(String statement, Map params) { try { final Bindings bindings = createBindings(params); @@ -62,7 +62,7 @@ public class GremlinExecutor { private Bindings createBindings(Map params) { final Bindings bindings = new SimpleBindings(); - bindings.put(g, new Neo4jGraph(graphDatabaseService)); + bindings.put(GRAPH_VARIABLE, new Neo4jGraph(graphDatabaseService)); if (params==null) return bindings; for (Map.Entry entry : params.entrySet()) { bindings.put(entry.getKey(),entry.getValue()); @@ -73,12 +73,13 @@ public class GremlinExecutor { private ScriptEngine engine() { if (engine == null || executionCount.incrementAndGet() > REFRESH_ENGINE_COUNT) { executionCount.set(0); - this.engine = new ScriptEngineManager().getEngineByName("gremlin"); + this.engine = createScriptEngine(); } return this.engine; } + @SuppressWarnings("unchecked") public static Iterable getRepresentation(final Object result) { if (result instanceof Iterable) { if (result instanceof Table) { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java index f6abaa8b6..72a51bf53 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java @@ -16,7 +16,9 @@ package org.springframework.data.neo4j.support.typerepresentation; -import org.neo4j.graphdb.*; +import org.neo4j.graphdb.GraphDatabaseService; +import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexHits; import org.neo4j.helpers.Predicate; @@ -24,14 +26,9 @@ import org.neo4j.helpers.collection.ClosableIterable; import org.neo4j.helpers.collection.FilteringIterable; import org.neo4j.helpers.collection.IterableWrapper; import org.springframework.data.neo4j.annotation.NodeEntity; - import org.springframework.data.neo4j.core.NodeTypeRepresentationStrategy; import org.springframework.data.neo4j.support.EntityInstantiator; -import java.util.HashMap; -import java.util.Map; -import java.util.WeakHashMap; - public class IndexingNodeTypeRepresentationStrategy implements NodeTypeRepresentationStrategy { public static final String INDEX_NAME = "__types__"; @@ -89,6 +86,7 @@ public class IndexingNodeTypeRepresentationStrategy implements NodeTypeRepresent return count; } + @SuppressWarnings("unchecked") @Override public Class getJavaType(Node node) { if (node == null) throw new IllegalArgumentException("Node is null"); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java index 44580df3a..cbff28fd1 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java @@ -57,10 +57,10 @@ public class IndexingRelationshipTypeRepresentationStrategy implements Relations } private void addToTypesIndex(Relationship node, Class entityClass) { - Class klass = entityClass; - while (klass.getAnnotation(RelationshipEntity.class) != null) { - getRelTypesIndex().add(node, INDEX_KEY, klass.getName()); - klass = klass.getSuperclass(); + Class type = entityClass; + while (type.getAnnotation(RelationshipEntity.class) != null) { + getRelTypesIndex().add(node, INDEX_KEY, type.getName()); + type = type.getSuperclass(); } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategy.java index 1d6aaf50a..ccf529b6d 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/SubReferenceNodeTypeRepresentationStrategy.java @@ -136,6 +136,7 @@ public class SubReferenceNodeTypeRepresentationStrategy implements NodeTypeRepre return clazz; } + @SuppressWarnings("unchecked") private Class resolveType(Node node, String typeName) { final Class type = typeCache.getClassForName(typeName); if (type == null) { @@ -180,7 +181,7 @@ public class SubReferenceNodeTypeRepresentationStrategy implements NodeTypeRepre @Override protected T underlyingObjectToObject(final Relationship rel) { final Node node = rel.getStartNode(); - T entity = (T) entityInstantiator.createEntityFromState(node, getJavaType(node)); + @SuppressWarnings("unchecked") T entity = (T) entityInstantiator.createEntityFromState(node, getJavaType(node)); if (log.isDebugEnabled()) log.debug("Converting node: " + node + " to entity: " + entity); return entity; } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jTemplate.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jTemplate.java index f568c25e9..c08319c4b 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jTemplate.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jTemplate.java @@ -53,7 +53,6 @@ public class Neo4jTemplate implements Neo4jOperations { /** * @param graphDatabase the neo4j graph database * @param transactionManager if passed in, will be used to create implicit transactions whenever needed - * @return a Neo4jTemplate instance */ public Neo4jTemplate(final GraphDatabase graphDatabase, PlatformTransactionManager transactionManager) { notNull(graphDatabase, "graphDatabase"); @@ -61,10 +60,6 @@ public class Neo4jTemplate implements Neo4jOperations { this.graphDatabase = graphDatabase; } - /** - * @param graphDatabase the neo4j graph database - * @return a Neo4jTemplate instance - */ public Neo4jTemplate(final GraphDatabase graphDatabase) { notNull(graphDatabase, "graphDatabase"); transactionManager = null; @@ -178,11 +173,13 @@ public class Neo4jTemplate implements Neo4jOperations { }); } + @SuppressWarnings("unchecked") public QueryResult> query(String statement, Map params) { notNull(statement, "statement"); return queryEngineFor(QueryType.Cypher).query(statement, params); } + @SuppressWarnings("unchecked") @Override public QueryResult execute(String statement, Map params) { notNull(statement, "statement"); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java index 6d08d7299..ee6e761ce 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerTest.java @@ -22,7 +22,7 @@ import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.kernel.EmbeddedGraphDatabase; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.data.neo4j.PersonRepository; +import org.springframework.data.neo4j.model.PersonRepository; import org.springframework.data.neo4j.repository.DirectGraphRepositoryFactory; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.transaction.PlatformTransactionManager; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTest.java index 4d096911d..0125cc9c3 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jMappingContextTest.java @@ -17,7 +17,7 @@ package org.springframework.data.neo4j.mapping; import org.junit.Before; import org.junit.Test; -import org.springframework.data.neo4j.Person; +import org.springframework.data.neo4j.model.Person; import static org.junit.Assert.assertEquals; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jNodeConverterTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jNodeConverterTest.java index d1c3e93de..b6b358df7 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jNodeConverterTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/mapping/Neo4jNodeConverterTest.java @@ -24,8 +24,8 @@ import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.index.Index; import org.neo4j.test.ImpermanentGraphDatabase; -import org.springframework.data.neo4j.Person; -import org.springframework.data.neo4j.Personality; +import org.springframework.data.neo4j.model.Person; +import org.springframework.data.neo4j.model.Personality; import org.springframework.data.neo4j.fieldaccess.Neo4jConversionServiceFactoryBean; import org.springframework.data.neo4j.fieldaccess.NodeDelegatingFieldAccessorFactory; import org.springframework.data.neo4j.support.EntityStateHandler; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Attribute.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java similarity index 95% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Attribute.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java index e90f699d9..c4d8787f1 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Attribute.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Attribute.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.Indexed; import org.springframework.data.neo4j.annotation.NodeEntity; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Car.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java similarity index 95% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Car.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java index 1377024ab..9a39a3286 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Car.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Car.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.neo4j.graphdb.Node; import org.springframework.data.neo4j.annotation.GraphId; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Developer.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Developer.java similarity index 95% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Developer.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Developer.java index 3ceb00edf..43d5e8569 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Developer.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Developer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.NodeEntity; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Friendship.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Friendship.java similarity index 98% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Friendship.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Friendship.java index bb1dda7f0..603011353 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Friendship.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Friendship.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.*; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/FriendshipRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/FriendshipRepository.java similarity index 94% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/FriendshipRepository.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/FriendshipRepository.java index a13ce8d8a..50ec0a640 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/FriendshipRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/FriendshipRepository.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.repository.GraphRepository; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Group.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java similarity index 98% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Group.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java index f5b55b0e0..39551b495 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Group.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.DynamicRelationshipType; @@ -116,6 +116,7 @@ public class Group { } private static class PeopleTraversalBuilder implements FieldTraversalDescriptionBuilder { + @SuppressWarnings("deprecation") @Override public TraversalDescription build(Object start, Neo4jPersistentProperty property, String...params) { return new TraversalDescriptionImpl() diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/GroupRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/GroupRepository.java similarity index 95% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/GroupRepository.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/GroupRepository.java index a3bf51640..df631b655 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/GroupRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/GroupRepository.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.repository.GraphRepository; import org.springframework.data.neo4j.repository.NamedIndexRepository; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/InvalidOneToNEntity.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/InvalidOneToNEntity.java similarity index 95% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/InvalidOneToNEntity.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/InvalidOneToNEntity.java index 1fbe45eeb..e9a663937 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/InvalidOneToNEntity.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/InvalidOneToNEntity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.NodeEntity; import org.springframework.data.neo4j.annotation.RelatedTo; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/InvalidReadOnlyOneToNEntity.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/InvalidReadOnlyOneToNEntity.java similarity index 94% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/InvalidReadOnlyOneToNEntity.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/InvalidReadOnlyOneToNEntity.java index cd257c05f..6236fc35d 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/InvalidReadOnlyOneToNEntity.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/InvalidReadOnlyOneToNEntity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.NodeEntity; import org.springframework.data.neo4j.annotation.RelatedTo; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Named.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Named.java similarity index 94% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Named.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Named.java index 247f2bfae..5761f64ee 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Named.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Named.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.NodeEntity; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Person.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java similarity index 89% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Person.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java index fd71c27b0..d40657447 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Person.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.Node; @@ -70,16 +70,16 @@ public class Person { @RelatedToVia(type = "knows", elementClass = Friendship.class) private Iterable friendships; - @Query(value = "start person=(%start) match (person)<-[:boss]-(boss) return boss") + @Query(value = "start person=node({self}) match (person)<-[:boss]-(boss) return boss") private Person bossByQuery; - @Query(value = "start person=(%start) match (person)<-[:boss]-(boss) return boss.%property",params = {"property","name"}) + @Query(value = "start person=node({self}) match (person)<-[:boss]-(boss) return boss.%property",params = {"property","name"}) private String bossName; - @Query(value = "start person=(%start) match (person)<-[:persons]-(team)-[:persons]->(member) return member",elementClass = Person.class) + @Query(value = "start person=node({self}) match (person)<-[:persons]-(team)-[:persons]->(member) return member",elementClass = Person.class) private Iterable otherTeamMembers; - @Query(value = "start person=(%start) match (person)<-[:persons]-(team)-[:persons]->(member) return member.name, member.age") + @Query(value = "start person=node({self}) match (person)<-[:persons]-(team)-[:persons]->(member) return member.name, member.age") private Iterable> otherTeamMemberData; public Person(Node n) { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/PersonCreator.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PersonCreator.java similarity index 95% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/PersonCreator.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PersonCreator.java index 9e3a214b8..cb34b40e3 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/PersonCreator.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PersonCreator.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.neo4j.graphdb.Node; import org.springframework.data.persistence.StateBackedCreator; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/PersonRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PersonRepository.java similarity index 59% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/PersonRepository.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PersonRepository.java index 8f8cc7e1b..f18fc8838 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/PersonRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PersonRepository.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -33,22 +33,22 @@ import java.util.Map; */ public interface PersonRepository extends GraphRepository, NamedIndexRepository { - @Query("start team=(%team) match (team)-[:persons]->(member) return member") - Iterable findAllTeamMembers(@Param("team") Group team); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member") + Iterable findAllTeamMembers(@Param("p_team") Group team); @Query(value = "g.v(team).out('persons')", type = QueryType.Gremlin) Iterable findAllTeamMembersGremlin(@Param("team") Group team); - @Query("start team=(%team) match (team)-[:persons]->(member) return member.name,member.age") - Iterable> findAllTeamMemberData(@Param("team") Group team); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member.name,member.age") + Iterable> findAllTeamMemberData(@Param("p_team") Group team); - @Query("start person=(%person) match (boss)-[:boss]->(person) return boss") - Person findBoss(@Param("person") Person person); + @Query("start person=node({p_person}) match (boss)-[:boss]->(person) return boss") + Person findBoss(@Param("p_person") Person person); - Group findTeam(@Param("person") Person person); + Group findTeam(@Param("p_person") Person person); - @Query("start team=(%team) match (team)-[:persons]->(member) return member") - Page findAllTeamMembersPaged(@Param("team") Group team, Pageable page); - @Query("start team=(%team) match (team)-[:persons]->(member) return member") - Iterable findAllTeamMembersSorted(@Param("team") Group team, Sort sort); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member") + Page findAllTeamMembersPaged(@Param("p_team") Group team, Pageable page); + @Query("start team=node({p_team}) match (team)-[:persons]->(member) return member") + Iterable findAllTeamMembersSorted(@Param("p_team") Group team, Sort sort); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Personality.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Personality.java similarity index 93% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Personality.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Personality.java index 74893c299..cb8e0a6b6 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Personality.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Personality.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; public enum Personality { EXTROVERT, INTROVERT diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/SubGroup.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/SubGroup.java similarity index 94% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/SubGroup.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/SubGroup.java index 99793f3a1..f7071ea55 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/SubGroup.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/SubGroup.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; import org.springframework.data.neo4j.annotation.NodeEntity; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Toyota.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Toyota.java similarity index 93% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Toyota.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Toyota.java index 49a1983a7..840f80ca9 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Toyota.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Toyota.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; public class Toyota extends Car { public Toyota() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Volvo.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Volvo.java similarity index 93% rename from spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Volvo.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Volvo.java index cd0946f84..2b1537915 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/Volvo.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Volvo.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.data.neo4j; +package org.springframework.data.neo4j.model; public class Volvo extends Car { public Volvo() { diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphDatabaseFactoryTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/GraphDatabaseFactoryTest.java similarity index 68% rename from spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphDatabaseFactoryTest.java rename to spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/GraphDatabaseFactoryTest.java index 1a27f3b7d..0895c23c3 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/GraphDatabaseFactoryTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/GraphDatabaseFactoryTest.java @@ -14,19 +14,16 @@ * limitations under the License. */ -package org.springframework.data.neo4j.aspects.support; +package org.springframework.data.neo4j.support; +import org.hamcrest.core.Is; +import org.hamcrest.core.IsInstanceOf; +import org.hamcrest.core.IsNot; +import org.hamcrest.core.IsNull; +import org.junit.Assert; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.neo4j.core.GraphDatabase; -import org.springframework.data.neo4j.support.DelegatingGraphDatabase; -import org.springframework.data.neo4j.support.GraphDatabaseFactory; - -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsInstanceOf.instanceOf; -import static org.hamcrest.core.IsNot.not; -import static org.hamcrest.core.IsNull.nullValue; -import static org.junit.Assert.assertThat; /** * @author mh @@ -39,8 +36,8 @@ public class GraphDatabaseFactoryTest { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("GraphDatabaseFactory-context.xml"); try { GraphDatabase graphDatabase = ctx.getBean("graphDatabase", GraphDatabase.class); - assertThat(graphDatabase, is(not(nullValue()))); - assertThat(graphDatabase, is(instanceOf(DelegatingGraphDatabase.class))); + Assert.assertThat(graphDatabase, Is.is(IsNot.not(IsNull.nullValue()))); + Assert.assertThat(graphDatabase, Is.is(IsInstanceOf.instanceOf(DelegatingGraphDatabase.class))); } finally { ctx.close(); } @@ -52,8 +49,8 @@ public class GraphDatabaseFactoryTest { try { factory.setStoreLocation("target/test-db"); GraphDatabase graphDatabase = factory.getObject(); - assertThat(graphDatabase, is(not(nullValue()))); - assertThat(graphDatabase,is(instanceOf(DelegatingGraphDatabase.class))); + Assert.assertThat(graphDatabase, Is.is(IsNot.not(IsNull.nullValue()))); + Assert.assertThat(graphDatabase, Is.is(IsInstanceOf.instanceOf(DelegatingGraphDatabase.class))); } finally { factory.shutdown(); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java index 619880f88..3842adf55 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/Neo4jTemplateApiTest.java @@ -18,10 +18,7 @@ package org.springframework.data.neo4j.template; import org.apache.lucene.index.Term; import org.apache.lucene.search.TermQuery; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; @@ -51,12 +48,12 @@ public class Neo4jTemplateApiTest { private static final DynamicRelationshipType KNOWS = DynamicRelationshipType.withName("knows"); private static final DynamicRelationshipType HAS = DynamicRelationshipType.withName("has"); protected Neo4jTemplate template; - protected static GraphDatabase graphDatabase; + protected GraphDatabase graphDatabase; protected Node referenceNode; protected Relationship relationship1; protected Node node1; - protected static PlatformTransactionManager transactionManager; - protected static GraphDatabaseService graphDatabaseService; + protected PlatformTransactionManager transactionManager; + protected GraphDatabaseService graphDatabaseService; @@ -85,7 +82,7 @@ public class Neo4jTemplateApiTest { private void createData() { - new TransactionTemplate(Neo4jTemplateApiTest.transactionManager).execute(new TransactionCallbackWithoutResult() { + new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { referenceNode.setProperty("name", "node0"); @@ -98,8 +95,8 @@ public class Neo4jTemplateApiTest { }); } - @AfterClass - public static void tearDown() throws Exception { + @After + public void tearDown() throws Exception { if (graphDatabaseService!=null) { graphDatabaseService.shutdown(); } @@ -137,7 +134,7 @@ public class Neo4jTemplateApiTest { @Test public void shouldRollbackViaStatus() throws Exception { - new TransactionTemplate(Neo4jTemplateApiTest.transactionManager).execute(new TransactionCallbackWithoutResult() { + new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(final TransactionStatus status) { template.exec(new GraphCallback.WithoutResult() { @@ -174,7 +171,7 @@ public class Neo4jTemplateApiTest { } @Test(expected = DataAccessException.class) public void shouldConvertNotFoundExceptionToDataAccessException() { - Neo4jTemplate template = new Neo4jTemplate(graphDatabase, Neo4jTemplateApiTest.transactionManager); + Neo4jTemplate template = new Neo4jTemplate(graphDatabase, transactionManager); template.exec(new GraphCallback.WithoutResult() { @Override public void doWithGraphWithoutResult(GraphDatabase graph) throws Exception { @@ -267,6 +264,7 @@ public class Neo4jTemplateApiTest { assertSingleResult("rel1",template.lookup("relationship", "name", "rel1").to(String.class, new PropertyContainerNameConverter())); } + @SuppressWarnings("deprecation") @Test public void testTraverse() throws Exception { final TraversalDescription description = Traversal.description().relationships(KNOWS).prune(Traversal.pruneAfterDepth(1)).filter(Traversal.returnAllButStartNode()); @@ -275,7 +273,7 @@ public class Neo4jTemplateApiTest { @Test public void shouldFindNextNodeViaCypher() throws Exception { - assertSingleResult(node1, template.query("start n=(0) match n-->m return m", null).to(Node.class)); + assertSingleResult(node1, template.query("start n=node(0) match n-->m return m", null).to(Node.class)); } @Test diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/NeoTraversalTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/NeoTraversalTest.java index d949afeb0..946e8c54b 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/NeoTraversalTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/template/NeoTraversalTest.java @@ -51,7 +51,7 @@ public class NeoTraversalTest extends NeoApiTest { }); final Set resultSet = new HashSet(); - final TraversalDescription description = Traversal.description().relationships(HAS).filter(returnAllButStartNode()).prune(Traversal.pruneAfterDepth(2)); + @SuppressWarnings("deprecation") final TraversalDescription description = Traversal.description().relationships(HAS).filter(returnAllButStartNode()).prune(Traversal.pruneAfterDepth(2)); final QueryResult queryResult = template.traverse(template.getReferenceNode(), description); queryResult.handle(new Handler() { @Override diff --git a/spring-data-neo4j/src/test/java/org/springframework/test/context/CleanContextCacheTestExecutionListener.java b/spring-data-neo4j/src/test/java/org/springframework/test/context/CleanContextCacheTestExecutionListener.java index 11b66404f..55819c354 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/test/context/CleanContextCacheTestExecutionListener.java +++ b/spring-data-neo4j/src/test/java/org/springframework/test/context/CleanContextCacheTestExecutionListener.java @@ -16,9 +16,9 @@ package org.springframework.test.context; +import org.springframework.context.ApplicationContext; import org.springframework.test.context.support.AbstractTestExecutionListener; -import java.applet.AppletContext; import java.lang.reflect.Field; import java.util.Map; @@ -31,7 +31,7 @@ public class CleanContextCacheTestExecutionListener extends AbstractTestExecutio ContextCache cache = (ContextCache) cacheField.get(testContext); Field cacheMapField = ContextCache.class.getDeclaredField("contextKeyToContextMap"); cacheMapField.setAccessible(true); - Map cacheMap = (Map) cacheMapField.get(cache); + @SuppressWarnings("unchecked") Map cacheMap = (Map) cacheMapField.get(cache); String[] keys = new String[cacheMap.size()]; cacheMap.keySet().toArray(keys); for (String key : keys) { diff --git a/spring-data-neo4j/src/test/resources/META-INF/neo4j-named-queries.properties b/spring-data-neo4j/src/test/resources/META-INF/neo4j-named-queries.properties index a92b0a402..bbed3e3d7 100644 --- a/spring-data-neo4j/src/test/resources/META-INF/neo4j-named-queries.properties +++ b/spring-data-neo4j/src/test/resources/META-INF/neo4j-named-queries.properties @@ -1 +1 @@ -Person.findTeam=start p=(%person) match (p)<-[:persons]-(group) return group \ No newline at end of file +Person.findTeam=start p=node({p_person}) match (p)<-[:persons]-(group) return group \ No newline at end of file diff --git a/src/docbkx/reference/programming-model/introducedmethods.xml b/src/docbkx/reference/programming-model/introducedmethods.xml index 6ac8b04f9..cf93ea093 100644 --- a/src/docbkx/reference/programming-model/introducedmethods.xml +++ b/src/docbkx/reference/programming-model/introducedmethods.xml @@ -114,19 +114,19 @@ - Executes the given query, replacing %start with the node-id and returning the results converted to the target type. + Executes the given query, providing the {self} variable with the node-id and returning the results converted to the target type. <T> Iterable<T> NodeBacked.findAllByQuery(final String query, final Class<T> targetType) - Executes the given query, replacing %start with the node-id and returning the original result, but with nodes and relationships replaced by their appropriate entities. + Executes the given query, providing {self} variable with the node-id and returning the original result, but with nodes and relationships replaced by their appropriate entities. Iterable<Map<String,Object>> NodeBacked.findAllByQuery(final String query) - Executes the given query, replacing %start with the node-id and returns a single result converted to the target type. + Executes the given query, providing {self} variable with the node-id and returns a single result converted to the target type. <T> T NodeBacked.findByQuery(final String query, final Class<T> targetType) diff --git a/src/docbkx/reference/programming-model/node-entities.xml b/src/docbkx/reference/programming-model/node-entities.xml index 993e82867..d209cd821 100644 --- a/src/docbkx/reference/programming-model/node-entities.xml +++ b/src/docbkx/reference/programming-model/node-entities.xml @@ -76,8 +76,8 @@ public class Movie { The @Query annotation leverages the delegation infrastructure used by the Spring Data Neo4j aspects. It provides dynamic fields which, when accessed, return the values - selected by the provided query language expression. The provided query must contain a placeholder named %start - for the id of the current entity. For instance start n=(%start) match n-[:FRIEND]->friend return friend. + selected by the provided query language expression. The provided query must contain a placeholder named {self} + for the id of the current entity. For instance start n=({self}) match n-[:FRIEND]->friend return friend. Graph queries can return variable number of entities. That's why annotation can be put onto fields with a single value, an Iterable of a concrete type or an Iterable of Map<String,Object>. Additional parameters are taken from the params attribute of the @Query annotation. @@ -87,7 +87,7 @@ public class Movie { @Graph on a node entity field (friend) return friend", + @Query(value = "start n=({self}) match (n)-[:%relType]->(friend) return friend", params = {"relType", "FRIEND"}) private Iterable friends; } diff --git a/src/docbkx/reference/programming-model/repositories.xml b/src/docbkx/reference/programming-model/repositories.xml index d734bb7b4..6f9c9f284 100644 --- a/src/docbkx/reference/programming-model/repositories.xml +++ b/src/docbkx/reference/programming-model/repositories.xml @@ -149,9 +149,9 @@ Named Queries Spring Data Neo4j also supports the notion of named queries which are externalized in property-config-files (META-INF/neo4j-named-queries.properties). Those files have the format: - Entity.finderName=query (e.g. Person.findBoss=start p=(%person) match (p)<-[:BOSS]-(boss) return boss). + Entity.finderName=query (e.g. Person.findBoss=start p=({p_person}) match (p)<-[:BOSS]-(boss) return boss). Otherwise named queries support the same parameters as annotated queries. For using the named parameters you have to either - annotate the parameters of the method with the @Param("person") annotation or enable debug symbols. + annotate the parameters of the method with the @Param("p_person") annotation or enable debug symbols.
diff --git a/src/docbkx/reference/template.xml b/src/docbkx/reference/template.xml index cdb05e73a..7c76e45e6 100644 --- a/src/docbkx/reference/template.xml +++ b/src/docbkx/reference/template.xml @@ -31,7 +31,7 @@ neo.createRelationship(mark,thomas, WORKS_WITH, map("project","spring-data")); neo.index("devs",thomas, "name","Thomas"); // Cypher -assert "Mark".equals(neo.query("start p=(%person) match p<-[:WORKS_WITH]-other return other.name", +assert "Mark".equals(neo.query("start p=({p_person}) match p<-[:WORKS_WITH]-other return other.name", map("person",thomas)).to(String.class).single()); // Gremlin From f27c8e3083be9a3cb993891369b99268d7c625eb Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 4 Oct 2011 09:46:01 +0200 Subject: [PATCH 2/5] Added command line MovieImporter to cineasts. Person.name is indexed in a fulltext "people" index. --- .../org/neo4j/cineasts/domain/Person.java | 1 + .../cineasts/movieimport/MovieImporter.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieImporter.java diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java index 7810e2b51..f87d43d05 100644 --- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java +++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Person.java @@ -16,6 +16,7 @@ import java.util.Set; public class Person { @Indexed String id; + @Indexed(fulltext = true, indexName = "people") String name; private Date birthday; private String birthplace; diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieImporter.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieImporter.java new file mode 100644 index 000000000..0fa2c0fe5 --- /dev/null +++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/movieimport/MovieImporter.java @@ -0,0 +1,50 @@ +package org.neo4j.cineasts.movieimport; + +import org.springframework.context.support.FileSystemXmlApplicationContext; + +import java.util.Collections; +import java.util.Map; + +/** + * @author mh + * @since 04.10.11 + */ +public class MovieImporter { + + private final MovieDbImportService importer; + + public static void main(String[] args) { + final FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/applicationContext.xml"); + try { + final MovieDbImportService importer = ctx.getBean(MovieDbImportService.class); + final MovieImporter movieImporter = new MovieImporter(importer); + movieImporter.runImport(getMovieIdsToImport(args)); + } finally { + ctx.close(); + } + } + + public MovieImporter(MovieDbImportService importer) { + this.importer = importer; + } + + private void runImport(Map movieIdsToImport) { + final long start = System.currentTimeMillis(); + final Map result = importer.importMovies(movieIdsToImport); + final long time = System.currentTimeMillis() - start; + for (Map.Entry movie : result.entrySet()) { + System.out.println(movie.getKey() + "\t" + movie.getValue()); + } + System.out.println("Imported movies took "+ time+" ms."); + } + + private static Map getMovieIdsToImport(String[] args) { + if (args.length == 0) { + throw new IllegalArgumentException("Usage: MovieImporter 1 10000\nWorking Directory should be the cineasts directory with the json files in data/json."); + } + if (args.length == 1) { + return Collections.singletonMap(Integer.valueOf(args[0]), Integer.valueOf(args[0])); + } + return Collections.singletonMap(Integer.valueOf(args[0]), Integer.valueOf(args[1])); + } +} From 5e6e62556973b1a5a03d0916d900dd2e69a45fed Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 4 Oct 2011 11:25:07 +0200 Subject: [PATCH 3/5] Added Support for duplicate relationships on relateTo() DATAGRAPH-105 --- .../data/neo4j/aspects/core/NodeBacked.java | 11 ++++++++ .../aspects/support/node/Neo4jNodeBacking.aj | 14 ++++++++--- .../support/NodeEntityRelationshipTest.java | 25 +++++++++++++++++-- ...neToNRelationshipFieldAccessorFactory.java | 2 +- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/core/NodeBacked.java b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/core/NodeBacked.java index 3b388013d..22c4d404f 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/core/NodeBacked.java +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/core/NodeBacked.java @@ -62,8 +62,14 @@ public interface NodeBacked extends GraphBacked { * @param target other entity * @param relationshipClass relationship entity class * @param relationshipType type of relationship to be created + * @param allowDuplicates duplication relationships of the same type are allowed between two entities * @return relationship entity of specified relationshipClass */ + R relateTo(N target, Class relationshipClass, String relationshipType,boolean allowDuplicates); + + /** + * delegates to relateTo with allowDuplicates set to false + */ R relateTo(N target, Class relationshipClass, String relationshipType); @@ -151,7 +157,12 @@ public interface NodeBacked extends GraphBacked { * * @param target entity * @param type neo4j relationship type for the underlying relationship + * @param allowDuplicates duplication relationships of the same type are allowed between two entities * @return the newly created relationship to the target node */ + Relationship relateTo(NodeBacked target, String type, boolean allowDuplicates); + /** + * delegates to relateTo with allowDuplicates set to false + */ Relationship relateTo(NodeBacked target, String type); } diff --git a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj index 9b33b52b9..46f8213fb 100644 --- a/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj +++ b/spring-data-neo4j-aspects/src/main/java/org/springframework/data/neo4j/aspects/support/node/Neo4jNodeBacking.aj @@ -162,11 +162,16 @@ public privileged aspect Neo4jNodeBacking { // extends AbstractTypeAnnotatingMix } public Relationship NodeBacked.relateTo(NodeBacked target, String type) { + return this.relateTo(target,type,false); + } + public Relationship NodeBacked.relateTo(NodeBacked target, String type, boolean allowDuplicates) { if (target==null) throw new IllegalArgumentException("Target entity is null"); if (type==null) throw new IllegalArgumentException("Relationshiptype is null"); - Relationship relationship=getRelationshipTo(target,type); - if (relationship!=null) return relationship; + if (!allowDuplicates) { + Relationship relationship=getRelationshipTo(target,type); + if (relationship!=null) return relationship; + } return this.getPersistentState().createRelationshipTo(target.getPersistentState(), DynamicRelationshipType.withName(type)); } @@ -229,11 +234,14 @@ public privileged aspect Neo4jNodeBacking { // extends AbstractTypeAnnotatingMix } public R NodeBacked.relateTo(N target, Class relationshipClass, String relationshipType) { + return this.relateTo(target,relationshipClass,relationshipType,false); + } + public R NodeBacked.relateTo(N target, Class relationshipClass, String relationshipType, boolean allowDuplicates) { if (target==null) throw new IllegalArgumentException("Target entity is null"); if (relationshipClass==null) throw new IllegalArgumentException("Relationship class is null"); if (relationshipType==null) throw new IllegalArgumentException("Relationshiptype is null"); - Relationship rel = this.relateTo(target,relationshipType); + Relationship rel = this.relateTo(target,relationshipType,allowDuplicates); GraphDatabaseContext gdc = Neo4jNodeBacking.aspectOf().graphDatabaseContext; gdc.postEntityCreation(rel, relationshipClass); diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityRelationshipTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityRelationshipTest.java index 9858372e7..e19dcd5a5 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityRelationshipTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/NodeEntityRelationshipTest.java @@ -26,6 +26,7 @@ import org.neo4j.helpers.collection.IteratorUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.InvalidDataAccessApiUsageException; +import static org.junit.Assert.assertTrue; import static org.springframework.data.neo4j.aspects.Person.persistedPerson; import org.springframework.data.neo4j.aspects.*; @@ -146,7 +147,7 @@ public class NodeEntityRelationshipTest { group.setPersons(persons); Collection personsFromGet = group.getPersons(); assertEquals(persons, personsFromGet); - Assert.assertTrue(Set.class.isAssignableFrom(personsFromGet.getClass())); + assertTrue(Set.class.isAssignableFrom(personsFromGet.getClass())); } @Test @@ -160,7 +161,7 @@ public class NodeEntityRelationshipTest { group.getPersons().add(david); Collection personsFromGet = group.getPersons(); assertEquals(new HashSet(Arrays.asList(david,michael)), personsFromGet); - Assert.assertTrue(Set.class.isAssignableFrom(personsFromGet.getClass())); + assertTrue(Set.class.isAssignableFrom(personsFromGet.getClass())); } @Test @@ -244,6 +245,26 @@ public class NodeEntityRelationshipTest { assertEquals(persons, IteratorUtil.addToCollection(group.getReadOnlyPersons().iterator(), new HashSet())); } + @Test + @Transactional + public void multipleRelationshipsOfSameTypeBetweenTwoEntities() { + Person michael = persistedPerson("Michael", 35); + Person david = persistedPerson("David", 25); + Friendship friendship1 = michael.relateTo(david, Friendship.class, "knows", true); + friendship1.setYears(1); + Friendship friendship2 = michael.relateTo(david, Friendship.class, "knows",true); + friendship2.setYears(2); + assertTrue("two different relationships", friendship1 != friendship2); + assertTrue("two different relationships", friendship1.getPersistentState() != friendship2.getPersistentState()); + assertEquals(1, friendship1.getYears()); + assertEquals(2,friendship2.getYears()); + final Collection friends = IteratorUtil.asCollection(michael.getPersistentState().getRelationships(Direction.OUTGOING, DynamicRelationshipType.withName("knows"))); + assertEquals(2,friends.size()); + assertTrue(friends.contains(friendship1.getPersistentState())); + assertTrue(friends.contains(friendship2.getPersistentState())); + } + + @Test(expected = InvalidDataAccessApiUsageException.class) @Transactional public void testOneToManyReadOnlyShouldThrowExceptionOnSet() { diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/OneToNRelationshipFieldAccessorFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/OneToNRelationshipFieldAccessorFactory.java index adc5cee86..0fcb9d86d 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/OneToNRelationshipFieldAccessorFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/OneToNRelationshipFieldAccessorFactory.java @@ -45,7 +45,7 @@ public class OneToNRelationshipFieldAccessorFactory extends NodeRelationshipFiel @Override public FieldAccessor forField(final Neo4jPersistentProperty property) { final RelationshipInfo relationshipInfo = property.getRelationshipInfo(); - final Class targetType = (Class) relationshipInfo.getTargetType().getType(); + final Class targetType = relationshipInfo.getTargetType().getType(); return new OneToNRelationshipFieldAccessor(relationshipInfo.getRelationshipType(), relationshipInfo.getDirection(), targetType, graphDatabaseContext,property); } From c0e27ada946a8d380d21f089764c6c2100015b0e Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 4 Oct 2011 11:25:20 +0200 Subject: [PATCH 4/5] Added Support for traversing over Nodes, Relationships, Paths, NodeEntities and RelationshipEntities with the @GraphTraversal annotation DATAGRAPH-97 --- .../data/neo4j/aspects/Group.java | 18 ++++++++-- .../neo4j/aspects/support/TraversalTest.java | 34 ++++++++++++------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java index ff6837abe..500b242c6 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/Group.java @@ -18,13 +18,13 @@ package org.springframework.data.neo4j.aspects; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.DynamicRelationshipType; +import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.kernel.Traversal; import org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl; -import org.springframework.data.neo4j.aspects.Person; import org.springframework.data.neo4j.annotation.*; import org.springframework.data.neo4j.core.FieldTraversalDescriptionBuilder; - import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import java.util.Collection; @@ -44,6 +44,12 @@ public class Group { @GraphTraversal(traversalBuilder = PeopleTraversalBuilder.class, elementClass = Person.class, params = "persons") private Iterable people; + @GraphTraversal(traversalBuilder = PeopleTraversalBuilder.class, params = "persons") + private Iterable peopleNodes; + + @GraphTraversal(traversalBuilder = PeopleTraversalBuilder.class, params = "persons") + private Iterable peopleRelationships; + @GraphProperty @Indexed private String name; @@ -162,4 +168,12 @@ public class Group { public void setAdmin(Boolean admin) { this.admin = admin; } + + public Iterable getPeopleNodes() { + return peopleNodes; + } + + public Iterable getPeopleRelationships() { + return peopleRelationships; + } } diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTest.java index be2931fff..8076e0450 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/TraversalTest.java @@ -22,22 +22,20 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.DynamicRelationshipType; +import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.Evaluators; import org.neo4j.graphdb.traversal.TraversalDescription; +import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.kernel.Traversal; import org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.aspects.Group; import org.springframework.data.neo4j.aspects.Person; import org.springframework.data.neo4j.core.EntityPath; - -import static org.springframework.data.neo4j.aspects.Person.persistedPerson; - import org.springframework.data.neo4j.repository.DirectGraphRepositoryFactory; import org.springframework.data.neo4j.repository.GraphRepository; import org.springframework.data.neo4j.support.GraphDatabaseContext; import org.springframework.data.neo4j.support.node.Neo4jHelper; - import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -48,6 +46,7 @@ import java.util.Collections; import java.util.HashSet; import static org.junit.Assert.assertEquals; +import static org.springframework.data.neo4j.aspects.Person.persistedPerson; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml"}) @@ -100,18 +99,29 @@ public class TraversalTest { @Test @Transactional - @Rollback(false) public void testTraverseFieldFromGroupToPeople() { Person p = persistedPerson("Michael", 35); Group group = new Group().persist(); - group.setName("dev"); group.addPerson(p); - Iterable people = group.getPeople(); - final HashSet found = new HashSet(); - for (Person person : people) { - found.add(person); - } - assertEquals(Collections.singleton(p),found); + assertEquals(Collections.singletonList(p),IteratorUtil.asCollection(group.getPeople())); + } + @Test + @Transactional + public void testTraverseFieldFromGroupToPeopleNodes() { + Person p = persistedPerson("Michael", 35); + Group group = new Group().persist(); + group.addPerson(p); + assertEquals(Collections.singletonList(p.getPersistentState()), IteratorUtil.asCollection(group.getPeopleNodes())); + } + + @Test + @Transactional + public void testTraverseFieldFromGroupToPeopleRelationships() { + Person p = persistedPerson("Michael", 35); + Group group = new Group().persist(); + group.addPerson(p); + Relationship personRelationship = group.getPersistentState().getSingleRelationship(DynamicRelationshipType.withName("persons"),Direction.OUTGOING); + assertEquals(Collections.singletonList(personRelationship), IteratorUtil.asCollection(group.getPeopleRelationships())); } @Test From d96ea07fc22b8be965607e3700d32af0117fc8ee Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 4 Oct 2011 16:28:37 +0200 Subject: [PATCH 5/5] re-enabled cypher-rest-plugin test as it now supports parameter --- .../data/neo4j/rest/support/RestQueryEngineTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java index bbe626c47..56fe69628 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestQueryEngineTest.java @@ -18,7 +18,6 @@ package org.springframework.data.neo4j.rest.support; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.aspects.support.query.QueryEngineTest; @@ -40,7 +39,6 @@ import org.springframework.test.context.transaction.TransactionalTestExecutionLi @ContextConfiguration(locations = {"classpath:org/springframework/data/neo4j/aspects/support/Neo4jGraphPersistenceTest-context.xml", "classpath:RestTest-context.xml"}) @TestExecutionListeners({CleanContextCacheTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class}) -@Ignore("until the cypher plugin supports parameters") public class RestQueryEngineTest extends QueryEngineTest { @Autowired