|
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,11 @@ class TGrpcCallWrapper : public TActorBootstrapped<TGrpcCallWrapper<GrpcProtoReq
|
278 | 281 | }
|
279 | 282 |
|
280 | 283 | void Bootstrap(const TActorContext& ctx) {
|
| 284 | + Bootstrap_wrapper(ctx); |
| 285 | + } |
| 286 | + |
| 287 | + virtual void Bootstrap_wrapper(const TActorContext& ctx) { |
| 288 | + std::cerr << "Call base\n"; |
281 | 289 | auto grpcRequest = std::make_unique<TGrpcProtoRequestType>();
|
282 | 290 | if (Parse(*grpcRequest)) {
|
283 | 291 | TIntrusivePtr<TGrpcRequestContextWrapper> requestContext = new TGrpcRequestContextWrapper(RequestContext, std::move(grpcRequest), &SendReply);
|
@@ -349,14 +357,13 @@ class TGrpcCallWrapper : public TActorBootstrapped<TGrpcCallWrapper<GrpcProtoReq
|
349 | 357 | Y_ABORT_UNLESS(resp->GetArena());
|
350 | 358 | Y_UNUSED(status);
|
351 | 359 | 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 | + if (!typedResponse->operation().result().template Is<TGrpcProtoResultType>()) { |
| 361 | + TStringStream json; |
| 362 | + auto* httpResult = google::protobuf::Arena::CreateMessage<FQHttp::Error>(resp->GetArena()); |
| 363 | + FqConvert(typedResponse->operation(), *httpResult); |
| 364 | + FqPackToJson(json, *httpResult, jsonSettings); |
| 365 | + requestContext.ResponseBadRequestJson(typedResponse->operation().status(), json.Str()); |
| 366 | + return; |
360 | 367 | }
|
361 | 368 |
|
362 | 369 | auto* grpcResult = google::protobuf::Arena::CreateMessage<TGrpcProtoResultType>(resp->GetArena());
|
@@ -396,4 +403,88 @@ DECLARE_YQ_GRPC_ACTOR(GetQueryStatus, GetQueryStatus);
|
396 | 403 | DECLARE_YQ_GRPC_ACTOR_WIHT_EMPTY_RESULT(StopQuery, ControlQuery);
|
397 | 404 | DECLARE_YQ_GRPC_ACTOR(GetResultData, GetResultData);
|
398 | 405 |
|
| 406 | +#define TGrpcCallWrapperBase TGrpcCallWrapper<FederatedQuery::DescribeQueryRequest, FQHttp::GetQueryRequest, FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse> |
| 407 | + |
| 408 | +class TStartQueryRequest : public TGrpcCallWrapperBase { |
| 409 | +public: |
| 410 | + TStartQueryRequest(const THttpRequestContext& ctx) |
| 411 | + : TGrpcCallWrapperBase(ctx, &NGRpcService::CreateFederatedQueryDescribeQueryRequestOperationCall) |
| 412 | + {} |
| 413 | + |
| 414 | + void Bootstrap_wrapper(const TActorContext& ctx) override { |
| 415 | + std::cerr << "Call derived\n"; |
| 416 | + |
| 417 | + auto describeRequest = std::make_unique<FederatedQuery::DescribeQueryRequest>(); |
| 418 | + if (!Parse(*describeRequest)) { |
| 419 | + this->Die(ctx); |
| 420 | + return; |
| 421 | + } |
| 422 | + |
| 423 | + TIntrusivePtr<TGrpcRequestContextWrapper> requestContext = new TGrpcRequestContextWrapper( |
| 424 | + RequestContext, |
| 425 | + std::move(describeRequest), |
| 426 | + [&, this, query_id = describeRequest->Getquery_id()](const THttpRequestContext& requestContext, const TJsonSettings& jsonSettings, NProtoBuf::Message* resp, ui32 status) { |
| 427 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response-1"); return; |
| 428 | + Y_ABORT_UNLESS(resp); |
| 429 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response-2"); return; |
| 430 | + Y_ABORT_UNLESS(resp->GetArena()); |
| 431 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response-3"); return; |
| 432 | + |
| 433 | + auto* typedResponse = static_cast<FederatedQuery::DescribeQueryResponse*>(resp); |
| 434 | + if (!typedResponse->operation().result().template Is<FederatedQuery::DescribeQueryResult>()) { |
| 435 | + TStringStream json; |
| 436 | + auto* httpResult = google::protobuf::Arena::CreateMessage<FQHttp::Error>(resp->GetArena()); |
| 437 | + FqConvert(typedResponse->operation(), *httpResult); |
| 438 | + FqPackToJson(json, *httpResult, jsonSettings); |
| 439 | + requestContext.ResponseBadRequestJson(typedResponse->operation().status(), json.Str()); |
| 440 | + this->Die(ctx); |
| 441 | + return; |
| 442 | + } |
| 443 | + |
| 444 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response1"); return; |
| 445 | + |
| 446 | + FederatedQuery::DescribeQueryResult* describeResult = google::protobuf::Arena::CreateMessage<FederatedQuery::DescribeQueryResult>(resp->GetArena()); |
| 447 | + if(!typedResponse->operation().result().UnpackTo(describeResult)) { |
| 448 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Error in response unpack"); |
| 449 | + this->Die(ctx); |
| 450 | + return; |
| 451 | + } |
| 452 | + |
| 453 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response2"); return; |
| 454 | + |
| 455 | + |
| 456 | + // modify |
| 457 | + auto modifyRequest = std::unique_ptr<FederatedQuery::ModifyQueryRequest>(google::protobuf::Arena::CreateMessage<FederatedQuery::ModifyQueryRequest>(resp->GetArena())); |
| 458 | + |
| 459 | + modifyRequest->set_query_id(query_id); |
| 460 | + auto content = describeResult->Getquery().content(); |
| 461 | + modifyRequest->set_allocated_content(&content); |
| 462 | + modifyRequest->set_execute_mode(::FederatedQuery::ExecuteMode::RUN); |
| 463 | + modifyRequest->set_allocated_disposition(nullptr); |
| 464 | + modifyRequest->set_state_load_mode(::FederatedQuery::StateLoadMode::STATE_LOAD_MODE_UNSPECIFIED); |
| 465 | + modifyRequest->set_previous_revision(describeResult->Getquery().meta().Getlast_job_query_revision()); |
| 466 | + modifyRequest->set_idempotency_key(requestContext.GetIdempotencyKey()); |
| 467 | + |
| 468 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response3"); return; |
| 469 | + |
| 470 | + TIntrusivePtr<TGrpcRequestContextWrapper> requestContextModify = new TGrpcRequestContextWrapper( |
| 471 | + this->RequestContext, |
| 472 | + std::move(modifyRequest), |
| 473 | + TGrpcCallWrapper<FederatedQuery::ModifyQueryRequest, int, FederatedQuery::ModifyQueryResult, google::protobuf::Empty, FederatedQuery::ModifyQueryResponse>::SendReply |
| 474 | + ); |
| 475 | + |
| 476 | + requestContext.ResponseBadRequest(Ydb::StatusIds::INTERNAL_ERROR, "Debug response4"); return; |
| 477 | + |
| 478 | + // new event -> new EventFactory |
| 479 | + EventFactory = &NGRpcService::CreateFederatedQueryModifyQueryRequestOperationCall; |
| 480 | + ctx.Send(NGRpcService::CreateGRpcRequestProxyId(), EventFactory(requestContextModify).release()); |
| 481 | + this->Die(ctx); |
| 482 | + }); |
| 483 | + |
| 484 | + ctx.Send(NGRpcService::CreateGRpcRequestProxyId(), EventFactory(requestContext).release()); |
| 485 | + } |
| 486 | +}; |
| 487 | + |
| 488 | +#undef TGrpcCallWrapperBase |
| 489 | + |
399 | 490 | } // namespace NKikimr::NPublicHttp
|
0 commit comments