diff --git a/driver/src/main/java/org/neo4j/driver/internal/summary/ResultBuilder.java b/driver/src/main/java/org/neo4j/driver/internal/summary/ResultBuilder.java index dab1c75758..d516dcd368 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/summary/ResultBuilder.java +++ b/driver/src/main/java/org/neo4j/driver/internal/summary/ResultBuilder.java @@ -39,16 +39,17 @@ import org.neo4j.driver.v1.exceptions.ClientException; import static java.util.Collections.unmodifiableMap; - import static org.neo4j.driver.internal.ParameterSupport.NO_PARAMETERS; public class ResultBuilder implements StreamCollector { + private final static List NO_KEYS = new ArrayList<>(); + private final SummaryBuilder summaryBuilder; private List body = new ArrayList<>(); - private List keys = null; - private Map keyIndexLookup = null; + private List keys = NO_KEYS; + private Map keyIndexLookup = null; public ResultBuilder( String statement, Map parameters ) { @@ -60,7 +61,7 @@ public ResultBuilder( String statement, Map parameters ) @Override public void keys( String[] names ) { - if ( keys == null ) + if ( keys == NO_KEYS ) { int numFields = names.length; if ( numFields == 0 ) diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalSessionTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalSessionTest.java index 8fe3c59883..9371e1f741 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalSessionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalSessionTest.java @@ -78,4 +78,34 @@ public void shouldBeAbleToOpenTxAfterPreviousIsClosed() throws Throwable // Then we should've gotten a transaction object back assertNotNull( tx ); } + + @Test + public void shouldNotBeAbleToUseSessionWhileOngoingTransaction() throws Throwable + { + // Given + Connection mock = mock( Connection.class ); + InternalSession sess = new InternalSession( mock ); + sess.beginTransaction(); + + // Expect + exception.expect( ClientException.class ); + + // When + sess.run( "whatever" ); + } + + @Test + public void shouldBeAbleToUseSessionAgainWhenTransactionIsClosed() throws Throwable + { + // Given + Connection mock = mock( Connection.class ); + InternalSession sess = new InternalSession( mock ); + sess.beginTransaction().close(); + + // When + sess.run( "whatever" ); + + // Then + verify( mock ).sync(); + } } diff --git a/driver/src/test/java/org/neo4j/driver/v1/integration/ResultStreamIT.java b/driver/src/test/java/org/neo4j/driver/v1/integration/ResultStreamIT.java index f5cebfe362..364a7f660e 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/integration/ResultStreamIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/integration/ResultStreamIT.java @@ -26,9 +26,9 @@ import org.neo4j.driver.v1.util.TestNeo4jSession; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; - import static org.neo4j.driver.v1.Values.parameters; public class ResultStreamIT @@ -109,4 +109,14 @@ public void shouldGiveHelpfulFailureMessageWhenAccessNonExistingPropertyOnNode() // Then assertTrue( rs.value( "n" ).value( "age" ).isNull() ); } + + @Test + public void shouldNotReturnNullKeysOnEmptyResult() + { + // Given + ResultCursor rs = session.run( "CREATE (n:Person {name:{name}})", parameters( "name", "Tom Hanks" ) ); + + // THEN + assertNotNull( rs.keys() ); + } }