Skip to content

Commit d743bd3

Browse files
feat: Allow direct rendering of Visitable objects. (#554)
This adds a generalised version of the `org.neo4j.cypherdsl.core.renderer.Renderer` that can be retrieved via `org.neo4j.cypherdsl.core.renderer.Renderer#getRenderer(org.neo4j.cypherdsl.core.renderer.Configuration, java.lang.Class<T>)`. This generalised version adds an overload of `render` that accepts any `Visitable` so that an intermediate representation can be retrieved. Changing the interface to accept `Visitable` in general would have broken binary compatibility, an overload on the current interface has been discarded to avoid ambiguity. Reluctant use is suggested, as the intermediate representation won't be cached in the renderer. In addition, an overload of `toString` has been added to many `Visitable` types. While I would liked to have added this to the `Visitable` interface as suggested by @lukaseder, this is not possible as specified in the JLS 9.4.1.2. "Requirements in Overriding" (https://docs.oracle.com/javase/specs/jls/se17/html/jls-9.html#jls-9.4.1.2) (more background here https://mail.openjdk.org/pipermail/lambda-dev/2013-March/008435.html) Closes #552.
1 parent 91adc96 commit d743bd3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+527
-85
lines changed

README.adoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
:artifactId: neo4j-cypher-dsl
77

88
// This will be next version and also the one that will be put into the manual for the main branch
9-
:neo4j-cypher-dsl-version: 2023.0.1-SNAPSHOT
9+
:neo4j-cypher-dsl-version: 2023.1.0-SNAPSHOT
1010
// This is the latest released version, used only in the readme
1111
:neo4j-cypher-dsl-version-latest: 2023.0.0
1212

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/AbstractCase.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,17 @@ public static Case create(@Nullable Expression expression) {
4848
return expression == null ? new GenericCaseImpl() : new SimpleCaseImpl(expression);
4949
}
5050

51-
AbstractCase() {
52-
this(Collections.emptyList());
53-
}
54-
5551
AbstractCase(List<CaseWhenThen> caseWhenThens) {
5652
this.caseWhenThens = new ArrayList<>(caseWhenThens);
5753
}
5854

5955
abstract Expression getCaseExpression();
6056

57+
@Override
58+
public String toString() {
59+
return RendererBridge.render(this);
60+
}
61+
6162
void setCaseElse(CaseElse caseElse) {
6263
this.caseElse = caseElse;
6364
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (c) 2019-2023 "Neo4j,"
3+
* Neo4j Sweden AB [https://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* https://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
package org.neo4j.cypherdsl.core;
20+
21+
abstract class AbstractClause implements Clause {
22+
23+
@Override
24+
public final String toString() {
25+
return RendererBridge.render(this);
26+
}
27+
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/AbstractNode.java

+5
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,9 @@ public final Relationship relationshipFrom(Node other, String... types) {
120120
public final Relationship relationshipBetween(Node other, String... types) {
121121
return new InternalRelationshipImpl(null, this, Relationship.Direction.UNI, other, types);
122122
}
123+
124+
@Override
125+
public String toString() {
126+
return RendererBridge.render(this);
127+
}
123128
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/AliasedExpression.java

+5
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,9 @@ Expression getDelegate() {
8181
public Expression asExpression() {
8282
return this;
8383
}
84+
85+
@Override
86+
public String toString() {
87+
return RendererBridge.render(this);
88+
}
8489
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Arguments.java

+5
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ public Optional<String> getPrefix() {
5555
public Optional<String> getSuffix() {
5656
return Optional.of(")");
5757
}
58+
59+
@Override
60+
public String toString() {
61+
return RendererBridge.render(this);
62+
}
5863
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Comparison.java

+5
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,10 @@ public Condition not() {
9999
}
100100
return Condition.super.not();
101101
}
102+
103+
@Override
104+
public String toString() {
105+
return RendererBridge.render(this);
106+
}
102107
}
103108

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Create.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* @since 1.0
3232
*/
3333
@API(status = STABLE, since = "1.0")
34-
public final class Create implements UpdatingClause {
34+
public final class Create extends AbstractClause implements UpdatingClause {
3535

3636
private final Pattern pattern;
3737

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/DecoratedQuery.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ sealed class DecoratedQuery extends AbstractStatement implements UseStatement {
3636

3737
private enum Decoration implements Visitable {
3838

39-
EXPLAIN, PROFILE
39+
EXPLAIN, PROFILE;
40+
41+
@Override
42+
public String toString() {
43+
return RendererBridge.render(this);
44+
}
4045
}
4146

4247
private final Visitable decoration;

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Delete.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* @since 1.0
3232
*/
3333
@API(status = STABLE, since = "1.0")
34-
public final class Delete implements UpdatingClause {
34+
public final class Delete extends AbstractClause implements UpdatingClause {
3535

3636
private final ExpressionList deleteItems;
3737

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/ExpressionList.java

+5
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,9 @@ protected Visitable prepareVisit(Expression child) {
5050
boolean isEmpty() {
5151
return super.children.isEmpty();
5252
}
53+
54+
@Override
55+
public String toString() {
56+
return RendererBridge.render(this);
57+
}
5358
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Foreach.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
* @since 2021.3.0
3333
*/
3434
@API(status = STABLE, since = "2021.3.0")
35-
public final class Foreach implements UpdatingClause {
35+
public final class Foreach extends AbstractClause implements UpdatingClause {
3636

3737
private final SymbolicName variable;
3838

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/FunctionInvocation.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,8 @@ public void accept(Visitor visitor) {
181181
visitor.leave(this);
182182
}
183183

184-
@Override public String toString() {
185-
return "FunctionInvocation{" +
186-
"functionName='" + functionName + '\'' +
187-
'}';
184+
@Override
185+
public String toString() {
186+
return RendererBridge.render(this);
188187
}
189188
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Hint.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,19 @@
4040
*/
4141
public final class Hint implements Visitable {
4242

43+
@Override
44+
public String toString() {
45+
return RendererBridge.render(this);
46+
}
47+
4348
private enum Type implements Visitable {
4449

45-
INDEX, INDEX_SEEK, SCAN, JOIN_ON
50+
INDEX, INDEX_SEEK, SCAN, JOIN_ON;
51+
52+
@Override
53+
public String toString() {
54+
return RendererBridge.render(this);
55+
}
4656
}
4757

4858
private static final class IndexReference implements Visitable {
@@ -71,6 +81,11 @@ public void accept(Visitor visitor) {
7181
Visitable.visitIfNotNull(this.optionalLabel, visitor);
7282
visitor.leave(this);
7383
}
84+
85+
@Override
86+
public String toString() {
87+
return RendererBridge.render(this);
88+
}
7489
}
7590

7691
private static final class IndexReferences extends TypedSubtree<IndexReference> {

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/InTransactions.java

+5
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,9 @@ public void accept(Visitor visitor) {
6262
subquery.accept(visitor);
6363
visitor.leave(this);
6464
}
65+
66+
@Override
67+
public String toString() {
68+
return RendererBridge.render(this);
69+
}
6570
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/InternalPropertyImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,9 @@ private static SymbolicName extractRequiredSymbolicName(Named parentContainer) {
165165
public Expression asExpression() {
166166
return this;
167167
}
168+
169+
@Override
170+
public String toString() {
171+
return RendererBridge.render(this);
172+
}
168173
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/KeyValueMapEntry.java

+5
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,9 @@ public void accept(Visitor visitor) {
7979
value.accept(visitor);
8080
visitor.leave(this);
8181
}
82+
83+
@Override
84+
public String toString() {
85+
return RendererBridge.render(this);
86+
}
8287
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Limit.java

+5
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,9 @@ public void accept(Visitor visitor) {
5252
limitExpression.accept(visitor);
5353
visitor.leave(this);
5454
}
55+
56+
@Override
57+
public String toString() {
58+
return RendererBridge.render(this);
59+
}
5560
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/ListExpression.java

+5
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,9 @@ public void accept(Visitor visitor) {
6464
this.content.accept(visitor);
6565
visitor.leave(this);
6666
}
67+
68+
@Override
69+
public String toString() {
70+
return RendererBridge.render(this);
71+
}
6772
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/ListOperator.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* @since 2020.1.0
3838
*/
3939
@API(status = API.Status.EXPERIMENTAL, since = "2020.1.0")
40-
public final class ListOperator implements Expression {
40+
public final class ListOperator implements Expression, Visitable {
4141

4242
/**
4343
* A literal for the dots.
@@ -93,6 +93,11 @@ public Optional<String> getPrefix() {
9393
public Optional<String> getSuffix() {
9494
return Optional.of("]");
9595
}
96+
97+
@Override
98+
public String toString() {
99+
return RendererBridge.render(this);
100+
}
96101
}
97102

98103
/**

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/ListPredicate.java

+5
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,9 @@ public void accept(Visitor visitor) {
6565
this.where.accept(visitor);
6666
visitor.leave(this);
6767
}
68+
69+
@Override
70+
public String toString() {
71+
return RendererBridge.render(this);
72+
}
6873
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/LiteralBase.java

+5
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,10 @@ protected LiteralBase(T content) {
5151
public final T getContent() {
5252
return content;
5353
}
54+
55+
@Override
56+
public String toString() {
57+
return RendererBridge.render(this);
58+
}
5459
}
5560

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/MapExpression.java

+5
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,9 @@ MapExpression addEntries(List<Expression> entries) {
106106
protected Visitable prepareVisit(Expression child) {
107107
return Expressions.nameOrExpression(child);
108108
}
109+
110+
@Override
111+
public String toString() {
112+
return RendererBridge.render(this);
113+
}
109114
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/MapProjection.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,13 @@ private static List<Expression> createNewContent(Object... content) {
130130
knownKeys.add(lastKey);
131131
} else if (lastExpression instanceof SymbolicName || lastExpression instanceof PropertyLookup) {
132132
newContent.add(lastExpression);
133-
} else if (lastExpression instanceof Property) {
134-
List<PropertyLookup> names = ((Property) lastExpression).getNames();
133+
} else if (lastExpression instanceof Property property) {
134+
List<PropertyLookup> names = property.getNames();
135135
if (names.size() > 1) {
136136
throw new IllegalArgumentException("Cannot project nested properties!");
137137
}
138138
newContent.addAll(names);
139-
} else if (lastExpression instanceof AliasedExpression) {
140-
AliasedExpression aliasedExpression = (AliasedExpression) lastExpression;
139+
} else if (lastExpression instanceof AliasedExpression aliasedExpression) {
141140
newContent.add(KeyValueMapEntry.create(aliasedExpression.getAlias(), aliasedExpression));
142141
} else if (lastExpression instanceof KeyValueMapEntry) {
143142
newContent.add(lastExpression);
@@ -153,4 +152,9 @@ private static List<Expression> createNewContent(Object... content) {
153152
}
154153
return newContent;
155154
}
155+
156+
@Override
157+
public String toString() {
158+
return RendererBridge.render(this);
159+
}
156160
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Match.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* @since 1.0
3838
*/
3939
@API(status = STABLE, since = "1.0")
40-
public final class Match implements ReadingClause {
40+
public final class Match extends AbstractClause implements ReadingClause {
4141

4242
private final boolean optional;
4343

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/Merge.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* @since 1.0
3838
*/
3939
@API(status = STABLE, since = "1.0")
40-
public final class Merge implements UpdatingClause {
40+
public final class Merge extends AbstractClause implements UpdatingClause {
4141

4242
/**
4343
* A literal for the blank.
@@ -81,4 +81,3 @@ public void accept(Visitor visitor) {
8181
visitor.leave(this);
8282
}
8383
}
84-

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/MergeAction.java

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
@API(status = STABLE, since = "2020.1.2")
4242
public final class MergeAction implements Visitable {
4343

44+
@Override
45+
public String toString() {
46+
return RendererBridge.render(this);
47+
}
48+
4449
/**
4550
* The type of the action.
4651
*/

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/MultiPartElement.java

+5
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public void accept(Visitor visitor) {
5454
with.accept(visitor);
5555
visitor.leave(this);
5656
}
57+
58+
@Override
59+
public String toString() {
60+
return RendererBridge.render(this);
61+
}
5762
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/NestedExpression.java

+5
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ public void accept(Visitor visitor) {
4343
Expressions.nameOrExpression(this.delegate).accept(visitor);
4444
visitor.leave(this);
4545
}
46+
47+
@Override
48+
public String toString() {
49+
return RendererBridge.render(this);
50+
}
4651
}

neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/NodeLabels.java

+4
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,8 @@ public void accept(Visitor visitor) {
4747
values.forEach(value -> value.accept(visitor));
4848
visitor.leave(this);
4949
}
50+
51+
public String toString() {
52+
return RendererBridge.render(this);
53+
}
5054
}

0 commit comments

Comments
 (0)