Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>6.1.0-SNAPSHOT</version>
<version>6.1.0-GH-2159-SNAPSHOT</version>

<name>Spring Data Neo4j</name>
<description>Next generation Object-Graph-Mapping for Spring Data.</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,14 @@ public abstract class AbstractNeo4jConfig extends Neo4jConfigurationSupport {
* @return A imperative Neo4j client.
*/
@Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_CLIENT_BEAN_NAME)
public Neo4jClient neo4jClient(Driver driver) {
return Neo4jClient.create(driver);
public Neo4jClient neo4jClient(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {
return Neo4jClient.create(driver, databaseSelectionProvider);
}

@Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_TEMPLATE_BEAN_NAME)
public Neo4jOperations neo4jTemplate(final Neo4jClient neo4jClient, final Neo4jMappingContext mappingContext,
DatabaseSelectionProvider databaseNameProvider) {
public Neo4jOperations neo4jTemplate(final Neo4jClient neo4jClient, final Neo4jMappingContext mappingContext) {

return new Neo4jTemplate(neo4jClient, mappingContext, databaseNameProvider);
return new Neo4jTemplate(neo4jClient, mappingContext);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ public ReactiveNeo4jClient neo4jClient(Driver driver) {

@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_NEO4J_TEMPLATE_BEAN_NAME)
public ReactiveNeo4jTemplate neo4jTemplate(final ReactiveNeo4jClient neo4jClient,
final Neo4jMappingContext mappingContext, final ReactiveDatabaseSelectionProvider databaseNameProvider) {
final Neo4jMappingContext mappingContext) {

return new ReactiveNeo4jTemplate(neo4jClient, mappingContext, databaseNameProvider);
return new ReactiveNeo4jTemplate(neo4jClient, mappingContext);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,6 @@
*/
package org.springframework.data.neo4j.config;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.inject.Singleton;

import org.apiguardian.api.API;
import org.neo4j.driver.Driver;
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
Expand All @@ -32,6 +26,12 @@
import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.inject.Singleton;

/**
* Support class that can be used as is for all necessary CDI beans or as a blueprint for custom producers.
*
Expand Down Expand Up @@ -66,10 +66,9 @@ public DatabaseSelectionProvider databaseSelectionProvider() {
@Produces @Builtin @Singleton
public Neo4jOperations neo4jOperations(
@Any Instance<Neo4jClient> neo4jClient,
@Any Instance<Neo4jMappingContext> mappingContext,
@Any Instance<DatabaseSelectionProvider> databaseNameProvider
@Any Instance<Neo4jMappingContext> mappingContext
) {
return new Neo4jTemplate(resolve(neo4jClient), resolve(mappingContext), resolve(databaseNameProvider));
return new Neo4jTemplate(resolve(neo4jClient), resolve(mappingContext));
}

@Produces @Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,15 @@ class DefaultNeo4jClient implements Neo4jClient {

private final Driver driver;
private final TypeSystem typeSystem;
private final DatabaseSelectionProvider databaseSelectionProvider;
private final ConversionService conversionService;
private final Neo4jPersistenceExceptionTranslator persistenceExceptionTranslator = new Neo4jPersistenceExceptionTranslator();

DefaultNeo4jClient(Driver driver) {
DefaultNeo4jClient(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {

this.driver = driver;
this.typeSystem = driver.defaultTypeSystem();
this.databaseSelectionProvider = databaseSelectionProvider;

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

DefaultRecordFetchSpec(String targetDatabase, RunnableStatement runnableStatement,
BiFunction<TypeSystem, Record, T> mappingFunction) {
this.targetDatabase = targetDatabase;
this.targetDatabase = targetDatabase != null
? targetDatabase
: databaseSelectionProvider != null
? databaseSelectionProvider.getDatabaseSelection().getValue()
: null;
this.runnableStatement = runnableStatement;
this.mappingFunction = mappingFunction;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,6 @@
*/
package org.springframework.data.neo4j.core;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple2;

import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.reactive.RxQueryRunner;
Expand All @@ -41,6 +32,14 @@
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple2;

import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

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

private final Driver driver;
private final TypeSystem typeSystem;
private final ReactiveDatabaseSelectionProvider databaseSelectionProvider;
private final ConversionService conversionService;
private final Neo4jPersistenceExceptionTranslator persistenceExceptionTranslator = new Neo4jPersistenceExceptionTranslator();

DefaultReactiveNeo4jClient(Driver driver) {
DefaultReactiveNeo4jClient(Driver driver, @Nullable ReactiveDatabaseSelectionProvider databaseSelectionProvider) {

this.driver = driver;
this.typeSystem = driver.defaultTypeSystem();
this.databaseSelectionProvider = databaseSelectionProvider;
this.conversionService = new DefaultConversionService();
new Neo4jConversions().registerConvertersIn((ConverterRegistry) conversionService);
}
Expand Down Expand Up @@ -180,7 +181,7 @@ public Mono<ResultSummary> run() {

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

private final String targetDatabase;
private final Mono<DatabaseSelection> targetDatabase;

private final Supplier<String> cypherSupplier;

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

DefaultRecordFetchSpec(String targetDatabase, Supplier<String> cypherSupplier, NamedParameters parameters,
DefaultRecordFetchSpec(@Nullable String targetDatabase, Supplier<String> cypherSupplier, NamedParameters parameters,
@Nullable BiFunction<TypeSystem, Record, T> mappingFunction) {
this.targetDatabase = targetDatabase;

this.targetDatabase = Mono.defer(() -> {
if (targetDatabase != null) {
return ReactiveDatabaseSelectionProvider.createStaticDatabaseSelectionProvider(targetDatabase)
.getDatabaseSelection();
} else if (databaseSelectionProvider != null) {
return databaseSelectionProvider.getDatabaseSelection();
}
return Mono.just(DatabaseSelection.undecided());
});
this.cypherSupplier = cypherSupplier;
this.parameters = parameters;
this.mappingFunction = mappingFunction;
Expand Down Expand Up @@ -229,33 +239,36 @@ Flux<T> executeWith(Tuple2<String, Map<String, Object>> t, RxQueryRunner runner)
@Override
public Mono<T> one() {

return doInQueryRunnerForMono(targetDatabase,
(runner) -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).singleOrEmpty())
return targetDatabase.flatMap(databaseSelection -> doInQueryRunnerForMono(databaseSelection.getValue(),
(runner) -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).singleOrEmpty()))
.onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
}

@Override
public Mono<T> first() {

return doInQueryRunnerForMono(targetDatabase,
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).next())
return targetDatabase.flatMap(databaseSelection -> doInQueryRunnerForMono(databaseSelection.getValue(),
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner)).next()))
.onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
}

@Override
public Flux<T> all() {

return doInStatementRunnerForFlux(targetDatabase,
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner))).onErrorMap(RuntimeException.class,
DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
return targetDatabase.flatMapMany(databaseSelection ->
doInStatementRunnerForFlux(databaseSelection.getValue(),
runner -> prepareStatement().flatMapMany(t -> executeWith(t, runner)))
)
.onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
}

Mono<ResultSummary> run() {

return doInQueryRunnerForMono(targetDatabase, runner -> prepareStatement().flatMap(t -> {
RxResult rxResult = runner.run(t.getT1(), t.getT2());
return Flux.from(rxResult.records()).then(Mono.from(rxResult.consume()).map(ResultSummaries::process));
})).onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
return targetDatabase.flatMap(databaseSelection ->
doInQueryRunnerForMono(databaseSelection.getValue(), runner -> prepareStatement().flatMap(t -> {
RxResult rxResult = runner.run(t.getT1(), t.getT2());
return Flux.from(rxResult.records()).then(Mono.from(rxResult.consume()).map(ResultSummaries::process));
}))).onErrorMap(RuntimeException.class, DefaultReactiveNeo4jClient.this::potentiallyConvertRuntimeException);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,12 @@ public interface Neo4jClient {

static Neo4jClient create(Driver driver) {

return new DefaultNeo4jClient(driver);
return new DefaultNeo4jClient(driver, null);
}

static Neo4jClient create(Driver driver, DatabaseSelectionProvider databaseSelectionProvider) {

return new DefaultNeo4jClient(driver, databaseSelectionProvider);
}

/**
Expand Down
Loading