Skip to content

Commit 210f209

Browse files
committed
GH-2159 - Neo4jClient support for database selection.
This also eliminates the need for the database selection definition in the (Reactive)Neo4jTemplate.
1 parent dbf2859 commit 210f209

14 files changed

+228
-181
lines changed

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,14 @@ public abstract class AbstractNeo4jConfig extends Neo4jConfigurationSupport {
5454
* @return A imperative Neo4j client.
5555
*/
5656
@Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_CLIENT_BEAN_NAME)
57-
public Neo4jClient neo4jClient(Driver driver) {
58-
return Neo4jClient.create(driver);
57+
public Neo4jClient neo4jClient(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {
58+
return Neo4jClient.create(driver, databaseSelectionProvider);
5959
}
6060

6161
@Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_TEMPLATE_BEAN_NAME)
62-
public Neo4jOperations neo4jTemplate(final Neo4jClient neo4jClient, final Neo4jMappingContext mappingContext,
63-
DatabaseSelectionProvider databaseNameProvider) {
62+
public Neo4jOperations neo4jTemplate(final Neo4jClient neo4jClient, final Neo4jMappingContext mappingContext) {
6463

65-
return new Neo4jTemplate(neo4jClient, mappingContext, databaseNameProvider);
64+
return new Neo4jTemplate(neo4jClient, mappingContext);
6665
}
6766

6867
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ public ReactiveNeo4jClient neo4jClient(Driver driver) {
6060

6161
@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_TEMPLATE_BEAN_NAME)
6262
public ReactiveNeo4jTemplate neo4jTemplate(final ReactiveNeo4jClient neo4jClient,
63-
final Neo4jMappingContext mappingContext, final ReactiveDatabaseSelectionProvider databaseNameProvider) {
63+
final Neo4jMappingContext mappingContext) {
6464

65-
return new ReactiveNeo4jTemplate(neo4jClient, mappingContext, databaseNameProvider);
65+
return new ReactiveNeo4jTemplate(neo4jClient, mappingContext);
6666
}
6767

6868
/**

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

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

18-
import javax.enterprise.context.ApplicationScoped;
19-
import javax.enterprise.inject.Any;
20-
import javax.enterprise.inject.Instance;
21-
import javax.enterprise.inject.Produces;
22-
import javax.inject.Singleton;
23-
2418
import org.apiguardian.api.API;
2519
import org.neo4j.driver.Driver;
2620
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
@@ -32,6 +26,12 @@
3226
import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager;
3327
import org.springframework.transaction.PlatformTransactionManager;
3428

29+
import javax.enterprise.context.ApplicationScoped;
30+
import javax.enterprise.inject.Any;
31+
import javax.enterprise.inject.Instance;
32+
import javax.enterprise.inject.Produces;
33+
import javax.inject.Singleton;
34+
3535
/**
3636
* Support class that can be used as is for all necessary CDI beans or as a blueprint for custom producers.
3737
*
@@ -66,10 +66,9 @@ public DatabaseSelectionProvider databaseSelectionProvider() {
6666
@Produces @Builtin @Singleton
6767
public Neo4jOperations neo4jOperations(
6868
@Any Instance<Neo4jClient> neo4jClient,
69-
@Any Instance<Neo4jMappingContext> mappingContext,
70-
@Any Instance<DatabaseSelectionProvider> databaseNameProvider
69+
@Any Instance<Neo4jMappingContext> mappingContext
7170
) {
72-
return new Neo4jTemplate(resolve(neo4jClient), resolve(mappingContext), resolve(databaseNameProvider));
71+
return new Neo4jTemplate(resolve(neo4jClient), resolve(mappingContext));
7372
}
7473

7574
@Produces @Singleton

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,15 @@ class DefaultNeo4jClient implements Neo4jClient {
5656

5757
private final Driver driver;
5858
private final TypeSystem typeSystem;
59+
private final DatabaseSelectionProvider databaseSelectionProvider;
5960
private final ConversionService conversionService;
6061
private final Neo4jPersistenceExceptionTranslator persistenceExceptionTranslator = new Neo4jPersistenceExceptionTranslator();
6162

62-
DefaultNeo4jClient(Driver driver) {
63+
DefaultNeo4jClient(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {
6364

6465
this.driver = driver;
6566
this.typeSystem = driver.defaultTypeSystem();
67+
this.databaseSelectionProvider = databaseSelectionProvider;
6668

6769
this.conversionService = new DefaultConversionService();
6870
new Neo4jConversions().registerConvertersIn((ConverterRegistry) conversionService);
@@ -262,7 +264,11 @@ class DefaultRecordFetchSpec<T> implements RecordFetchSpec<T>, MappingSpec<T> {
262264

263265
DefaultRecordFetchSpec(String targetDatabase, RunnableStatement runnableStatement,
264266
BiFunction<TypeSystem, Record, T> mappingFunction) {
265-
this.targetDatabase = targetDatabase;
267+
this.targetDatabase = targetDatabase != null
268+
? targetDatabase
269+
: databaseSelectionProvider != null
270+
? databaseSelectionProvider.getDatabaseSelection().getValue()
271+
: null;
266272
this.runnableStatement = runnableStatement;
267273
this.mappingFunction = mappingFunction;
268274
}

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

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,6 @@
1515
*/
1616
package org.springframework.data.neo4j.core;
1717

18-
import reactor.core.publisher.Flux;
19-
import reactor.core.publisher.Mono;
20-
import reactor.util.function.Tuple2;
21-
22-
import java.util.Map;
23-
import java.util.function.BiFunction;
24-
import java.util.function.Function;
25-
import java.util.function.Supplier;
26-
2718
import org.neo4j.driver.Driver;
2819
import org.neo4j.driver.Record;
2920
import org.neo4j.driver.reactive.RxQueryRunner;
@@ -41,6 +32,14 @@
4132
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;
4233
import org.springframework.lang.Nullable;
4334
import org.springframework.util.Assert;
35+
import reactor.core.publisher.Flux;
36+
import reactor.core.publisher.Mono;
37+
import reactor.util.function.Tuple2;
38+
39+
import java.util.Map;
40+
import java.util.function.BiFunction;
41+
import java.util.function.Function;
42+
import java.util.function.Supplier;
4443

4544
/**
4645
* Reactive variant of the {@link Neo4jClient}.
@@ -54,13 +53,15 @@ class DefaultReactiveNeo4jClient implements ReactiveNeo4jClient {
5453

5554
private final Driver driver;
5655
private final TypeSystem typeSystem;
56+
private final ReactiveDatabaseSelectionProvider databaseSelectionProvider;
5757
private final ConversionService conversionService;
5858
private final Neo4jPersistenceExceptionTranslator persistenceExceptionTranslator = new Neo4jPersistenceExceptionTranslator();
5959

60-
DefaultReactiveNeo4jClient(Driver driver) {
60+
DefaultReactiveNeo4jClient(Driver driver, @Nullable ReactiveDatabaseSelectionProvider databaseSelectionProvider) {
6161

6262
this.driver = driver;
6363
this.typeSystem = driver.defaultTypeSystem();
64+
this.databaseSelectionProvider = databaseSelectionProvider;
6465
this.conversionService = new DefaultConversionService();
6566
new Neo4jConversions().registerConvertersIn((ConverterRegistry) conversionService);
6667
}
@@ -180,7 +181,7 @@ public Mono<ResultSummary> run() {
180181

181182
class DefaultRecordFetchSpec<T> implements RecordFetchSpec<T>, MappingSpec<T> {
182183

183-
private final String targetDatabase;
184+
private final Mono<DatabaseSelection> targetDatabase;
184185

185186
private final Supplier<String> cypherSupplier;
186187

@@ -192,9 +193,18 @@ class DefaultRecordFetchSpec<T> implements RecordFetchSpec<T>, MappingSpec<T> {
192193
this(targetDatabase, cypherSupplier, parameters, null);
193194
}
194195

195-
DefaultRecordFetchSpec(String targetDatabase, Supplier<String> cypherSupplier, NamedParameters parameters,
196+
DefaultRecordFetchSpec(@Nullable String targetDatabase, Supplier<String> cypherSupplier, NamedParameters parameters,
196197
@Nullable BiFunction<TypeSystem, Record, T> mappingFunction) {
197-
this.targetDatabase = targetDatabase;
198+
199+
this.targetDatabase = Mono.defer(() -> {
200+
if (targetDatabase != null) {
201+
return ReactiveDatabaseSelectionProvider.createStaticDatabaseSelectionProvider(targetDatabase)
202+
.getDatabaseSelection();
203+
} else if (databaseSelectionProvider != null) {
204+
return databaseSelectionProvider.getDatabaseSelection();
205+
}
206+
return Mono.just(DatabaseSelection.undecided());
207+
});
198208
this.cypherSupplier = cypherSupplier;
199209
this.parameters = parameters;
200210
this.mappingFunction = mappingFunction;
@@ -229,33 +239,36 @@ Flux<T> executeWith(Tuple2<String, Map<String, Object>> t, RxQueryRunner runner)
229239
@Override
230240
public Mono<T> one() {
231241

232-
return doInQueryRunnerForMono(targetDatabase,
233-
(runner) -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).singleOrEmpty())
242+
return targetDatabase.flatMap(databaseSelection -> doInQueryRunnerForMono(databaseSelection.getValue(),
243+
(runner) -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).singleOrEmpty()))
234244
.onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
235245
}
236246

237247
@Override
238248
public Mono<T> first() {
239249

240-
return doInQueryRunnerForMono(targetDatabase,
241-
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).next())
250+
return targetDatabase.flatMap(databaseSelection -> doInQueryRunnerForMono(databaseSelection.getValue(),
251+
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).next()))
242252
.onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
243253
}
244254

245255
@Override
246256
public Flux<T> all() {
247257

248-
return doInStatementRunnerForFlux(targetDatabase,
249-
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner))).onErrorMap(RuntimeException.class,
250-
DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
258+
return targetDatabase.flatMapMany(databaseSelection ->
259+
doInStatementRunnerForFlux(databaseSelection.getValue(),
260+
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner)))
261+
)
262+
.onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
251263
}
252264

253265
Mono<ResultSummary> run() {
254266

255-
return doInQueryRunnerForMono(targetDatabase, runner -> prepareStatement().flatMap(t -> {
256-
RxResult rxResult = runner.run(t.getT1(), t.getT2());
257-
return Flux.from(rxResult.records()).then(Mono.from(rxResult.consume()).map(ResultSummaries::process));
258-
})).onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
267+
return targetDatabase.flatMap(databaseSelection ->
268+
doInQueryRunnerForMono(databaseSelection.getValue(), runner -> prepareStatement().flatMap(t -> {
269+
RxResult rxResult = runner.run(t.getT1(), t.getT2());
270+
return Flux.from(rxResult.records()).then(Mono.from(rxResult.consume()).map(ResultSummaries::process));
271+
}))).onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
259272
}
260273
}
261274

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ public interface Neo4jClient {
4848

4949
static Neo4jClient create(Driver driver) {
5050

51-
return new DefaultNeo4jClient(driver);
51+
return new DefaultNeo4jClient(driver, null);
52+
}
53+
54+
static Neo4jClient create(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {
55+
56+
return new DefaultNeo4jClient(driver, databaseSelectionProvider);
5257
}
5358

5459
/**

0 commit comments

Comments
 (0)