Skip to content

Commit f799eb7

Browse files
committed
Keep API compatible after DBSelection changes.
Deprecate old constuctors and throw an exception if there is a mismatch of the provided DatabaseSelectionProviders.
1 parent 494f663 commit f799eb7

File tree

7 files changed

+84
-20
lines changed

7 files changed

+84
-20
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public abstract class AbstractReactiveNeo4jConfig extends Neo4jConfigurationSupp
5454
* @return A reactive Neo4j client.
5555
*/
5656
@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_CLIENT_BEAN_NAME)
57-
public ReactiveNeo4jClient neo4jClient(Driver driver) {
58-
return ReactiveNeo4jClient.create(driver);
57+
public ReactiveNeo4jClient neo4jClient(Driver driver, ReactiveDatabaseSelectionProvider databaseNameProvider) {
58+
return ReactiveNeo4jClient.create(driver, databaseNameProvider);
5959
}
6060

6161
@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_TEMPLATE_BEAN_NAME)

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ public <T> OngoingDelegation<T> delegateTo(Function<QueryRunner, Optional<T>> ca
129129
return new DefaultRunnableDelegation<>(callback);
130130
}
131131

132+
@Override
133+
public DatabaseSelectionProvider getDatabaseSelectionProvider() {
134+
return databaseSelectionProvider;
135+
}
136+
132137
/**
133138
* Basically a holder of a cypher template supplier and a set of named parameters. It's main purpose is to orchestrate
134139
* the running of things with a bit of logging.
@@ -262,17 +267,27 @@ class DefaultRecordFetchSpec<T> implements RecordFetchSpec<T>, MappingSpec<T> {
262267

263268
private BiFunction<TypeSystem, Record, T> mappingFunction;
264269

265-
DefaultRecordFetchSpec(String targetDatabase, RunnableStatement runnableStatement,
270+
DefaultRecordFetchSpec(String parameterTargetDatabase, RunnableStatement runnableStatement,
266271
BiFunction<TypeSystem, Record, T> mappingFunction) {
267-
this.targetDatabase = targetDatabase != null
268-
? targetDatabase
269-
: databaseSelectionProvider != null
270-
? databaseSelectionProvider.getDatabaseSelection().getValue()
271-
: null;
272+
273+
this.targetDatabase = resolveTargetDatabaseName(parameterTargetDatabase);
272274
this.runnableStatement = runnableStatement;
273275
this.mappingFunction = mappingFunction;
274276
}
275277

278+
private String resolveTargetDatabaseName(@Nullable String parameterTargetDatabase) {
279+
if (parameterTargetDatabase != null) {
280+
return parameterTargetDatabase;
281+
}
282+
if (databaseSelectionProvider != null) {
283+
String databaseSelectionProviderValue = databaseSelectionProvider.getDatabaseSelection().getValue();
284+
if (databaseSelectionProviderValue != null) {
285+
return databaseSelectionProviderValue;
286+
}
287+
}
288+
return DatabaseSelectionProvider.getDefaultSelectionProvider().getDatabaseSelection().getValue();
289+
}
290+
276291
@Override
277292
public RecordFetchSpec<T> mappedBy(
278293
@SuppressWarnings("HiddenField") BiFunction<TypeSystem, Record, T> mappingFunction) {

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ public <T> OngoingDelegation<T> delegateTo(Function<RxQueryRunner, Mono<T>> call
105105
return new DefaultRunnableDelegation<>(callback);
106106
}
107107

108+
@Override
109+
public ReactiveDatabaseSelectionProvider getDatabaseSelectionProvider() {
110+
return databaseSelectionProvider;
111+
}
112+
108113
class DefaultRunnableSpec implements RunnableSpec {
109114

110115
private final Supplier<String> cypherSupplier;
@@ -193,18 +198,16 @@ class DefaultRecordFetchSpec<T> implements RecordFetchSpec<T>, MappingSpec<T> {
193198
this(targetDatabase, cypherSupplier, parameters, null);
194199
}
195200

196-
DefaultRecordFetchSpec(@Nullable String targetDatabase, Supplier<String> cypherSupplier, NamedParameters parameters,
201+
DefaultRecordFetchSpec(@Nullable String parameterTargetDatabase, Supplier<String> cypherSupplier, NamedParameters parameters,
197202
@Nullable BiFunction<TypeSystem, Record, T> mappingFunction) {
198203

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-
});
204+
this.targetDatabase = Mono.defer(() -> Mono
205+
.justOrEmpty(parameterTargetDatabase)
206+
.flatMap(db -> ReactiveDatabaseSelectionProvider.createStaticDatabaseSelectionProvider(db).getDatabaseSelection())
207+
.switchIfEmpty(databaseSelectionProvider == null
208+
? Mono.empty()
209+
: databaseSelectionProvider.getDatabaseSelection())
210+
.switchIfEmpty(Mono.just(DatabaseSelection.undecided())));
208211
this.cypherSupplier = cypherSupplier;
209212
this.parameters = parameters;
210213
this.mappingFunction = mappingFunction;

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

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

4949
static Neo4jClient create(Driver driver) {
5050

51-
return new DefaultNeo4jClient(driver, null);
51+
return new DefaultNeo4jClient(driver, DatabaseSelectionProvider.getDefaultSelectionProvider());
5252
}
5353

5454
static Neo4jClient create(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {
@@ -85,6 +85,13 @@ static Neo4jClient create(Driver driver, DatabaseSelectionProvider databaseSelec
8585
*/
8686
<T> OngoingDelegation<T> delegateTo(Function<QueryRunner, Optional<T>> callback);
8787

88+
/**
89+
* Returns the assigned database selection provider.
90+
*
91+
* @return The database selection provider - can be null
92+
*/
93+
DatabaseSelectionProvider getDatabaseSelectionProvider();
94+
8895
/**
8996
* Contract for a runnable query that can be either run returning it's result, run without results or be
9097
* parameterized.

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,35 @@ public final class Neo4jTemplate implements Neo4jOperations, BeanFactoryAware {
9898

9999
private EventSupport eventSupport;
100100

101+
@Deprecated
102+
public Neo4jTemplate(Neo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext,
103+
DatabaseSelectionProvider databaseSelectionProvider) {
104+
105+
this(neo4jClient, neo4jMappingContext, EntityCallbacks.create());
106+
107+
if (databaseSelectionProvider != neo4jClient.getDatabaseSelectionProvider()) {
108+
throw new IllegalStateException(
109+
"The provided database selection provider differs from the Neo4jClient's one.");
110+
}
111+
}
112+
113+
@Deprecated
114+
public Neo4jTemplate(Neo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext,
115+
DatabaseSelectionProvider databaseSelectionProvider, EntityCallbacks entityCallbacks) {
116+
117+
this(neo4jClient, neo4jMappingContext, entityCallbacks);
118+
119+
if (databaseSelectionProvider != neo4jClient.getDatabaseSelectionProvider()) {
120+
throw new IllegalStateException(
121+
"The provided database selection provider differs from the Neo4jClient's one.");
122+
}
123+
}
124+
101125
public Neo4jTemplate(Neo4jClient neo4jClient) {
102126
this(neo4jClient, new Neo4jMappingContext());
103127
}
104128

105129
public Neo4jTemplate(Neo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext) {
106-
107130
this(neo4jClient, neo4jMappingContext, EntityCallbacks.create());
108131
}
109132

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ static ReactiveNeo4jClient create(Driver driver, ReactiveDatabaseSelectionProvid
8585
*/
8686
<T> OngoingDelegation<T> delegateTo(Function<RxQueryRunner, Mono<T>> callback);
8787

88+
/**
89+
* Returns the assigned database selection provider.
90+
*
91+
* @return The database selection provider - can be null
92+
*/
93+
ReactiveDatabaseSelectionProvider getDatabaseSelectionProvider();
8894
/**
8995
* @param <T> The resulting type of this mapping
9096
* @since 6.0

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ public final class ReactiveNeo4jTemplate implements ReactiveNeo4jOperations, Bea
9898

9999
private ReactiveEventSupport eventSupport;
100100

101+
@Deprecated
102+
public ReactiveNeo4jTemplate(ReactiveNeo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext,
103+
ReactiveDatabaseSelectionProvider databaseSelectionProvider) {
104+
105+
this(neo4jClient, neo4jMappingContext);
106+
if (databaseSelectionProvider != neo4jClient.getDatabaseSelectionProvider()) {
107+
throw new IllegalStateException("The provided database selection provider differs from the ReactiveNeo4jClient's one.");
108+
}
109+
}
110+
101111
public ReactiveNeo4jTemplate(ReactiveNeo4jClient neo4jClient, Neo4jMappingContext neo4jMappingContext) {
102112

103113
Assert.notNull(neo4jClient, "The Neo4jClient is required");

0 commit comments

Comments
 (0)