1515import tech .ydb .core .Result ;
1616import tech .ydb .core .Status ;
1717import tech .ydb .core .StatusCode ;
18+ import tech .ydb .core .grpc .GrpcReadStream ;
1819import tech .ydb .proto .ValueProtos ;
1920import tech .ydb .table .Session ;
2021import tech .ydb .table .query .DataQueryResult ;
2526import tech .ydb .table .query .stats .QueryStats ;
2627import tech .ydb .table .query .stats .QueryStatsCollectionMode ;
2728import tech .ydb .table .query .stats .TableAccessStats ;
29+ import tech .ydb .table .query .ReadTablePart ;
2830import tech .ydb .table .result .ResultSetReader ;
2931import tech .ydb .table .settings .BulkUpsertSettings ;
3032import tech .ydb .table .settings .CommitTxSettings ;
7072import tech .ydb .yoj .repository .ydb .exception .YdbRepositoryException ;
7173import tech .ydb .yoj .repository .ydb .merge .QueriesMerger ;
7274import tech .ydb .yoj .repository .ydb .readtable .ReadTableMapper ;
75+ import tech .ydb .yoj .repository .ydb .spliterator .ClosableSpliterator ;
76+ import tech .ydb .yoj .repository .ydb .spliterator .ResultSetIterator ;
77+ import tech .ydb .yoj .repository .ydb .spliterator .YdbSpliterator ;
78+ import tech .ydb .yoj .repository .ydb .spliterator .YdbSpliteratorQueue ;
79+ import tech .ydb .yoj .repository .ydb .spliterator .YdbSpliteratorQueueGrpcStreamAdapter ;
80+ import tech .ydb .yoj .repository .ydb .spliterator .legacy .YdbLegacySpliterator ;
81+ import tech .ydb .yoj .repository .ydb .spliterator .legacy .YdbNewLegacySpliterator ;
7382import tech .ydb .yoj .repository .ydb .statement .Statement ;
7483import tech .ydb .yoj .repository .ydb .table .YdbTable ;
7584import tech .ydb .yoj .util .lang .Interrupts ;
7887import javax .annotation .Nullable ;
7988import java .time .Duration ;
8089import java .util .ArrayList ;
90+ import java .util .Iterator ;
8191import java .util .List ;
8292import java .util .Map ;
8393import java .util .concurrent .CompletableFuture ;
@@ -101,7 +111,7 @@ public class YdbRepositoryTransaction<REPO extends YdbRepository>
101111 private static final String PROP_TRACE_VERBOSE_OBJ_RESULTS = "tech.ydb.yoj.repository.ydb.trace.verboseObjResults" ;
102112
103113 private final List <YdbRepository .Query <?>> pendingWrites = new ArrayList <>();
104- private final List <YdbSpliterator <?>> spliterators = new ArrayList <>();
114+ private final List <ClosableSpliterator <?>> spliterators = new ArrayList <>();
105115
106116 @ Getter
107117 private final TxOptions options ;
@@ -127,8 +137,8 @@ public YdbRepositoryTransaction(REPO repo, TxOptions options) {
127137 this .tablespace = repo .getSchemaOperations ().getTablespace ();
128138 }
129139
130- private <V > YdbSpliterator <V > createSpliterator (String request , boolean isOrdered ) {
131- YdbSpliterator <V > spliterator = new YdbSpliterator <>(request , isOrdered );
140+ private <V > YdbNewLegacySpliterator <V > createSpliterator (String request , boolean isOrdered ) {
141+ YdbNewLegacySpliterator <V > spliterator = new YdbNewLegacySpliterator <>(request , isOrdered );
132142 spliterators .add (spliterator );
133143 return spliterator ;
134144 }
@@ -183,7 +193,7 @@ private void doCommit() {
183193
184194 private void closeStreams () {
185195 Exception summaryException = null ;
186- for (YdbSpliterator <?> spliterator : spliterators ) {
196+ for (ClosableSpliterator <?> spliterator : spliterators ) {
187197 try {
188198 spliterator .close ();
189199 } catch (Exception e ) {
@@ -451,7 +461,7 @@ public <PARAMS, RESULT> Stream<RESULT> executeScanQuery(Statement<PARAMS, RESULT
451461 String yql = getYql (statement );
452462 Params sdkParams = getSdkParams (statement , params );
453463
454- YdbSpliterator <RESULT > spliterator = createSpliterator ("scanQuery: " + yql , false );
464+ YdbNewLegacySpliterator <RESULT > spliterator = createSpliterator ("scanQuery: " + yql , false );
455465
456466 initSession ();
457467 session .executeScanQuery (
@@ -560,7 +570,7 @@ public <PARAMS, RESULT> Stream<RESULT> readTable(ReadTableMapper<PARAMS, RESULT>
560570 }
561571
562572 if (params .isUseNewSpliterator ()) {
563- YdbSpliterator <RESULT > spliterator = createSpliterator ("readTable: " + tableName , params .isOrdered ());
573+ YdbNewLegacySpliterator <RESULT > spliterator = createSpliterator ("readTable: " + tableName , params .isOrdered ());
564574
565575 initSession ();
566576 session .readTable (
@@ -571,6 +581,30 @@ public <PARAMS, RESULT> Stream<RESULT> readTable(ReadTableMapper<PARAMS, RESULT>
571581 return spliterator .createStream ();
572582 }
573583
584+ if (params .isUseNewSpliterator2 ()) {
585+ initSession ();
586+
587+ // TODO: configure stream timeout
588+ YdbSpliteratorQueue <Iterator <RESULT >> queue = new YdbSpliteratorQueue <>(1 , Duration .ofMinutes (5 ));
589+
590+ var adapter = new YdbSpliteratorQueueGrpcStreamAdapter <>("readTable: " + tableName , queue );
591+ GrpcReadStream <ReadTablePart > grpcStream = session .executeReadTable (tableName , settings .build ());
592+ CompletableFuture <Status > future = grpcStream .start (readTablePart -> {
593+ ResultSetIterator <RESULT > iterator = new ResultSetIterator <>(
594+ readTablePart .getResultSetReader (),
595+ mapper ::mapResult
596+ );
597+ adapter .onNext (iterator );
598+ });
599+ future .whenComplete (adapter ::onSupplierThreadComplete );
600+
601+ YdbSpliterator <RESULT > spliterator = new YdbSpliterator <>(queue , params .isOrdered ());
602+
603+ spliterators .add (spliterator );
604+
605+ return spliterator .createStream ();
606+ }
607+
574608 try {
575609 YdbLegacySpliterator <RESULT > spliterator = new YdbLegacySpliterator <>(params .isOrdered (), action ->
576610 doCall ("read table " + mapper .getTableName ("" ), () -> {
0 commit comments