@@ -249,6 +249,7 @@ void SetIdempotencyKey(T& dst, const TString& key) {
249
249
250
250
template <typename GrpcProtoRequestType, typename HttpProtoRequestType, typename GrpcProtoResultType, typename HttpProtoResultType, typename GrpcProtoResponseType>
251
251
class TGrpcCallWrapper : public TActorBootstrapped <TGrpcCallWrapper<GrpcProtoRequestType, HttpProtoRequestType, GrpcProtoResultType, HttpProtoResultType, GrpcProtoResponseType>> {
252
+ protected:
252
253
THttpRequestContext RequestContext;
253
254
254
255
typedef std::function<std::unique_ptr<NGRpcService::TEvProxyRuntimeEvent>(TIntrusivePtr<NYdbGrpc::IRequestContextBase> ctx)> TGrpcProxyEventFactory;
@@ -344,20 +345,22 @@ class TGrpcCallWrapper : public TActorBootstrapped<TGrpcCallWrapper<GrpcProtoReq
344
345
RequestContext.ResponseBadRequest (Ydb::StatusIds::BAD_REQUEST, error);
345
346
}
346
347
348
+ #define CheckTypedResponse (typedResponse, ResultType ) \
349
+ if (!typedResponse->operation ().result().template Is<ResultType>()) { \
350
+ TStringStream json; \
351
+ auto * httpResult = google::protobuf::Arena::CreateMessage<FQHttp::Error>(resp->GetArena ()); \
352
+ FqConvert (typedResponse->operation (), *httpResult); \
353
+ FqPackToJson (json, *httpResult, jsonSettings); \
354
+ requestContext.ResponseBadRequestJson (typedResponse->operation ().status (), json.Str ()); \
355
+ return ; \
356
+ }
357
+
347
358
static void SendReply (const THttpRequestContext& requestContext, const TJsonSettings& jsonSettings, NProtoBuf::Message* resp, ui32 status) {
348
359
Y_ABORT_UNLESS (resp);
349
360
Y_ABORT_UNLESS (resp->GetArena ());
350
361
Y_UNUSED (status);
351
362
auto * typedResponse = static_cast <TGrpcProtoResponseType*>(resp);
352
- if (!typedResponse->operation ().result ().template Is <TGrpcProtoResultType>()) {
353
- TStringStream json;
354
- auto * httpResult = google::protobuf::Arena::CreateMessage<FQHttp::Error>(resp->GetArena ());
355
- FqConvert (typedResponse->operation (), *httpResult);
356
- FqPackToJson (json, *httpResult, jsonSettings);
357
-
358
- requestContext.ResponseBadRequestJson (typedResponse->operation ().status (), json.Str ());
359
- return ;
360
- }
363
+ CheckTypedResponse (typedResponse, TGrpcProtoResultType);
361
364
362
365
auto * grpcResult = google::protobuf::Arena::CreateMessage<TGrpcProtoResultType>(resp->GetArena ());
363
366
typedResponse->operation ().result ().UnpackTo (grpcResult);
@@ -396,4 +399,63 @@ DECLARE_YQ_GRPC_ACTOR(GetQueryStatus, GetQueryStatus);
396
399
DECLARE_YQ_GRPC_ACTOR_WIHT_EMPTY_RESULT (StopQuery, ControlQuery);
397
400
DECLARE_YQ_GRPC_ACTOR (GetResultData, GetResultData);
398
401
402
+ #define TGrpcCallWrapperBase TGrpcCallWrapper<FederatedQuery::DescribeQueryRequest, FQHttp::GetQueryRequest, FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse>
403
+
404
+ class TRestartQueryRequest : public TGrpcCallWrapperBase {
405
+ public:
406
+ TRestartQueryRequest (const THttpRequestContext& ctx)
407
+ : TGrpcCallWrapperBase(ctx, &NGRpcService::CreateFederatedQueryDescribeQueryRequestOperationCall)
408
+ {}
409
+
410
+ void Bootstrap (const TActorContext& ctx) {
411
+ auto describeRequest = std::make_unique<FederatedQuery::DescribeQueryRequest>();
412
+ if (!Parse (*describeRequest)) {
413
+ this ->Die (ctx);
414
+ return ;
415
+ }
416
+
417
+ TIntrusivePtr<TGrpcRequestContextWrapper> requestContext = new TGrpcRequestContextWrapper (
418
+ RequestContext,
419
+ std::move (describeRequest),
420
+ [&, this , query_id = describeRequest->Getquery_id ()](const THttpRequestContext& requestContext, const TJsonSettings& jsonSettings, NProtoBuf::Message* resp, ui32 status) {
421
+ Y_ABORT_UNLESS (resp);
422
+ Y_ABORT_UNLESS (resp->GetArena ());
423
+
424
+ auto * typedResponse = static_cast <FederatedQuery::DescribeQueryResponse*>(resp);
425
+ CheckTypedResponse (typedResponse, FederatedQuery::DescribeQueryResult);
426
+
427
+ FederatedQuery::DescribeQueryResult* describeResult = google::protobuf::Arena::CreateMessage<FederatedQuery::DescribeQueryResult>(resp->GetArena ());
428
+ typedResponse->operation ().result ().UnpackTo (describeResult);
429
+
430
+
431
+ // modify
432
+ auto modifyRequest = std::unique_ptr<FederatedQuery::ModifyQueryRequest>(google::protobuf::Arena::CreateMessage<FederatedQuery::ModifyQueryRequest>(resp->GetArena ()));
433
+
434
+ modifyRequest->set_query_id (query_id);
435
+ auto content = describeResult->Getquery ().content ();
436
+ modifyRequest->set_allocated_content (&content);
437
+ modifyRequest->set_execute_mode (::FederatedQuery::ExecuteMode::RUN);
438
+ modifyRequest->set_allocated_disposition (nullptr );
439
+ modifyRequest->set_state_load_mode (::FederatedQuery::StateLoadMode::FROM_LAST_CHECKPOINT);
440
+ modifyRequest->set_previous_revision (describeResult->Getquery ().meta ().Getlast_job_query_revision ());
441
+ modifyRequest->set_idempotency_key (requestContext.GetIdempotencyKey ());
442
+
443
+ TIntrusivePtr<TGrpcRequestContextWrapper> requestContextModify = new TGrpcRequestContextWrapper (
444
+ this ->RequestContext ,
445
+ std::move (modifyRequest),
446
+ TGrpcCallWrapper<FederatedQuery::ModifyQueryRequest, int , FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse>::SendReply
447
+ );
448
+
449
+ // новый тип события, по идее нужна новая фабрика
450
+ EventFactory = &NGRpcService::CreateFederatedQueryModifyQueryRequestOperationCall;
451
+ ctx.Send (NGRpcService::CreateGRpcRequestProxyId (), EventFactory (requestContextModify).release ());
452
+ this ->Die (ctx);
453
+ });
454
+
455
+ ctx.Send (NGRpcService::CreateGRpcRequestProxyId (), EventFactory (requestContext).release ());
456
+ }
457
+ };
458
+
459
+ #undef TGrpcCallWrapperBase
460
+
399
461
} // namespace NKikimr::NPublicHttp
0 commit comments