Skip to content

Commit 2e7ecef

Browse files
committed
GH-2287 - Upgrade order and return to CypherDSL's collection API.
Upgrade to CypherDSL 2021.2.3. Closes #2287
1 parent 0c0de1b commit 2e7ecef

File tree

7 files changed

+31
-33
lines changed

7 files changed

+31
-33
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
<cdi>2.0.SP1</cdi>
7777
<changelist>-SNAPSHOT</changelist>
7878
<checkstyle.version>8.40</checkstyle.version>
79-
<cypher-dsl.version>2021.2.2</cypher-dsl.version>
79+
<cypher-dsl.version>2021.2.3</cypher-dsl.version>
8080
<dist.id>spring-data-neo4j</dist.id>
8181
<dist.key>SDNEO4J</dist.key>
8282
<flatten-maven-plugin.version>1.2.5</flatten-maven-plugin.version>

src/main/java/org/springframework/data/neo4j/core/mapping/CypherGenerator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.ArrayList;
2828
import java.util.Arrays;
2929
import java.util.Collection;
30+
import java.util.Collections;
3031
import java.util.List;
3132
import java.util.function.Predicate;
3233
import java.util.function.UnaryOperator;
@@ -463,7 +464,7 @@ public Statement prepareDeleteOf(
463464
.build();
464465
}
465466

466-
public Expression[] createReturnStatementForMatch(NodeDescription<?> nodeDescription) {
467+
public Collection<Expression> createReturnStatementForMatch(NodeDescription<?> nodeDescription) {
467468
return createReturnStatementForMatch(nodeDescription, fieldName -> true);
468469
}
469470

@@ -511,23 +512,23 @@ public Expression[] createReturnStatementForMatch(NodeDescription<?> nodeDescrip
511512
* of projections which allow to exclude one or more fields.
512513
* @return An expresion to be returned by a Cypher statement
513514
*/
514-
public Expression[] createReturnStatementForMatch(NodeDescription<?> nodeDescription,
515+
public Collection<Expression> createReturnStatementForMatch(NodeDescription<?> nodeDescription,
515516
Predicate<String> includeField) {
516517

517518
List<RelationshipDescription> processedRelationships = new ArrayList<>();
518519
if (nodeDescription.containsPossibleCircles(includeField)) {
519520
return createGenericReturnStatement();
520521
} else {
521-
return new Expression[]{projectPropertiesAndRelationships(nodeDescription, Constants.NAME_OF_ROOT_NODE, includeField, processedRelationships)};
522+
return Collections.singleton(projectPropertiesAndRelationships(nodeDescription, Constants.NAME_OF_ROOT_NODE, includeField, processedRelationships));
522523
}
523524
}
524525

525-
public Expression[] createGenericReturnStatement() {
526+
public Collection<Expression> createGenericReturnStatement() {
526527
List<Expression> returnExpressions = new ArrayList<>();
527528
returnExpressions.add(Cypher.name(Constants.NAME_OF_SYNTHESIZED_ROOT_NODE));
528529
returnExpressions.add(Cypher.name(Constants.NAME_OF_SYNTHESIZED_RELATED_NODES));
529530
returnExpressions.add(Cypher.name(Constants.NAME_OF_SYNTHESIZED_RELATIONS));
530-
return returnExpressions.toArray(new Expression[]{});
531+
return returnExpressions;
531532
}
532533

533534
// recursive entry point for relationships in return statement

src/main/java/org/springframework/data/neo4j/repository/query/CypherAdapterUtils.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717

1818
import static org.neo4j.cypherdsl.core.Cypher.property;
1919

20+
import java.util.Collection;
2021
import java.util.function.Function;
22+
import java.util.stream.Collectors;
2123

2224
import org.apiguardian.api.API;
2325
import org.neo4j.cypherdsl.core.Cypher;
@@ -83,9 +85,9 @@ public static Function<Sort.Order, SortItem> sortAdapterFor(NodeDescription<?> n
8385
* @param sort The sort object to convert
8486
* @return An of sort items. It will be empty when sort is unsorted.
8587
*/
86-
public static SortItem[] toSortItems(NodeDescription<?> nodeDescription, Sort sort) {
88+
public static Collection<SortItem> toSortItems(NodeDescription<?> nodeDescription, Sort sort) {
8789

88-
return sort.stream().map(sortAdapterFor(nodeDescription)).toArray(SortItem[]::new);
90+
return sort.stream().map(sortAdapterFor(nodeDescription)).collect(Collectors.toList());
8991
}
9092

9193
public static StatementBuilder.BuildableStatement addPagingParameter(NodeDescription<?> nodeDescription,

src/main/java/org/springframework/data/neo4j/repository/query/CypherQueryCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ private QueryFragments createQueryFragments(@Nullable Condition condition, Sort
307307
queryFragments.setOrderBy(Stream
308308
.concat(sortItems.stream(),
309309
pagingParameter.getSort().and(sort).stream().map(CypherAdapterUtils.sortAdapterFor(nodeDescription)))
310-
.toArray(SortItem[]::new));
310+
.collect(Collectors.toList()));
311311
if (pagingParameter.isUnpaged()) {
312312
queryFragments.setLimit(maxResults);
313313
} else {

src/main/java/org/springframework/data/neo4j/repository/query/CypherdslConditionExecutorImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.neo4j.cypherdsl.core.Cypher.asterisk;
1919

20+
import java.util.Arrays;
2021
import java.util.Collection;
2122
import java.util.List;
2223
import java.util.Optional;
@@ -95,7 +96,7 @@ public Collection<T> findAll(Condition condition, SortItem... sortItems) {
9596
return this.neo4jOperations.toExecutableQuery(
9697
this.metaData.getType(),
9798
QueryFragmentsAndParameters.forCondition(
98-
this.metaData, condition, null, sortItems
99+
this.metaData, condition, null, Arrays.asList(sortItems)
99100
)
100101
).getResults();
101102
}
@@ -105,7 +106,7 @@ public Collection<T> findAll(SortItem... sortItems) {
105106

106107
return this.neo4jOperations.toExecutableQuery(
107108
this.metaData.getType(),
108-
QueryFragmentsAndParameters.forCondition(this.metaData, Conditions.noCondition(), null, sortItems)
109+
QueryFragmentsAndParameters.forCondition(this.metaData, Conditions.noCondition(), null, Arrays.asList(sortItems))
109110
).getResults();
110111
}
111112

src/main/java/org/springframework/data/neo4j/repository/query/QueryFragments.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package org.springframework.data.neo4j.repository.query;
1717

1818
import java.util.ArrayList;
19-
import java.util.Arrays;
19+
import java.util.Collection;
2020
import java.util.Collections;
2121
import java.util.HashSet;
2222
import java.util.List;
@@ -46,8 +46,8 @@
4646
public final class QueryFragments {
4747
private List<PatternElement> matchOn = new ArrayList<>();
4848
private Condition condition;
49-
private List<Expression> returnExpressions = new ArrayList<>();
50-
private SortItem[] orderBy;
49+
private Collection<Expression> returnExpressions = new ArrayList<>();
50+
private Collection<SortItem> orderBy;
5151
private Number limit;
5252
private Long skip;
5353
private ReturnTuple returnTuple;
@@ -74,8 +74,8 @@ public Condition getCondition() {
7474
return condition;
7575
}
7676

77-
public void setReturnExpressions(Expression[] expression) {
78-
this.returnExpressions = Arrays.asList(expression);
77+
public void setReturnExpressions(Collection<Expression> expression) {
78+
this.returnExpressions = expression;
7979
}
8080

8181
public void setReturnExpression(Expression returnExpression, boolean isScalarValue) {
@@ -88,7 +88,7 @@ public boolean includeField(String fieldName) {
8888
|| this.returnTuple.includedProperties.contains(fieldName);
8989
}
9090

91-
public void setOrderBy(SortItem[] orderBy) {
91+
public void setOrderBy(Collection<SortItem> orderBy) {
9292
this.orderBy = orderBy;
9393
}
9494

@@ -148,9 +148,9 @@ public Statement toStatement() {
148148
return statement;
149149
}
150150

151-
private Expression[] getReturnExpressions() {
151+
private Collection<Expression> getReturnExpressions() {
152152
return returnExpressions.size() > 0
153-
? returnExpressions.toArray(new Expression[] {})
153+
? returnExpressions
154154
: CypherGenerator.INSTANCE.createReturnStatementForMatch(getReturnTuple().nodeDescription,
155155
this::includeField);
156156
}
@@ -159,8 +159,8 @@ private boolean isDistinctReturn() {
159159
return returnExpressions.isEmpty() && getReturnTuple().isDistinct;
160160
}
161161

162-
public SortItem[] getOrderBy() {
163-
return orderBy != null ? orderBy : new SortItem[] {};
162+
public Collection<SortItem> getOrderBy() {
163+
return orderBy != null ? orderBy : Collections.emptySet();
164164
}
165165

166166
public Number getLimit() {

src/main/java/org/springframework/data/neo4j/repository/query/QueryFragmentsAndParameters.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
import static org.neo4j.cypherdsl.core.Cypher.parameter;
1919

20+
import java.util.Collection;
2021
import java.util.Collections;
2122
import java.util.Map;
2223

2324
import org.apiguardian.api.API;
2425
import org.neo4j.cypherdsl.core.Condition;
2526
import org.neo4j.cypherdsl.core.Conditions;
26-
import org.neo4j.cypherdsl.core.Expression;
2727
import org.neo4j.cypherdsl.core.SortItem;
2828
import org.springframework.data.domain.Example;
2929
import org.springframework.data.domain.Pageable;
@@ -94,23 +94,21 @@ public static QueryFragmentsAndParameters forFindById(Neo4jPersistentEntity<?> e
9494
Map<String, Object> parameters = Collections.singletonMap(Constants.NAME_OF_ID, idValues);
9595

9696
Condition condition = entityMetaData.getIdExpression().isEqualTo(parameter(Constants.NAME_OF_ID));
97-
Expression[] returnStatement = cypherGenerator.createReturnStatementForMatch(entityMetaData);
9897
QueryFragments queryFragments = new QueryFragments();
9998
queryFragments.addMatchOn(cypherGenerator.createRootNode(entityMetaData));
10099
queryFragments.setCondition(condition);
101-
queryFragments.setReturnExpressions(returnStatement);
100+
queryFragments.setReturnExpressions(cypherGenerator.createReturnStatementForMatch(entityMetaData));
102101
return new QueryFragmentsAndParameters(entityMetaData, queryFragments, parameters);
103102
}
104103

105104
public static QueryFragmentsAndParameters forFindByAllId(Neo4jPersistentEntity<?> entityMetaData, Object idValues) {
106105
Map<String, Object> parameters = Collections.singletonMap(Constants.NAME_OF_IDS, idValues);
107106

108107
Condition condition = entityMetaData.getIdExpression().in((parameter(Constants.NAME_OF_IDS)));
109-
Expression[] returnStatement = cypherGenerator.createReturnStatementForMatch(entityMetaData);
110108
QueryFragments queryFragments = new QueryFragments();
111109
queryFragments.addMatchOn(cypherGenerator.createRootNode(entityMetaData));
112110
queryFragments.setCondition(condition);
113-
queryFragments.setReturnExpressions(returnStatement);
111+
queryFragments.setReturnExpressions(cypherGenerator.createReturnStatementForMatch(entityMetaData));
114112
return new QueryFragmentsAndParameters(entityMetaData, queryFragments, parameters);
115113
}
116114

@@ -140,15 +138,13 @@ static QueryFragmentsAndParameters forExample(Neo4jMappingContext mappingContext
140138
static QueryFragmentsAndParameters forCondition(Neo4jPersistentEntity<?> entityMetaData,
141139
Condition condition,
142140
@Nullable Pageable pageable,
143-
@Nullable SortItem[] sortItems
141+
@Nullable Collection<SortItem> sortItems
144142
) {
145143

146-
Expression[] returnStatement = cypherGenerator.createReturnStatementForMatch(entityMetaData);
147-
148144
QueryFragments queryFragments = new QueryFragments();
149145
queryFragments.addMatchOn(cypherGenerator.createRootNode(entityMetaData));
150146
queryFragments.setCondition(condition);
151-
queryFragments.setReturnExpressions(returnStatement);
147+
queryFragments.setReturnExpressions(cypherGenerator.createReturnStatementForMatch(entityMetaData));
152148
queryFragments.setRenderConstantsAsParameters(true);
153149

154150
if (pageable != null) {
@@ -192,12 +188,10 @@ private static QueryFragmentsAndParameters getQueryFragmentsAndParameters(
192188
Neo4jPersistentEntity<?> entityMetaData, @Nullable Pageable pageable, @Nullable Sort sort,
193189
@Nullable Map<String, Object> parameters, @Nullable Condition condition) {
194190

195-
Expression[] returnStatement = cypherGenerator.createReturnStatementForMatch(entityMetaData);
196-
197191
QueryFragments queryFragments = new QueryFragments();
198192
queryFragments.addMatchOn(cypherGenerator.createRootNode(entityMetaData));
199193
queryFragments.setCondition(condition);
200-
queryFragments.setReturnExpressions(returnStatement);
194+
queryFragments.setReturnExpressions(cypherGenerator.createReturnStatementForMatch(entityMetaData));
201195

202196
if (pageable != null) {
203197
adaptPageable(entityMetaData, pageable, queryFragments);

0 commit comments

Comments
 (0)