3131import tech .ydb .core .grpc .GrpcReadStream ;
3232import tech .ydb .core .grpc .GrpcRequestSettings ;
3333import tech .ydb .core .grpc .YdbHeaders ;
34- import tech .ydb .core .impl .call .ProxyReadStream ;
3534import tech .ydb .core .operation .Operation ;
3635import tech .ydb .core .settings .BaseRequestSettings ;
3736import tech .ydb .core .utils .ProtobufUtils ;
3837import tech .ydb .core .utils .URITools ;
3938import tech .ydb .proto .StatusCodesProtos .StatusIds ;
4039import tech .ydb .proto .ValueProtos ;
4140import tech .ydb .proto .ValueProtos .TypedValue ;
41+ import tech .ydb .proto .YdbIssueMessage ;
4242import tech .ydb .proto .common .CommonProtos ;
4343import tech .ydb .proto .scheme .SchemeOperationProtos ;
4444import tech .ydb .proto .table .YdbTable ;
@@ -1205,22 +1205,22 @@ public GrpcReadStream<ReadTablePart> executeReadTable(String tablePath, ReadTabl
12051205 }
12061206
12071207 GrpcReadStream <YdbTable .ReadTableResponse > origin = rpc .streamReadTable (request .build (), options .build ());
1208- return new ProxyReadStream <>(origin , (response , future , observer ) -> {
1209- StatusIds .StatusCode statusCode = response .getStatus ();
1210- if (statusCode == StatusIds .StatusCode .SUCCESS ) {
1211- try {
1212- observer .onNext (new ReadTablePart (response .getResult (), response .getSnapshot ()));
1213- } catch (Throwable t ) {
1214- future .completeExceptionally (t );
1215- origin .cancel ();
1216- }
1217- } else {
1218- Issue [] issues = Issue .fromPb (response .getIssuesList ());
1219- StatusCode code = StatusCode .fromProto (statusCode );
1220- future .complete (Status .of (code , issues ));
1221- origin .cancel ();
1208+ return new ProxyStream <YdbTable .ReadTableResponse , ReadTablePart >(origin ) {
1209+ @ Override
1210+ StatusIds .StatusCode readStatusCode (YdbTable .ReadTableResponse message ) {
1211+ return message .getStatus ();
12221212 }
1223- });
1213+
1214+ @ Override
1215+ List <YdbIssueMessage .IssueMessage > readIssues (YdbTable .ReadTableResponse message ) {
1216+ return message .getIssuesList ();
1217+ }
1218+
1219+ @ Override
1220+ ReadTablePart readValue (YdbTable .ReadTableResponse message ) {
1221+ return new ReadTablePart (message .getResult (), message .getSnapshot ());
1222+ }
1223+ };
12241224 }
12251225
12261226 @ Override
@@ -1239,22 +1239,22 @@ public GrpcReadStream<ResultSetReader> executeScanQuery(String query, Params par
12391239 }
12401240
12411241 GrpcReadStream <YdbTable .ExecuteScanQueryPartialResponse > origin = rpc .streamExecuteScanQuery (req , opts .build ());
1242- return new ProxyReadStream <>(origin , (response , future , observer ) -> {
1243- StatusIds .StatusCode statusCode = response .getStatus ();
1244- if (statusCode == StatusIds .StatusCode .SUCCESS ) {
1245- try {
1246- observer .onNext (ProtoValueReaders .forResultSet (response .getResult ().getResultSet ()));
1247- } catch (Throwable t ) {
1248- future .completeExceptionally (t );
1249- origin .cancel ();
1250- }
1251- } else {
1252- Issue [] issues = Issue .fromPb (response .getIssuesList ());
1253- StatusCode code = StatusCode .fromProto (statusCode );
1254- future .complete (Status .of (code , issues ));
1255- origin .cancel ();
1242+ return new ProxyStream <YdbTable .ExecuteScanQueryPartialResponse , ResultSetReader >(origin ) {
1243+ @ Override
1244+ StatusIds .StatusCode readStatusCode (YdbTable .ExecuteScanQueryPartialResponse message ) {
1245+ return message .getStatus ();
12561246 }
1257- });
1247+
1248+ @ Override
1249+ List <YdbIssueMessage .IssueMessage > readIssues (YdbTable .ExecuteScanQueryPartialResponse message ) {
1250+ return message .getIssuesList ();
1251+ }
1252+
1253+ @ Override
1254+ ResultSetReader readValue (YdbTable .ExecuteScanQueryPartialResponse message ) {
1255+ return ProtoValueReaders .forResultSet (message .getResult ().getResultSet ());
1256+ }
1257+ };
12581258 }
12591259
12601260 private CompletableFuture <Status > commitTransactionInternal (String txId , CommitTxSettings settings ) {
@@ -1378,6 +1378,56 @@ public String toString() {
13781378 return "Session{" + id + "}" ;
13791379 }
13801380
1381+ private abstract class ProxyStream <R , T > implements GrpcReadStream <T > {
1382+ private final GrpcReadStream <R > origin ;
1383+ private final CompletableFuture <Status > result = new CompletableFuture <>();
1384+
1385+ ProxyStream (GrpcReadStream <R > origin ) {
1386+ this .origin = origin ;
1387+ }
1388+
1389+ abstract StatusIds .StatusCode readStatusCode (R message );
1390+ abstract List <YdbIssueMessage .IssueMessage > readIssues (R message );
1391+ abstract T readValue (R message );
1392+
1393+ private void onClose (Status status , Throwable th ) {
1394+ if (th != null ) {
1395+ updateSessionState (th , null , false );
1396+ result .completeExceptionally (th );
1397+ }
1398+ if (status != null ) {
1399+ updateSessionState (null , status .getCode (), false );
1400+ result .complete (status );
1401+ }
1402+ }
1403+
1404+ @ Override
1405+ public CompletableFuture <Status > start (Observer <T > observer ) {
1406+ origin .start (message -> {
1407+ StatusIds .StatusCode statusCode = readStatusCode (message );
1408+ if (statusCode == StatusIds .StatusCode .SUCCESS ) {
1409+ try {
1410+ observer .onNext (readValue (message ));
1411+ } catch (Throwable t ) {
1412+ result .completeExceptionally (t );
1413+ origin .cancel ();
1414+ }
1415+ } else {
1416+ Issue [] issues = Issue .fromPb (readIssues (message ));
1417+ StatusCode code = StatusCode .fromProto (statusCode );
1418+ result .complete (Status .of (code , issues ));
1419+ origin .cancel ();
1420+ }
1421+ }).whenComplete (this ::onClose );
1422+ return result ;
1423+ }
1424+
1425+ @ Override
1426+ public void cancel () {
1427+ origin .cancel ();
1428+ }
1429+ }
1430+
13811431 class TableTransactionImpl extends YdbTransactionImpl implements TableTransaction {
13821432
13831433 TableTransactionImpl (TxMode txMode , String txId ) {
0 commit comments