Skip to content

Commit 2c06274

Browse files
committed
YQ-2715 add ydb data source
1 parent dc192af commit 2c06274

File tree

11 files changed

+122
-2
lines changed

11 files changed

+122
-2
lines changed

ydb/core/external_sources/external_source_factory.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ IExternalSourceFactory::TPtr CreateExternalSourceFactory(const std::vector<TStri
4646
{
4747
ToString(NYql::EDatabaseType::PostgreSQL),
4848
CreateExternalDataSource(TString{NYql::GenericProviderName}, {"MDB_BASIC", "BASIC"}, {"database_name", "protocol", "mdb_cluster_id", "use_tls", "schema"}, hostnamePatternsRegEx)
49+
},
50+
{
51+
ToString(NYql::EDatabaseType::Ydb),
52+
CreateExternalDataSource(TString{NYql::GenericProviderName}, {"BASIC", "SERVICE_ACCOUNT"}, {"database_name", "use_tls", "database_id"}, hostnamePatternsRegEx)
4953
}
5054
});
5155
}

ydb/core/kqp/ut/federated_query/generic_ut/kqp_generic_provider_ut.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace NKikimr::NKqp {
3131
enum class EProviderType {
3232
PostgreSQL,
3333
ClickHouse,
34+
Ydb,
3435
};
3536

3637
NApi::TDataSourceInstance MakeDataSourceInstance(EProviderType providerType) {
@@ -39,6 +40,8 @@ namespace NKikimr::NKqp {
3940
return TConnectorClientMock::TPostgreSQLDataSourceInstanceBuilder<>().GetResult();
4041
case EProviderType::ClickHouse:
4142
return TConnectorClientMock::TClickHouseDataSourceInstanceBuilder<>().GetResult();
43+
case EProviderType::Ydb:
44+
return TConnectorClientMock::TYdbDataSourceInstanceBuilder<>().GetResult();
4245
}
4346
}
4447

@@ -48,6 +51,8 @@ namespace NKikimr::NKqp {
4851
return CreatePostgreSQLExternalDataSource(kikimr);
4952
case EProviderType::ClickHouse:
5053
return CreateClickHouseExternalDataSource(kikimr);
54+
case EProviderType::Ydb:
55+
return CreateYdbExternalDataSource(kikimr);
5156
}
5257
}
5358

@@ -165,6 +170,10 @@ namespace NKikimr::NKqp {
165170
TestSelectAllFields(EProviderType::ClickHouse);
166171
}
167172

173+
Y_UNIT_TEST(YdbManaged) {
174+
TestSelectAllFields(EProviderType::Ydb);
175+
}
176+
168177
void TestSelectConstant(EProviderType providerType) {
169178
// prepare mock
170179
auto clientMock = std::make_shared<TConnectorClientMock>();
@@ -257,6 +266,10 @@ namespace NKikimr::NKqp {
257266
TestSelectConstant(EProviderType::ClickHouse);
258267
}
259268

269+
Y_UNIT_TEST(YdbManagedSelectConstant) {
270+
TestSelectConstant(EProviderType::Ydb);
271+
}
272+
260273
void TestSelectCount(EProviderType providerType) {
261274
// prepare mock
262275
auto clientMock = std::make_shared<TConnectorClientMock>();
@@ -345,6 +358,10 @@ namespace NKikimr::NKqp {
345358
TestSelectCount(EProviderType::ClickHouse);
346359
}
347360

361+
Y_UNIT_TEST(YdbSelectCount) {
362+
TestSelectCount(EProviderType::Ydb);
363+
}
364+
348365
void TestFilterPushdown(EProviderType providerType) {
349366
// prepare mock
350367
auto clientMock = std::make_shared<TConnectorClientMock>();
@@ -450,5 +467,9 @@ namespace NKikimr::NKqp {
450467
Y_UNIT_TEST(ClickHouseFilterPushdown) {
451468
TestFilterPushdown(EProviderType::ClickHouse);
452469
}
470+
471+
Y_UNIT_TEST(YdbFilterPushdown) {
472+
TestFilterPushdown(EProviderType::Ydb);
473+
}
453474
}
454475
}

ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ inline EDatabaseType DatabaseTypeFromDataSourceKind(NConnector::NApi::EDataSourc
2222
return EDatabaseType::PostgreSQL;
2323
case NConnector::NApi::EDataSourceKind::CLICKHOUSE:
2424
return EDatabaseType::ClickHouse;
25+
case NConnector::NApi::EDataSourceKind::YDB:
26+
return EDatabaseType::Ydb;
2527
default:
2628
ythrow yexception() << "Unknown data source kind: " << NConnector::NApi::EDataSourceKind_Name(dataSourceKind);
2729
}
@@ -33,6 +35,8 @@ inline NConnector::NApi::EDataSourceKind DatabaseTypeToDataSourceKind(EDatabaseT
3335
return NConnector::NApi::EDataSourceKind::POSTGRESQL;
3436
case EDatabaseType::ClickHouse:
3537
return NConnector::NApi::EDataSourceKind::CLICKHOUSE;
38+
case EDatabaseType::Ydb:
39+
return NConnector::NApi::EDataSourceKind::YDB;
3640
default:
3741
ythrow yexception() << "Unknown database type: " << ToString(databaseType);
3842
}

ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace NYql::NDq {
1616
args.SecureParams, args.TaskParams, args.ComputeActorId, credentialsFactory, args.HolderFactory);
1717
};
1818

19-
for (auto& sourceName : {"ClickHouseGeneric", "PostgreSqlGeneric"}) {
19+
for (auto& sourceName : {"ClickHouseGeneric", "PostgreSqlGeneric", "YdbGeneric"}) {
2020
factory.RegisterSource<Generic::TSource>(sourceName, genericFactory);
2121
}
2222
}

ydb/library/yql/providers/generic/connector/libcpp/ut_helpers/connector_client_mock.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,43 @@ namespace NYql::NConnector::NTest {
107107
UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
108108
}
109109

110+
void CreateYdbExternalDataSource(
111+
const std::shared_ptr<NKikimr::NKqp::TKikimrRunner>& kikimr,
112+
const TString& dataSourceName,
113+
const TString& login,
114+
const TString& password,
115+
const TString& endpoint,
116+
bool useTls,
117+
const TString& databaseName)
118+
{
119+
auto tc = kikimr->GetTableClient();
120+
auto session = tc.CreateSession().GetValueSync().GetSession();
121+
const TString query = fmt::format(
122+
R"(
123+
CREATE OBJECT sa_signature (TYPE SECRET) WITH (value=sa_signature);
124+
CREATE OBJECT {data_source_name}_password (TYPE SECRET) WITH (value={password});
125+
126+
CREATE EXTERNAL DATA SOURCE {data_source_name} WITH (
127+
SOURCE_TYPE="{source_type}",
128+
LOCATION="{endpoint}",
129+
AUTH_METHOD="BASIC",
130+
LOGIN="{login}",
131+
PASSWORD_SECRET_NAME="{data_source_name}_password",
132+
USE_TLS="{use_tls}",
133+
DATABASE_NAME="{database}"
134+
);
135+
)",
136+
"data_source_name"_a = dataSourceName,
137+
"login"_a = login,
138+
"password"_a = password,
139+
"use_tls"_a = useTls ? "TRUE" : "FALSE",
140+
"source_type"_a = ToString(NYql::EDatabaseType::Ydb),
141+
"endpoint"_a = endpoint,
142+
"database"_a = databaseName);
143+
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
144+
UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
145+
}
146+
110147
std::shared_ptr<arrow::RecordBatch> MakeEmptyRecordBatch(size_t rowsCount) {
111148
return arrow::RecordBatch::Make(
112149
std::make_shared<arrow::Schema>(arrow::FieldVector()),

ydb/library/yql/providers/generic/connector/libcpp/ut_helpers/connector_client_mock.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ namespace NYql::NConnector::NTest {
5454
return TClickHouseDataSourceInstanceBuilder<TBuilder>( \
5555
this->Result_->mutable_data_source_instance(), \
5656
static_cast<TBuilder*>(this)); \
57+
} \
58+
TYdbDataSourceInstanceBuilder<TBuilder> YdbDataSourceInstance() { \
59+
return TYdbDataSourceInstanceBuilder<TBuilder>( \
60+
this->Result_->mutable_data_source_instance(), \
61+
static_cast<TBuilder*>(this)); \
5762
}
5863

5964
MATCHER_P(ProtobufRequestMatcher, expected, "request does not match") {
@@ -200,6 +205,15 @@ namespace NYql::NConnector::NTest {
200205
const TString& serviceAccountIdSignature = DEFAULT_CH_SERVICE_ACCOUNT_ID_SIGNATURE,
201206
const TString& databaseName = DEFAULT_DATABASE);
202207

208+
void CreateYdbExternalDataSource(
209+
const std::shared_ptr<NKikimr::NKqp::TKikimrRunner>& kikimr,
210+
const TString& dataSourceName = DEFAULT_DATA_SOURCE_NAME,
211+
const TString& login = DEFAULT_LOGIN,
212+
const TString& password = DEFAULT_PASSWORD,
213+
const TString& endpoint = DEFAULT_YDB_ENDPOINT,
214+
bool useTls = DEFAULT_USE_TLS,
215+
const TString& databaseName = DEFAULT_DATABASE);
216+
203217
class TConnectorClientMock: public NYql::NConnector::IClient {
204218
public:
205219
MOCK_METHOD(TResult<NApi::TDescribeTableResponse>, DescribeTableImpl, (const NApi::TDescribeTableRequest& request));
@@ -277,6 +291,24 @@ namespace NYql::NConnector::NTest {
277291
}
278292
};
279293

294+
template <class TParent = void /* no parent by default */>
295+
struct TYdbDataSourceInstanceBuilder: public TBaseDataSourceInstanceBuilder<TYdbDataSourceInstanceBuilder<TParent>, TParent> {
296+
using TBase = TBaseDataSourceInstanceBuilder<TYdbDataSourceInstanceBuilder<TParent>, TParent>;
297+
298+
explicit TYdbDataSourceInstanceBuilder(NApi::TDataSourceInstance* result = nullptr, TParent* parent = nullptr)
299+
: TBase(result, parent)
300+
{
301+
FillWithDefaults();
302+
}
303+
304+
void FillWithDefaults() {
305+
TBase::FillWithDefaults();
306+
this->Host(DEFAULT_YDB_HOST);
307+
this->Port(DEFAULT_YDB_PORT);
308+
this->Kind(NApi::EDataSourceKind::YDB);
309+
}
310+
};
311+
280312
template <class TParent = void /* no parent by default */>
281313
struct TDescribeTableResultBuilder: public TResponseBuilder<TParent, NApi::TDescribeTableResponse> {
282314
using TBuilder = TDescribeTableResultBuilder<TParent>;

ydb/library/yql/providers/generic/connector/libcpp/ut_helpers/defaults.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,8 @@ namespace NYql::NConnector::NTest {
1616
extern const TString DEFAULT_CH_CLUSTER_ID = "ch-managed";
1717
extern const TString DEFAULT_CH_SERVICE_ACCOUNT_ID = "sa";
1818
extern const TString DEFAULT_CH_SERVICE_ACCOUNT_ID_SIGNATURE = "sa_signature";
19+
20+
extern const TString DEFAULT_YDB_HOST = "localhost";
21+
extern const TString DEFAULT_YDB_DATABASE = "local";
22+
extern const TString DEFAULT_YDB_ENDPOINT = TStringBuilder() << DEFAULT_YDB_HOST << ':' << DEFAULT_YDB_PORT;
1923
} // namespace NYql::NConnector::NTest

ydb/library/yql/providers/generic/connector/libcpp/ut_helpers/defaults.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,9 @@ namespace NYql::NConnector::NTest {
2525
constexpr NApi::EProtocol DEFAULT_CH_PROTOCOL = NApi::EProtocol::HTTP;
2626
extern const TString DEFAULT_CH_SERVICE_ACCOUNT_ID;
2727
extern const TString DEFAULT_CH_SERVICE_ACCOUNT_ID_SIGNATURE;
28+
29+
extern const TString DEFAULT_YDB_DATABASE;
30+
extern const TString DEFAULT_YDB_HOST;
31+
constexpr int DEFAULT_YDB_PORT = 2136;
32+
extern const TString DEFAULT_YDB_ENDPOINT;
2833
} // namespace NYql::NConnector::NTest

ydb/library/yql/providers/generic/provider/yql_generic_cluster_config.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,11 @@ namespace NYql {
172172
NYql::TGenericClusterConfig& clusterConfig) {
173173
using namespace NConnector::NApi;
174174

175+
if (clusterConfig.GetKind() == EDataSourceKind::YDB) {
176+
clusterConfig.SetProtocol(EProtocol::NATIVE);
177+
return;
178+
}
179+
175180
auto it = properties.find("protocol");
176181
if (it == properties.cend()) {
177182
ythrow yexception() << "missing 'PROTOCOL' value";

ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ namespace NYql {
162162
case NYql::NConnector::NApi::POSTGRESQL:
163163
sourceType = "PostgreSqlGeneric";
164164
break;
165+
case NYql::NConnector::NApi::YDB:
166+
sourceType = "YdbGeneric";
167+
break;
165168
default:
166169
ythrow yexception() << "Data source kind is unknown or not specified";
167170
break;
@@ -193,6 +196,9 @@ namespace NYql {
193196
case NConnector::NApi::POSTGRESQL:
194197
properties["SourceType"] = "PostgreSql";
195198
break;
199+
case NConnector::NApi::YDB:
200+
properties["SourceType"] = "YDB";
201+
break;
196202
case NConnector::NApi::DATA_SOURCE_KIND_UNSPECIFIED:
197203
break;
198204
default:

0 commit comments

Comments
 (0)