Skip to content

Commit 68c64b3

Browse files
Fix reactive flow.
1 parent 10c3712 commit 68c64b3

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

src/main/java/org/springframework/data/neo4j/core/ReactiveNeo4jTemplate.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType,
454454
returnTuple != null
455455
? returnTuple.getIncludedProperties()
456456
: Collections.emptyList());
457-
if (containsPossibleCircles) {
457+
if (containsPossibleCircles && !queryFragments.isScalarValueReturn()) {
458458
return createQueryAndParameters(entityMetaData, queryFragments, parameters)
459459
.flatMap(finalQueryAndParameters ->
460460
createExecutableQuery(domainType, renderer.render(GenericQueryAndParameters.STATEMENT),
@@ -759,7 +759,7 @@ public <T> Mono<ExecutableQuery<T>> toExecutableQuery(PreparedQuery<T> preparedQ
759759

760760
Map<String, Object> parameters = queryFragmentsAndParameters.getParameters();
761761

762-
if (containsPossibleCircles) {
762+
if (containsPossibleCircles && !queryFragments.isScalarValueReturn()) {
763763
GenericQueryAndParameters genericQueryAndParameters =
764764
createQueryAndParameters(entityMetaData, queryFragments, parameters).block();
765765

@@ -768,7 +768,6 @@ public <T> Mono<ExecutableQuery<T>> toExecutableQuery(PreparedQuery<T> preparedQ
768768
} else {
769769
cypherQuery = renderer.render(queryFragments.toStatement());
770770
}
771-
772771
}
773772

774773
ReactiveNeo4jClient.MappingSpec<T> mappingSpec = this.neo4jClient.query(cypherQuery)

src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,12 @@ void countByPropertyWithPossibleCircles(@Autowired PetRepository repository) {
979979
assertThat(repository.countByName("Luna")).isEqualTo(1L);
980980
}
981981

982+
@Test // GH-2157
983+
void countByCustomQueryShouldWork(@Autowired PetRepository repository) {
984+
createFriendlyPets();
985+
assertThat(repository.countAllByName("Luna")).isEqualTo(4L);
986+
}
987+
982988
@Test // GH-2157
983989
void existsByPropertyWithPossibleCircles(@Autowired PetRepository repository) {
984990
createFriendlyPets();
@@ -3874,8 +3880,10 @@ interface PetRepository extends Neo4jRepository<Pet, Long> {
38743880

38753881
long countByName(String name);
38763882

3877-
boolean existsByName(String name);
3883+
@Query(value = "RETURN size($0)", count = true)
3884+
long countAllByName(String name);
38783885

3886+
boolean existsByName(String name);
38793887
}
38803888

38813889
interface RelationshipRepository extends Neo4jRepository<PersonWithRelationship, Long> {

src/test/java/org/springframework/data/neo4j/integration/reactive/ReactiveRepositoryIT.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -998,18 +998,32 @@ void loadEntityWithRelationshipWithAssignedId(@Autowired ReactivePetRepository r
998998
@Test
999999
void findEntityWithSelfReferencesInBothDirections(@Autowired ReactivePetRepository repository) {
10001000

1001-
long petId;
1002-
1003-
try (Session session = createSession()) {
1004-
petId = session.run("CREATE (luna:Pet{name:'Luna'})-[:Has]->(daphne:Pet{name:'Daphne'})"
1005-
+ "-[:Has]->(luna2:Pet{name:'Luna'})" + "RETURN id(luna) as id").single().get("id").asLong();
1006-
}
1001+
long petId = createFriendlyPets();
10071002

10081003
StepVerifier.create(repository.findById(petId)).assertNext(loadedPet -> {
10091004
assertThat(loadedPet.getFriends().get(0).getName()).isEqualTo("Daphne");
10101005
assertThat(loadedPet.getFriends().get(0).getFriends().get(0).getName()).isEqualTo("Luna");
10111006
}).verifyComplete();
10121007
}
1008+
1009+
@Test // GH-2157
1010+
void countByPropertyWithPossibleCircles(@Autowired ReactivePetRepository repository) {
1011+
createFriendlyPets();
1012+
StepVerifier.create(repository.countByName("Luna")).expectNext(1L).verifyComplete();
1013+
}
1014+
1015+
@Test // GH-2157
1016+
void existsByPropertyWithPossibleCircles(@Autowired ReactivePetRepository repository) {
1017+
createFriendlyPets();
1018+
StepVerifier.create(repository.existsByName("Luna")).expectNext(true).verifyComplete();
1019+
}
1020+
1021+
private long createFriendlyPets() {
1022+
try (Session session = createSession()) {
1023+
return session.run("CREATE (luna:Pet{name:'Luna'})-[:Has]->(daphne:Pet{name:'Daphne'})"
1024+
+ "-[:Has]->(luna)" + "RETURN id(luna) as id").single().get("id").asLong();
1025+
}
1026+
}
10131027
}
10141028

10151029
@Nested
@@ -2470,7 +2484,11 @@ interface ReactiveHobbyWithRelationshipWithPropertiesRepository
24702484
Flux<AltHobby> loadFromCustomQuery(@Param("personId") Long personId);
24712485
}
24722486

2473-
interface ReactivePetRepository extends ReactiveNeo4jRepository<Pet, Long> {}
2487+
interface ReactivePetRepository extends ReactiveNeo4jRepository<Pet, Long> {
2488+
Mono<Long> countByName(String name);
2489+
2490+
Mono<Boolean> existsByName(String name);
2491+
}
24742492

24752493
interface ReactiveRelationshipRepository extends ReactiveNeo4jRepository<PersonWithRelationship, Long> {
24762494

0 commit comments

Comments
 (0)