28
28
29
29
import org .neo4j .driver .internal .FailableCursor ;
30
30
import org .neo4j .driver .internal .handlers .RunResponseHandler ;
31
- import org .neo4j .driver .internal .handlers .pulln .BasicPullResponseHandler ;
31
+ import org .neo4j .driver .internal .handlers .pulln .PullResponseHandler ;
32
32
import org .neo4j .driver .Record ;
33
33
import org .neo4j .driver .summary .ResultSummary ;
34
34
35
- import static org .neo4j .driver .internal .handlers .pulln .AbstractBasicPullResponseHandler .DISCARD_RECORD_CONSUMER ;
35
+ import static org .neo4j .driver .internal .handlers .pulln .BasicPullResponseHandler .DISCARD_RECORD_CONSUMER ;
36
36
37
37
public class RxStatementResultCursor implements Subscription , FailableCursor
38
38
{
39
39
private final RunResponseHandler runHandler ;
40
- private final BasicPullResponseHandler pullHandler ;
40
+ private final PullResponseHandler pullHandler ;
41
41
private final Throwable runResponseError ;
42
42
private final CompletableFuture <ResultSummary > summaryFuture = new CompletableFuture <>();
43
- private boolean isRecordHandlerInstalled = false ;
43
+ private BiConsumer < Record , Throwable > recordConsumer ;
44
44
45
- public RxStatementResultCursor ( RunResponseHandler runHandler , BasicPullResponseHandler pullHandler )
45
+ public RxStatementResultCursor ( RunResponseHandler runHandler , PullResponseHandler pullHandler )
46
46
{
47
47
this ( null , runHandler , pullHandler );
48
48
}
49
49
50
- public RxStatementResultCursor ( Throwable runError , RunResponseHandler runHandler , BasicPullResponseHandler pullHandler )
50
+ public RxStatementResultCursor ( Throwable runError , RunResponseHandler runHandler , PullResponseHandler pullHandler )
51
51
{
52
52
Objects .requireNonNull ( runHandler );
53
53
Objects .requireNonNull ( pullHandler );
@@ -66,15 +66,20 @@ public List<String> keys()
66
66
67
67
public void installRecordConsumer ( BiConsumer <Record ,Throwable > recordConsumer )
68
68
{
69
- if ( isRecordHandlerInstalled )
69
+ if ( isRecordConsumerInstalled () )
70
70
{
71
71
return ;
72
72
}
73
- isRecordHandlerInstalled = true ;
74
- pullHandler .installRecordConsumer ( recordConsumer );
73
+ this . recordConsumer = recordConsumer ;
74
+ pullHandler .installRecordConsumer ( this . recordConsumer );
75
75
assertRunCompletedSuccessfully ();
76
76
}
77
77
78
+ private boolean isRecordConsumerInstalled ()
79
+ {
80
+ return this .recordConsumer != null ;
81
+ }
82
+
78
83
public void request ( long n )
79
84
{
80
85
pullHandler .request ( n );
@@ -120,8 +125,10 @@ private void assertRunCompletedSuccessfully()
120
125
private void installSummaryConsumer ()
121
126
{
122
127
pullHandler .installSummaryConsumer ( ( summary , error ) -> {
123
- if ( error != null )
128
+ if ( error != null && recordConsumer == DISCARD_RECORD_CONSUMER )
124
129
{
130
+ // We will only report the error to summary if there is no user record consumer installed
131
+ // When a user record consumer is installed, the error will be reported to record consumer instead.
125
132
summaryFuture .completeExceptionally ( error );
126
133
}
127
134
else if ( summary != null )
0 commit comments