Skip to content

Commit 1bfcec4

Browse files
authored
Describe VIEW for YDB CLI (#9513)
1 parent 865a27c commit 1bfcec4

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
@@ -128,6 +128,7 @@
128128
#include <ydb/services/ydb/ydb_table.h>
129129
#include <ydb/services/ydb/ydb_object_storage.h>
130130
#include <ydb/services/tablet/ydb_tablet.h>
131+
#include <ydb/services/view/grpc_service.h>
131132

132133
#include <ydb/core/fq/libs/init/init.h>
133134

@@ -610,6 +611,8 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) {
610611
names["replication"] = &hasReplication;
611612
TServiceCfg hasTabletService = services.empty();
612613
names["tablet_service"] = &hasTabletService;
614+
TServiceCfg hasView = services.empty();
615+
names["view"] = &hasView;
613616

614617
std::unordered_set<TString> enabled;
615618
for (const auto& name : services) {
@@ -895,6 +898,11 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) {
895898
hasTabletService.IsRlAllowed(), grpcConfig.GetHandlersPerCompletionQueue()));
896899
}
897900

901+
if (hasView) {
902+
server.AddService(new NGRpcService::TGRpcViewService(ActorSystem.Get(), Counters,
903+
grpcRequestProxies[0], hasView.IsRlAllowed()));
904+
}
905+
898906
if (ModuleFactories) {
899907
for (const auto& service : ModuleFactories->GrpcServiceFactory.Create(enabled, disabled, ActorSystem.Get(), Counters, grpcRequestProxies[0])) {
900908
server.AddService(service);

ydb/core/driver_lib/run/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ PEERDIR(
175175
ydb/services/rate_limiter
176176
ydb/services/replication
177177
ydb/services/tablet
178+
ydb/services/view
178179
ydb/services/ydb
179180
)
180181

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
@@ -75,6 +75,7 @@ SRCS(
7575
rpc_stream_execute_yql_script.cpp
7676
rpc_whoami.cpp
7777
rpc_object_storage.cpp
78+
rpc_view.cpp
7879
table_settings.cpp
7980

8081
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
@@ -17,6 +17,7 @@ SRCS(
1717
ydb_object_storage_v1.proto
1818
ydb_replication_v1.proto
1919
ydb_tablet_v1.proto
20+
ydb_view_v1.proto
2021
ydb_ymq_v1.proto
2122
)
2223

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
@@ -18,6 +18,7 @@ SRCS(
1818
draft/ydb_object_storage.proto
1919
draft/ydb_replication.proto
2020
draft/ydb_tablet.proto
21+
draft/ydb_view.proto
2122
draft/ymq.proto
2223
draft/field_transformation.proto
2324
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
@@ -273,6 +273,8 @@ int TCommandDescribe::PrintPathResponse(TDriver& driver, const NScheme::TDescrib
273273
return DescribeCoordinationNode(driver);
274274
case NScheme::ESchemeEntryType::Replication:
275275
return DescribeReplication(driver);
276+
case NScheme::ESchemeEntryType::View:
277+
return DescribeView(driver);
276278
default:
277279
return DescribeEntryDefault(entry);
278280
}
@@ -579,6 +581,19 @@ int TCommandDescribe::DescribeReplication(const TDriver& driver) {
579581
return PrintDescription(this, OutputFormat, result, &TCommandDescribe::PrintReplicationResponsePretty);
580582
}
581583

584+
int TCommandDescribe::PrintViewResponsePretty(const NYdb::NView::TDescribeViewResult& result) const {
585+
Cout << "\nQuery text:\n" << result.GetViewDescription().GetQueryText() << Endl;
586+
return EXIT_SUCCESS;
587+
}
588+
589+
int TCommandDescribe::DescribeView(const TDriver& driver) {
590+
NView::TViewClient client(driver);
591+
auto result = client.DescribeView(Path, {}).ExtractValueSync();
592+
ThrowOnError(result);
593+
594+
return PrintDescription(this, OutputFormat, result, &TCommandDescribe::PrintViewResponsePretty);
595+
}
596+
582597
namespace {
583598
void PrintColumns(const NTable::TTableDescription& tableDescription) {
584599
if (!tableDescription.GetTableColumns().size()) {

0 commit comments

Comments
 (0)