Skip to content

Commit bc65065

Browse files
committed
Moved all metadata parsing in a dedicated class
Moved parsing of RUN message metadata to a class responsible for SUCCESS metadata parsing. This way all such parsing is in a single class. Renamed this utility class to `MetadataUtil`.
1 parent 0af5895 commit bc65065

File tree

4 files changed

+99
-58
lines changed

4 files changed

+99
-58
lines changed

driver/src/main/java/org/neo4j/driver/internal/handlers/PullAllResponseHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.neo4j.driver.internal.InternalRecord;
2828
import org.neo4j.driver.internal.spi.Connection;
2929
import org.neo4j.driver.internal.spi.ResponseHandler;
30-
import org.neo4j.driver.internal.summary.ResultSummaryCreator;
30+
import org.neo4j.driver.internal.util.MetadataUtil;
3131
import org.neo4j.driver.v1.Record;
3232
import org.neo4j.driver.v1.Statement;
3333
import org.neo4j.driver.v1.Value;
@@ -298,6 +298,6 @@ private boolean completeFailureFuture( Throwable error )
298298
private ResultSummary extractResultSummary( Map<String,Value> metadata )
299299
{
300300
long resultAvailableAfter = runResponseHandler.resultAvailableAfter();
301-
return ResultSummaryCreator.create( statement, connection, resultAvailableAfter, metadata );
301+
return MetadataUtil.extractSummary( statement, connection, resultAvailableAfter, metadata );
302302
}
303303
}

driver/src/main/java/org/neo4j/driver/internal/handlers/RunResponseHandler.java

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package org.neo4j.driver.internal.handlers;
2020

21-
import java.util.ArrayList;
2221
import java.util.List;
2322
import java.util.Map;
2423
import java.util.concurrent.CompletableFuture;
@@ -27,15 +26,15 @@
2726
import org.neo4j.driver.v1.Value;
2827

2928
import static java.util.Collections.emptyList;
29+
import static org.neo4j.driver.internal.util.MetadataUtil.extractResultAvailableAfter;
30+
import static org.neo4j.driver.internal.util.MetadataUtil.extractStatementKeys;
3031

3132
public class RunResponseHandler implements ResponseHandler
3233
{
33-
private static final int UNKNOWN = -1;
34-
3534
private final CompletableFuture<Void> runCompletedFuture;
3635

3736
private List<String> statementKeys = emptyList();
38-
private long resultAvailableAfter = UNKNOWN;
37+
private long resultAvailableAfter = -1;
3938

4039
public RunResponseHandler( CompletableFuture<Void> runCompletedFuture )
4140
{
@@ -45,7 +44,7 @@ public RunResponseHandler( CompletableFuture<Void> runCompletedFuture )
4544
@Override
4645
public void onSuccess( Map<String,Value> metadata )
4746
{
48-
statementKeys = extractKeys( metadata );
47+
statementKeys = extractStatementKeys( metadata );
4948
resultAvailableAfter = extractResultAvailableAfter( metadata );
5049

5150
completeRunFuture();
@@ -82,33 +81,4 @@ private void completeRunFuture()
8281
{
8382
runCompletedFuture.complete( null );
8483
}
85-
86-
private static List<String> extractKeys( Map<String,Value> metadata )
87-
{
88-
Value keysValue = metadata.get( "fields" );
89-
if ( keysValue != null )
90-
{
91-
if ( !keysValue.isEmpty() )
92-
{
93-
List<String> keys = new ArrayList<>( keysValue.size() );
94-
for ( Value value : keysValue.values() )
95-
{
96-
keys.add( value.asString() );
97-
}
98-
99-
return keys;
100-
}
101-
}
102-
return emptyList();
103-
}
104-
105-
private static long extractResultAvailableAfter( Map<String,Value> metadata )
106-
{
107-
Value resultAvailableAfterValue = metadata.get( "result_available_after" );
108-
if ( resultAvailableAfterValue != null )
109-
{
110-
return resultAvailableAfterValue.asLong();
111-
}
112-
return UNKNOWN;
113-
}
11484
}

driver/src/main/java/org/neo4j/driver/internal/summary/ResultSummaryCreator.java renamed to driver/src/main/java/org/neo4j/driver/internal/util/MetadataUtil.java

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,20 @@
1616
* See the License for the specific language governing permissions and
1717
* limitations under the License.
1818
*/
19-
package org.neo4j.driver.internal.summary;
19+
package org.neo4j.driver.internal.util;
2020

21+
import java.util.ArrayList;
2122
import java.util.Collections;
2223
import java.util.List;
2324
import java.util.Map;
2425

2526
import org.neo4j.driver.internal.spi.Connection;
27+
import org.neo4j.driver.internal.summary.InternalNotification;
28+
import org.neo4j.driver.internal.summary.InternalPlan;
29+
import org.neo4j.driver.internal.summary.InternalProfiledPlan;
30+
import org.neo4j.driver.internal.summary.InternalResultSummary;
31+
import org.neo4j.driver.internal.summary.InternalServerInfo;
32+
import org.neo4j.driver.internal.summary.InternalSummaryCounters;
2633
import org.neo4j.driver.v1.Statement;
2734
import org.neo4j.driver.v1.Value;
2835
import org.neo4j.driver.v1.summary.Notification;
@@ -32,13 +39,44 @@
3239
import org.neo4j.driver.v1.summary.ServerInfo;
3340
import org.neo4j.driver.v1.summary.StatementType;
3441

35-
public final class ResultSummaryCreator
42+
import static java.util.Collections.emptyList;
43+
44+
public final class MetadataUtil
3645
{
37-
private ResultSummaryCreator()
46+
private MetadataUtil()
47+
{
48+
}
49+
50+
public static List<String> extractStatementKeys( Map<String,Value> metadata )
3851
{
52+
Value keysValue = metadata.get( "fields" );
53+
if ( keysValue != null )
54+
{
55+
if ( !keysValue.isEmpty() )
56+
{
57+
List<String> keys = new ArrayList<>( keysValue.size() );
58+
for ( Value value : keysValue.values() )
59+
{
60+
keys.add( value.asString() );
61+
}
62+
63+
return keys;
64+
}
65+
}
66+
return emptyList();
67+
}
68+
69+
public static long extractResultAvailableAfter( Map<String,Value> metadata )
70+
{
71+
Value resultAvailableAfterValue = metadata.get( "result_available_after" );
72+
if ( resultAvailableAfterValue != null )
73+
{
74+
return resultAvailableAfterValue.asLong();
75+
}
76+
return -1;
3977
}
4078

41-
public static ResultSummary create( Statement statement, Connection connection, long resultAvailableAfter,
79+
public static ResultSummary extractSummary( Statement statement, Connection connection, long resultAvailableAfter,
4280
Map<String,Value> metadata )
4381
{
4482
ServerInfo serverInfo = new InternalServerInfo( connection.serverAddress(), connection.serverVersion() );

driver/src/test/java/org/neo4j/driver/internal/summary/ResultSummaryCreatorTest.java renamed to driver/src/test/java/org/neo4j/driver/internal/util/MetadataUtilTest.java

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* See the License for the specific language governing permissions and
1717
* limitations under the License.
1818
*/
19-
package org.neo4j.driver.internal.summary;
19+
package org.neo4j.driver.internal.util;
2020

2121
import org.junit.Test;
2222

@@ -26,7 +26,7 @@
2626

2727
import org.neo4j.driver.internal.BoltServerAddress;
2828
import org.neo4j.driver.internal.spi.Connection;
29-
import org.neo4j.driver.internal.util.ServerVersion;
29+
import org.neo4j.driver.internal.summary.InternalInputPosition;
3030
import org.neo4j.driver.v1.Statement;
3131
import org.neo4j.driver.v1.Value;
3232
import org.neo4j.driver.v1.summary.Notification;
@@ -35,6 +35,7 @@
3535
import org.neo4j.driver.v1.summary.ResultSummary;
3636

3737
import static java.util.Arrays.asList;
38+
import static java.util.Collections.emptyList;
3839
import static java.util.Collections.emptyMap;
3940
import static java.util.Collections.singletonMap;
4041
import static org.junit.Assert.assertEquals;
@@ -44,7 +45,9 @@
4445
import static org.mockito.Mockito.mock;
4546
import static org.mockito.Mockito.when;
4647
import static org.neo4j.driver.internal.summary.InternalSummaryCounters.EMPTY_STATS;
47-
import static org.neo4j.driver.internal.summary.ResultSummaryCreator.create;
48+
import static org.neo4j.driver.internal.util.MetadataUtil.extractResultAvailableAfter;
49+
import static org.neo4j.driver.internal.util.MetadataUtil.extractStatementKeys;
50+
import static org.neo4j.driver.internal.util.MetadataUtil.extractSummary;
4851
import static org.neo4j.driver.v1.Values.parameters;
4952
import static org.neo4j.driver.v1.Values.value;
5053
import static org.neo4j.driver.v1.Values.values;
@@ -53,15 +56,45 @@
5356
import static org.neo4j.driver.v1.summary.StatementType.SCHEMA_WRITE;
5457
import static org.neo4j.driver.v1.summary.StatementType.WRITE_ONLY;
5558

56-
public class ResultSummaryCreatorTest
59+
public class MetadataUtilTest
5760
{
61+
@Test
62+
public void shouldExtractStatementKeys()
63+
{
64+
List<String> keys = asList( "hello", " ", "world", "!" );
65+
List<String> extractedKeys = extractStatementKeys( singletonMap( "fields", value( keys ) ) );
66+
assertEquals( keys, extractedKeys );
67+
}
68+
69+
@Test
70+
public void shouldExtractEmptyStatementKeysWhenNoneInMetadata()
71+
{
72+
List<String> extractedKeys = extractStatementKeys( emptyMap() );
73+
assertEquals( emptyList(), extractedKeys );
74+
}
75+
76+
@Test
77+
public void shouldExtractResultAvailableAfter()
78+
{
79+
long extractedResultAvailableAfter = extractResultAvailableAfter(
80+
singletonMap( "result_available_after", value( 424242 ) ) );
81+
assertEquals( 424242L, extractedResultAvailableAfter );
82+
}
83+
84+
@Test
85+
public void shouldExtractNoResultAvailableAfterWhenNoneInMetadata()
86+
{
87+
long extractedResultAvailableAfter = extractResultAvailableAfter( emptyMap() );
88+
assertEquals( -1, extractedResultAvailableAfter );
89+
}
90+
5891
@Test
5992
public void shouldBuildResultSummaryWithStatement()
6093
{
6194
Statement statement = new Statement( "UNWIND range(10, 100) AS x CREATE (:Node {name: $name, x: x})",
6295
singletonMap( "name", "Apa" ) );
6396

64-
ResultSummary summary = create( statement, connectionMock(), 42, emptyMap() );
97+
ResultSummary summary = extractSummary( statement, connectionMock(), 42, emptyMap() );
6598

6699
assertEquals( statement, summary.statement() );
67100
}
@@ -71,7 +104,7 @@ public void shouldBuildResultSummaryWithServerInfo()
71104
{
72105
Connection connection = connectionMock( new BoltServerAddress( "server:42" ), ServerVersion.v3_2_0 );
73106

74-
ResultSummary summary = create( statement(), connection, 42, emptyMap() );
107+
ResultSummary summary = extractSummary( statement(), connection, 42, emptyMap() );
75108

76109
assertEquals( "server:42", summary.server().address() );
77110
assertEquals( "Neo4j/3.2.0", summary.server().version() );
@@ -107,7 +140,7 @@ public void shouldBuildResultSummaryWithCounters()
107140

108141
Map<String,Value> metadata = singletonMap( "stats", stats );
109142

110-
ResultSummary summary = create( statement(), connectionMock(), 42, metadata );
143+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, metadata );
111144

112145
assertEquals( 42, summary.counters().nodesCreated() );
113146
assertEquals( 4242, summary.counters().nodesDeleted() );
@@ -125,7 +158,7 @@ public void shouldBuildResultSummaryWithCounters()
125158
@Test
126159
public void shouldBuildResultSummaryWithoutCounters()
127160
{
128-
ResultSummary summary = create( statement(), connectionMock(), 42, emptyMap() );
161+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, emptyMap() );
129162
assertEquals( EMPTY_STATS, summary.counters() );
130163
}
131164

@@ -146,7 +179,7 @@ public void shouldBuildResultSummaryWithPlan()
146179
) );
147180
Map<String,Value> metadata = singletonMap( "plan", plan );
148181

149-
ResultSummary summary = create( statement(), connectionMock(), 42, metadata );
182+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, metadata );
150183

151184
assertTrue( summary.hasPlan() );
152185
assertEquals( "Projection", summary.plan().operatorType() );
@@ -166,7 +199,7 @@ public void shouldBuildResultSummaryWithPlan()
166199
@Test
167200
public void shouldBuildResultSummaryWithoutPlan()
168201
{
169-
ResultSummary summary = create( statement(), connectionMock(), 42, emptyMap() );
202+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, emptyMap() );
170203
assertFalse( summary.hasPlan() );
171204
assertNull( summary.plan() );
172205
}
@@ -192,7 +225,7 @@ public void shouldBuildResultSummaryWithProfiledPlan()
192225
) );
193226
Map<String,Value> metadata = singletonMap( "profile", profile );
194227

195-
ResultSummary summary = create( statement(), connectionMock(), 42, metadata );
228+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, metadata );
196229

197230
assertTrue( summary.hasPlan() );
198231
assertTrue( summary.hasProfile() );
@@ -216,7 +249,7 @@ public void shouldBuildResultSummaryWithProfiledPlan()
216249
@Test
217250
public void shouldBuildResultSummaryWithoutProfiledPlan()
218251
{
219-
ResultSummary summary = create( statement(), connectionMock(), 42, emptyMap() );
252+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, emptyMap() );
220253
assertFalse( summary.hasProfile() );
221254
assertNull( summary.profile() );
222255
}
@@ -249,7 +282,7 @@ public void shouldBuildResultSummaryWithNotifications()
249282
Value notifications = value( notification1, notification2 );
250283
Map<String,Value> metadata = singletonMap( "notifications", notifications );
251284

252-
ResultSummary summary = create( statement(), connectionMock(), 42, metadata );
285+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, metadata );
253286

254287
assertEquals( 2, summary.notifications().size() );
255288
Notification firstNotification = summary.notifications().get( 0 );
@@ -271,7 +304,7 @@ public void shouldBuildResultSummaryWithNotifications()
271304
@Test
272305
public void shouldBuildResultSummaryWithoutNotifications()
273306
{
274-
ResultSummary summary = create( statement(), connectionMock(), 42, emptyMap() );
307+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, emptyMap() );
275308
assertEquals( 0, summary.notifications().size() );
276309
}
277310

@@ -280,7 +313,7 @@ public void shouldBuildResultSummaryWithResultAvailableAfter()
280313
{
281314
int value = 42_000;
282315

283-
ResultSummary summary = create( statement(), connectionMock(), value, emptyMap() );
316+
ResultSummary summary = extractSummary( statement(), connectionMock(), value, emptyMap() );
284317

285318
assertEquals( 42, summary.resultAvailableAfter( TimeUnit.SECONDS ) );
286319
assertEquals( value, summary.resultAvailableAfter( TimeUnit.MILLISECONDS ) );
@@ -292,7 +325,7 @@ public void shouldBuildResultSummaryWithResultConsumedAfter()
292325
int value = 42_000;
293326
Map<String,Value> metadata = singletonMap( "result_consumed_after", value( value ) );
294327

295-
ResultSummary summary = create( statement(), connectionMock(), 42, metadata );
328+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, metadata );
296329

297330
assertEquals( 42, summary.resultConsumedAfter( TimeUnit.SECONDS ) );
298331
assertEquals( value, summary.resultConsumedAfter( TimeUnit.MILLISECONDS ) );
@@ -301,15 +334,15 @@ public void shouldBuildResultSummaryWithResultConsumedAfter()
301334
@Test
302335
public void shouldBuildResultSummaryWithoutResultConsumedAfter()
303336
{
304-
ResultSummary summary = create( statement(), connectionMock(), 42, emptyMap() );
337+
ResultSummary summary = extractSummary( statement(), connectionMock(), 42, emptyMap() );
305338
assertEquals( -1, summary.resultConsumedAfter( TimeUnit.SECONDS ) );
306339
assertEquals( -1, summary.resultConsumedAfter( TimeUnit.MILLISECONDS ) );
307340
}
308341

309342
private static ResultSummary createWithStatementType( Value typeValue )
310343
{
311344
Map<String,Value> metadata = singletonMap( "type", typeValue );
312-
return create( statement(), connectionMock(), 42, metadata );
345+
return extractSummary( statement(), connectionMock(), 42, metadata );
313346
}
314347

315348
private static Statement statement()

0 commit comments

Comments
 (0)