Skip to content

Commit b012b5b

Browse files
GH-2230 - Use Cypher-DSL statement parameters in all template methods.
This closes #2230.
1 parent 9a3e3da commit b012b5b

File tree

7 files changed

+55
-31
lines changed

7 files changed

+55
-31
lines changed

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

+2-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.springframework.data.neo4j.core;
1717

1818
import java.util.Collections;
19-
import java.util.HashMap;
2019
import java.util.List;
2120
import java.util.Map;
2221
import java.util.Optional;
@@ -127,12 +126,8 @@ default TerminatingFind<T> matching(String query) {
127126
* @throws IllegalArgumentException if statement is {@literal null}.
128127
*/
129128
default TerminatingFind<T> matching(Statement statement, @Nullable Map<String, Object> parameter) {
130-
Map<String, Object> mergedParameters = new HashMap<>();
131-
mergedParameters.putAll(statement.getParameters());
132-
if (parameter != null) {
133-
mergedParameters.putAll(parameter);
134-
}
135-
return matching(statement.getCypher(), mergedParameters);
129+
130+
return matching(statement.getCypher(), TemplateSupport.mergeParameters(statement, parameter));
136131
}
137132

138133
/**

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

+6-7
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ public long count(Statement statement) {
169169

170170
@Override
171171
public long count(Statement statement, Map<String, Object> parameters) {
172-
return count(renderer.render(statement), parameters);
172+
173+
return count(renderer.render(statement), TemplateSupport.mergeParameters(statement, parameters));
173174
}
174175

175176
@Override
@@ -194,7 +195,7 @@ public <T> List<T> findAll(Class<T> domainType) {
194195

195196
@Override
196197
public <T> List<T> findAll(Statement statement, Class<T> domainType) {
197-
return createExecutableQuery(domainType, renderer.render(statement)).getResults();
198+
return createExecutableQuery(domainType, statement, Collections.emptyMap()).getResults();
198199
}
199200

200201
@Override
@@ -551,10 +552,9 @@ private <T> ExecutableQuery<T> createExecutableQuery(Class<T> domainType, String
551552
return createExecutableQuery(domainType, cypherStatement, Collections.emptyMap());
552553
}
553554

554-
private <T> ExecutableQuery<T> createExecutableQuery(Class<T> domainType, Statement statement,
555-
Map<String, Object> parameters) {
555+
private <T> ExecutableQuery<T> createExecutableQuery(Class<T> domainType, Statement statement, Map<String, Object> parameters) {
556556

557-
return createExecutableQuery(domainType, renderer.render(statement), parameters);
557+
return createExecutableQuery(domainType, renderer.render(statement), TemplateSupport.mergeParameters(statement, parameters));
558558
}
559559

560560
private <T> ExecutableQuery<T> createExecutableQuery(Class<T> domainType, String cypherStatement,
@@ -866,8 +866,7 @@ private Optional<Neo4jClient.RecordFetchSpec<T>> createFetchSpec() {
866866
} else {
867867
Statement statement = queryFragments.toStatement();
868868
cypherQuery = renderer.render(statement);
869-
finalParameters = new HashMap<>(finalParameters);
870-
finalParameters.putAll(statement.getParameters());
869+
finalParameters = TemplateSupport.mergeParameters(statement, finalParameters);
871870
}
872871
}
873872

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import reactor.core.publisher.Mono;
2020

2121
import java.util.Collections;
22-
import java.util.HashMap;
2322
import java.util.Map;
2423

2524
import org.apiguardian.api.API;
@@ -117,12 +116,7 @@ default TerminatingFind<T> matching(String query) {
117116
* @throws IllegalArgumentException if statement is {@literal null}.
118117
*/
119118
default TerminatingFind<T> matching(Statement statement, @Nullable Map<String, Object> parameter) {
120-
Map<String, Object> mergedParameters = new HashMap<>();
121-
mergedParameters.putAll(statement.getParameters());
122-
if (parameter != null) {
123-
mergedParameters.putAll(parameter);
124-
}
125-
return matching(statement.getCypher(), mergedParameters);
119+
return matching(statement.getCypher(), TemplateSupport.mergeParameters(statement, parameter));
126120
}
127121

128122
/**

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

+5-10
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public Mono<Long> count(Statement statement) {
146146

147147
@Override
148148
public Mono<Long> count(Statement statement, Map<String, Object> parameters) {
149-
return count(renderer.render(statement), parameters);
149+
return count(renderer.render(statement), TemplateSupport.mergeParameters(statement, parameters));
150150
}
151151

152152
@Override
@@ -521,7 +521,7 @@ public Mono<Void> deleteAll(Class<?> domainType) {
521521
}
522522

523523
private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType, Statement statement) {
524-
return createExecutableQuery(domainType, renderer.render(statement), Collections.emptyMap());
524+
return createExecutableQuery(domainType, statement, Collections.emptyMap());
525525
}
526526

527527
private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType, String cypherQuery) {
@@ -531,7 +531,7 @@ private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType,
531531
private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType, Statement statement,
532532
Map<String, Object> parameters) {
533533

534-
return createExecutableQuery(domainType, renderer.render(statement), parameters);
534+
return createExecutableQuery(domainType, renderer.render(statement), TemplateSupport.mergeParameters(statement, parameters));
535535
}
536536

537537
private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType, String cypherQuery,
@@ -558,11 +558,7 @@ private <T> Mono<ExecutableQuery<T>> createExecutableQuery(Class<T> domainType,
558558
finalQueryAndParameters.getParameters()));
559559
}
560560

561-
Statement statement = queryFragments.toStatement();
562-
Map<String, Object> parameters = new HashMap<>(queryFragmentsAndParameters.getParameters());
563-
parameters.putAll(statement.getParameters());
564-
565-
return createExecutableQuery(domainType, renderer.render(statement), parameters);
561+
return createExecutableQuery(domainType, queryFragments.toStatement(), queryFragmentsAndParameters.getParameters());
566562
}
567563

568564
private Mono<GenericQueryAndParameters> createQueryAndParameters(Neo4jPersistentEntity<?> entityMetaData,
@@ -919,8 +915,7 @@ public <T> Mono<ExecutableQuery<T>> toExecutableQuery(PreparedQuery<T> preparedQ
919915

920916
Statement statement = queryFragments.toStatement();
921917
cypherQuery = renderer.render(statement);
922-
finalParameters = new HashMap<>(finalParameters);
923-
finalParameters.putAll(statement.getParameters());
918+
finalParameters = TemplateSupport.mergeParameters(statement, finalParameters);
924919
}
925920

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

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

+18
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
package org.springframework.data.neo4j.core;
1717

1818
import java.beans.PropertyDescriptor;
19+
import java.util.HashMap;
1920
import java.util.List;
21+
import java.util.Map;
2022
import java.util.Set;
2123
import java.util.function.Predicate;
2224
import java.util.stream.Collectors;
2325

2426
import org.apiguardian.api.API;
27+
import org.neo4j.cypherdsl.core.Statement;
2528
import org.springframework.lang.Nullable;
2629

2730
/**
@@ -65,6 +68,21 @@ static Predicate<String> computeIncludePropertyPredicate(List<PropertyDescriptor
6568
}
6669
}
6770

71+
/**
72+
* Merges statement and explicit parameters. Statement parameters have a higher precedence
73+
* @param statement A statement that maybe has some stored parameters
74+
* @param parameters The original parameters
75+
* @return Merged parameters
76+
*/
77+
static Map<String, Object> mergeParameters(Statement statement, @Nullable Map<String, Object> parameters) {
78+
79+
Map<String, Object> mergedParameters = new HashMap<>(statement.getParameters());
80+
if (parameters != null) {
81+
mergedParameters.putAll(parameters);
82+
}
83+
return mergedParameters;
84+
}
85+
6886
private TemplateSupport() {
6987
}
7088
}

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

+11
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,17 @@ void findOneWithStatementAndParameters() {
189189
assertThat(person).isPresent();
190190
}
191191

192+
@Test // 2230
193+
void findAllWithStatementWithoutParameters() {
194+
Node node = Cypher.node("PersonWithAllConstructor").named("n");
195+
Statement statement = Cypher.match(node).where(node.property("name").isEqualTo(Cypher.parameter("name").withValue(TEST_PERSON1_NAME)))
196+
.returning(node).build();
197+
198+
List<PersonWithAllConstructor> people = neo4jTemplate.findAll(statement, PersonWithAllConstructor.class);
199+
200+
assertThat(people).hasSize(1);
201+
}
202+
192203
@Test
193204
void findAllWithCypherQuery() {
194205
String cypherQuery = "MATCH (p:PersonWithAllConstructor) return p";

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

+12
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,18 @@ record -> record.asMap(Function.identity()).get("t").get("name").asString()
274274
}
275275
}
276276

277+
@Test // 2230
278+
void findAllWithStatementWithoutParameters() {
279+
Node node = Cypher.node("PersonWithAllConstructor").named("n");
280+
Statement statement = Cypher.match(node).where(node.property("name").isEqualTo(Cypher.parameter("name").withValue(TEST_PERSON1_NAME)))
281+
.returning(node).build();
282+
283+
neo4jTemplate.findAll(statement, PersonWithAllConstructor.class)
284+
.as(StepVerifier::create)
285+
.expectNextCount(1L)
286+
.verifyComplete();
287+
}
288+
277289
@Test
278290
void deleteById() {
279291
StepVerifier.create(neo4jTemplate.deleteById(person1Id, PersonWithAllConstructor.class)).verifyComplete();

0 commit comments

Comments
 (0)