Skip to content

Commit 573ed04

Browse files
Merge 04336eb into b9e1b38
2 parents b9e1b38 + 04336eb commit 573ed04

10 files changed

+401
-28
lines changed

ydb/core/grpc_services/local_rpc/local_rpc.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,7 @@ void SetRequestSyncOperationMode(TRequest&) {
305305
template<typename TRpc>
306306
NThreading::TFuture<typename TRpc::TResponse> DoLocalRpc(typename TRpc::TRequest&& proto, const TString& database,
307307
const TMaybe<TString>& token, const TMaybe<TString>& requestType,
308-
TActorSystem* actorSystem, bool internalCall = false)
309-
{
308+
TActorSystem* actorSystem, bool internalCall = false) {
310309
auto promise = NThreading::NewPromise<typename TRpc::TResponse>();
311310

312311
SetRequestSyncOperationMode(proto);

ydb/core/grpc_services/query/rpc_execute_script.cpp

+23-21
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <ydb/core/base/appdata.h>
44
#include <ydb/library/ydb_issue/issue_helpers.h>
55
#include <ydb/core/grpc_services/base/base.h>
6+
#include <ydb/core/grpc_services/rpc_request_base.h>
67
#include <ydb/core/grpc_services/rpc_kqp_base.h>
78
#include <ydb/core/grpc_services/audit_dml_operations.h>
89
#include <ydb/core/grpc_services/grpc_integrity_trails.h>
@@ -72,27 +73,29 @@ std::tuple<Ydb::StatusIds::StatusCode, NYql::TIssues> FillKqpRequest(
7273
return {Ydb::StatusIds::SUCCESS, {}};
7374
}
7475

75-
class TExecuteScriptRPC : public TActorBootstrapped<TExecuteScriptRPC> {
76+
class TExecuteScriptRPC : public TRpcRequestActor<TExecuteScriptRPC, TEvExecuteScriptRequest, false> {
7677
public:
78+
using TRpcRequestActorBase = TRpcRequestActor<TExecuteScriptRPC, TEvExecuteScriptRequest, false>;
79+
7780
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
7881
return NKikimrServices::TActivity::GRPC_REQ;
7982
}
8083

81-
TExecuteScriptRPC(TEvExecuteScriptRequest* request)
82-
: Request_(request)
84+
TExecuteScriptRPC(IRequestNoOpCtx* request)
85+
: TRpcRequestActorBase(request)
8386
{}
8487

8588
void Bootstrap() {
8689
NYql::TIssues issues;
87-
const auto& request = *Request_->GetProtoRequest();
90+
const auto& request = GetProtoRequest();
8891

89-
if (request.operation_params().operation_mode() == Ydb::Operations::OperationParams::SYNC) {
92+
if (request->operation_params().operation_mode() == Ydb::Operations::OperationParams::SYNC) {
9093
issues.AddIssue("ExecuteScript must be asyncronous operation");
9194
return Reply(Ydb::StatusIds::BAD_REQUEST, issues);
9295
}
9396

94-
AuditContextAppend(Request_.get(), request);
95-
NDataIntegrity::LogIntegrityTrails(Request_->GetTraceId(), request, TlsActivationContext->AsActorContext());
97+
AuditContextAppend(Request.Get(), request);
98+
NDataIntegrity::LogIntegrityTrails(Request->GetTraceId(), *request, TlsActivationContext->AsActorContext());
9699

97100
Ydb::StatusIds::StatusCode status = Ydb::StatusIds::SUCCESS;
98101
if (auto scriptRequest = MakeScriptRequest(issues, status)) {
@@ -113,7 +116,7 @@ class TExecuteScriptRPC : public TActorBootstrapped<TExecuteScriptRPC> {
113116
)
114117

115118
void Handle(NKqp::TEvKqp::TEvScriptResponse::TPtr& ev, const TActorContext& ctx) {
116-
NDataIntegrity::LogIntegrityTrails(Request_->GetTraceId(), *Request_->GetProtoRequest(), ev, ctx);
119+
NDataIntegrity::LogIntegrityTrails(Request->GetTraceId(), *GetProtoRequest(), ev, ctx);
117120

118121
Ydb::Operations::Operation operation;
119122
operation.set_id(ev->Get()->OperationId);
@@ -126,14 +129,14 @@ class TExecuteScriptRPC : public TActorBootstrapped<TExecuteScriptRPC> {
126129
}
127130

128131
THolder<NKqp::TEvKqp::TEvScriptRequest> MakeScriptRequest(NYql::TIssues& issues, Ydb::StatusIds::StatusCode& status) const {
129-
const auto* req = Request_->GetProtoRequest();
130-
const auto traceId = Request_->GetTraceId();
132+
const auto* req = GetProtoRequest();
133+
const auto traceId = Request->GetTraceId();
131134

132135
auto ev = MakeHolder<NKqp::TEvKqp::TEvScriptRequest>();
133136

134-
SetAuthToken(ev, *Request_);
135-
SetDatabase(ev, *Request_);
136-
SetRlPath(ev, *Request_);
137+
SetAuthToken(ev, *Request);
138+
SetDatabase(ev, *Request);
139+
SetRlPath(ev, *Request);
137140

138141
if (traceId) {
139142
ev->Record.SetTraceId(traceId.GetRef());
@@ -166,12 +169,9 @@ class TExecuteScriptRPC : public TActorBootstrapped<TExecuteScriptRPC> {
166169

167170
result.set_status(status);
168171

169-
AuditContextAppend(Request_.get(), *Request_->GetProtoRequest(), result);
170-
171-
TString serializedResult;
172-
Y_PROTOBUF_SUPPRESS_NODISCARD result.SerializeToString(&serializedResult);
172+
AuditContextAppend(Request.Get(), GetProtoRequest(), result);
173173

174-
Request_->SendSerializedResult(std::move(serializedResult), status);
174+
TProtoResponseHelper::SendProtoResponse(result, status, Request);
175175

176176
PassAway();
177177
}
@@ -181,9 +181,6 @@ class TExecuteScriptRPC : public TActorBootstrapped<TExecuteScriptRPC> {
181181
result.set_ready(true);
182182
Reply(status, std::move(result), issues);
183183
}
184-
185-
private:
186-
std::unique_ptr<TEvExecuteScriptRequest> Request_;
187184
};
188185

189186
} // namespace
@@ -197,6 +194,11 @@ void DoExecuteScript(std::unique_ptr<IRequestNoOpCtx> p, const IFacilityProvider
197194
f.RegisterActor(new TExecuteScriptRPC(req));
198195
}
199196

197+
} // namespace NQuery
198+
199+
template<>
200+
IActor* TEvExecuteScriptRequest::CreateRpcActor(IRequestNoOpCtx* msg) {
201+
return new TExecuteScriptRPC(msg);
200202
}
201203

202204
} // namespace NKikimr::NGRpcService

ydb/core/grpc_services/query/rpc_fetch_script_results.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class TFetchScriptResultsRPC : public TRpcRequestActor<TFetchScriptResultsRPC, T
3535
return NKikimrServices::TActivity::GRPC_REQ;
3636
}
3737

38-
TFetchScriptResultsRPC(TEvFetchScriptResultsRequest* request)
38+
TFetchScriptResultsRPC(IRequestNoOpCtx* request)
3939
: TRpcRequestActorBase(request)
4040
{}
4141

@@ -108,10 +108,7 @@ class TFetchScriptResultsRPC : public TRpcRequestActor<TFetchScriptResultsRPC, T
108108

109109
result.set_status(status);
110110

111-
TString serializedResult;
112-
Y_PROTOBUF_SUPPRESS_NODISCARD result.SerializeToString(&serializedResult);
113-
114-
Request->SendSerializedResult(std::move(serializedResult), status);
111+
TProtoResponseHelper::SendProtoResponse(result, status, Request);
115112

116113
PassAway();
117114
}
@@ -154,4 +151,9 @@ void DoFetchScriptResults(std::unique_ptr<IRequestNoOpCtx> p, const IFacilityPro
154151

155152
}
156153

154+
template<>
155+
IActor* TEvFetchScriptResultsRequest::CreateRpcActor(IRequestNoOpCtx* msg) {
156+
return new TFetchScriptResultsRPC(msg);
157+
}
158+
157159
} // namespace NKikimr::NGRpcService

ydb/core/viewer/json.json

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
{
2+
"metadata": {
3+
"execution_id": "4578ea89-93aa2e63-c0ef36df-b5d4c3c8",
4+
"exec_status": "EXEC_STATUS_COMPLETED",
5+
"script_content": {
6+
"syntax": "SYNTAX_YQL_V1",
7+
"text": "SELECT * FROM `/Root/Test`;"
8+
},
9+
"result_sets_meta": [
10+
{
11+
"columns": [
12+
{
13+
"name": "Key",
14+
"type": {
15+
"optional_type": {
16+
"item": {
17+
"type_id": "UINT64"
18+
}
19+
}
20+
}
21+
},
22+
{
23+
"name": "Value",
24+
"type": {
25+
"optional_type": {
26+
"item": {
27+
"type_id": "STRING"
28+
}
29+
}
30+
}
31+
}
32+
]
33+
}
34+
],
35+
"exec_mode": "EXEC_MODE_EXECUTE",
36+
"exec_stats": {
37+
"query_phases": [
38+
{
39+
"duration_us": 1421,
40+
"table_access": [
41+
{
42+
"name": "/Root/Test",
43+
"reads": {
44+
"rows": 15,
45+
"bytes": 255
46+
},
47+
"partitions_count": 1
48+
}
49+
],
50+
"cpu_time_us": 942,
51+
"affected_shards": 1
52+
}
53+
],
54+
"compilation": {
55+
"duration_us": 7351,
56+
"cpu_time_us": 6955
57+
},
58+
"process_cpu_time_us": 72,
59+
"query_plan": "{}",
60+
"total_duration_us": 9039,
61+
"total_cpu_time_us": 7969
62+
}
63+
}
64+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include "json_handlers.h"
2+
#include "query_execute_script.h"
3+
#include "query_fetch_script.h"
4+
5+
namespace NKikimr::NViewer {
6+
7+
void InitQueryExecuteScriptJsonHandler(TJsonHandlers& handlers) {
8+
handlers.AddHandler("/query/script/execute", new TJsonHandler<TQueryExecuteScript>(TQueryExecuteScript::GetSwagger()));
9+
}
10+
11+
void InitQueryFetchScriptJsonHandler(TJsonHandlers& handlers) {
12+
handlers.AddHandler("/query/script/fetch", new TJsonHandler<TQueryFetchScript>(TQueryFetchScript::GetSwagger()));
13+
}
14+
15+
void InitQueryJsonHandlers(TJsonHandlers& jsonHandlers) {
16+
InitQueryExecuteScriptJsonHandler(jsonHandlers);
17+
InitQueryFetchScriptJsonHandler(jsonHandlers);
18+
}
19+
20+
} // namespace NKikimr::NViewer
+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#pragma once
2+
#include "json_local_rpc.h"
3+
#include <ydb/core/grpc_services/rpc_calls.h>
4+
#include <ydb/core/viewer/yaml/yaml.h>
5+
#include <ydb/public/api/grpc/ydb_query_v1.grpc.pb.h>
6+
#include <ydb/public/api/grpc/ydb_operation_v1.grpc.pb.h>
7+
8+
namespace NKikimr {
9+
10+
namespace NRpcService {
11+
12+
template<>
13+
void SetRequestSyncOperationMode<Ydb::Query::ExecuteScriptRequest>(Ydb::Query::ExecuteScriptRequest& request) {
14+
request.mutable_operation_params()->set_operation_mode(Ydb::Operations::OperationParams::ASYNC);
15+
}
16+
17+
}
18+
19+
namespace NViewer {
20+
21+
using TQueryExecuteScriptRpc = TJsonLocalRpc<Ydb::Query::ExecuteScriptRequest,
22+
Ydb::Operations::Operation,
23+
Ydb::Operations::Operation,
24+
Ydb::Query::V1::QueryService,
25+
NKikimr::NGRpcService::TGrpcRequestNoOperationCall<Ydb::Query::ExecuteScriptRequest, Ydb::Operations::Operation>>;
26+
27+
class TQueryExecuteScript : public TQueryExecuteScriptRpc {
28+
public:
29+
using TBase = TQueryExecuteScriptRpc;
30+
31+
TQueryExecuteScript(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
32+
: TBase(viewer, ev)
33+
{
34+
AllowedMethods = {HTTP_METHOD_POST};
35+
}
36+
37+
static YAML::Node GetSwagger() {
38+
YAML::Node node = YAML::Load(R"___(
39+
post:
40+
tags:
41+
- script query
42+
summary: Execute script
43+
description: Execute script
44+
requestBody:
45+
required: true
46+
content:
47+
application/json:
48+
schema:
49+
type: object
50+
properties:
51+
database:
52+
type: string
53+
required: true
54+
script_content:
55+
type: object
56+
properties:
57+
text:
58+
type: string
59+
description: query text
60+
required: true
61+
syntax:
62+
type: string
63+
description: |
64+
syntax:
65+
* `SYNTAX_YQL_V1`
66+
* `SYNTAX_PG`
67+
required: false
68+
exec_mode:
69+
type: string
70+
description: |
71+
exec_mode:
72+
* `EXEC_MODE_PARSE`
73+
* `EXEC_MODE_VALIDATE`
74+
* `EXEC_MODE_EXPLAIN`
75+
* `EXEC_MODE_EXECUTE`
76+
required: true
77+
responses:
78+
200:
79+
description: OK
80+
content:
81+
application/json:
82+
schema: {}
83+
400:
84+
description: Bad Request
85+
403:
86+
description: Forbidden
87+
504:
88+
description: Gateway Timeout
89+
)___");
90+
node["get"]["responses"]["200"]["content"]["application/json"]["schema"] = TProtoToYaml::ProtoToYamlSchema<Ydb::Operations::Operation>();
91+
return node;
92+
}
93+
};
94+
95+
}
96+
}

0 commit comments

Comments
 (0)