diff --git a/pom.xml b/pom.xml
index aa91ab839..4884dfe50 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,7 +99,7 @@
${java.version}
${java.version}
2.23.4
- 2.0.0-alpha01
+ 2.0.0-alpha02
3.5.2
UTF-8
1.2.1
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultNeo4jClient.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultNeo4jClient.java
index a93e55fb8..dd69cbf71 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultNeo4jClient.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultNeo4jClient.java
@@ -39,7 +39,6 @@ import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
-import org.neo4j.driver.AccessMode;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.Session;
@@ -67,10 +66,7 @@ class DefaultNeo4jClient implements Neo4jClient {
DefaultNeo4jClient(Driver driver) {
this.driver = driver;
- // This will go away
- try (Session session = this.driver.session(t -> t.withDefaultAccessMode(AccessMode.READ))) {
- typeSystem = session.typeSystem();
- }
+ this.typeSystem = driver.defaultTypeSystem();
}
AutoCloseableStatementRunner getStatementRunner(final String targetDatabase) {
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultReactiveNeo4jClient.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultReactiveNeo4jClient.java
index 4afd95e46..fbf5185e6 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultReactiveNeo4jClient.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/DefaultReactiveNeo4jClient.java
@@ -33,10 +33,8 @@ import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
-import org.neo4j.driver.AccessMode;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
-import org.neo4j.driver.Session;
import org.neo4j.driver.exceptions.NoSuchRecordException;
import org.neo4j.driver.reactive.RxSession;
import org.neo4j.driver.reactive.RxStatementRunner;
@@ -68,10 +66,7 @@ class DefaultReactiveNeo4jClient implements ReactiveNeo4jClient {
DefaultReactiveNeo4jClient(Driver driver) {
this.driver = driver;
- // This will go away
- try (Session session = this.driver.session(t -> t.withDefaultAccessMode(AccessMode.READ))) {
- typeSystem = session.typeSystem();
- }
+ this.typeSystem = driver.defaultTypeSystem();
}
// Internal helper methods for managing transactional state
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jConnectionHolder.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jConnectionHolder.java
index a1cd8641a..a56319d33 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jConnectionHolder.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jConnectionHolder.java
@@ -18,11 +18,10 @@
*/
package org.springframework.data.neo4j.core.transaction;
-import java.util.Optional;
-
import org.neo4j.driver.Session;
import org.neo4j.driver.Transaction;
import org.neo4j.driver.TransactionConfig;
+import org.springframework.lang.Nullable;
import org.springframework.transaction.support.ResourceHolderSupport;
import org.springframework.util.Assert;
@@ -64,11 +63,9 @@ class Neo4jConnectionHolder extends ResourceHolderSupport {
return namesMapToTheSameDatabase(this.databaseName, inDatabase) ? transaction : null;
}
- static boolean namesMapToTheSameDatabase(String name1, String name2) {
- String d1 = Optional.ofNullable(name1).orElse(Neo4jTransactionUtils.DEFAULT_DATABASE_NAME);
- String d2 = Optional.ofNullable(name2).orElse(Neo4jTransactionUtils.DEFAULT_DATABASE_NAME);
+ static boolean namesMapToTheSameDatabase(@Nullable String name1, @Nullable String name2) {
- return d1.equals(d2);
+ return name1 == null && name2 == null || (name1 != null && name1.equals(name2));
}
void commit() {
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionManager.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionManager.java
index f6459e6ec..05fd789ea 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionManager.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionManager.java
@@ -53,10 +53,22 @@ import org.springframework.util.Assert;
@Slf4j
public class Neo4jTransactionManager extends AbstractPlatformTransactionManager {
+ /**
+ * The underlying driver, which is also the synchronisation object.
+ */
private final Driver driver;
+ /**
+ * The name of the target database.
+ */
+ private final String databaseName;
public Neo4jTransactionManager(Driver driver) {
+ this(driver, null);
+ }
+
+ public Neo4jTransactionManager(Driver driver, String databaseName) {
this.driver = driver;
+ this.databaseName = databaseName;
}
@Override
@@ -82,15 +94,14 @@ public class Neo4jTransactionManager extends AbstractPlatformTransactionManager
boolean readOnly = definition.isReadOnly();
AccessMode accessMode = readOnly ? AccessMode.READ : AccessMode.WRITE;
List bookmarks = Collections.emptyList(); // TODO Bookmarksupport
- String database = ""; // TODO Database selection
TransactionSynchronizationManager.setCurrentTransactionReadOnly(readOnly);
try {
Session session = this.driver
- .session(t -> t.withDefaultAccessMode(accessMode).withBookmarks(bookmarks).withDatabase(database));
+ .session(t -> t.withDefaultAccessMode(accessMode).withBookmarks(bookmarks).withDatabase(databaseName));
- Neo4jConnectionHolder connectionHolder = new Neo4jConnectionHolder(database, session, transactionConfig);
+ Neo4jConnectionHolder connectionHolder = new Neo4jConnectionHolder(databaseName, session, transactionConfig);
connectionHolder.setSynchronizedWithTransaction(true);
transactionObject.setResourceHolder(connectionHolder);
TransactionSynchronizationManager.bindResource(this.driver, connectionHolder);
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionUtils.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionUtils.java
index 237c2abc9..3bbc7484f 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionUtils.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/core/transaction/Neo4jTransactionUtils.java
@@ -37,8 +37,6 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
*/
public final class Neo4jTransactionUtils {
- public static final String DEFAULT_DATABASE_NAME = "";
-
/**
* The default session uses {@link AccessMode#WRITE} and an empty list of bookmarks.
*
@@ -46,10 +44,14 @@ public final class Neo4jTransactionUtils {
* @return Session parameters to configure the default session used
*/
public static Consumer defaultSessionParameters(@Nullable String databaseName) {
- return t -> t
- .withDefaultAccessMode(AccessMode.WRITE)
- .withBookmarks(Collections.EMPTY_LIST)
- .withDatabase(Optional.ofNullable(databaseName).orElse(DEFAULT_DATABASE_NAME));
+ return (SessionParametersTemplate t) -> {
+ t.withDefaultAccessMode(AccessMode.WRITE)
+ .withBookmarks(Collections.EMPTY_LIST);
+
+ if (databaseName != null) {
+ t.withDatabase(databaseName);
+ }
+ };
}
/**
diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/core/Neo4jClientTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/core/Neo4jClientTest.java
index 9c344a4bb..eeb2282be 100644
--- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/core/Neo4jClientTest.java
+++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/core/Neo4jClientTest.java
@@ -21,7 +21,6 @@ package org.springframework.data.neo4j.core;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
-import static org.springframework.data.neo4j.core.transaction.Neo4jTransactionUtils.*;
import java.time.LocalDate;
import java.util.ArrayList;
@@ -92,13 +91,12 @@ class Neo4jClientTest {
@BeforeEach
void prepareMocks() {
- when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withBookmarks(anyList())).thenReturn(sessionParametersTemplate);
when(sessionParametersTemplate.withDefaultAccessMode(any(AccessMode.class)))
.thenReturn(sessionParametersTemplate);
when(driver.session(any(Consumer.class))).thenReturn(session);
- when(session.typeSystem()).thenReturn(typeSystem);
+ when(driver.defaultTypeSystem()).thenReturn(typeSystem);
}
@AfterEach
@@ -135,7 +133,7 @@ class Neo4jClientTest {
assertThat(usedBikes).hasSize(2);
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
Map expectedParameters = new HashMap<>();
expectedParameters.putAll(parameters);
@@ -146,12 +144,13 @@ class Neo4jClientTest {
verify(statementResult).stream();
verify(record1).asMap();
verify(record2).asMap();
- verify(session, times(2)).close();
+ verify(session).close();
}
@Test
void databaseSelectionShouldBePossibleOnlyOnce() {
+ when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
when(session.run(anyString(), anyMap())).thenReturn(statementResult);
when(statementResult.stream()).thenReturn(Stream.of(record1, record2));
@@ -176,7 +175,7 @@ class Neo4jClientTest {
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).stream();
verify(record1).asMap();
- verify(session, times(2)).close();
+ verify(session).close();
}
@Nested
@@ -193,14 +192,16 @@ class Neo4jClientTest {
assertThat(result).isPresent().hasValue(42);
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
- verify(session, times(2)).close();
+ verify(session).close();
}
@Test
void withDatabase() {
+ when(sessionParametersTemplate.withDatabase(anyString())).thenReturn(sessionParametersTemplate);
+
Neo4jClient client = Neo4jClient.create(driver);
Optional result = client
.delegateTo(runner -> Optional.of(42))
@@ -211,7 +212,7 @@ class Neo4jClientTest {
verifyDatabaseSelection("aDatabase");
- verify(session, times(2)).close();
+ verify(session).close();
}
}
@@ -241,7 +242,7 @@ class Neo4jClientTest {
assertThat(bikeOwners).hasSize(1).first()
.hasFieldOrPropertyWithValue("name", "michael");
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
Map expectedParameters = new HashMap<>();
expectedParameters.put("name", "michael");
@@ -249,7 +250,7 @@ class Neo4jClientTest {
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).stream();
verify(record1).get("name");
- verify(session, times(2)).close();
+ verify(session).close();
}
@Test
@@ -272,12 +273,12 @@ class Neo4jClientTest {
})
.all());
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
verify(session).run(eq("MATCH (n) RETURN n"), argThat(new MapAssertionMatcher(Collections.emptyMap())));
verify(statementResult).stream();
verify(record1).get("name");
- verify(session, times(2)).close();
+ verify(session).close();
}
@Test
@@ -298,14 +299,14 @@ class Neo4jClientTest {
.bind(michael).with(new BikeOwnerBinder())
.run();
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
Map expectedParameters = new HashMap<>();
expectedParameters.put("name", "Michael");
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).consume();
- verify(session, times(2)).close();
+ verify(session).close();
}
@Test
@@ -328,12 +329,12 @@ class Neo4jClientTest {
assertThat(numberOfBikes).isPresent().hasValue(23L);
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
verify(session).run(eq(cypher), anyMap());
verify(statementResult).hasNext();
verify(statementResult).single();
- verify(session, times(2)).close();
+ verify(session).close();
}
}
@@ -353,14 +354,14 @@ class Neo4jClientTest {
.bind("fixie").to("name")
.run();
- verifyDatabaseSelection(DEFAULT_DATABASE_NAME);
+ verifyDatabaseSelection(null);
Map expectedParameters = new HashMap<>();
expectedParameters.put("name", "fixie");
verify(session).run(eq(cypher), argThat(new MapAssertionMatcher(expectedParameters)));
verify(statementResult).consume();
- verify(session, times(2)).close();
+ verify(session).close();
}
static class BikeOwner {
@@ -417,9 +418,14 @@ class Neo4jClientTest {
}
void verifyDatabaseSelection(String targetDatabase) {
- verify(driver, times(2)).session(sessionTemplateCaptor.capture());
+
+ verify(driver).session(sessionTemplateCaptor.capture());
sessionTemplateCaptor.getValue().accept(sessionParametersTemplate);
- verify(sessionParametersTemplate).withDatabase(targetDatabase);
+ if (targetDatabase != null) {
+ verify(sessionParametersTemplate).withDatabase(targetDatabase);
+ } else {
+ verify(sessionParametersTemplate, never()).withDatabase(any());
+ }
}
static class MapAssertionMatcher extends AssertionMatcher