11
11
import tech .ydb .core .Result ;
12
12
import tech .ydb .core .Status ;
13
13
import tech .ydb .core .StatusCode ;
14
+ import tech .ydb .core .grpc .GrpcReadStream ;
14
15
import tech .ydb .proto .ValueProtos ;
15
16
import tech .ydb .table .Session ;
16
17
import tech .ydb .table .query .DataQueryResult ;
17
18
import tech .ydb .table .query .Params ;
19
+ import tech .ydb .table .query .ReadTablePart ;
18
20
import tech .ydb .table .result .ResultSetReader ;
19
21
import tech .ydb .table .settings .BulkUpsertSettings ;
20
22
import tech .ydb .table .settings .CommitTxSettings ;
54
56
import tech .ydb .yoj .repository .ydb .exception .YdbRepositoryException ;
55
57
import tech .ydb .yoj .repository .ydb .merge .QueriesMerger ;
56
58
import tech .ydb .yoj .repository .ydb .readtable .ReadTableMapper ;
59
+ import tech .ydb .yoj .repository .ydb .spliterator .ClosableSpliterator ;
60
+ import tech .ydb .yoj .repository .ydb .spliterator .ResultSetIterator ;
61
+ import tech .ydb .yoj .repository .ydb .spliterator .YdbSpliterator ;
62
+ import tech .ydb .yoj .repository .ydb .spliterator .YdbSpliteratorQueue ;
63
+ import tech .ydb .yoj .repository .ydb .spliterator .YdbSpliteratorQueueGrpcStreamAdapter ;
64
+ import tech .ydb .yoj .repository .ydb .spliterator .legacy .YdbLegacySpliterator ;
65
+ import tech .ydb .yoj .repository .ydb .spliterator .legacy .YdbNewLegacySpliterator ;
57
66
import tech .ydb .yoj .repository .ydb .statement .Statement ;
58
67
import tech .ydb .yoj .repository .ydb .table .YdbTable ;
59
68
import tech .ydb .yoj .util .lang .Interrupts ;
60
69
61
70
import java .time .Duration ;
62
71
import java .util .ArrayList ;
72
+ import java .util .Iterator ;
63
73
import java .util .List ;
64
74
import java .util .Map ;
75
+ import java .util .concurrent .CompletableFuture ;
65
76
import java .util .concurrent .TimeUnit ;
66
77
import java .util .function .Supplier ;
67
78
import java .util .stream .Collectors ;
@@ -78,7 +89,7 @@ public class YdbRepositoryTransaction<REPO extends YdbRepository>
78
89
private static final Logger log = LoggerFactory .getLogger (YdbRepositoryTransaction .class );
79
90
80
91
private final List <YdbRepository .Query <?>> pendingWrites = new ArrayList <>();
81
- private final List <YdbSpliterator <?>> spliterators = new ArrayList <>();
92
+ private final List <ClosableSpliterator <?>> spliterators = new ArrayList <>();
82
93
83
94
@ Getter
84
95
private final TxOptions options ;
@@ -102,8 +113,8 @@ public YdbRepositoryTransaction(REPO repo, @NonNull TxOptions options) {
102
113
this .cache = options .isFirstLevelCache () ? new RepositoryCacheImpl () : RepositoryCache .empty ();
103
114
}
104
115
105
- private <V > YdbSpliterator <V > createSpliterator (String request , boolean isOrdered ) {
106
- YdbSpliterator <V > spliterator = new YdbSpliterator <>(request , isOrdered );
116
+ private <V > YdbNewLegacySpliterator <V > createSpliterator (String request , boolean isOrdered ) {
117
+ YdbNewLegacySpliterator <V > spliterator = new YdbNewLegacySpliterator <>(request , isOrdered );
107
118
spliterators .add (spliterator );
108
119
return spliterator ;
109
120
}
@@ -153,7 +164,7 @@ private void doCommit() {
153
164
154
165
private void closeStreams () {
155
166
Exception summaryException = null ;
156
- for (YdbSpliterator <?> spliterator : spliterators ) {
167
+ for (ClosableSpliterator <?> spliterator : spliterators ) {
157
168
try {
158
169
spliterator .close ();
159
170
} catch (Exception e ) {
@@ -387,7 +398,7 @@ public <PARAMS, RESULT> Stream<RESULT> executeScanQuery(Statement<PARAMS, RESULT
387
398
String yql = getYql (statement );
388
399
Params sdkParams = getSdkParams (statement , params );
389
400
390
- YdbSpliterator <RESULT > spliterator = createSpliterator ("scanQuery: " + yql , false );
401
+ YdbNewLegacySpliterator <RESULT > spliterator = createSpliterator ("scanQuery: " + yql , false );
391
402
392
403
initSession ();
393
404
session .executeScanQuery (
@@ -489,7 +500,7 @@ public <PARAMS, RESULT> Stream<RESULT> readTable(ReadTableMapper<PARAMS, RESULT>
489
500
}
490
501
491
502
if (params .isUseNewSpliterator ()) {
492
- YdbSpliterator <RESULT > spliterator = createSpliterator ("readTable: " + tableName , params .isOrdered ());
503
+ YdbNewLegacySpliterator <RESULT > spliterator = createSpliterator ("readTable: " + tableName , params .isOrdered ());
493
504
494
505
initSession ();
495
506
session .readTable (
@@ -500,6 +511,30 @@ public <PARAMS, RESULT> Stream<RESULT> readTable(ReadTableMapper<PARAMS, RESULT>
500
511
return spliterator .createStream ();
501
512
}
502
513
514
+ if (params .isUseNewSpliterator2 ()) {
515
+ initSession ();
516
+
517
+ // TODO: configure stream timeout
518
+ YdbSpliteratorQueue <Iterator <RESULT >> queue = new YdbSpliteratorQueue <>(1 , Duration .ofMinutes (5 ));
519
+
520
+ var adapter = new YdbSpliteratorQueueGrpcStreamAdapter <>("readTable: " + tableName , queue );
521
+ GrpcReadStream <ReadTablePart > grpcStream = session .executeReadTable (tableName , settings .build ());
522
+ CompletableFuture <Status > future = grpcStream .start (readTablePart -> {
523
+ ResultSetIterator <RESULT > iterator = new ResultSetIterator <>(
524
+ readTablePart .getResultSetReader (),
525
+ mapper ::mapResult
526
+ );
527
+ adapter .onNext (iterator );
528
+ });
529
+ future .whenComplete (adapter ::onSupplierThreadComplete );
530
+
531
+ YdbSpliterator <RESULT > spliterator = new YdbSpliterator <>(queue , params .isOrdered ());
532
+
533
+ spliterators .add (spliterator );
534
+
535
+ return spliterator .createStream ();
536
+ }
537
+
503
538
try {
504
539
YdbLegacySpliterator <RESULT > spliterator = new YdbLegacySpliterator <>(params .isOrdered (), action ->
505
540
doCall ("read table " + mapper .getTableName ("" ), () -> {
0 commit comments