From d40e7150446755b450a546099553036aaa586fb3 Mon Sep 17 00:00:00 2001 From: Zhen Date: Fri, 18 Nov 2016 13:56:12 +0100 Subject: [PATCH] Added StatementResult#summary to obtain the summary in the end of a result stream by pulling all unconsumed records into memory --- .../internal/InternalStatementResult.java | 11 +++ .../internal/RoutingStatementResult.java | 17 +++++ .../org/neo4j/driver/v1/StatementResult.java | 13 ++++ .../driver/v1/integration/ResultStreamIT.java | 67 +++++++++++++++++++ .../driver/v1/integration/SummaryIT.java | 28 -------- 5 files changed, 108 insertions(+), 28 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalStatementResult.java b/driver/src/main/java/org/neo4j/driver/internal/InternalStatementResult.java index 72cd39ad37..1819c51d17 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalStatementResult.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalStatementResult.java @@ -296,6 +296,17 @@ public ResultSummary consume() return summary; } + @Override + public ResultSummary summary() + { + while( !done ) + { + connection.receiveOne(); + } + + return summary; + } + @Override public void remove() { diff --git a/driver/src/main/java/org/neo4j/driver/internal/RoutingStatementResult.java b/driver/src/main/java/org/neo4j/driver/internal/RoutingStatementResult.java index 768d026d49..2522b5c2ba 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/RoutingStatementResult.java +++ b/driver/src/main/java/org/neo4j/driver/internal/RoutingStatementResult.java @@ -192,6 +192,23 @@ public ResultSummary consume() } } + @Override + public ResultSummary summary() + { + try + { + return delegate.summary(); + } + catch ( ServiceUnavailableException e ) + { + throw sessionExpired( e, onError, address ); + } + catch ( ClientException e ) + { + throw filterFailureToWrite( e, mode, onError, address ); + } + } + public BoltServerAddress address() { return address; diff --git a/driver/src/main/java/org/neo4j/driver/v1/StatementResult.java b/driver/src/main/java/org/neo4j/driver/v1/StatementResult.java index 420bfe3be0..119cc70bb7 100644 --- a/driver/src/main/java/org/neo4j/driver/v1/StatementResult.java +++ b/driver/src/main/java/org/neo4j/driver/v1/StatementResult.java @@ -142,4 +142,17 @@ public interface StatementResult extends Iterator * @return a summary for the whole query result */ ResultSummary consume(); + + /** + * Return the result summary. + * + * If the records in the result is not fully consumed, then calling this method will force to pull all remaining + * records into buffer to yield the summary. + * + * If you want to obtain the summary but discard the records, use + * {@link StatementResult#consume()} instead. + * + * @return a summary for the whole query result. + */ + ResultSummary summary(); } 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 8e663d63c6..8981501401 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 @@ -23,10 +23,14 @@ import org.neo4j.driver.v1.Record; import org.neo4j.driver.v1.StatementResult; +import org.neo4j.driver.v1.summary.ResultSummary; import org.neo4j.driver.v1.util.TestNeo4jSession; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.neo4j.driver.v1.Values.parameters; @@ -120,4 +124,67 @@ public void shouldBeAbleToReuseSessionAfterFailure() throws Throwable assertTrue( res2.hasNext() ); assertEquals( res2.next().get("1").asLong(), 1L ); } + + @Test + public void shouldBeAbleToAccessSummaryAfterFailure() throws Throwable + { + // Given + StatementResult res1 = session.run( "INVALID" ); + ResultSummary summary; + + // When + try + { + res1.consume(); + } + catch ( Exception e ) + { + //ignore + } + finally + { + summary = res1.summary(); + } + + // Then + assertThat( summary, notNullValue() ); + assertThat( summary.server().address(), equalTo( "localhost:7687" ) ); + assertThat( summary.counters().nodesCreated(), equalTo( 0 ) ); + } + + + @Test + public void shouldBufferRecordsAfterSummary() throws Throwable + { + // Given + StatementResult result = session.run("UNWIND [1,2] AS a RETURN a"); + + // When + ResultSummary summary = result.summary(); + + // Then + assertThat( summary, notNullValue() ); + assertThat( summary.server().address(), equalTo( "localhost:7687" ) ); + assertThat( summary.counters().nodesCreated(), equalTo( 0 ) ); + + assertThat( result.next().get( "a" ).asInt(), equalTo( 1 ) ); + assertThat( result.next().get( "a" ).asInt(), equalTo( 2 ) ); + } + + @Test + public void shouldDiscardRecordsAfterConsume() throws Throwable + { + // Given + StatementResult result = session.run("UNWIND [1,2] AS a RETURN a"); + + // When + ResultSummary summary = result.consume(); + + // Then + assertThat( summary, notNullValue() ); + assertThat( summary.server().address(), equalTo( "localhost:7687" ) ); + assertThat( summary.counters().nodesCreated(), equalTo( 0 ) ); + + assertThat( result.hasNext(), equalTo( false ) ); + } } diff --git a/driver/src/test/java/org/neo4j/driver/v1/integration/SummaryIT.java b/driver/src/test/java/org/neo4j/driver/v1/integration/SummaryIT.java index 51cd5a1c38..86ca1a68c4 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/integration/SummaryIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/integration/SummaryIT.java @@ -174,32 +174,4 @@ public void shouldContainNotifications() throws Throwable assertThat( notifications.get( 0 ).toString(), containsString("CartesianProduct") ); } - - - @Test - public void shouldBeAbleToAccessSummaryAfterFailure() throws Throwable - { - // Given - StatementResult res1 = session.run( "INVALID" ); - ResultSummary summary; - - // When - try - { - res1.consume(); - } - catch ( Exception e ) - { - //ignore - } - finally - { - summary = res1.consume(); - } - - // Then - assertThat( summary, notNullValue() ); - assertThat( summary.server().address(), equalTo( "localhost:7687" ) ); - assertThat( summary.counters().nodesCreated(), equalTo( 0 ) ); - } }