Skip to content

Commit

Permalink
GH-818 - Flush mapping context on potentially generic write queries.
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-simons committed Aug 21, 2020
1 parent 4f3ae9c commit 7425b15
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ public Result query(String cypher, Map<String, ?> 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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ public void canComplexExecute() {
HashMap<String, Object> 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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Object>());
Result result = sessionFactory.openSession().query("MATCH (p:Pizza)-[r]-() return count(r) as c", new HashMap<>());
Map<String, Object> row = result.iterator().next();
Number count = (Number) row.get("c");
assertThat(count.longValue()).isEqualTo(1L);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -294,29 +264,23 @@ 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");
userA.getFriends().add(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(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 <a href="https://github.com/neo4j/neo4j-ogm/issues/305">issue 305</a>
*/
@Test
@Test // GH-305
public void shouldBePossibleToDeleteRelationshipToPurgedNodeWithEventListener() throws Exception {
session.register(new EventListenerAdapter());

Expand All @@ -330,10 +294,10 @@ public void shouldBePossibleToDeleteRelationshipToPurgedNodeWithEventListener()
session.save(a1);
session.save(a2);

a1.setPeopleILike(Collections.<Person>emptyList());
a1.setPeopleILike(Collections.emptyList());
session.save(a1);

a2.setPeopleILike(Collections.<Person>emptyList());
a2.setPeopleILike(Collections.emptyList());
session.save(a2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -131,7 +131,7 @@ public void shouldBeAbleToSaveAndLoadRelationshipEntityWithNullProperties() thro
Map<String, Object> 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<Map<String, Object>> iterator = result.iterator();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down

0 comments on commit 7425b15

Please sign in to comment.