11package tech .ydb .query .impl ;
22
33import java .time .Duration ;
4+ import java .util .ArrayList ;
5+ import java .util .Arrays ;
6+ import java .util .List ;
47import java .util .concurrent .CompletableFuture ;
58import java .util .concurrent .ScheduledExecutorService ;
69import java .util .concurrent .atomic .AtomicReference ;
710
811import tech .ydb .common .transaction .TxMode ;
12+ import tech .ydb .core .Issue ;
913import tech .ydb .core .Result ;
1014import tech .ydb .core .Status ;
1115import tech .ydb .core .StatusCode ;
1216import tech .ydb .core .UnexpectedResultException ;
1317import tech .ydb .core .grpc .GrpcTransport ;
18+ import tech .ydb .proto .ValueProtos ;
1419import tech .ydb .proto .query .YdbQuery ;
1520import tech .ydb .proto .table .YdbTable ;
1621import tech .ydb .query .QuerySession ;
1722import tech .ydb .query .QueryStream ;
23+ import tech .ydb .query .result .QueryInfo ;
24+ import tech .ydb .query .result .QueryResultPart ;
1825import tech .ydb .query .settings .ExecuteQuerySettings ;
1926import tech .ydb .query .settings .QueryStatsMode ;
20- import tech .ydb .query .tools .QueryReader ;
2127import tech .ydb .table .Session ;
2228import tech .ydb .table .SessionPoolStats ;
2329import tech .ydb .table .TableClient ;
2935import tech .ydb .table .query .stats .QueryPhaseStats ;
3036import tech .ydb .table .query .stats .QueryStats ;
3137import tech .ydb .table .query .stats .TableAccessStats ;
32- import tech .ydb .table .result .ResultSetReader ;
3338import tech .ydb .table .rpc .TableRpc ;
3439import tech .ydb .table .rpc .grpc .GrpcTableRpc ;
3540import tech .ydb .table .settings .ExecuteDataQuerySettings ;
@@ -95,103 +100,51 @@ private YdbQuery.TransactionControl mapTxControl(YdbTable.TransactionControl tc)
95100 return TxControl .txModeCtrl (TxMode .NONE , tc .getCommitTx ());
96101 }
97102
98- private static class ProxedDataQueryResult extends DataQueryResult {
99- private final String txID ;
100- private final QueryReader reader ;
101- private final QueryStats queryStats ;
102-
103- private ProxedDataQueryResult (String txID , QueryReader reader ) {
104- super (YdbTable .ExecuteQueryResult .getDefaultInstance ());
105- this .txID = txID ;
106- this .reader = reader ;
107-
108- tech .ydb .query .result .QueryStats stats = reader .getQueryInfo ().getStats ();
109- this .queryStats = stats == null ? null : queryStats (stats );
110- }
111-
112- @ Override
113- public String getTxId () {
114- return txID ;
115- }
116-
117- @ Override
118- public int getResultSetCount () {
119- return reader .getResultSetCount ();
120- }
121-
122- @ Override
123- public ResultSetReader getResultSet (int index ) {
124- return reader .getResultSet (index );
125- }
126-
127- @ Override
128- public boolean isTruncated (int index ) {
129- return false ;
130- }
131-
132- @ Override
133- public int getRowCount (int index ) {
134- return reader .getResultSet (index ).getRowCount ();
135- }
136-
137- @ Override
138- public boolean isEmpty () {
139- return txID .isEmpty () && reader .getResultSetCount () == 0 ;
140- }
141-
142- @ Override
143- public QueryStats getQueryStats () {
144- return this .queryStats ;
145- }
146-
147- @ Override
148- public boolean hasQueryStats () {
149- return this .queryStats != null ;
150- }
151-
152- private static QueryStats queryStats (tech .ydb .query .result .QueryStats stats ) {
153- return new QueryStats (
154- stats .getPhases ().stream ().map (qp -> queryPhaseStats (qp )).collect (toList ()),
155- compilationStats (stats .getCompilationStats ()),
156- stats .getProcessCpuTimeUs (),
157- stats .getQueryPlan (),
158- stats .getQueryAst (),
159- stats .getTotalDurationUs (),
160- stats .getTotalCpuTimeUs ()
161- );
103+ private static QueryStats queryStats (tech .ydb .query .result .QueryStats stats ) {
104+ if (stats == null ) {
105+ return null ;
162106 }
107+ return new QueryStats (
108+ stats .getPhases ().stream ().map (qp -> queryPhaseStats (qp )).collect (toList ()),
109+ compilationStats (stats .getCompilationStats ()),
110+ stats .getProcessCpuTimeUs (),
111+ stats .getQueryPlan (),
112+ stats .getQueryAst (),
113+ stats .getTotalDurationUs (),
114+ stats .getTotalCpuTimeUs ()
115+ );
116+ }
163117
164- private static QueryPhaseStats queryPhaseStats (tech .ydb .query .result .QueryStats .QueryPhase queryPhase ) {
165- return new QueryPhaseStats (
166- queryPhase .getDurationUs (),
167- queryPhase .getTableAccesses ().stream ().map (ta -> tableAccessStats (ta )).collect (toList ()),
168- queryPhase .getCpuTimeUs (),
169- queryPhase .getAffectedShards (),
170- queryPhase .isLiteralPhase ()
171- );
172- }
118+ private static QueryPhaseStats queryPhaseStats (tech .ydb .query .result .QueryStats .QueryPhase queryPhase ) {
119+ return new QueryPhaseStats (
120+ queryPhase .getDurationUs (),
121+ queryPhase .getTableAccesses ().stream ().map (ta -> tableAccessStats (ta )).collect (toList ()),
122+ queryPhase .getCpuTimeUs (),
123+ queryPhase .getAffectedShards (),
124+ queryPhase .isLiteralPhase ()
125+ );
126+ }
173127
174- private static TableAccessStats tableAccessStats (tech .ydb .query .result .QueryStats .TableAccess tableAccess ) {
175- return new TableAccessStats (
176- tableAccess .getTableName (),
177- operationStats (tableAccess .getReads ()),
178- operationStats (tableAccess .getUpdates ()),
179- operationStats (tableAccess .getDeletes ()),
180- tableAccess .getPartitionsCount ()
181- );
182- }
128+ private static TableAccessStats tableAccessStats (tech .ydb .query .result .QueryStats .TableAccess tableAccess ) {
129+ return new TableAccessStats (
130+ tableAccess .getTableName (),
131+ operationStats (tableAccess .getReads ()),
132+ operationStats (tableAccess .getUpdates ()),
133+ operationStats (tableAccess .getDeletes ()),
134+ tableAccess .getPartitionsCount ()
135+ );
136+ }
183137
184- private static OperationStats operationStats (tech .ydb .query .result .QueryStats .Operation operation ) {
185- return new OperationStats (operation .getRows (), operation .getBytes ());
186- }
138+ private static OperationStats operationStats (tech .ydb .query .result .QueryStats .Operation operation ) {
139+ return new OperationStats (operation .getRows (), operation .getBytes ());
140+ }
187141
188- private static CompilationStats compilationStats (tech .ydb .query .result .QueryStats .Compilation compilation ) {
189- return new CompilationStats (
190- compilation .isFromCache (),
191- compilation .getDurationUs (),
192- compilation .getCpuTimeUs ()
193- );
194- }
142+ private static CompilationStats compilationStats (tech .ydb .query .result .QueryStats .Compilation compilation ) {
143+ return new CompilationStats (
144+ compilation .isFromCache (),
145+ compilation .getDurationUs (),
146+ compilation .getCpuTimeUs ()
147+ );
195148 }
196149
197150 private class TableSession extends BaseSession {
@@ -213,17 +166,49 @@ public CompletableFuture<Result<DataQueryResult>> executeDataQueryInternal(
213166 .build ();
214167
215168 final AtomicReference <String > txRef = new AtomicReference <>("" );
169+ final List <Issue > issues = new ArrayList <>();
170+ final List <ValueProtos .ResultSet > results = new ArrayList <>();
171+
216172 QueryStream stream = querySession .new StreamImpl (querySession .createGrpcStream (query , tc , prms , qs )) {
217173 @ Override
218174 void handleTxMeta (String txID ) {
219175 txRef .set (txID );
220176 }
221177 };
222178
223- return QueryReader .readFrom (stream )
224- .thenApply (r -> r .map (
225- reader -> new ProxedDataQueryResult (txRef .get (), reader )
226- ));
179+ CompletableFuture <Result <QueryInfo >> future = stream .execute (new QueryStream .PartsHandler () {
180+ @ Override
181+ public void onIssues (Issue [] issueArr ) {
182+ issues .addAll (Arrays .asList (issueArr ));
183+ }
184+
185+ @ Override
186+ public void onNextPart (QueryResultPart part ) { } // not used
187+
188+ @ Override
189+ public void onNextRawPart (long index , ValueProtos .ResultSet rs ) {
190+ int idx = (int ) index ;
191+ while (results .size () <= idx ) {
192+ results .add (null );
193+ }
194+ if (results .get (idx ) == null ) {
195+ results .set (idx , rs );
196+ } else {
197+ results .set (idx , results .get (idx ).toBuilder ().addAllRows (rs .getRowsList ()).build ());
198+ }
199+ }
200+ });
201+
202+
203+ return future .thenApply (res -> {
204+ if (!res .isSuccess ()) {
205+ return res .map (v -> null );
206+ }
207+ QueryStats info = queryStats (res .getValue ().getStats ());
208+ String txId = txRef .get ();
209+ Status status = res .getStatus ().withIssues (issues .toArray (new Issue [0 ]));
210+ return Result .success (new DataQueryResult (txId , results , info ), status );
211+ });
227212 }
228213
229214 @ Override
0 commit comments