From 7425b15b3f3315c9ff9bb78083335c1bc362cbcd Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Fri, 21 Aug 2020 14:19:18 +0200 Subject: [PATCH] GH-818 - Flush mapping context on potentially generic write queries. --- .../delegates/ExecuteQueriesDelegate.java | 6 ++ .../neo4j/ogm/persistence/EndToEndTest.java | 2 +- .../examples/pizza/PizzaIntegrationTest.java | 2 +- .../SocialRelationshipsIntegrationTest.java | 68 +++++-------------- .../model/RelationshipEntityMappingTest.java | 4 +- .../session/lifecycle/DirtyObjectsTest.java | 2 +- 6 files changed, 27 insertions(+), 57 deletions(-) diff --git a/core/src/main/java/org/neo4j/ogm/session/delegates/ExecuteQueriesDelegate.java b/core/src/main/java/org/neo4j/ogm/session/delegates/ExecuteQueriesDelegate.java index c22acfa5e2..6c06371a3a 100644 --- a/core/src/main/java/org/neo4j/ogm/session/delegates/ExecuteQueriesDelegate.java +++ b/core/src/main/java/org/neo4j/ogm/session/delegates/ExecuteQueriesDelegate.java @@ -113,6 +113,12 @@ public Result query(String cypher, Map parameters, boolean readOnly) validateQuery(cypher, parameters, readOnly); + if (!readOnly) { + // While an update query may not return objects, it has enough changes + // to modify all entities in the context, so we must flush it either way. + session.clear(); + } + RestModelRequest request = new DefaultRestModelRequest(cypher, parameters); RestModelMapper mapper = new RestModelMapper(session.metaData(), session.context(), session.getEntityInstantiator()); diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/EndToEndTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/EndToEndTest.java index 31ccecaf19..cbeeeb54c2 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/EndToEndTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/EndToEndTest.java @@ -155,7 +155,7 @@ public void canComplexExecute() { HashMap parameters2 = new HashMap<>(); parameters2.put("brand", "Huffy"); Bike actual = session.queryForObject(Bike.class, - "MATCH (bike:Bike{brand: $brand})-[rels]-() RETURN bike, COLLECT(DISTINCT rels) as rels", parameters2); + "MATCH (bike:Bike{brand: $brand})-[rels]-(o) RETURN *", parameters2); assertThat(actual.getId()).isEqualTo(bike.getId()); assertThat(actual.getBrand()).isEqualTo(bike.getBrand()); diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/pizza/PizzaIntegrationTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/pizza/PizzaIntegrationTest.java index 8bf0a778bb..4a0d9fc957 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/pizza/PizzaIntegrationTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/pizza/PizzaIntegrationTest.java @@ -534,7 +534,7 @@ public void shouldUpdateLabelWhenLoadingEntityInNewSession() { private void assertOneRelationshipInDb() { - Result result = session.query("MATCH (p:Pizza)-[r]-() return count(r) as c", new HashMap()); + Result result = sessionFactory.openSession().query("MATCH (p:Pizza)-[r]-() return count(r) as c", new HashMap<>()); Map row = result.iterator().next(); Number count = (Number) row.get("c"); assertThat(count.longValue()).isEqualTo(1L); diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/social/SocialRelationshipsIntegrationTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/social/SocialRelationshipsIntegrationTest.java index e77786aef7..fc185a1e28 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/social/SocialRelationshipsIntegrationTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/examples/social/SocialRelationshipsIntegrationTest.java @@ -64,10 +64,7 @@ public void clearDatabase() { session.purgeDatabase(); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void saveUndirectedSavesOutgoingRelationship() { User userA = new User("A"); User userB = new User("B"); @@ -79,10 +76,7 @@ public void saveUndirectedSavesOutgoingRelationship() { + "return a,b", emptyMap()).queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void saveUnmarkedSavesOutgoingRelationship() { Individual individualA = new Individual(); individualA.setName("A"); @@ -100,10 +94,7 @@ public void saveUnmarkedSavesOutgoingRelationship() { .hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void saveOutgoingSavesOutgoingRelationship() { Person personA = new Person("A"); Person personB = new Person("B"); @@ -115,10 +106,7 @@ public void saveOutgoingSavesOutgoingRelationship() { + "return a, b", emptyMap()).queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void saveIncomingSavesIncomingRelationship() { Mortal mortalA = new Mortal("A"); Mortal mortalB = new Mortal("B"); @@ -130,10 +118,7 @@ public void saveIncomingSavesIncomingRelationship() { + "return a,b", emptyMap()).queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void saveOutgoingSavesOutgoingRelationshipInBothDirections() { Person personA = new Person("A"); Person personB = new Person("B"); @@ -146,10 +131,7 @@ public void saveOutgoingSavesOutgoingRelationshipInBothDirections() { "WHERE (a)-[:LIKES]->(b) and (b)-[:LIKES]->(a) return a, b", emptyMap()).queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void saveOutgoingToExistingNodesSavesOutgoingRelationshipInBothDirections() { Person personA = new Person("A"); Person personB = new Person("B"); @@ -164,10 +146,7 @@ public void saveOutgoingToExistingNodesSavesOutgoingRelationshipInBothDirections "WHERE (a)-[:LIKES]->(b) and (b)-[:LIKES]->(a) return a,b", emptyMap()).queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void updateOutgoingRelSavesOutgoingRelationshipInBothDirections() { Person personA = new Person("A"); Person personB = new Person("B"); @@ -191,10 +170,7 @@ public void updateOutgoingRelSavesOutgoingRelationshipInBothDirections() { .queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-594 - */ - @Test + @Test // DATAGRAPH-594 public void updateOutgoingRelInListSavesOutgoingRelationshipInBothDirections() { Person personA = new Person("A"); Person personB = new Person("B"); @@ -217,10 +193,7 @@ public void updateOutgoingRelInListSavesOutgoingRelationshipInBothDirections() { "return a, b, c, d", emptyMap()).queryResults()).hasSize(1); } - /** - * @see DATAGRAPH-636, DATAGRAPH-665 (equals() on SocialUser includes every field) - */ - @Test + @Test // DATAGRAPH-636, DATAGRAPH-665 (equals() on SocialUser includes every field) public void shouldManageRelationshipsToTheSameNodeType() { SocialUser userA = new SocialUser("A"); SocialUser userB = new SocialUser("B"); @@ -256,10 +229,7 @@ public void shouldManageRelationshipsToTheSameNodeType() { assertThat(userA.getFollowing()).hasSize(2); } - /** - * @see Issue #61 - */ - @Test + @Test // GH-61 public void shouldUseOptimizedQueryToSaveExistingRelations() { SocialUser userA = new SocialUser("A"); SocialUser userB = new SocialUser("B"); @@ -294,10 +264,7 @@ public void shouldUseOptimizedQueryToSaveExistingRelations() { assertThat(userA.getFollowing()).hasSize(2); } - /** - * @see issue #112 - */ - @Test + @Test // GH-112 public void removeUndirectedRelationship() { User userA = new User("A"); User userB = new User("B"); @@ -305,18 +272,15 @@ public void removeUndirectedRelationship() { session.save(userA); assertThat(session.query("MATCH (a:User {name:'A'}), (b:User {name:'B'}) WHERE (a)-[:FRIEND]->(b) return a,b", - emptyMap()).queryResults()).hasSize(1); + emptyMap(), true).queryResults()).hasSize(1); userA.unfriend(userB); session.save(userA); assertThat(session.query("MATCH (a:User {name:'A'}), (b:User {name:'B'}) WHERE (a)-[:FRIEND]->(b) return a, b", - emptyMap()).queryResults()).hasSize(0); + emptyMap(), true).queryResults()).hasSize(0); } - /** - * @see issue 305 - */ - @Test + @Test // GH-305 public void shouldBePossibleToDeleteRelationshipToPurgedNodeWithEventListener() throws Exception { session.register(new EventListenerAdapter()); @@ -330,10 +294,10 @@ public void shouldBePossibleToDeleteRelationshipToPurgedNodeWithEventListener() session.save(a1); session.save(a2); - a1.setPeopleILike(Collections.emptyList()); + a1.setPeopleILike(Collections.emptyList()); session.save(a1); - a2.setPeopleILike(Collections.emptyList()); + a2.setPeopleILike(Collections.emptyList()); session.save(a2); } } diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/model/RelationshipEntityMappingTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/model/RelationshipEntityMappingTest.java index d53d574433..10af640fea 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/model/RelationshipEntityMappingTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/model/RelationshipEntityMappingTest.java @@ -117,7 +117,7 @@ public void shouldUseCorrectTypeFromHierarchyOfRelationshipEntities() { } @Test - public void shouldBeAbleToSaveAndLoadRelationshipEntityWithNullProperties() throws Exception { + public void shouldBeAbleToSaveAndLoadRelationshipEntityWithNullProperties() { Actor keanu = new Actor("Keanu Reeves"); Movie matrix = new Movie("The Matrix", 1999); @@ -131,7 +131,7 @@ public void shouldBeAbleToSaveAndLoadRelationshipEntityWithNullProperties() thro Map params = new HashMap<>(); params.put("actorId", keanu.getId()); Result result = session.query("MATCH (a:Actor)-[r:ACTS_IN]-(m:Movie) WHERE ID(a) = $actorId RETURN r as rel", - params); + params, true); Iterator> iterator = result.iterator(); diff --git a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/session/lifecycle/DirtyObjectsTest.java b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/session/lifecycle/DirtyObjectsTest.java index 62e17fca00..fda5e4fcd3 100644 --- a/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/session/lifecycle/DirtyObjectsTest.java +++ b/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/persistence/session/lifecycle/DirtyObjectsTest.java @@ -117,7 +117,7 @@ public void reloadingAnObjectReturnsTheCachedInstanceEvenIfItIsChangedInTheDatab session.save(d); // perform an out-of-session update on the object - session.query("MATCH (n) SET n.name='Document'", Collections.emptyMap()); + sessionFactory.openSession().query("MATCH (n) SET n.name='Document'", Collections.emptyMap()); // get a copy of the document into a different session Document d2 = sessionFactory.openSession().load(Document.class, d.getId());