@@ -100,7 +100,7 @@ IGraphTransformer::TStatus TKqpColumnStatisticsRequester::DoTransform(TExprNode:
100
100
NKikimr::NStat::TRequest req;
101
101
req.ColumnTag = columnsMeta[column].Id ;
102
102
req.PathId = pathId;
103
- getStatisticsRequest->StatRequests .push_back (req);
103
+ getStatisticsRequest->StatRequests .push_back (std::move ( req) );
104
104
105
105
tableMetaByPathId[pathId].TableName = table;
106
106
tableMetaByPathId[pathId].ColumnNameByTag [req.ColumnTag .value ()] = column;
@@ -113,15 +113,14 @@ IGraphTransformer::TStatus TKqpColumnStatisticsRequester::DoTransform(TExprNode:
113
113
114
114
using TRequest = NStat::TEvStatistics::TEvGetStatistics;
115
115
using TResponse = NStat::TEvStatistics::TEvGetStatisticsResult;
116
- struct TResult : public NYql ::IKikimrGateway::TGenericResult {
117
- THashMap<TString, TOptimizerStatistics::TColumnStatMap> columnStatisticsByTableName;
118
- };
119
116
120
- auto promise = NewPromise<TResult>();
117
+ AsyncReadiness = NewPromise<void >();
118
+ auto promise = NewPromise<TColumnStatisticsResponse>();
121
119
auto callback = [tableMetaByPathId = std::move (tableMetaByPathId)]
122
- (TPromise<TResult > promise, NStat::TEvStatistics::TEvGetStatisticsResult&& response) mutable {
120
+ (TPromise<TColumnStatisticsResponse > promise, NStat::TEvStatistics::TEvGetStatisticsResult&& response) mutable {
123
121
if (!response.Success ) {
124
- promise.SetValue (NYql::NCommon::ResultFromError<TResult>(" can't get column statistics!" ));
122
+ promise.SetValue (NYql::NCommon::ResultFromError<TColumnStatisticsResponse>(" can't get column statistics!" ));
123
+ return ;
125
124
}
126
125
127
126
THashMap<TString, TOptimizerStatistics::TColumnStatMap> columnStatisticsByTableName;
@@ -133,30 +132,39 @@ IGraphTransformer::TStatus TKqpColumnStatisticsRequester::DoTransform(TExprNode:
133
132
columnStatistics.CountMinSketch = std::move (stat.CountMinSketch .CountMin );
134
133
}
135
134
136
- promise.SetValue (TResult{. columnStatisticsByTableName = std::move (columnStatisticsByTableName)});
135
+ promise.SetValue (TColumnStatisticsResponse{. ColumnStatisticsByTableName = std::move (columnStatisticsByTableName)});
137
136
};
138
137
auto statServiceId = NStat::MakeStatServiceID (ActorSystem->NodeId );
139
138
IActor* requestHandler =
140
- new TActorRequestHandler<TRequest, TResponse, TResult >(statServiceId, getStatisticsRequest.Release (), promise, callback);
141
- auto actorId = ActorSystem
139
+ new TActorRequestHandler<TRequest, TResponse, TColumnStatisticsResponse >(statServiceId, getStatisticsRequest.Release (), promise, callback);
140
+ ActorSystem
142
141
->Register (requestHandler, TMailboxType::HTSwap, ActorSystem->AppData <TAppData>()->UserPoolId );
143
- Y_UNUSED (actorId);
144
142
145
- auto res = promise.GetFuture ().GetValueSync ();
146
- if (!res.Issues ().Empty ()) {
147
- TStringStream ss;
148
- res.Issues ().PrintTo (ss);
149
- YQL_CLOG (DEBUG, ProviderKikimr) << " Can't load columns statistics for request: " << ss.Str ();
143
+ promise.GetFuture ().Subscribe ([this ](auto result){ ColumnStatisticsResponse = result.ExtractValue (); AsyncReadiness.SetValue (); });
144
+
145
+ return TStatus::Async;
146
+ }
147
+
148
+ IGraphTransformer::TStatus TKqpColumnStatisticsRequester::DoApplyAsyncChanges (TExprNode::TPtr, TExprNode::TPtr&, TExprContext&) {
149
+ Y_ENSURE (AsyncReadiness.IsReady () && ColumnStatisticsResponse.has_value ());
150
+
151
+ if (!ColumnStatisticsResponse->Issues ().Empty ()) {
152
+ TStringStream ss; ColumnStatisticsResponse->Issues ().PrintTo (ss);
153
+ YQL_CLOG (TRACE, ProviderKikimr) << " Can't load columns statistics for request: " << ss.Str ();
150
154
return IGraphTransformer::TStatus::Ok;
151
155
}
152
156
153
- for (auto && [tableName, columnStatistics]: res. columnStatisticsByTableName ) {
157
+ for (auto && [tableName, columnStatistics]: ColumnStatisticsResponse-> ColumnStatisticsByTableName ) {
154
158
TypesCtx.ColumnStatisticsByTableName .insert (
155
159
{std::move (tableName), new TOptimizerStatistics::TColumnStatMap (std::move (columnStatistics))}
156
160
);
157
161
}
158
162
159
- return IGraphTransformer::TStatus::Ok;
163
+ return TStatus::Ok;
164
+ }
165
+
166
+ TFuture<void > TKqpColumnStatisticsRequester::DoGetAsyncFuture (const TExprNode&) {
167
+ return AsyncReadiness.GetFuture ();
160
168
}
161
169
162
170
bool TKqpColumnStatisticsRequester::BeforeLambdas (const TExprNode::TPtr& input) {
0 commit comments