Skip to content

Commit f63af38

Browse files
committed
GH-2531 - Add Neo4j 5.0 Cypher support.
This provides also the support for defining a CypherDSL configuration bean.
1 parent b6fddaa commit f63af38

File tree

92 files changed

+732
-186
lines changed

Some content is hidden

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

92 files changed

+732
-186
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
<cdi>3.0.1</cdi>
7777
<checkstyle.skip>${skipTests}</checkstyle.skip>
7878
<checkstyle.version>8.40</checkstyle.version>
79-
<cypher-dsl.version>2022.2.0</cypher-dsl.version>
79+
<cypher-dsl.version>2022.3.0</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/config/Neo4jCdiConfigurationSupport.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package org.springframework.data.neo4j.config;
1717

1818
import org.apiguardian.api.API;
19+
import org.neo4j.cypherdsl.core.renderer.Configuration;
20+
import org.neo4j.cypherdsl.core.renderer.Renderer;
1921
import org.neo4j.driver.Driver;
2022
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
2123
import org.springframework.data.neo4j.core.Neo4jClient;
@@ -63,12 +65,20 @@ public DatabaseSelectionProvider databaseSelectionProvider() {
6365
return DatabaseSelectionProvider.getDefaultSelectionProvider();
6466
}
6567

68+
@Produces @Builtin @Singleton
69+
public Configuration cypherDslConfiguration() {
70+
return Configuration.defaultConfig();
71+
}
72+
6673
@Produces @Builtin @Singleton
6774
public Neo4jOperations neo4jOperations(
6875
@Any Instance<Neo4jClient> neo4jClient,
69-
@Any Instance<Neo4jMappingContext> mappingContext
76+
@Any Instance<Neo4jMappingContext> mappingContext,
77+
@Any Instance<Configuration> cypherDslConfiguration
7078
) {
71-
return new Neo4jTemplate(resolve(neo4jClient), resolve(mappingContext));
79+
Neo4jTemplate neo4jTemplate = new Neo4jTemplate(resolve(neo4jClient), resolve(mappingContext));
80+
neo4jTemplate.setCypherRenderer(Renderer.getRenderer(resolve(cypherDslConfiguration)));
81+
return neo4jTemplate;
7282
}
7383

7484
@Produces @Singleton

src/main/java/org/springframework/data/neo4j/config/Neo4jConfigurationSupport.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Set;
2121

2222
import org.apiguardian.api.API;
23+
import org.neo4j.cypherdsl.core.renderer.Configuration;
2324
import org.springframework.context.annotation.Bean;
2425
import org.springframework.data.neo4j.core.convert.Neo4jConversions;
2526
import org.springframework.data.neo4j.core.mapping.Neo4jMappingContext;
@@ -42,6 +43,11 @@ public Neo4jConversions neo4jConversions() {
4243
return new Neo4jConversions();
4344
}
4445

46+
@Bean
47+
public Configuration cypherDslConfiguration() {
48+
return Configuration.defaultConfig();
49+
}
50+
4551
/**
4652
* Creates a {@link Neo4jMappingContext} equipped with entity classes scanned from the mapping base package.
4753
*

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.neo4j.cypherdsl.core.Functions;
4646
import org.neo4j.cypherdsl.core.Node;
4747
import org.neo4j.cypherdsl.core.Statement;
48+
import org.neo4j.cypherdsl.core.renderer.Configuration;
4849
import org.neo4j.cypherdsl.core.renderer.Renderer;
4950
import org.neo4j.driver.Value;
5051
import org.neo4j.driver.exceptions.NoSuchRecordException;
@@ -110,8 +111,6 @@ public final class Neo4jTemplate implements
110111

111112
private static final String OPTIMISTIC_LOCKING_ERROR_MESSAGE = "An entity with the required version does not exist.";
112113

113-
private static final Renderer renderer = Renderer.getDefaultRenderer();
114-
115114
private final Neo4jClient neo4jClient;
116115

117116
private final Neo4jMappingContext neo4jMappingContext;
@@ -124,6 +123,8 @@ public final class Neo4jTemplate implements
124123

125124
private ProjectionFactory projectionFactory;
126125

126+
private Renderer renderer;
127+
127128
public Neo4jTemplate(Neo4jClient neo4jClient) {
128129
this(neo4jClient, new Neo4jMappingContext());
129130
}
@@ -899,6 +900,16 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
899900
spelAwareProxyProjectionFactory.setBeanClassLoader(beanClassLoader);
900901
spelAwareProxyProjectionFactory.setBeanFactory(beanFactory);
901902
this.projectionFactory = spelAwareProxyProjectionFactory;
903+
904+
Configuration cypherDslConfiguration = beanFactory
905+
.getBeanProvider(Configuration.class)
906+
.getIfAvailable(Configuration::defaultConfig);
907+
this.renderer = Renderer.getRenderer(cypherDslConfiguration);
908+
}
909+
910+
// only used for the CDI configuration
911+
public void setCypherRenderer(Renderer rendererFromCdiConfiguration) {
912+
this.renderer = rendererFromCdiConfiguration;
902913
}
903914

904915
@Override

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.neo4j.cypherdsl.core.Cypher.asterisk;
2020
import static org.neo4j.cypherdsl.core.Cypher.parameter;
2121

22+
import org.neo4j.cypherdsl.core.renderer.Configuration;
2223
import org.springframework.data.mapping.Association;
2324
import org.springframework.data.neo4j.core.TemplateSupport.FilteredBinderFunction;
2425
import org.springframework.data.neo4j.core.mapping.AssociationHandlerSupport;
@@ -112,7 +113,6 @@ public final class ReactiveNeo4jTemplate implements
112113

113114
private static final String OPTIMISTIC_LOCKING_ERROR_MESSAGE = "An entity with the required version does not exist.";
114115

115-
private static final Renderer renderer = Renderer.getDefaultRenderer();
116116
private static final String CONTEXT_RELATIONSHIP_HANDLER = "RELATIONSHIP_HANDLER";
117117

118118
private final ReactiveNeo4jClient neo4jClient;
@@ -127,6 +127,8 @@ public final class ReactiveNeo4jTemplate implements
127127

128128
private ProjectionFactory projectionFactory;
129129

130+
private Renderer renderer;
131+
130132
public ReactiveNeo4jTemplate(ReactiveNeo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext) {
131133

132134
Assert.notNull(neo4jClient, "The Neo4jClient is required");
@@ -1109,6 +1111,11 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
11091111
spelAwareProxyProjectionFactory.setBeanClassLoader(beanClassLoader);
11101112
spelAwareProxyProjectionFactory.setBeanFactory(beanFactory);
11111113
this.projectionFactory = spelAwareProxyProjectionFactory;
1114+
1115+
Configuration cypherDslConfiguration = beanFactory
1116+
.getBeanProvider(Configuration.class)
1117+
.getIfAvailable(Configuration::defaultConfig);
1118+
this.renderer = Renderer.getRenderer(cypherDslConfiguration);
11121119
}
11131120

11141121
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.neo4j.cypherdsl.core.StatementBuilder.OngoingMatchAndUpdate;
5353
import org.neo4j.cypherdsl.core.StatementBuilder.OngoingUpdate;
5454
import org.neo4j.cypherdsl.core.SymbolicName;
55+
import org.neo4j.cypherdsl.core.renderer.Configuration;
5556
import org.neo4j.cypherdsl.core.renderer.Renderer;
5657
import org.springframework.data.domain.Sort;
5758
import org.springframework.data.mapping.MappingException;
@@ -503,7 +504,8 @@ public Collection<Expression> createReturnStatementForMatch(Neo4jPersistentEntit
503504
return order.isAscending() ? expression.ascending() : expression.descending();
504505
}).toArray(SortItem[]::new))
505506
.build();
506-
String renderedStatement = Renderer.getDefaultRenderer().render(statement);
507+
508+
String renderedStatement = Renderer.getRenderer(Configuration.defaultConfig()).render(statement);
507509
return renderedStatement.substring(renderedStatement.indexOf("ORDER BY")).trim();
508510
}
509511

src/test/java/org/springframework/data/neo4j/documentation/repositories/custom_queries/CustomQueriesIT.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.springframework.beans.factory.annotation.Autowired;
3030
import org.springframework.context.annotation.Bean;
3131
import org.springframework.context.annotation.Configuration;
32-
import org.springframework.data.neo4j.config.AbstractNeo4jConfig;
3332
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
3433
import org.springframework.data.neo4j.core.transaction.Neo4jBookmarkManager;
3534
import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager;
@@ -40,6 +39,7 @@
4039
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
4140
import org.springframework.data.neo4j.test.BookmarkCapture;
4241
import org.springframework.data.neo4j.test.Neo4jExtension;
42+
import org.springframework.data.neo4j.test.Neo4jImperativeTestConfiguration;
4343
import org.springframework.data.neo4j.test.Neo4jIntegrationTest;
4444
import org.springframework.transaction.PlatformTransactionManager;
4545
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -93,7 +93,7 @@ interface PersonRepository extends Neo4jRepository<PersonEntity, String> {
9393
@Configuration
9494
@EnableTransactionManagement
9595
@EnableNeo4jRepositories(considerNestedRepositories = true)
96-
static class Config extends AbstractNeo4jConfig {
96+
static class Config extends Neo4jImperativeTestConfiguration {
9797

9898
@Bean
9999
@Override
@@ -117,5 +117,10 @@ public PlatformTransactionManager transactionManager(Driver driver, DatabaseSele
117117
BookmarkCapture bookmarkCapture = bookmarkCapture();
118118
return new Neo4jTransactionManager(driver, databaseNameProvider, Neo4jBookmarkManager.create(bookmarkCapture));
119119
}
120+
121+
@Override
122+
public boolean isCypher5Compatible() {
123+
return neo4jConnectionSupport.isCypher5SyntaxCompatible();
124+
}
120125
}
121126
}

src/test/java/org/springframework/data/neo4j/integration/conversion_imperative/CustomTypesIT.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import org.springframework.context.annotation.Bean;
4040
import org.springframework.context.annotation.Configuration;
4141
import org.springframework.core.convert.converter.GenericConverter;
42-
import org.springframework.data.neo4j.config.AbstractNeo4jConfig;
42+
import org.springframework.data.neo4j.test.Neo4jImperativeTestConfiguration;
4343
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
4444
import org.springframework.data.neo4j.core.Neo4jOperations;
4545
import org.springframework.data.neo4j.core.convert.Neo4jConversions;
@@ -239,7 +239,7 @@ ThingWithCustomTypes findByCustomTypeSpELObjectQuery(
239239
@Configuration
240240
@EnableTransactionManagement
241241
@EnableNeo4jRepositories(considerNestedRepositories = true)
242-
static class Config extends AbstractNeo4jConfig {
242+
static class Config extends Neo4jImperativeTestConfiguration {
243243

244244
@Bean
245245
@Override
@@ -274,5 +274,10 @@ public PlatformTransactionManager transactionManager(Driver driver, DatabaseSele
274274
BookmarkCapture bookmarkCapture = bookmarkCapture();
275275
return new Neo4jTransactionManager(driver, databaseNameProvider, Neo4jBookmarkManager.create(bookmarkCapture));
276276
}
277+
278+
@Override
279+
public boolean isCypher5Compatible() {
280+
return neo4jConnectionSupport.isCypher5SyntaxCompatible();
281+
}
277282
}
278283
}

src/test/java/org/springframework/data/neo4j/integration/conversion_imperative/ImperativeCompositePropertiesIT.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.springframework.beans.factory.annotation.Autowired;
2828
import org.springframework.context.annotation.Bean;
2929
import org.springframework.context.annotation.Configuration;
30-
import org.springframework.data.neo4j.config.AbstractNeo4jConfig;
3130
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
3231
import org.springframework.data.neo4j.core.Neo4jTemplate;
3332
import org.springframework.data.neo4j.core.convert.Neo4jConversions;
@@ -40,6 +39,7 @@
4039
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
4140
import org.springframework.data.neo4j.test.BookmarkCapture;
4241
import org.springframework.data.neo4j.test.Neo4jExtension;
42+
import org.springframework.data.neo4j.test.Neo4jImperativeTestConfiguration;
4343
import org.springframework.data.neo4j.test.Neo4jIntegrationTest;
4444
import org.springframework.transaction.PlatformTransactionManager;
4545
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -141,7 +141,7 @@ public interface Repository extends Neo4jRepository<ThingWithCompositeProperties
141141
@Configuration
142142
@EnableNeo4jRepositories(considerNestedRepositories = true)
143143
@EnableTransactionManagement
144-
static class Config extends AbstractNeo4jConfig {
144+
static class Config extends Neo4jImperativeTestConfiguration {
145145

146146
@Bean
147147
public Driver driver() {
@@ -164,5 +164,10 @@ public PlatformTransactionManager transactionManager(Driver driver, DatabaseSele
164164
BookmarkCapture bookmarkCapture = bookmarkCapture();
165165
return new Neo4jTransactionManager(driver, databaseNameProvider, Neo4jBookmarkManager.create(bookmarkCapture));
166166
}
167+
168+
@Override
169+
public boolean isCypher5Compatible() {
170+
return neo4jConnectionSupport.isCypher5SyntaxCompatible();
171+
}
167172
}
168173
}

src/test/java/org/springframework/data/neo4j/integration/conversion_imperative/TypeConversionIT.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import org.springframework.core.convert.ConversionService;
5252
import org.springframework.core.convert.support.DefaultConversionService;
5353
import org.springframework.data.mapping.MappingException;
54-
import org.springframework.data.neo4j.config.AbstractNeo4jConfig;
5554
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
5655
import org.springframework.data.neo4j.core.Neo4jTemplate;
5756
import org.springframework.data.neo4j.core.convert.Neo4jConversions;
@@ -68,6 +67,7 @@
6867
import org.springframework.data.neo4j.repository.Neo4jRepository;
6968
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
7069
import org.springframework.data.neo4j.test.BookmarkCapture;
70+
import org.springframework.data.neo4j.test.Neo4jImperativeTestConfiguration;
7171
import org.springframework.data.neo4j.test.Neo4jIntegrationTest;
7272
import org.springframework.test.util.ReflectionTestUtils;
7373
import org.springframework.transaction.PlatformTransactionManager;
@@ -296,7 +296,7 @@ public interface CustomTypesRepository extends Neo4jRepository<ThingWithCustomTy
296296
@Configuration
297297
@EnableNeo4jRepositories(considerNestedRepositories = true)
298298
@EnableTransactionManagement
299-
static class Config extends AbstractNeo4jConfig {
299+
static class Config extends Neo4jImperativeTestConfiguration {
300300

301301
@Bean
302302
public Driver driver() {
@@ -319,5 +319,10 @@ public PlatformTransactionManager transactionManager(Driver driver, DatabaseSele
319319
BookmarkCapture bookmarkCapture = bookmarkCapture();
320320
return new Neo4jTransactionManager(driver, databaseNameProvider, Neo4jBookmarkManager.create(bookmarkCapture));
321321
}
322+
323+
@Override
324+
public boolean isCypher5Compatible() {
325+
return neo4jConnectionSupport.isCypher5SyntaxCompatible();
326+
}
322327
}
323328
}

0 commit comments

Comments
 (0)