|
10 | 10 | #include <ydb/library/services/services.pb.h>
|
11 | 11 | #include <ydb/core/public_http/protos/fq.pb.h>
|
12 | 12 |
|
| 13 | +#include <type_traits> |
| 14 | + |
13 | 15 | namespace NKikimr::NPublicHttp {
|
14 | 16 |
|
15 | 17 | using namespace NActors;
|
@@ -249,6 +251,7 @@ void SetIdempotencyKey(T& dst, const TString& key) {
|
249 | 251 |
|
250 | 252 | template <typename GrpcProtoRequestType, typename HttpProtoRequestType, typename GrpcProtoResultType, typename HttpProtoResultType, typename GrpcProtoResponseType>
|
251 | 253 | class TGrpcCallWrapper : public TActorBootstrapped<TGrpcCallWrapper<GrpcProtoRequestType, HttpProtoRequestType, GrpcProtoResultType, HttpProtoResultType, GrpcProtoResponseType>> {
|
| 254 | +protected: |
252 | 255 | THttpRequestContext RequestContext;
|
253 | 256 |
|
254 | 257 | typedef std::function<std::unique_ptr<NGRpcService::TEvProxyRuntimeEvent>(TIntrusivePtr<NYdbGrpc::IRequestContextBase> ctx)> TGrpcProxyEventFactory;
|
@@ -278,6 +281,10 @@ class TGrpcCallWrapper : public TActorBootstrapped<TGrpcCallWrapper<GrpcProtoReq
|
278 | 281 | }
|
279 | 282 |
|
280 | 283 | void Bootstrap(const TActorContext& ctx) {
|
| 284 | + BootstrapWrapper(ctx); |
| 285 | + } |
| 286 | + |
| 287 | + virtual void BootstrapWrapper(const TActorContext& ctx) { |
281 | 288 | auto grpcRequest = std::make_unique<TGrpcProtoRequestType>();
|
282 | 289 | if (Parse(*grpcRequest)) {
|
283 | 290 | TIntrusivePtr<TGrpcRequestContextWrapper> requestContext = new TGrpcRequestContextWrapper(RequestContext, std::move(grpcRequest), &SendReply);
|
@@ -354,7 +361,6 @@ class TGrpcCallWrapper : public TActorBootstrapped<TGrpcCallWrapper<GrpcProtoReq
|
354 | 361 | auto* httpResult = google::protobuf::Arena::CreateMessage<FQHttp::Error>(resp->GetArena());
|
355 | 362 | FqConvert(typedResponse->operation(), *httpResult);
|
356 | 363 | FqPackToJson(json, *httpResult, jsonSettings);
|
357 |
| - |
358 | 364 | requestContext.ResponseBadRequestJson(typedResponse->operation().status(), json.Str());
|
359 | 365 | return;
|
360 | 366 | }
|
@@ -396,4 +402,72 @@ DECLARE_YQ_GRPC_ACTOR(GetQueryStatus, GetQueryStatus);
|
396 | 402 | DECLARE_YQ_GRPC_ACTOR_WIHT_EMPTY_RESULT(StopQuery, ControlQuery);
|
397 | 403 | DECLARE_YQ_GRPC_ACTOR(GetResultData, GetResultData);
|
398 | 404 |
|
| 405 | +class TJsonStartQuery : public TGrpcCallWrapper<FederatedQuery::DescribeQueryRequest, FQHttp::GetQueryRequest, FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse> { |
| 406 | +public: |
| 407 | + typedef TGrpcCallWrapper<FederatedQuery::DescribeQueryRequest, FQHttp::GetQueryRequest, FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse> TGrpcCallWrapperBase; |
| 408 | + |
| 409 | + TJsonStartQuery(const THttpRequestContext& ctx) |
| 410 | + : TGrpcCallWrapperBase(ctx, &NGRpcService::CreateFederatedQueryDescribeQueryRequestOperationCall) |
| 411 | + {} |
| 412 | + |
| 413 | + void BootstrapWrapper(const TActorContext& ctx) override { |
| 414 | + |
| 415 | + auto describeRequest = std::make_unique<FederatedQuery::DescribeQueryRequest>(); |
| 416 | + if (!Parse(*describeRequest)) { |
| 417 | + this->Die(ctx); |
| 418 | + return; |
| 419 | + } |
| 420 | + |
| 421 | + TProtoStringType queryId = describeRequest->Getquery_id(); |
| 422 | + TIntrusivePtr<TGrpcRequestContextWrapper> requestContext = MakeIntrusive<TGrpcRequestContextWrapper>( |
| 423 | + RequestContext, |
| 424 | + std::move(describeRequest), |
| 425 | + [query_id = std::move(queryId), actorSystem = TActivationContext::ActorSystem()](const THttpRequestContext& requestContext, const TJsonSettings& jsonSettings, NProtoBuf::Message* resp, ui32 status) { |
| 426 | + |
| 427 | + Y_ABORT_UNLESS(resp); |
| 428 | + Y_ABORT_UNLESS(resp->GetArena()); |
| 429 | + |
| 430 | + auto* typedResponse = static_cast<FederatedQuery::DescribeQueryResponse*>(resp); |
| 431 | + if (!typedResponse->operation().result().template Is<FederatedQuery::DescribeQueryResult>()) { |
| 432 | + TStringStream json; |
| 433 | + auto httpResult = std::unique_ptr<FQHttp::Error>(new FQHttp::Error()); |
| 434 | + FqConvert(typedResponse->operation(), *httpResult); |
| 435 | + FqPackToJson(json, *httpResult, jsonSettings); |
| 436 | + requestContext.ResponseBadRequestJson(typedResponse->operation().status(), json.Str()); |
| 437 | + return; |
| 438 | + } |
| 439 | + |
| 440 | + std::unique_ptr<FederatedQuery::DescribeQueryResult> describeResult = std::unique_ptr<FederatedQuery::DescribeQueryResult>(new FederatedQuery::DescribeQueryResult()); |
| 441 | + if (!typedResponse->operation().result().UnpackTo(&*describeResult)) { |
| 442 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Error in response unpack"); |
| 443 | + return; |
| 444 | + } |
| 445 | + |
| 446 | + // modify |
| 447 | + auto modifyRequest = std::unique_ptr<FederatedQuery::ModifyQueryRequest>(new FederatedQuery::ModifyQueryRequest()); |
| 448 | + |
| 449 | + modifyRequest->set_query_id(query_id); |
| 450 | + *modifyRequest->mutable_content() = describeResult->query().content(); |
| 451 | + modifyRequest->set_execute_mode(::FederatedQuery::ExecuteMode::RUN); |
| 452 | + modifyRequest->set_state_load_mode(::FederatedQuery::StateLoadMode::STATE_LOAD_MODE_UNSPECIFIED); |
| 453 | + modifyRequest->set_previous_revision(describeResult->query().meta().Getlast_job_query_revision()); |
| 454 | + modifyRequest->set_idempotency_key(requestContext.GetIdempotencyKey()); |
| 455 | + |
| 456 | + TIntrusivePtr<TGrpcRequestContextWrapper> requestContextModify = new TGrpcRequestContextWrapper( |
| 457 | + requestContext, |
| 458 | + std::move(modifyRequest), |
| 459 | + TGrpcCallWrapper<FederatedQuery::ModifyQueryRequest, int, FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse>::SendReply |
| 460 | + ); |
| 461 | + |
| 462 | + // new event -> new EventFactory |
| 463 | + actorSystem->Send(NGRpcService::CreateGRpcRequestProxyId(), NGRpcService::CreateFederatedQueryModifyQueryRequestOperationCall(std::move(requestContextModify)).release()); |
| 464 | + }); |
| 465 | + |
| 466 | + ctx.Send(NGRpcService::CreateGRpcRequestProxyId(), EventFactory(std::move(requestContext)).release()); |
| 467 | + this->Die(ctx); |
| 468 | + } |
| 469 | +}; |
| 470 | + |
| 471 | +#undef TGrpcCallWrapperBase |
| 472 | + |
399 | 473 | } // namespace NKikimr::NPublicHttp
|
0 commit comments