Skip to content

Commit 5b55670

Browse files
committed
Describe VIEW for YDB CLI (ydb-platform#9513)
1 parent f1b886c commit 5b55670

File tree

34 files changed

+650
-67
lines changed

34 files changed

+650
-67
lines changed

ydb/core/driver_lib/run/run.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
#include <ydb/services/ydb/ydb_scripting.h>
123123
#include <ydb/services/ydb/ydb_table.h>
124124
#include <ydb/services/ydb/ydb_object_storage.h>
125+
#include <ydb/services/view/grpc_service.h>
125126

126127
#include <ydb/core/fq/libs/init/init.h>
127128

@@ -600,6 +601,8 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) {
600601
names["keyvalue"] = &hasKeyValue;
601602
TServiceCfg hasReplication = services.empty();
602603
names["replication"] = &hasReplication;
604+
TServiceCfg hasView = services.empty();
605+
names["view"] = &hasView;
603606

604607
std::unordered_set<TString> enabled;
605608
for (const auto& name : services) {
@@ -875,6 +878,11 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) {
875878
grpcRequestProxies[0], hasReplication.IsRlAllowed()));
876879
}
877880

881+
if (hasView) {
882+
server.AddService(new NGRpcService::TGRpcViewService(ActorSystem.Get(), Counters,
883+
grpcRequestProxies[0], hasView.IsRlAllowed()));
884+
}
885+
878886
if (ModuleFactories) {
879887
for (const auto& service : ModuleFactories->GrpcServiceFactory.Create(enabled, disabled, ActorSystem.Get(), Counters, grpcRequestProxies[0])) {
880888
server.AddService(service);

ydb/core/driver_lib/run/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ PEERDIR(
172172
ydb/services/persqueue_v1
173173
ydb/services/rate_limiter
174174
ydb/services/replication
175+
ydb/services/view
175176
ydb/services/ydb
176177
)
177178

ydb/core/grpc_services/rpc_view.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include "rpc_scheme_base.h"
2+
#include "service_view.h"
3+
4+
#include <ydb/core/grpc_services/base/base.h>
5+
#include <ydb/core/tx/schemeshard/schemeshard.h>
6+
#include <ydb/core/ydb_convert/ydb_convert.h>
7+
#include <ydb/library/actors/core/actor.h>
8+
#include <ydb/library/actors/core/hfunc.h>
9+
#include <ydb/public/api/protos/draft/ydb_view.pb.h>
10+
11+
namespace NKikimr::NGRpcService {
12+
13+
using namespace Ydb;
14+
15+
using TEvDescribeView = TGrpcRequestOperationCall<View::DescribeViewRequest, View::DescribeViewResponse>;
16+
17+
class TDescribeViewRPC : public TRpcSchemeRequestActor<TDescribeViewRPC, TEvDescribeView> {
18+
using TBase = TRpcSchemeRequestActor<TDescribeViewRPC, TEvDescribeView>;
19+
20+
public:
21+
using TBase::TBase;
22+
23+
void Bootstrap() {
24+
DescribeScheme();
25+
}
26+
27+
void PassAway() override {
28+
TBase::PassAway();
29+
}
30+
31+
private:
32+
void DescribeScheme() {
33+
auto ev = std::make_unique<TEvTxUserProxy::TEvNavigate>();
34+
SetAuthToken(ev, *Request_);
35+
SetDatabase(ev.get(), *Request_);
36+
ev->Record.MutableDescribePath()->SetPath(GetProtoRequest()->path());
37+
38+
Send(MakeTxProxyID(), ev.release());
39+
Become(&TDescribeViewRPC::StateDescribeScheme);
40+
}
41+
42+
STATEFN(StateDescribeScheme) {
43+
switch (ev->GetTypeRewrite()) {
44+
HFunc(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult, Handle);
45+
default:
46+
return TBase::StateWork(ev);
47+
}
48+
}
49+
50+
void Handle(NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev, const TActorContext& ctx) {
51+
const auto& record = ev->Get()->GetRecord();
52+
const auto& desc = record.GetPathDescription();
53+
54+
if (record.HasReason()) {
55+
Request_->RaiseIssue(NYql::TIssue(record.GetReason()));
56+
}
57+
58+
switch (record.GetStatus()) {
59+
case NKikimrScheme::StatusSuccess:
60+
if (desc.GetSelf().GetPathType() != NKikimrSchemeOp::EPathTypeView) {
61+
auto message = TStringBuilder() << "Expected a view, but got: " << desc.GetSelf().GetPathType();
62+
Request_->RaiseIssue(NYql::TIssue(message));
63+
return Reply(StatusIds::SCHEME_ERROR, ctx);
64+
}
65+
66+
ConvertDirectoryEntry(desc.GetSelf(), Result_.mutable_self(), true);
67+
Result_.set_query_text(desc.GetViewDescription().GetQueryText());
68+
69+
return ReplyWithResult(StatusIds::SUCCESS, Result_, ctx);
70+
71+
case NKikimrScheme::StatusPathDoesNotExist:
72+
case NKikimrScheme::StatusSchemeError:
73+
return Reply(StatusIds::SCHEME_ERROR, ctx);
74+
75+
case NKikimrScheme::StatusAccessDenied:
76+
return Reply(StatusIds::UNAUTHORIZED, ctx);
77+
78+
case NKikimrScheme::StatusNotAvailable:
79+
return Reply(StatusIds::UNAVAILABLE, ctx);
80+
81+
default:
82+
return Reply(StatusIds::GENERIC_ERROR, ctx);
83+
}
84+
}
85+
86+
private:
87+
View::DescribeViewResult Result_;
88+
};
89+
90+
void DoDescribeView(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f) {
91+
f.RegisterActor(new TDescribeViewRPC(p.release()));
92+
}
93+
94+
}

ydb/core/grpc_services/service_view.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#pragma once
2+
3+
#include <memory>
4+
5+
namespace NKikimr::NGRpcService {
6+
7+
class IRequestOpCtx;
8+
class IFacilityProvider;
9+
10+
void DoDescribeView(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
11+
12+
}

ydb/core/grpc_services/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ SRCS(
7474
rpc_stream_execute_yql_script.cpp
7575
rpc_whoami.cpp
7676
rpc_object_storage.cpp
77+
rpc_view.cpp
7778
table_settings.cpp
7879

7980
rpc_common/rpc_common_kqp_session.cpp

ydb/public/api/grpc/draft/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SRCS(
1616
ydb_persqueue_v1.proto
1717
ydb_object_storage_v1.proto
1818
ydb_replication_v1.proto
19+
ydb_view_v1.proto
1920
ydb_ymq_v1.proto
2021
)
2122

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
syntax = "proto3";
2+
3+
package Ydb.View.V1;
4+
option java_package = "com.yandex.ydb.view.v1";
5+
6+
import "ydb/public/api/protos/draft/ydb_view.proto";
7+
8+
service ViewService {
9+
rpc DescribeView(View.DescribeViewRequest) returns (View.DescribeViewResponse);
10+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
syntax = "proto3";
2+
option cc_enable_arenas = true;
3+
4+
package Ydb.View;
5+
option java_package = "com.yandex.ydb.view";
6+
7+
import "ydb/public/api/protos/annotations/validation.proto";
8+
import "ydb/public/api/protos/ydb_operation.proto";
9+
import "ydb/public/api/protos/ydb_scheme.proto";
10+
11+
message DescribeViewRequest {
12+
Ydb.Operations.OperationParams operation_params = 1;
13+
// The path to the view.
14+
string path = 2 [(required) = true];
15+
}
16+
17+
message DescribeViewResponse {
18+
// The result of the request will be inside the operation proto.
19+
Ydb.Operations.Operation operation = 1;
20+
}
21+
22+
message DescribeViewResult {
23+
// Description of a generic scheme object.
24+
Ydb.Scheme.Entry self = 1;
25+
26+
// View-specific fields.
27+
string query_text = 2;
28+
}

ydb/public/api/protos/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ SRCS(
1717
draft/ydb_maintenance.proto
1818
draft/ydb_object_storage.proto
1919
draft/ydb_replication.proto
20+
draft/ydb_view.proto
2021
draft/ymq.proto
2122
draft/field_transformation.proto
2223
ydb_federation_discovery.proto

ydb/public/lib/ydb_cli/commands/ydb_service_scheme.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ int TCommandDescribe::PrintPathResponse(TDriver& driver, const NScheme::TDescrib
179179
return DescribeCoordinationNode(driver);
180180
case NScheme::ESchemeEntryType::Replication:
181181
return DescribeReplication(driver);
182+
case NScheme::ESchemeEntryType::View:
183+
return DescribeView(driver);
182184
default:
183185
return DescribeEntryDefault(entry);
184186
}
@@ -491,6 +493,19 @@ int TCommandDescribe::DescribeReplication(const TDriver& driver) {
491493
return PrintDescription(this, OutputFormat, result, &TCommandDescribe::PrintReplicationResponsePretty);
492494
}
493495

496+
int TCommandDescribe::PrintViewResponsePretty(const NYdb::NView::TDescribeViewResult& result) const {
497+
Cout << "\nQuery text:\n" << result.GetViewDescription().GetQueryText() << Endl;
498+
return EXIT_SUCCESS;
499+
}
500+
501+
int TCommandDescribe::DescribeView(const TDriver& driver) {
502+
NView::TViewClient client(driver);
503+
auto result = client.DescribeView(Path, {}).ExtractValueSync();
504+
ThrowOnError(result);
505+
506+
return PrintDescription(this, OutputFormat, result, &TCommandDescribe::PrintViewResponsePretty);
507+
}
508+
494509
namespace {
495510
void PrintColumns(const NTable::TTableDescription& tableDescription) {
496511
if (!tableDescription.GetTableColumns().size()) {

ydb/public/lib/ydb_cli/commands/ydb_service_scheme.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <ydb/public/lib/ydb_cli/common/format.h>
77
#include <ydb/public/lib/ydb_cli/common/recursive_remove.h>
88
#include <ydb/public/sdk/cpp/client/draft/ydb_replication.h>
9+
#include <ydb/public/sdk/cpp/client/draft/ydb_view.h>
910
#include <ydb/public/sdk/cpp/client/ydb_coordination/coordination.h>
1011
#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h>
1112
#include <ydb/public/sdk/cpp/client/ydb_table/table.h>
@@ -69,6 +70,9 @@ class TCommandDescribe : public TYdbOperationCommand, public TCommandWithPath, p
6970
int DescribeReplication(const TDriver& driver);
7071
int PrintReplicationResponsePretty(const NYdb::NReplication::TDescribeReplicationResult& result) const;
7172

73+
int DescribeView(const TDriver& driver);
74+
int PrintViewResponsePretty(const NYdb::NView::TDescribeViewResult& result) const;
75+
7276
template<typename TDescriptionType>
7377
void PrintPermissionsIfNeeded(const TDescriptionType& description) const {
7478
if (ShowPermissions) {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <grpcpp/server.h>
4+
#include <grpcpp/server_builder.h>
5+
6+
namespace NYdb {
7+
8+
template<class TService>
9+
std::unique_ptr<grpc::Server> StartGrpcServer(const TString& address, TService& service) {
10+
grpc::ServerBuilder builder;
11+
builder.AddListeningPort(address, grpc::InsecureServerCredentials());
12+
builder.RegisterService(&service);
13+
return builder.BuildAndStart();
14+
}
15+
16+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "scripting.h"
2+
3+
namespace NYdb::NScripting {
4+
5+
grpc::Status TMockSlyDbProxy::ExecuteYql(
6+
grpc::ServerContext* context,
7+
const Ydb::Scripting::ExecuteYqlRequest* request,
8+
Ydb::Scripting::ExecuteYqlResponse* response
9+
) {
10+
context->AddInitialMetadata("key", "value");
11+
Y_UNUSED(request);
12+
13+
// Just to make sdk core happy
14+
auto* op = response->mutable_operation();
15+
op->set_ready(true);
16+
op->set_status(Ydb::StatusIds::SUCCESS);
17+
op->mutable_result();
18+
19+
return grpc::Status::OK;
20+
}
21+
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <ydb/public/api/grpc/ydb_scripting_v1.grpc.pb.h>
4+
5+
namespace NYdb::NScripting {
6+
7+
class TMockSlyDbProxy : public Ydb::Scripting::V1::ScriptingService::Service
8+
{
9+
public:
10+
grpc::Status ExecuteYql(
11+
grpc::ServerContext* context,
12+
const Ydb::Scripting::ExecuteYqlRequest* request,
13+
Ydb::Scripting::ExecuteYqlResponse* response) override;
14+
};
15+
16+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "view.h"
2+
3+
namespace NYdb::NView {
4+
5+
grpc::Status TViewDummyService::DescribeView(
6+
grpc::ServerContext* context,
7+
const Ydb::View::DescribeViewRequest* request,
8+
Ydb::View::DescribeViewResponse* response
9+
) {
10+
Y_UNUSED(context);
11+
Y_UNUSED(request);
12+
13+
auto* op = response->mutable_operation();
14+
op->set_ready(true);
15+
op->set_status(Ydb::StatusIds::SUCCESS);
16+
17+
Ydb::View::DescribeViewResult describeResult;
18+
describeResult.set_query_text(DummyQueryText);
19+
op->mutable_result()->PackFrom(describeResult);
20+
21+
return grpc::Status::OK;
22+
}
23+
24+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <ydb/public/api/grpc/draft/ydb_view_v1.grpc.pb.h>
4+
5+
namespace NYdb::NView {
6+
7+
constexpr const char* DummyQueryText = "select 42";
8+
9+
class TViewDummyService : public Ydb::View::V1::ViewService::Service
10+
{
11+
public:
12+
grpc::Status DescribeView(
13+
grpc::ServerContext* context,
14+
const Ydb::View::DescribeViewRequest* request,
15+
Ydb::View::DescribeViewResponse* response) override;
16+
};
17+
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
LIBRARY()
2+
3+
PEERDIR(
4+
ydb/public/api/grpc
5+
ydb/public/api/grpc/draft
6+
)
7+
8+
SRCS(
9+
grpc_services/scripting.cpp
10+
grpc_services/view.cpp
11+
)
12+
13+
END()

ydb/public/sdk/cpp/client/draft/ut/ya.make

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ ENDIF()
1111

1212
FORK_SUBTESTS()
1313

14+
PEERDIR(
15+
ydb/public/sdk/cpp/client/draft/ut/helpers
16+
)
17+
1418
SRCS(
1519
ydb_scripting_response_headers_ut.cpp
20+
ydb_view_ut.cpp
1621
)
1722

1823
END()

0 commit comments

Comments
 (0)