aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalyisaev <vitalyisaev@yandex-team.com>2023-05-31 13:58:42 +0300
committervitalyisaev <vitalyisaev@yandex-team.com>2023-05-31 13:58:42 +0300
commita495c64ce9b1f2df1299aa415287a90e61719400 (patch)
tree1655f42a7a5dbe0ff660c5860babf8722c021933
parent905720a7f9489423c651bcb8cd567eb92f0f3101 (diff)
downloadydb-a495c64ce9b1f2df1299aa415287a90e61719400.tar.gz
PR from branch users/vitalyisaev/
Generic provider to external data sources
-rw-r--r--CMakeLists.darwin-x86_64.txt1
-rw-r--r--CMakeLists.linux-aarch64.txt1
-rw-r--r--CMakeLists.linux-x86_64.txt1
-rw-r--r--CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/library/yql/ast/yql_expr.h14
-rw-r--r--ydb/library/yql/providers/CMakeLists.txt1
-rw-r--r--ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h3
-rw-r--r--ydb/library/yql/providers/common/mkql/parser.cpp28
-rw-r--r--ydb/library/yql/providers/common/mkql/parser.h1
-rw-r--r--ydb/library/yql/providers/common/proto/gateways_config.proto10
-rw-r--r--ydb/library/yql/providers/common/provider/yql_provider_names.h5
-rw-r--r--ydb/library/yql/providers/generic/CMakeLists.txt12
-rw-r--r--ydb/library/yql/providers/generic/actors/CMakeLists.darwin-x86_64.txt27
-rw-r--r--ydb/library/yql/providers/generic/actors/CMakeLists.linux-aarch64.txt28
-rw-r--r--ydb/library/yql/providers/generic/actors/CMakeLists.linux-x86_64.txt28
-rw-r--r--ydb/library/yql/providers/generic/actors/CMakeLists.txt17
-rw-r--r--ydb/library/yql/providers/generic/actors/CMakeLists.windows-x86_64.txt27
-rw-r--r--ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp248
-rw-r--r--ydb/library/yql/providers/generic/actors/yql_generic_read_actor.h18
-rw-r--r--ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp20
-rw-r--r--ydb/library/yql/providers/generic/actors/yql_generic_source_factory.h12
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/CMakeLists.darwin-x86_64.txt41
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-aarch64.txt42
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-x86_64.txt42
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/CMakeLists.txt17
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/CMakeLists.windows-x86_64.txt41
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp1
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h40
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json50
-rw-r--r--ydb/library/yql/providers/generic/proto/CMakeLists.darwin-x86_64.txt57
-rw-r--r--ydb/library/yql/providers/generic/proto/CMakeLists.linux-aarch64.txt58
-rw-r--r--ydb/library/yql/providers/generic/proto/CMakeLists.linux-x86_64.txt58
-rw-r--r--ydb/library/yql/providers/generic/proto/CMakeLists.txt17
-rw-r--r--ydb/library/yql/providers/generic/proto/CMakeLists.windows-x86_64.txt57
-rw-r--r--ydb/library/yql/providers/generic/proto/range.proto9
-rw-r--r--ydb/library/yql/providers/generic/proto/source.proto16
-rw-r--r--ydb/library/yql/providers/generic/provider/CMakeLists.darwin-x86_64.txt56
-rw-r--r--ydb/library/yql/providers/generic/provider/CMakeLists.linux-aarch64.txt57
-rw-r--r--ydb/library/yql/providers/generic/provider/CMakeLists.linux-x86_64.txt57
-rw-r--r--ydb/library/yql/providers/generic/provider/CMakeLists.txt17
-rw-r--r--ydb/library/yql/providers/generic/provider/CMakeLists.windows-x86_64.txt56
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp87
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp30
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp39
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp126
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp167
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp160
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.h12
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp135
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp278
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp106
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp30
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.h12
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp81
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp43
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_provider.h81
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_provider_impl.h23
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp19
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_settings.h117
-rw-r--r--ydb/library/yql/utils/log/log.cpp1
-rw-r--r--ydb/library/yql/utils/log/log_component.h5
-rw-r--r--ydb/library/yql/utils/log/proto/logger_config.proto1
-rw-r--r--yql/CMakeLists.txt9
-rw-r--r--yql/providers/CMakeLists.txt9
-rw-r--r--yql/providers/connector/CMakeLists.txt10
-rw-r--r--yql/providers/connector/api/CMakeLists.darwin-x86_64.txt59
-rw-r--r--yql/providers/connector/api/CMakeLists.linux-aarch64.txt60
-rw-r--r--yql/providers/connector/api/CMakeLists.linux-x86_64.txt60
-rw-r--r--yql/providers/connector/api/CMakeLists.txt17
-rw-r--r--yql/providers/connector/api/CMakeLists.windows-x86_64.txt59
-rw-r--r--yql/providers/connector/api/protos/CMakeLists.darwin-x86_64.txt44
-rw-r--r--yql/providers/connector/api/protos/CMakeLists.linux-aarch64.txt45
-rw-r--r--yql/providers/connector/api/protos/CMakeLists.linux-x86_64.txt45
-rw-r--r--yql/providers/connector/api/protos/CMakeLists.txt17
-rw-r--r--yql/providers/connector/api/protos/CMakeLists.windows-x86_64.txt44
-rw-r--r--yql/providers/connector/libcpp/CMakeLists.darwin-x86_64.txt27
-rw-r--r--yql/providers/connector/libcpp/CMakeLists.linux-aarch64.txt28
-rw-r--r--yql/providers/connector/libcpp/CMakeLists.linux-x86_64.txt28
-rw-r--r--yql/providers/connector/libcpp/CMakeLists.txt17
-rw-r--r--yql/providers/connector/libcpp/CMakeLists.windows-x86_64.txt27
80 files changed, 3446 insertions, 4 deletions
diff --git a/CMakeLists.darwin-x86_64.txt b/CMakeLists.darwin-x86_64.txt
index fa276972cd..336903a636 100644
--- a/CMakeLists.darwin-x86_64.txt
+++ b/CMakeLists.darwin-x86_64.txt
@@ -12,3 +12,4 @@ add_subdirectory(util)
add_subdirectory(library)
add_subdirectory(ydb)
add_subdirectory(certs)
+add_subdirectory(yql)
diff --git a/CMakeLists.linux-aarch64.txt b/CMakeLists.linux-aarch64.txt
index fa276972cd..336903a636 100644
--- a/CMakeLists.linux-aarch64.txt
+++ b/CMakeLists.linux-aarch64.txt
@@ -12,3 +12,4 @@ add_subdirectory(util)
add_subdirectory(library)
add_subdirectory(ydb)
add_subdirectory(certs)
+add_subdirectory(yql)
diff --git a/CMakeLists.linux-x86_64.txt b/CMakeLists.linux-x86_64.txt
index fa276972cd..336903a636 100644
--- a/CMakeLists.linux-x86_64.txt
+++ b/CMakeLists.linux-x86_64.txt
@@ -12,3 +12,4 @@ add_subdirectory(util)
add_subdirectory(library)
add_subdirectory(ydb)
add_subdirectory(certs)
+add_subdirectory(yql)
diff --git a/CMakeLists.windows-x86_64.txt b/CMakeLists.windows-x86_64.txt
index fa276972cd..336903a636 100644
--- a/CMakeLists.windows-x86_64.txt
+++ b/CMakeLists.windows-x86_64.txt
@@ -12,3 +12,4 @@ add_subdirectory(util)
add_subdirectory(library)
add_subdirectory(ydb)
add_subdirectory(certs)
+add_subdirectory(yql)
diff --git a/ydb/library/yql/ast/yql_expr.h b/ydb/library/yql/ast/yql_expr.h
index 943c38305b..373efea6cf 100644
--- a/ydb/library/yql/ast/yql_expr.h
+++ b/ydb/library/yql/ast/yql_expr.h
@@ -555,6 +555,20 @@ public:
return true;
}
+
+ TString ToString() const {
+ TStringBuilder sb;
+
+ for (std::size_t i = 0; i < Items.size(); i++) {
+ sb << i << ": " << Items[i]->GetName() << "(" << FormatType(Items[i]->GetItemType()) << ")";
+ if (i != Items.size() - 1) {
+ sb << ", ";
+ }
+ }
+
+ return sb;
+ }
+
private:
TVector<const TItemExprType*> Items;
};
diff --git a/ydb/library/yql/providers/CMakeLists.txt b/ydb/library/yql/providers/CMakeLists.txt
index 7442f5bd49..e6ab81d4f9 100644
--- a/ydb/library/yql/providers/CMakeLists.txt
+++ b/ydb/library/yql/providers/CMakeLists.txt
@@ -11,6 +11,7 @@ add_subdirectory(common)
add_subdirectory(config)
add_subdirectory(dq)
add_subdirectory(function)
+add_subdirectory(generic)
add_subdirectory(pq)
add_subdirectory(result)
add_subdirectory(s3)
diff --git a/ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h b/ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h
index bf4983ad13..6a9385996f 100644
--- a/ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h
+++ b/ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h
@@ -9,7 +9,8 @@ enum class DatabaseType {
Ydb,
ClickHouse,
DataStreams,
- ObjectStorage
+ ObjectStorage,
+ Generic
};
struct TDatabaseAuth {
diff --git a/ydb/library/yql/providers/common/mkql/parser.cpp b/ydb/library/yql/providers/common/mkql/parser.cpp
index 7051f5fc5e..2d4ac590d8 100644
--- a/ydb/library/yql/providers/common/mkql/parser.cpp
+++ b/ydb/library/yql/providers/common/mkql/parser.cpp
@@ -137,6 +137,7 @@ TRuntimeNode WrapWithDecompress(
}
} // namespace
+
TRuntimeNode BuildParseCall(
TPosition pos,
TRuntimeNode input,
@@ -390,6 +391,7 @@ TMaybe<TRuntimeNode> TryWrapWithParser(const TDqSourceWrapBase& wrapper, NCommon
const auto& settings = GetSettings(wrapper.Settings().Cast().Ref());
TPosition pos = ctx.ExprCtx.GetPosition(wrapper.Pos());
+
return BuildParseCall(
pos,
input,
@@ -405,4 +407,30 @@ TMaybe<TRuntimeNode> TryWrapWithParser(const TDqSourceWrapBase& wrapper, NCommon
useBlocks);
}
+TMaybe<TRuntimeNode> TryWrapWithParserForArrowIPCStreaming(const TDqSourceWrapBase& wrapper, NCommon::TMkqlBuildContext& ctx) {
+ const auto input = MkqlBuildExpr(wrapper.Input().Ref(), ctx);
+ const TStructExprType* rowType = wrapper.RowType().Ref().GetTypeAnn()->Cast<TTypeExprType>()->GetType()->Cast<TStructExprType>();
+
+ const auto finalItemType = NCommon::BuildType(
+ wrapper.RowType().Ref(),
+ *rowType,
+ ctx.ProgramBuilder);
+
+ const auto* finalItemStructType = static_cast<TStructType*>(finalItemType);
+
+ return ctx.ProgramBuilder.ExpandMap(ctx.ProgramBuilder.ToFlow(input), [&](TRuntimeNode item) {
+ // MKQL_ENSURE(!extraColumnsByPathIndex && metadataColumns.empty(), "TODO");
+
+ TRuntimeNode::TList fields;
+
+ for (ui32 i = 0; i < finalItemStructType->GetMembersCount(); ++i) {
+ TStringBuf name = finalItemStructType->GetMemberName(i);
+ fields.push_back(ctx.ProgramBuilder.Member(item, name));
+ }
+
+ fields.push_back(ctx.ProgramBuilder.Member(item, BlockLengthColumnName));
+ return fields;
+ });
+}
+
}
diff --git a/ydb/library/yql/providers/common/mkql/parser.h b/ydb/library/yql/providers/common/mkql/parser.h
index cf35d6447b..bccab59faf 100644
--- a/ydb/library/yql/providers/common/mkql/parser.h
+++ b/ydb/library/yql/providers/common/mkql/parser.h
@@ -28,5 +28,6 @@ NKikimr::NMiniKQL::TRuntimeNode BuildParseCall(
bool useBlocks = false);
TMaybe<NKikimr::NMiniKQL::TRuntimeNode> TryWrapWithParser(const NYql::NNodes::TDqSourceWrapBase& wrapper, NCommon::TMkqlBuildContext& ctx, bool useBlocks = false);
+TMaybe<NKikimr::NMiniKQL::TRuntimeNode> TryWrapWithParserForArrowIPCStreaming(const NYql::NNodes::TDqSourceWrapBase& wrapper, NCommon::TMkqlBuildContext& ctx);
}
diff --git a/ydb/library/yql/providers/common/proto/gateways_config.proto b/ydb/library/yql/providers/common/proto/gateways_config.proto
index 0243818df4..87d25c0521 100644
--- a/ydb/library/yql/providers/common/proto/gateways_config.proto
+++ b/ydb/library/yql/providers/common/proto/gateways_config.proto
@@ -530,6 +530,15 @@ message TDbToolConfig {
}
+/////////// Generic gateway for the external data sources ////////////
+
+message TGenericGatewayConfig {
+ required string Endpoint = 1;
+
+ // external data sources that can be accessed via connector
+ optional TClickHouseGatewayConfig ClickHouse = 2;
+}
+
/////////////////////////////// Root ///////////////////////////////
message TGatewaysConfig {
@@ -553,4 +562,5 @@ message TGatewaysConfig {
optional THttpGatewayConfig HttpGateway = 18;
optional TYtOrmGatewayConfig YtOrm = 19;
optional TDbToolConfig DbTool = 20;
+ optional TGenericGatewayConfig Generic = 21;
}
diff --git a/ydb/library/yql/providers/common/provider/yql_provider_names.h b/ydb/library/yql/providers/common/provider/yql_provider_names.h
index 03924fbb0b..b5e743e05e 100644
--- a/ydb/library/yql/providers/common/provider/yql_provider_names.h
+++ b/ydb/library/yql/providers/common/provider/yql_provider_names.h
@@ -18,11 +18,12 @@ constexpr TStringBuf YdbProviderName = "ydb";
constexpr TStringBuf PqProviderName = "pq";
constexpr TStringBuf S3ProviderName = "s3";
constexpr TStringBuf FunctionProviderName = "function";
+constexpr TStringBuf GenericProviderName = "generic";
-constexpr std::array<const TStringBuf, 12> Providers = {
+constexpr std::array<const TStringBuf, 13> Providers = {
{ConfigProviderName, YtProviderName, KikimrProviderName, RtmrProviderName, S3ProviderName,
StatProviderName, SolomonProviderName, DqProviderName, ClickHouseProviderName, YdbProviderName,
- PqProviderName, FunctionProviderName}
+ PqProviderName, FunctionProviderName, GenericProviderName}
};
} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/CMakeLists.txt b/ydb/library/yql/providers/generic/CMakeLists.txt
new file mode 100644
index 0000000000..44f7e33156
--- /dev/null
+++ b/ydb/library/yql/providers/generic/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(actors)
+add_subdirectory(expr_nodes)
+add_subdirectory(proto)
+add_subdirectory(provider)
diff --git a/ydb/library/yql/providers/generic/actors/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/providers/generic/actors/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..eab0abf842
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,27 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-actors)
+target_compile_options(providers-generic-actors PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-actors PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ dq-actors-compute
+ yql-minikql-computation
+ common-token_accessor-client
+ providers-generic-proto
+ yql-public-types
+ providers-connector-libcpp
+)
+target_sources(providers-generic-actors PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp
+)
diff --git a/ydb/library/yql/providers/generic/actors/CMakeLists.linux-aarch64.txt b/ydb/library/yql/providers/generic/actors/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..21c336cea6
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,28 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-actors)
+target_compile_options(providers-generic-actors PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-actors PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ dq-actors-compute
+ yql-minikql-computation
+ common-token_accessor-client
+ providers-generic-proto
+ yql-public-types
+ providers-connector-libcpp
+)
+target_sources(providers-generic-actors PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp
+)
diff --git a/ydb/library/yql/providers/generic/actors/CMakeLists.linux-x86_64.txt b/ydb/library/yql/providers/generic/actors/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..21c336cea6
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,28 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-actors)
+target_compile_options(providers-generic-actors PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-actors PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ dq-actors-compute
+ yql-minikql-computation
+ common-token_accessor-client
+ providers-generic-proto
+ yql-public-types
+ providers-connector-libcpp
+)
+target_sources(providers-generic-actors PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp
+)
diff --git a/ydb/library/yql/providers/generic/actors/CMakeLists.txt b/ydb/library/yql/providers/generic/actors/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/ydb/library/yql/providers/generic/actors/CMakeLists.windows-x86_64.txt b/ydb/library/yql/providers/generic/actors/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..eab0abf842
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,27 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-actors)
+target_compile_options(providers-generic-actors PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-actors PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ dq-actors-compute
+ yql-minikql-computation
+ common-token_accessor-client
+ providers-generic-proto
+ yql-public-types
+ providers-connector-libcpp
+)
+target_sources(providers-generic-actors PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp
+)
diff --git a/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp b/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp
new file mode 100644
index 0000000000..ea33e9eceb
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.cpp
@@ -0,0 +1,248 @@
+#include "yql_generic_read_actor.h"
+
+#include <library/cpp/actors/core/actor_bootstrapped.h>
+#include <library/cpp/actors/core/actorsystem.h>
+#include <library/cpp/actors/core/event_local.h>
+#include <library/cpp/actors/core/events.h>
+#include <library/cpp/actors/core/hfunc.h>
+#include <ydb/library/yql/core/yql_expr_type_annotation.h>
+#include <ydb/library/yql/minikql/computation/mkql_computation_node_holders.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/proto/range.pb.h>
+#include <ydb/library/yql/public/udf/arrow/util.h>
+#include <ydb/library/yql/utils/log/log.h>
+#include <ydb/library/yql/utils/yql_panic.h>
+#include <yql/providers/connector/api/protos/connector.pb.h>
+#include <yql/providers/connector/libcpp/error.h>
+
+namespace NYql::NDq {
+
+ using namespace NActors;
+
+ namespace {
+
+ struct TEvPrivate {
+ // Event ids
+ enum EEv: ui32 {
+ EvBegin = EventSpaceBegin(TEvents::ES_PRIVATE),
+
+ EvReadResult = EvBegin,
+ EvReadError,
+
+ EvEnd
+ };
+
+ static_assert(EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE)");
+
+ // Events
+ struct TEvReadResult: public TEventLocal<TEvReadResult, EvReadResult> {
+ TEvReadResult(const Connector::ReadSplitsResult::TPtr& result)
+ : Result(result)
+ {
+ }
+
+ Connector::ReadSplitsResult::TPtr Result;
+ };
+
+ struct TEvReadError: public TEventLocal<TEvReadError, EvReadError> {
+ TEvReadError(TIssues&& error)
+ : Error(std::move(error))
+ {
+ }
+ TIssues Error;
+ };
+ };
+
+ } // namespace
+
+ class TGenericReadActor: public TActorBootstrapped<TGenericReadActor>, public IDqComputeActorAsyncInput {
+ public:
+ TGenericReadActor(ui64 inputIndex, Connector::IClient::TPtr genericClient, const NYql::Connector::API::Select& select,
+ const NYql::Connector::API::DataSourceInstance& dataSourceInstance,
+ const NActors::TActorId& computeActorId, const NKikimr::NMiniKQL::THolderFactory& holderFactory)
+ : InputIndex(inputIndex)
+ , ComputeActorId(computeActorId)
+ , ActorSystem(TActivationContext::ActorSystem())
+ , ConnectorClient(genericClient)
+ , HolderFactory(holderFactory)
+ , Select(select)
+ , DataSourceInstance(dataSourceInstance)
+ {
+ }
+
+ void Bootstrap() {
+ Become(&TGenericReadActor::StateFunc);
+
+ Connector::API::ListSplitsRequest listSplitsRequest;
+ listSplitsRequest.mutable_selects()->Add()->CopyFrom(Select);
+ listSplitsRequest.mutable_data_source_instance()->CopyFrom(DataSourceInstance);
+
+ auto listSplitsResult = ConnectorClient->ListSplits(listSplitsRequest);
+ if (!Connector::ErrorIsSuccess(listSplitsResult->Error)) {
+ YQL_CLOG(ERROR, ProviderGeneric) << "ListSplits failure" << listSplitsResult->Error.DebugString();
+ ActorSystem->Send(new IEventHandle(
+ SelfId(), TActorId(), new TEvPrivate::TEvReadError(Connector::ErrorToIssues(listSplitsResult->Error))));
+ return;
+ }
+
+ YQL_CLOG(INFO, ProviderGeneric) << "ListSplits succeess, total splits: " << listSplitsResult->Splits.size();
+
+ Connector::API::ReadSplitsRequest readSplitsRequest;
+ readSplitsRequest.set_format(Connector::API::ReadSplitsRequest::ARROW_IPC_STREAMING);
+ readSplitsRequest.mutable_splits()->Reserve(listSplitsResult->Splits.size());
+ std::for_each(
+ listSplitsResult->Splits.cbegin(), listSplitsResult->Splits.cend(),
+ [&](const Connector::API::Split& split) { readSplitsRequest.mutable_splits()->Add()->CopyFrom(split); });
+ readSplitsRequest.mutable_data_source_instance()->CopyFrom(DataSourceInstance);
+
+ auto readSplitsResult = ConnectorClient->ReadSplits(readSplitsRequest);
+ if (!Connector::ErrorIsSuccess(listSplitsResult->Error)) {
+ YQL_CLOG(ERROR, ProviderGeneric) << "ReadSplits failure" << readSplitsResult->Error.DebugString();
+ ActorSystem->Send(new IEventHandle(
+ SelfId(), TActorId(), new TEvPrivate::TEvReadError(Connector::ErrorToIssues(listSplitsResult->Error))));
+ return;
+ }
+
+ YQL_CLOG(INFO, ProviderGeneric) << "ReadSplits succeess, total batches: "
+ << readSplitsResult->RecordBatches.size();
+
+ ActorSystem->Send(new IEventHandle(SelfId(), TActorId(), new TEvPrivate::TEvReadResult(readSplitsResult)));
+ }
+
+ static constexpr char ActorName[] = "Generic_READ_ACTOR";
+
+ private:
+ void SaveState(const NDqProto::TCheckpoint&, NDqProto::TSourceState&) final {
+ }
+ void LoadState(const NDqProto::TSourceState&) final {
+ }
+ void CommitState(const NDqProto::TCheckpoint&) final {
+ }
+ ui64 GetInputIndex() const final {
+ return InputIndex;
+ }
+
+ STRICT_STFUNC(StateFunc,
+ hFunc(TEvPrivate::TEvReadResult, Handle);
+ hFunc(TEvPrivate::TEvReadError, Handle);)
+
+ i64 GetAsyncInputData(NKikimr::NMiniKQL::TUnboxedValueVector& buffer, TMaybe<TInstant>&, bool& finished,
+ i64 /*freeSpace*/) final {
+ if (Result) {
+ NUdf::TUnboxedValue value;
+
+ ui64 total = 0;
+
+ for (const auto& batch : Result->RecordBatches) {
+ total += NUdf::GetSizeOfArrowBatchInBytes(*batch);
+
+ YQL_CLOG(TRACE, ProviderGeneric) << "Converting arrow::RecordBatch into NUdf::UnboxedValue:\n"
+ << batch->ToString();
+
+ // It's very important to fill UV column in the alphabet order,
+ // paying attention to the scalar field containing block length.
+ auto fieldNames = batch->schema()->field_names();
+ fieldNames.push_back(std::string(BlockLengthColumnName));
+ std::sort(fieldNames.begin(), fieldNames.end());
+ std::map<std::string, std::size_t> fieldNameOrder;
+ for (std::size_t i = 0; i < fieldNames.size(); i++) {
+ fieldNameOrder[fieldNames[i]] = i;
+ }
+
+ NUdf::TUnboxedValue* structItems = nullptr;
+ auto structObj = ArrowRowContainerCache.NewArray(HolderFactory, 1 + batch->num_columns(), structItems);
+ for (int i = 0; i < batch->num_columns(); ++i) {
+ const auto& columnName = batch->schema()->field(i)->name();
+ const auto ix = fieldNameOrder[columnName];
+ structItems[ix] = HolderFactory.CreateArrowBlock(arrow::Datum(batch->column(i)));
+ }
+
+ structItems[fieldNameOrder[std::string(BlockLengthColumnName)]] = HolderFactory.CreateArrowBlock(
+ arrow::Datum(std::make_shared<arrow::UInt64Scalar>(batch->num_rows())));
+ value = structObj;
+
+ buffer.emplace_back(std::move(value));
+ }
+
+ // freeSpace -= size;
+ finished = true;
+ Result.reset();
+
+ // TODO: check it, because in S3 the generic cache clearing happens only when LastFileWasProcessed:
+ // https://a.yandex-team.ru/arcadia/ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp?rev=r11543410#L2497
+ ArrowRowContainerCache.Clear();
+
+ return total;
+ }
+
+ return 0LL;
+ }
+
+ void Handle(TEvPrivate::TEvReadResult::TPtr& evReadResult) {
+ Result = evReadResult->Get()->Result;
+ Send(ComputeActorId, new TEvNewAsyncInputDataArrived(InputIndex));
+ }
+
+ void Handle(TEvPrivate::TEvReadError::TPtr& result) {
+ Send(ComputeActorId,
+ new TEvAsyncInputError(InputIndex, result->Get()->Error, NYql::NDqProto::StatusIds::EXTERNAL_ERROR));
+ }
+
+ // IActor & IDqComputeActorAsyncInput
+ void PassAway() override { // Is called from Compute Actor
+ TActorBootstrapped<TGenericReadActor>::PassAway();
+ }
+
+ const ui64 InputIndex;
+ const NActors::TActorId ComputeActorId;
+
+ TActorSystem* const ActorSystem;
+
+ // Changed:
+ Connector::IClient::TPtr ConnectorClient;
+ Connector::ReadSplitsResult::TPtr Result;
+ NKikimr::NMiniKQL::TPlainContainerCache ArrowRowContainerCache;
+ const NKikimr::NMiniKQL::THolderFactory& HolderFactory;
+ const NYql::Connector::API::Select Select;
+ const NYql::Connector::API::DataSourceInstance DataSourceInstance;
+ };
+
+ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, IActor*>
+ CreateGenericReadActor(Connector::IClient::TPtr genericClient, Generic::TSource&& params, ui64 inputIndex,
+ const THashMap<TString, TString>& /*secureParams*/,
+ const THashMap<TString, TString>& /*taskParams*/, const NActors::TActorId& computeActorId,
+ ISecuredServiceAccountCredentialsFactory::TPtr /*credentialsFactory*/,
+ const NKikimr::NMiniKQL::THolderFactory& holderFactory)
+ {
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Creating read actor with params: " << params.ShortDebugString();
+
+ // FIXME: strange piece of logic - authToken is created but not used:
+ // https://a.yandex-team.ru/arcadia/ydb/library/yql/providers/clickhouse/actors/yql_ch_read_actor.cpp?rev=r11550199#L140
+ /*
+ const auto token = secureParams.Value(params.token(), TString{});
+ const auto credentialsProviderFactory =
+ CreateCredentialsProviderFactoryForStructuredToken(credentialsFactory, token);
+ const auto authToken = credentialsProviderFactory->CreateProvider()->GetAuthInfo();
+ const auto one = token.find('#'), two = token.rfind('#');
+ YQL_ENSURE(one != TString::npos && two != TString::npos && one < two, "Bad token format:" << token);
+ */
+
+ // TODO: partitioning is not implemented now, but this code will be useful for the further research:
+ /*
+ TStringBuilder part;
+ if (const auto taskParamsIt = taskParams.find(GenericProviderName); taskParamsIt != taskParams.cend()) {
+ Generic::TRange range;
+ TStringInput input(taskParamsIt->second);
+ range.Load(&input);
+ if (const auto& r = range.GetRange(); !r.empty())
+ part << ' ' << r;
+ }
+ part << ';';
+ */
+
+ const auto actor = new TGenericReadActor(inputIndex, genericClient, params.select(), params.data_source_instance(),
+ computeActorId, holderFactory);
+ return {actor, actor};
+ }
+
+} // namespace NYql::NDq
diff --git a/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.h b/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.h
new file mode 100644
index 0000000000..d7fb96cb69
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/yql_generic_read_actor.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <library/cpp/actors/core/actor.h>
+#include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io.h>
+#include <ydb/library/yql/providers/common/token_accessor/client/factory.h>
+#include <ydb/library/yql/providers/generic/proto/source.pb.h>
+#include <yql/providers/connector/libcpp/client.h>
+
+namespace NYql::NDq {
+
+ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, NActors::IActor*>
+ CreateGenericReadActor(Connector::IClient::TPtr genericClient, Generic::TSource&& params, ui64 inputIndex,
+ const THashMap<TString, TString>& secureParams, const THashMap<TString, TString>& taskParams,
+ const NActors::TActorId& computeActorId,
+ ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory,
+ const NKikimr::NMiniKQL::THolderFactory& holderFactory);
+
+} // namespace NYql::NDq
diff --git a/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp b/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp
new file mode 100644
index 0000000000..d7223c12c8
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.cpp
@@ -0,0 +1,20 @@
+#include "yql_generic_source_factory.h"
+
+#include "yql_generic_read_actor.h"
+
+#include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io.h>
+
+namespace NYql::NDq {
+
+ void RegisterGenericReadActorFactory(TDqAsyncIoFactory& factory,
+ ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory,
+ NYql::Connector::IClient::TPtr genericClient) {
+ factory.RegisterSource<Generic::TSource>("GenericSource", [credentialsFactory, genericClient](
+ Generic::TSource&& settings,
+ IDqAsyncIoFactory::TSourceArguments&& args) {
+ return CreateGenericReadActor(genericClient, std::move(settings), args.InputIndex, args.SecureParams,
+ args.TaskParams, args.ComputeActorId, credentialsFactory, args.HolderFactory);
+ });
+ }
+
+}
diff --git a/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.h b/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.h
new file mode 100644
index 0000000000..6c72e2853c
--- /dev/null
+++ b/ydb/library/yql/providers/generic/actors/yql_generic_source_factory.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io.h>
+#include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io_factory.h>
+#include <ydb/library/yql/providers/common/token_accessor/client/factory.h>
+#include <yql/providers/connector/libcpp/client.h>
+
+namespace NYql::NDq {
+ void RegisterGenericReadActorFactory(TDqAsyncIoFactory& factory,
+ ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory,
+ NYql::Connector::IClient::TPtr genericClient);
+}
diff --git a/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..ef7d722030
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,41 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(Python3 REQUIRED)
+
+add_library(providers-generic-expr_nodes)
+target_link_libraries(providers-generic-expr_nodes PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ yql-core-expr_nodes
+ providers-common-provider
+)
+target_sources(providers-generic-expr_nodes PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
+add_custom_command(
+ OUTPUT
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+ DEPENDS
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ COMMAND
+ Python3::Interpreter
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
diff --git a/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-aarch64.txt b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..e07208f2e1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,42 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(Python3 REQUIRED)
+
+add_library(providers-generic-expr_nodes)
+target_link_libraries(providers-generic-expr_nodes PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ yql-core-expr_nodes
+ providers-common-provider
+)
+target_sources(providers-generic-expr_nodes PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
+add_custom_command(
+ OUTPUT
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+ DEPENDS
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ COMMAND
+ Python3::Interpreter
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
diff --git a/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-x86_64.txt b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..e07208f2e1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,42 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(Python3 REQUIRED)
+
+add_library(providers-generic-expr_nodes)
+target_link_libraries(providers-generic-expr_nodes PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ yql-core-expr_nodes
+ providers-common-provider
+)
+target_sources(providers-generic-expr_nodes PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
+add_custom_command(
+ OUTPUT
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+ DEPENDS
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ COMMAND
+ Python3::Interpreter
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
diff --git a/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.txt b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.windows-x86_64.txt b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..ef7d722030
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,41 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(Python3 REQUIRED)
+
+add_library(providers-generic-expr_nodes)
+target_link_libraries(providers-generic-expr_nodes PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ yql-core-expr_nodes
+ providers-common-provider
+)
+target_sources(providers-generic-expr_nodes PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
+add_custom_command(
+ OUTPUT
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+ DEPENDS
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ COMMAND
+ Python3::Interpreter
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/gen/__main__.py
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/core/expr_nodes_gen/yql_expr_nodes_gen.jnj
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h
+ ${CMAKE_BINARY_DIR}/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h
+)
diff --git a/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp
new file mode 100644
index 0000000000..43ba365519
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.cpp
@@ -0,0 +1 @@
+#include "yql_generic_expr_nodes.h"
diff --git a/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h
new file mode 100644
index 0000000000..88c42f144d
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.gen.h>
+
+namespace NYql {
+ namespace NNodes {
+
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.decl.inl.h>
+
+ class TGenDataSource: public NGenerated::TGenDataSourceStub<TExprBase, TCallable, TCoAtom> {
+ public:
+ explicit TGenDataSource(const TExprNode* node)
+ : TGenDataSourceStub(node)
+ {
+ }
+
+ explicit TGenDataSource(const TExprNode::TPtr& node)
+ : TGenDataSourceStub(node)
+ {
+ }
+
+ static bool Match(const TExprNode* node) {
+ if (!TGenDataSourceStub::Match(node)) {
+ return false;
+ }
+
+ if (node->Child(0)->Content() != GenericProviderName) {
+ return false;
+ }
+
+ return true;
+ }
+ };
+
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.defs.inl.h>
+
+ }
+}
diff --git a/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
new file mode 100644
index 0000000000..393287f800
--- /dev/null
+++ b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
@@ -0,0 +1,50 @@
+{
+ "NodeRootType": "TExprBase",
+ "NodeBuilderBase": "TNodeBuilderBase",
+ "ListBuilderBase": "TListBuilderBase",
+ "FreeArgCallableBase": "TFreeArgCallable",
+ "FreeArgBuilderBase": "TFreeArgCallableBuilderBase",
+ "Nodes": [
+ {
+ "Name": "TGenDataSource",
+ "Base": "TCallable",
+ "Definition": "Custom",
+ "Match": {"Type": "Callable", "Name": "DataSource"},
+ "Children": [
+ {"Index": 0, "Name": "Category", "Type": "TCoAtom"},
+ {"Index": 1, "Name": "Cluster", "Type": "TCoAtom"}
+ ]
+ },
+ {
+ "Name": "TGenRead",
+ "Base": "TFreeArgCallable",
+ "Match": {"Type": "Callable", "Name": "Read!"},
+ "Children": [
+ {"Index": 0, "Name": "World", "Type": "TExprBase"},
+ {"Index": 1, "Name": "DataSource", "Type": "TGenDataSource"}
+ ]
+ },
+ {
+ "Name": "TGenReadTable",
+ "Base": "TCallable",
+ "Match": {"Type": "Callable", "Name": "GenReadTable!"},
+ "Children": [
+ {"Index": 0, "Name": "World", "Type": "TExprBase"},
+ {"Index": 1, "Name": "DataSource", "Type": "TGenDataSource"},
+ {"Index": 2, "Name": "Table", "Type": "TCoAtom"},
+ {"Index": 3, "Name": "Columns", "Type": "TExprBase"},
+ {"Index": 4, "Name": "Timezone", "Type": "TCoAtom"}
+ ]
+ },
+ {
+ "Name": "TGenSourceSettings",
+ "Base": "TCallable",
+ "Match": {"Type": "Callable", "Name": "GenSourceSettings"},
+ "Children": [
+ {"Index": 0, "Name": "Table", "Type": "TCoAtom"},
+ {"Index": 1, "Name": "Token", "Type": "TCoSecureParam"},
+ {"Index": 2, "Name": "Columns", "Type": "TCoAtomList"}
+ ]
+ }
+ ]
+}
diff --git a/ydb/library/yql/providers/generic/proto/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/providers/generic/proto/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..97d03389d6
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,57 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(providers-generic-proto)
+target_link_libraries(providers-generic-proto PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(providers-generic-proto PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/range.proto
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/source.proto
+)
+target_proto_addincls(providers-generic-proto
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(providers-generic-proto
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/ydb/library/yql/providers/generic/proto/CMakeLists.linux-aarch64.txt b/ydb/library/yql/providers/generic/proto/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..ac8978c56d
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,58 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(providers-generic-proto)
+target_link_libraries(providers-generic-proto PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(providers-generic-proto PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/range.proto
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/source.proto
+)
+target_proto_addincls(providers-generic-proto
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(providers-generic-proto
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/ydb/library/yql/providers/generic/proto/CMakeLists.linux-x86_64.txt b/ydb/library/yql/providers/generic/proto/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..ac8978c56d
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,58 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(providers-generic-proto)
+target_link_libraries(providers-generic-proto PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(providers-generic-proto PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/range.proto
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/source.proto
+)
+target_proto_addincls(providers-generic-proto
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(providers-generic-proto
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/ydb/library/yql/providers/generic/proto/CMakeLists.txt b/ydb/library/yql/providers/generic/proto/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/ydb/library/yql/providers/generic/proto/CMakeLists.windows-x86_64.txt b/ydb/library/yql/providers/generic/proto/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..97d03389d6
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,57 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(providers-generic-proto)
+target_link_libraries(providers-generic-proto PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(providers-generic-proto PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/range.proto
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/proto/source.proto
+)
+target_proto_addincls(providers-generic-proto
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(providers-generic-proto
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/ydb/library/yql/providers/generic/proto/range.proto b/ydb/library/yql/providers/generic/proto/range.proto
new file mode 100644
index 0000000000..a28e4b4598
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/range.proto
@@ -0,0 +1,9 @@
+syntax = "proto3";
+
+package NYql.Generic;
+
+// FIXME: this is legacy left from the ClickHouse connector,
+// it's not used directly now, but left for the further research.
+message TRange {
+ string Range = 1;
+}
diff --git a/ydb/library/yql/providers/generic/proto/source.proto b/ydb/library/yql/providers/generic/proto/source.proto
new file mode 100644
index 0000000000..814eb816bc
--- /dev/null
+++ b/ydb/library/yql/providers/generic/proto/source.proto
@@ -0,0 +1,16 @@
+syntax = "proto3";
+
+option cc_enable_arenas = true;
+
+package NYql.Generic;
+
+import "yql/providers/connector/api/protos/connector.proto";
+
+message TSource {
+ // Token to access database
+ string token = 1;
+ // Prepared Select expression
+ NYql.Connector.API.Select select = 2;
+ // Description of instance to connect
+ NYql.Connector.API.DataSourceInstance data_source_instance = 3;
+}
diff --git a/ydb/library/yql/providers/generic/provider/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/providers/generic/provider/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..c5a49c156e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,56 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-provider)
+target_compile_options(providers-generic-provider PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-provider PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ library-cpp-json
+ library-cpp-random_provider
+ library-cpp-time_provider
+ fq-libs-result_formatter
+ library-yql-ast
+ library-yql-core
+ yql-core-type_ann
+ yql-dq-expr_nodes
+ yql-dq-integration
+ library-yql-minikql
+ yql-minikql-comp_nodes
+ yql-minikql-computation
+ providers-common-config
+ providers-common-db_id_async_resolver
+ providers-common-dq
+ providers-common-mkql
+ providers-common-proto
+ providers-common-provider
+ providers-common-transform
+ providers-dq-common
+ providers-dq-expr_nodes
+ providers-generic-expr_nodes
+ providers-generic-proto
+ providers-connector-libcpp
+)
+target_sources(providers-generic-provider PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp
+)
diff --git a/ydb/library/yql/providers/generic/provider/CMakeLists.linux-aarch64.txt b/ydb/library/yql/providers/generic/provider/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..f7416438d4
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,57 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-provider)
+target_compile_options(providers-generic-provider PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-provider PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ library-cpp-json
+ library-cpp-random_provider
+ library-cpp-time_provider
+ fq-libs-result_formatter
+ library-yql-ast
+ library-yql-core
+ yql-core-type_ann
+ yql-dq-expr_nodes
+ yql-dq-integration
+ library-yql-minikql
+ yql-minikql-comp_nodes
+ yql-minikql-computation
+ providers-common-config
+ providers-common-db_id_async_resolver
+ providers-common-dq
+ providers-common-mkql
+ providers-common-proto
+ providers-common-provider
+ providers-common-transform
+ providers-dq-common
+ providers-dq-expr_nodes
+ providers-generic-expr_nodes
+ providers-generic-proto
+ providers-connector-libcpp
+)
+target_sources(providers-generic-provider PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp
+)
diff --git a/ydb/library/yql/providers/generic/provider/CMakeLists.linux-x86_64.txt b/ydb/library/yql/providers/generic/provider/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..f7416438d4
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,57 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-provider)
+target_compile_options(providers-generic-provider PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-provider PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ library-cpp-json
+ library-cpp-random_provider
+ library-cpp-time_provider
+ fq-libs-result_formatter
+ library-yql-ast
+ library-yql-core
+ yql-core-type_ann
+ yql-dq-expr_nodes
+ yql-dq-integration
+ library-yql-minikql
+ yql-minikql-comp_nodes
+ yql-minikql-computation
+ providers-common-config
+ providers-common-db_id_async_resolver
+ providers-common-dq
+ providers-common-mkql
+ providers-common-proto
+ providers-common-provider
+ providers-common-transform
+ providers-dq-common
+ providers-dq-expr_nodes
+ providers-generic-expr_nodes
+ providers-generic-proto
+ providers-connector-libcpp
+)
+target_sources(providers-generic-provider PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp
+)
diff --git a/ydb/library/yql/providers/generic/provider/CMakeLists.txt b/ydb/library/yql/providers/generic/provider/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/ydb/library/yql/providers/generic/provider/CMakeLists.windows-x86_64.txt b/ydb/library/yql/providers/generic/provider/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..c5a49c156e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,56 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-generic-provider)
+target_compile_options(providers-generic-provider PRIVATE
+ -DUSE_CURRENT_UDF_ABI_VERSION
+)
+target_link_libraries(providers-generic-provider PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ library-cpp-json
+ library-cpp-random_provider
+ library-cpp-time_provider
+ fq-libs-result_formatter
+ library-yql-ast
+ library-yql-core
+ yql-core-type_ann
+ yql-dq-expr_nodes
+ yql-dq-integration
+ library-yql-minikql
+ yql-minikql-comp_nodes
+ yql-minikql-computation
+ providers-common-config
+ providers-common-db_id_async_resolver
+ providers-common-dq
+ providers-common-mkql
+ providers-common-proto
+ providers-common-provider
+ providers-common-transform
+ providers-dq-common
+ providers-dq-expr_nodes
+ providers-generic-expr_nodes
+ providers-generic-proto
+ providers-connector-libcpp
+)
+target_sources(providers-generic-provider PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp
+)
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp
new file mode 100644
index 0000000000..142aa12005
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasink.cpp
@@ -0,0 +1,87 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ namespace {
+
+ class TGenericDataSink: public TDataProviderBase {
+ public:
+ TGenericDataSink(TGenericState::TPtr state)
+ : State_(state)
+ , TypeAnnotationTransformer_(CreateGenericDataSinkTypeAnnotationTransformer(State_))
+ , ExecutionTransformer_(CreateGenericDataSinkExecTransformer(State_))
+ , LogicalOptProposalTransformer_(CreateGenericLogicalOptProposalTransformer(State_))
+ , PhysicalOptProposalTransformer_(CreateGenericPhysicalOptProposalTransformer(State_))
+ {
+ }
+
+ TStringBuf GetName() const override {
+ return GenericProviderName;
+ }
+
+ bool CanParse(const TExprNode& node) override {
+ return TypeAnnotationTransformer_->CanParse(node);
+ }
+
+ IGraphTransformer& GetTypeAnnotationTransformer(bool instantOnly) override {
+ Y_UNUSED(instantOnly);
+ return *TypeAnnotationTransformer_;
+ }
+
+ IGraphTransformer& GetCallableExecutionTransformer() override {
+ return *ExecutionTransformer_;
+ }
+
+ bool CanExecute(const TExprNode& node) override {
+ return ExecutionTransformer_->CanExec(node);
+ }
+
+ bool ValidateParameters(TExprNode& node, TExprContext& ctx, TMaybe<TString>& cluster) override {
+ if (node.IsCallable(TCoDataSink::CallableName())) {
+ if (node.Child(0)->Content() == GenericProviderName) {
+ auto clusterName = node.Child(1)->Content();
+ if (!State_->Configuration->HasCluster(clusterName)) {
+ ctx.AddError(TIssue(ctx.GetPosition(node.Child(1)->Pos()),
+ TStringBuilder() << "Unknown cluster name: " << clusterName));
+ return false;
+ }
+ cluster = clusterName;
+ return true;
+ }
+ }
+ ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), "Invalid Generic DataSink parameters"));
+ return false;
+ }
+
+ IGraphTransformer& GetLogicalOptProposalTransformer() override {
+ return *LogicalOptProposalTransformer_;
+ }
+
+ IGraphTransformer& GetPhysicalOptProposalTransformer() override {
+ return *PhysicalOptProposalTransformer_;
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+ const THolder<TVisitorTransformerBase> TypeAnnotationTransformer_;
+ const THolder<TExecTransformerBase> ExecutionTransformer_;
+ const THolder<IGraphTransformer> LogicalOptProposalTransformer_;
+ const THolder<IGraphTransformer> PhysicalOptProposalTransformer_;
+ };
+
+ }
+
+ TIntrusivePtr<IDataProvider> CreateGenericDataSink(TGenericState::TPtr state) {
+ return new TGenericDataSink(state);
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp
new file mode 100644
index 0000000000..08d8c43d9e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasink_execution.cpp
@@ -0,0 +1,30 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ class TGenericDataSinkExecTransformer: public TExecTransformerBase {
+ public:
+ TGenericDataSinkExecTransformer(TGenericState::TPtr state)
+ : State_(state)
+ {
+ AddHandler({TCoCommit::CallableName()}, RequireFirst(), Pass());
+ }
+
+ private:
+ TGenericState::TPtr State_;
+ };
+
+ THolder<TExecTransformerBase> CreateGenericDataSinkExecTransformer(TGenericState::TPtr state) {
+ return THolder(new TGenericDataSinkExecTransformer(state));
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp
new file mode 100644
index 0000000000..96901a2851
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasink_type_ann.cpp
@@ -0,0 +1,39 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ class TGenericDataSinkTypeAnnotationTransformer: public TVisitorTransformerBase {
+ public:
+ TGenericDataSinkTypeAnnotationTransformer(TGenericState::TPtr state)
+ : TVisitorTransformerBase(true)
+ , State_(state)
+ {
+ using TSelf = TGenericDataSinkTypeAnnotationTransformer;
+ AddHandler({TCoCommit::CallableName()}, Hndl(&TSelf::HandleCommit));
+ }
+
+ TStatus HandleCommit(TExprBase input, TExprContext& ctx) {
+ Y_UNUSED(ctx);
+ auto commit = input.Cast<TCoCommit>();
+ input.Ptr()->SetTypeAnn(commit.World().Ref().GetTypeAnn());
+ return TStatus::Ok;
+ }
+
+ private:
+ TGenericState::TPtr State_;
+ };
+
+ THolder<TVisitorTransformerBase> CreateGenericDataSinkTypeAnnotationTransformer(TGenericState::TPtr state) {
+ return MakeHolder<TGenericDataSinkTypeAnnotationTransformer>(state);
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
new file mode 100644
index 0000000000..1d9bc5cdd0
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
@@ -0,0 +1,126 @@
+#include "yql_generic_dq_integration.h"
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+#include <yql/providers/connector/libcpp/client.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ namespace {
+
+ class TGenericDataSource: public TDataProviderBase {
+ public:
+ TGenericDataSource(TGenericState::TPtr state, Connector::IClient::TPtr client)
+ : State_(state)
+ , IODiscoveryTransformer_(CreateGenericIODiscoveryTransformer(State_))
+ , LoadMetaDataTransformer_(CreateGenericLoadTableMetadataTransformer(State_, std::move(client)))
+ , TypeAnnotationTransformer_(CreateGenericDataSourceTypeAnnotationTransformer(State_))
+ , DqIntegration_(CreateGenericDqIntegration(State_))
+ {
+ }
+
+ TStringBuf GetName() const override {
+ return GenericProviderName;
+ }
+
+ bool ValidateParameters(TExprNode& node, TExprContext& ctx, TMaybe<TString>& cluster) override {
+ if (node.IsCallable(TCoDataSource::CallableName())) {
+ if (node.Child(0)->Content() == GenericProviderName) {
+ auto clusterName = node.Child(1)->Content();
+ if (!State_->Configuration->HasCluster(clusterName)) {
+ ctx.AddError(TIssue(ctx.GetPosition(node.Child(1)->Pos()),
+ TStringBuilder() << "Unknown cluster name: " << clusterName));
+ return false;
+ }
+ cluster = clusterName;
+ return true;
+ }
+ }
+ ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), "Invalid Generic DataSource parameters"));
+ return false;
+ }
+
+ bool CanParse(const TExprNode& node) override {
+ if (node.IsCallable(TCoRead::CallableName())) {
+ return TGenDataSource::Match(node.Child(1));
+ }
+ return TypeAnnotationTransformer_->CanParse(node);
+ }
+
+ IGraphTransformer& GetIODiscoveryTransformer() override {
+ return *IODiscoveryTransformer_;
+ }
+
+ IGraphTransformer& GetLoadTableMetadataTransformer() override {
+ return *LoadMetaDataTransformer_;
+ }
+
+ IGraphTransformer& GetTypeAnnotationTransformer(bool instantOnly) override {
+ Y_UNUSED(instantOnly);
+ return *TypeAnnotationTransformer_;
+ }
+
+ TExprNode::TPtr RewriteIO(const TExprNode::TPtr& node, TExprContext& ctx) override {
+ Y_UNUSED(ctx);
+ YQL_CLOG(INFO, ProviderGeneric) << "RewriteIO";
+ return node;
+ }
+
+ const THashMap<TString, TString>* GetClusterTokens() override {
+ return &State_->Configuration->Tokens;
+ }
+
+ bool GetDependencies(const TExprNode& node, TExprNode::TListType& children, bool compact) override {
+ Y_UNUSED(compact);
+
+ for (auto& child : node.Children()) {
+ children.push_back(child.Get());
+ }
+
+ if (TMaybeNode<TGenReadTable>(&node)) {
+ return true;
+ }
+ return false;
+ }
+
+ void GetInputs(const TExprNode& node, TVector<TPinInfo>& inputs) override {
+ if (auto maybeRead = TMaybeNode<TGenReadTable>(&node)) {
+ if (auto maybeTable = maybeRead.Table()) {
+ TStringBuilder tableNameBuilder;
+ if (auto dataSource = maybeRead.DataSource().Maybe<TGenDataSource>()) {
+ auto cluster = dataSource.Cast().Cluster();
+ tableNameBuilder << cluster.Value() << ".";
+ }
+ tableNameBuilder << '`' << maybeTable.Cast().Value() << '`';
+ inputs.push_back(
+ TPinInfo(maybeRead.DataSource().Raw(), nullptr, maybeTable.Cast().Raw(), tableNameBuilder, false));
+ }
+ }
+ }
+
+ IDqIntegration* GetDqIntegration() override {
+ return DqIntegration_.Get();
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+ const THolder<IGraphTransformer> IODiscoveryTransformer_;
+ const THolder<IGraphTransformer> LoadMetaDataTransformer_;
+ const THolder<TVisitorTransformerBase> TypeAnnotationTransformer_;
+ const THolder<IDqIntegration> DqIntegration_;
+ };
+
+ }
+
+ TIntrusivePtr<IDataProvider> CreateGenericDataSource(TGenericState::TPtr state, Connector::IClient::TPtr client) {
+ return new TGenericDataSource(std::move(state), std::move(client));
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
new file mode 100644
index 0000000000..f05688124d
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
@@ -0,0 +1,167 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/ast/yql_type_string.h>
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/providers/common/mkql/parser.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ class TGenericDataSourceTypeAnnotationTransformer: public TVisitorTransformerBase {
+ public:
+ TGenericDataSourceTypeAnnotationTransformer(TGenericState::TPtr state)
+ : TVisitorTransformerBase(true)
+ , State_(state)
+ {
+ using TSelf = TGenericDataSourceTypeAnnotationTransformer;
+ AddHandler({TGenReadTable::CallableName()}, Hndl(&TSelf::HandleReadTable));
+ AddHandler({TGenSourceSettings::CallableName()}, Hndl(&TSelf::HandleSourceSettings));
+ }
+
+ TStatus HandleSourceSettings(const TExprNode::TPtr& input, TExprContext& ctx) {
+ if (!EnsureArgsCount(*input, 3U, ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureAtom(*input->Child(TGenSourceSettings::idx_Table), ctx)) {
+ return TStatus::Error;
+ }
+
+ if (input->ChildrenSize() > TGenSourceSettings::idx_Token &&
+ !TCoSecureParam::Match(input->Child(TGenSourceSettings::idx_Token))) {
+ ctx.AddError(TIssue(ctx.GetPosition(input->Child(TGenSourceSettings::idx_Token)->Pos()),
+ TStringBuilder() << "Expected " << TCoSecureParam::CallableName()));
+ return TStatus::Error;
+ }
+
+ // Create type annotation
+ const TTypeAnnotationNode* structExprType = nullptr;
+ TVector<const TItemExprType*> blockRowTypeItems;
+
+ for (const auto& table : State_->Tables) {
+ const auto structExprType = table.second.ItemType;
+ for (const auto& item : structExprType->GetItems()) {
+ blockRowTypeItems.push_back(
+ ctx.MakeType<TItemExprType>(item->GetName(), ctx.MakeType<TBlockExprType>(item->GetItemType())));
+ }
+
+ // FIXME:
+ // Clickhouse provider used to work with multiple tables simultaneously;
+ // I don't know what to do with others.
+ break;
+ }
+
+ blockRowTypeItems.push_back(ctx.MakeType<TItemExprType>(
+ BlockLengthColumnName, ctx.MakeType<TScalarExprType>(ctx.MakeType<TDataExprType>(EDataSlot::Uint64))));
+ structExprType = ctx.MakeType<TStructExprType>(blockRowTypeItems);
+
+ // Struct column order
+ YQL_CLOG(INFO, ProviderGeneric)
+ << "StructExprType column order:"
+ << (static_cast<const TStructExprType*>(structExprType))->ToString();
+
+ auto streamExprType = ctx.MakeType<TStreamExprType>(structExprType);
+ input->SetTypeAnn(streamExprType);
+
+ return TStatus::Ok;
+ }
+
+ TStatus HandleReadTable(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ Y_UNUSED(output);
+ if (!EnsureArgsCount(*input, 5, ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureWorldType(*input->Child(TGenReadTable::idx_World), ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureSpecificDataSource(*input->Child(TGenReadTable::idx_DataSource), GenericProviderName, ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureAtom(*input->Child(TGenReadTable::idx_Table), ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureAtom(*input->Child(TGenReadTable::idx_Timezone), ctx)) {
+ return TStatus::Error;
+ }
+
+ TMaybe<THashSet<TStringBuf>> columnsSet;
+ auto columns = input->Child(TGenReadTable::idx_Columns);
+ if (!columns->IsCallable(TCoVoid::CallableName())) {
+ if (!EnsureTuple(*columns, ctx)) {
+ return TStatus::Error;
+ }
+
+ columnsSet.ConstructInPlace();
+ for (auto& child : columns->Children()) {
+ if (!EnsureAtom(*child, ctx)) {
+ return TStatus::Error;
+ }
+
+ auto name = child->Content();
+ if (!columnsSet->insert(name).second) {
+ ctx.AddError(
+ TIssue(ctx.GetPosition(child->Pos()), TStringBuilder() << "Duplicated column name: " << name));
+ return TStatus::Error;
+ }
+ }
+ }
+
+ TString cluster{input->Child(TGenReadTable::idx_DataSource)->Child(1)->Content()};
+ TString table{input->Child(TGenReadTable::idx_Table)->Content()};
+ auto found = State_->Tables.FindPtr(std::make_pair(cluster, table));
+ if (!found) {
+ ctx.AddError(TIssue(ctx.GetPosition(input->Pos()),
+ TStringBuilder() << "No metadata for table: `" << cluster << "`.`" << table << "`"));
+ return TStatus::Error;
+ }
+
+ auto itemType = found->ItemType;
+ auto columnOrder = found->ColumnOrder;
+
+ YQL_CLOG(INFO, ProviderGeneric) << "Custom column order:" << StateColumnOrderToString(columnOrder);
+
+ if (columnsSet) {
+ TVector<const TItemExprType*> items = itemType->GetItems();
+ EraseIf(items, [&](const TItemExprType* item) { return !columnsSet->contains(item->GetName()); });
+ EraseIf(columnOrder, [&](const TString& col) { return !columnsSet->contains(col); });
+ itemType = ctx.MakeType<TStructExprType>(items);
+ }
+
+ input->SetTypeAnn(ctx.MakeType<TTupleExprType>(TTypeAnnotationNode::TListType{
+ input->Child(TGenReadTable::idx_World)->GetTypeAnn(), ctx.MakeType<TListExprType>(itemType)}));
+
+ return State_->Types->SetColumnOrder(*input, columnOrder, ctx);
+ }
+
+ TString StateColumnOrderToString(const TVector<TString>& columns) {
+ TStringBuilder sb;
+
+ for (std::size_t i = 0; i < columns.size(); i++) {
+ sb << i << ": " << columns[i];
+ if (i != columns.size() - 1) {
+ sb << ", ";
+ }
+ }
+
+ return sb;
+ }
+
+ private:
+ TGenericState::TPtr State_;
+ };
+
+ THolder<TVisitorTransformerBase> CreateGenericDataSourceTypeAnnotationTransformer(TGenericState::TPtr state) {
+ return MakeHolder<TGenericDataSourceTypeAnnotationTransformer>(state);
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
new file mode 100644
index 0000000000..2048693dfa
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
@@ -0,0 +1,160 @@
+#include "yql_generic_dq_integration.h"
+
+#include "yql_generic_mkql_compiler.h"
+
+#include <ydb/library/yql/ast/yql_expr.h>
+#include <ydb/library/yql/dq/expr_nodes/dq_expr_nodes.h>
+#include <ydb/library/yql/providers/common/dq/yql_dq_integration_impl.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/providers/generic/proto/range.pb.h>
+#include <ydb/library/yql/providers/generic/proto/source.pb.h>
+#include <ydb/library/yql/providers/dq/common/yql_dq_settings.h>
+#include <ydb/library/yql/providers/dq/expr_nodes/dqs_expr_nodes.h>
+#include <yql/providers/connector/libcpp/utils.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ namespace {
+
+ class TGenericDqIntegration: public TDqIntegrationBase {
+ public:
+ TGenericDqIntegration(TGenericState::TPtr state)
+ : State_(state)
+ {
+ }
+
+ bool CanRead(const TExprNode& read, TExprContext&, bool) override {
+ return TGenReadTable::Match(&read);
+ }
+
+ TMaybe<ui64> EstimateReadSize(ui64 /*dataSizePerJob*/, ui32 /*maxTasksPerStage*/, const TExprNode& read,
+ TExprContext&) override {
+ if (TGenReadTable::Match(&read)) {
+ return 0ul; // TODO: return real size
+ }
+ return Nothing();
+ }
+
+ TExprNode::TPtr WrapRead(const TDqSettings&, const TExprNode::TPtr& read, TExprContext& ctx) override {
+ if (const auto maybeGenReadTable = TMaybeNode<TGenReadTable>(read)) {
+ const auto clReadTable = maybeGenReadTable.Cast();
+ const auto token = TString("cluster:default_") += clReadTable.DataSource().Cluster().StringValue();
+ YQL_CLOG(INFO, ProviderGeneric) << "Wrap " << read->Content() << " with token: " << token;
+
+ const auto rowType = clReadTable.Ref()
+ .GetTypeAnn()
+ ->Cast<TTupleExprType>()
+ ->GetItems()
+ .back()
+ ->Cast<TListExprType>()
+ ->GetItemType();
+ auto columns = clReadTable.Columns().Ptr();
+ if (!columns->IsList()) {
+ const auto pos = columns->Pos();
+ const auto& items = rowType->Cast<TStructExprType>()->GetItems();
+ TExprNode::TListType cols;
+ cols.reserve(items.size());
+ std::transform(items.cbegin(), items.cend(), std::back_inserter(cols),
+ [&](const TItemExprType* item) { return ctx.NewAtom(pos, item->GetName()); });
+ columns = ctx.NewList(pos, std::move(cols));
+ }
+
+ // clang-format off
+ return Build<TDqSourceWrap>(ctx, read->Pos())
+ .Input<TGenSourceSettings>()
+ .Table(clReadTable.Table())
+ .Token<TCoSecureParam>()
+ .Name().Build(token)
+ .Build()
+ .Columns(std::move(columns))
+ .Build()
+ .RowType(ExpandType(clReadTable.Pos(), *rowType, ctx))
+ .DataSource(clReadTable.DataSource().Cast<TCoDataSource>())
+ .Done().Ptr();
+ // clang-format on
+ }
+ return read;
+ }
+
+ ui64 Partition(const TDqSettings&, size_t, const TExprNode&, TVector<TString>& partitions, TString*, TExprContext&,
+ bool) override {
+ partitions.clear();
+ Generic::TRange range;
+ partitions.emplace_back();
+ TStringOutput out(partitions.back());
+ range.Save(&out);
+ return 0ULL;
+ }
+
+ void FillSourceSettings(const TExprNode& node, ::google::protobuf::Any& protoSettings,
+ TString& sourceType) override {
+ const TDqSource source(&node);
+ if (const auto maySettings = source.Settings().Maybe<TGenSourceSettings>()) {
+ const auto settings = maySettings.Cast();
+ const auto& cluster = source.DataSource().Cast<TGenDataSource>().Cluster().StringValue();
+ const auto& table = settings.Table().StringValue();
+ const auto& token = settings.Token().Name().StringValue();
+ const auto& connect = State_->Configuration->Urls[cluster];
+ const auto endpoint = connect.Endpoint();
+
+ YQL_CLOG(INFO, ProviderGeneric)
+ << "Filling source settings"
+ << ": cluster: " << cluster << ", table: " << table << ", endpoint: " << endpoint;
+
+ Generic::TSource srcDesc;
+ srcDesc.set_token(token);
+
+ TStringBuf db, dbTable;
+ if (!TStringBuf(table).TrySplit('.', db, dbTable)) {
+ db = "default";
+ dbTable = table;
+ }
+
+ const auto& columns = settings.Columns();
+
+ // prepare select
+ auto select = srcDesc.mutable_select();
+ select->mutable_from()->set_table(TString(dbTable));
+
+ auto items = select->mutable_what()->mutable_items();
+
+ const auto& tableMeta = State_->GetTable(cluster, table);
+
+ for (size_t i = 0; i < columns.Size(); i++) {
+ // assign column name
+ auto column = items->Add()->mutable_column();
+ auto column_name = columns.Item(i).StringValue();
+ column->mutable_name()->assign(column_name);
+
+ // assign column type
+ auto type = Connector::GetColumnTypeByName(tableMeta.Schema, column_name);
+ column->mutable_type()->CopyFrom(type);
+ }
+
+ // store data source instance
+ srcDesc.mutable_data_source_instance()->CopyFrom(tableMeta.DataSourceInstance);
+
+ // preserve source description for read actor
+ protoSettings.PackFrom(srcDesc);
+
+ sourceType = "GenericSource";
+ }
+ }
+
+ void RegisterMkqlCompiler(NCommon::TMkqlCallableCompilerBase& compiler) override {
+ RegisterDqGenericMkqlCompilers(compiler, State_);
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+ };
+
+ }
+
+ THolder<IDqIntegration> CreateGenericDqIntegration(TGenericState::TPtr state) {
+ return MakeHolder<TGenericDqIntegration>(state);
+ }
+
+}
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.h b/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.h
new file mode 100644
index 0000000000..79119737d6
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "yql_generic_provider.h"
+
+#include <util/generic/ptr.h>
+#include <ydb/library/yql/dq/integration/yql_dq_integration.h>
+
+namespace NYql {
+
+ THolder<IDqIntegration> CreateGenericDqIntegration(TGenericState::TPtr state);
+
+}
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp
new file mode 100644
index 0000000000..cca47d8c2e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_io_discovery.cpp
@@ -0,0 +1,135 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/ast/yql_expr.h>
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/core/yql_expr_optimize.h>
+#include <ydb/library/yql/core/yql_graph_transformer.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+
+namespace NYql {
+
+ namespace {
+
+ using namespace NNodes;
+
+ class TGenericIODiscoveryTransformer: public TGraphTransformerBase {
+ using TDbId2Endpoint = THashMap<std::pair<TString, NYql::DatabaseType>, NYql::TDbResolverResponse::TEndpoint>;
+
+ public:
+ TGenericIODiscoveryTransformer(TGenericState::TPtr state)
+ : State_(std::move(state))
+ {
+ }
+
+ TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+
+ if (ctx.Step.IsDone(TExprStep::DiscoveryIO))
+ return TStatus::Ok;
+
+ if (!State_->DbResolver)
+ return TStatus::Ok;
+
+ THashMap<std::pair<TString, NYql::DatabaseType>, NYql::TDatabaseAuth> ids;
+ if (auto reads = FindNodes(input,
+ [&](const TExprNode::TPtr& node) {
+ const TExprBase nodeExpr(node);
+ if (!nodeExpr.Maybe<TGenRead>())
+ return false;
+
+ auto read = nodeExpr.Maybe<TGenRead>().Cast();
+ if (read.DataSource().Category().Value() != GenericProviderName) {
+ return false;
+ }
+ return true;
+ });
+ !reads.empty()) {
+ for (auto& node : reads) {
+ const TGenRead read(node);
+ const auto cluster = read.DataSource().Cluster().StringValue();
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Found cluster: " << cluster;
+ auto dbId = State_->Configuration->Endpoints[cluster].first;
+ dbId = dbId.substr(0, dbId.find(':'));
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Found dbId: " << dbId;
+ const auto idKey = std::make_pair(dbId, NYql::DatabaseType::Generic);
+ const auto iter = State_->DatabaseIds.find(idKey);
+ if (iter != State_->DatabaseIds.end()) {
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Resolve CH id: " << dbId;
+ ids[idKey] = iter->second;
+ }
+ }
+ }
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Ids to resolve: " << ids.size();
+
+ if (ids.empty()) {
+ return TStatus::Ok;
+ }
+
+ const std::weak_ptr<NYql::TDbResolverResponse> response = DbResolverResponse_;
+ AsyncFuture_ = State_->DbResolver->ResolveIds(ids).Apply([response](auto future) {
+ if (const auto res = response.lock())
+ *res = std::move(future.ExtractValue());
+ });
+ return TStatus::Async;
+ }
+
+ NThreading::TFuture<void> DoGetAsyncFuture(const TExprNode&) final {
+ return AsyncFuture_;
+ }
+
+ TStatus DoApplyAsyncChanges(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+ AsyncFuture_.GetValue();
+ if (!DbResolverResponse_->Success) {
+ ctx.IssueManager.AddIssues(DbResolverResponse_->Issues);
+ return TStatus::Error;
+ }
+ FullResolvedIds_.insert(DbResolverResponse_->DatabaseId2Endpoint.begin(),
+ DbResolverResponse_->DatabaseId2Endpoint.end());
+ DbResolverResponse_ = std::make_shared<NYql::TDbResolverResponse>();
+ YQL_CLOG(DEBUG, ProviderGeneric) << "ResolvedIds: " << FullResolvedIds_.size();
+ auto& endpoints = State_->Configuration->Endpoints;
+ const auto& id2Clusters = State_->Configuration->DbId2Clusters;
+ for (const auto& [dbIdWithType, info] : FullResolvedIds_) {
+ const auto& dbId = dbIdWithType.first;
+ const auto iter = id2Clusters.find(dbId);
+ if (iter == id2Clusters.end()) {
+ continue;
+ }
+ for (const auto& clusterName : iter->second) {
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Resolved endpoint: " << info.Endpoint << " for id: " << dbId;
+ auto& [endpoint, secure] = endpoints[clusterName];
+ if (const auto it = endpoint.find(':'); it != TString::npos) {
+ secure = info.Secure;
+ endpoint = info.Endpoint;
+ if (info.Endpoint.find(':') == TString::npos) {
+ const auto port = endpoint.substr(it);
+ endpoint += port;
+ }
+ }
+ }
+ }
+ return TStatus::Ok;
+ }
+
+ void Rewind() final {
+ AsyncFuture_ = {};
+ FullResolvedIds_.clear();
+ DbResolverResponse_.reset(new NYql::TDbResolverResponse);
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+
+ NThreading::TFuture<void> AsyncFuture_;
+ TDbId2Endpoint FullResolvedIds_;
+ std::shared_ptr<NYql::TDbResolverResponse> DbResolverResponse_;
+ };
+ }
+
+ THolder<IGraphTransformer> CreateGenericIODiscoveryTransformer(TGenericState::TPtr state) {
+ return THolder(new TGenericIODiscoveryTransformer(std::move(state)));
+ }
+
+}
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
new file mode 100644
index 0000000000..48128fa5cc
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
@@ -0,0 +1,278 @@
+#include "yql_generic_provider_impl.h"
+
+#include <library/cpp/json/json_reader.h>
+#include <ydb/core/fq/libs/result_formatter/result_formatter.h>
+#include <ydb/library/yql/ast/yql_expr.h>
+#include <ydb/library/yql/ast/yql_type_string.h>
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/core/type_ann/type_ann_expr.h>
+#include <ydb/library/yql/core/yql_expr_optimize.h>
+#include <ydb/library/yql/core/yql_graph_transformer.h>
+#include <ydb/library/yql/minikql/comp_nodes/mkql_factories.h>
+#include <ydb/library/yql/minikql/computation/mkql_computation_node.h>
+#include <ydb/library/yql/minikql/mkql_alloc.h>
+#include <ydb/library/yql/minikql/mkql_program_builder.h>
+#include <ydb/library/yql/minikql/mkql_type_ops.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+#include <yql/providers/connector/libcpp/client.h>
+#include <yql/providers/connector/libcpp/error.h>
+
+namespace NYql {
+ using namespace NNodes;
+ using namespace NKikimr;
+ using namespace NKikimr::NMiniKQL;
+
+ struct TGenericTableDescription {
+ Connector::API::DataSourceInstance DataSourceInstance;
+ Connector::DescribeTableResult::TPtr Result;
+
+ TGenericTableDescription(const Connector::API::DataSourceInstance& dsi,
+ Connector::DescribeTableResult::TPtr&& result)
+ : DataSourceInstance(dsi)
+ , Result(std::move(result))
+ {
+ }
+ };
+
+ class TGenericLoadTableMetadataTransformer: public TGraphTransformerBase {
+ using TMapType =
+ std::unordered_map<std::pair<TString, TString>, TGenericTableDescription, THash<std::pair<TString, TString>>>;
+
+ public:
+ TGenericLoadTableMetadataTransformer(TGenericState::TPtr state, Connector::IClient::TPtr client)
+ : State_(std::move(state))
+ , Client_(std::move(client))
+ {
+ }
+
+ TStatus DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ output = input;
+
+ if (ctx.Step.IsDone(TExprStep::LoadTablesMetadata)) {
+ return TStatus::Ok;
+ }
+
+ std::unordered_set<TMapType::key_type, TMapType::hasher> pendingTables;
+ if (const auto& reads = FindNodes(input,
+ [&](const TExprNode::TPtr& node) {
+ if (const auto maybeRead = TMaybeNode<TGenRead>(node)) {
+ return maybeRead.Cast().DataSource().Category().Value() ==
+ GenericProviderName;
+ }
+ return false;
+ });
+ !reads.empty()) {
+ for (const auto& r : reads) {
+ const TGenRead read(r);
+ if (!read.FreeArgs().Get(2).Ref().IsCallable("MrTableConcat")) {
+ ctx.AddError(
+ TIssue(ctx.GetPosition(read.FreeArgs().Get(0).Pos()), TStringBuilder() << "Expected Key"));
+ return TStatus::Error;
+ }
+
+ const auto maybeKey = TExprBase(read.FreeArgs().Get(2).Ref().HeadPtr()).Maybe<TCoKey>();
+ if (!maybeKey) {
+ ctx.AddError(
+ TIssue(ctx.GetPosition(read.FreeArgs().Get(0).Pos()), TStringBuilder() << "Expected Key"));
+ return TStatus::Error;
+ }
+
+ const auto& keyArg = maybeKey.Cast().Ref().Head();
+ if (!keyArg.IsList() || keyArg.ChildrenSize() != 2U || !keyArg.Head().IsAtom("table") ||
+ !keyArg.Tail().IsCallable(TCoString::CallableName())) {
+ ctx.AddError(
+ TIssue(ctx.GetPosition(keyArg.Pos()), TStringBuilder() << "Expected single table name"));
+ return TStatus::Error;
+ }
+
+ const auto cluster = read.DataSource().Cluster().StringValue();
+ const auto tableName = TString(keyArg.Tail().Head().Content());
+ if (pendingTables.insert(std::make_pair(cluster, tableName)).second) {
+ YQL_CLOG(INFO, ProviderGeneric)
+ << "Load table meta for: `" << cluster << "`.`" << tableName << "`";
+ }
+ }
+ }
+
+ std::vector<NThreading::TFuture<void>> handles;
+ handles.reserve(pendingTables.size());
+ Results_.reserve(pendingTables.size());
+
+ for (const auto& item : pendingTables) {
+ Connector::API::DescribeTableRequest request;
+
+ const auto& cluster = item.first;
+ const auto it = State_->Configuration->Urls.find(cluster);
+ YQL_ENSURE(State_->Configuration->Urls.cend() != it, "Cluster not found:" << cluster);
+
+ TString token;
+ if (const auto cred = State_->Types->Credentials->FindCredential("default_" + cluster)) {
+ token = cred->Content;
+ } else {
+ token = State_->Configuration->Tokens[cluster];
+ }
+
+ const auto one = token.find('#'), two = token.rfind('#');
+ YQL_ENSURE(one != TString::npos && two != TString::npos && one < two, "Bad token format:" << token);
+
+ auto dsi = request.mutable_data_source_instance();
+ dsi->set_endpoint(it->second.Endpoint());
+
+ auto auth = request.mutable_data_source_instance()->mutable_credentials()->mutable_basic();
+ auth->set_username(token.substr(one + 1U, two - one - 1U));
+ auth->set_password(token.substr(two + 1U));
+
+ const auto& table = item.second;
+ TStringBuf db, dbTable;
+ if (!TStringBuf(table).TrySplit('.', db, dbTable)) {
+ db = "default";
+ dbTable = table;
+ }
+
+ dsi->set_database(TString(db));
+ request.set_table(TString(dbTable));
+
+ auto response = Client_->DescribeTable(request);
+
+ Results_.emplace(
+ item, TGenericTableDescription(request.data_source_instance(), Client_->DescribeTable(request)));
+
+ // FIXME: for the sake of simplicity, asynchronous workflow is broken now. Fix it some day.
+ auto promise = NThreading::NewPromise();
+ handles.emplace_back(promise.GetFuture());
+ promise.SetValue();
+ }
+
+ if (handles.empty()) {
+ return TStatus::Ok;
+ }
+
+ AsyncFuture_ = NThreading::WaitExceptionOrAll(handles);
+ return TStatus::Async;
+ }
+
+ NThreading::TFuture<void> DoGetAsyncFuture(const TExprNode&) final {
+ return AsyncFuture_;
+ }
+
+ TStatus DoApplyAsyncChanges(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) final {
+ AsyncFuture_.GetValue();
+
+ const auto& reads = FindNodes(input, [&](const TExprNode::TPtr& node) {
+ if (const auto maybeRead = TMaybeNode<TGenRead>(node)) {
+ return maybeRead.Cast().DataSource().Category().Value() == GenericProviderName;
+ }
+ return false;
+ });
+
+ TNodeOnNodeOwnedMap replaces(reads.size());
+ bool hasErrors = false;
+
+ for (const auto& r : reads) {
+ const TGenRead read(r);
+ const auto cluster = read.DataSource().Cluster().StringValue();
+ const auto& keyArg = TExprBase(read.FreeArgs().Get(2).Ref().HeadPtr()).Cast<TCoKey>().Ref().Head();
+ const auto table = TString(keyArg.Tail().Head().Content());
+
+ const auto it = Results_.find(std::make_pair(cluster, table));
+ if (Results_.cend() != it) {
+ const auto& result = it->second.Result;
+ const auto& error = result->Error;
+ if (Connector::ErrorIsSuccess(error)) {
+ TGenericState::TTableMeta meta;
+ meta.Schema = result->Schema;
+ meta.DataSourceInstance = it->second.DataSourceInstance;
+
+ const auto& parse = ParseTableMeta(meta.Schema, cluster, table, ctx, meta.ColumnOrder);
+
+ if (parse.first) {
+ meta.ItemType = parse.first;
+ State_->Timezones[read.DataSource().Cluster().Value()] = ctx.AppendString(parse.second);
+ if (const auto ins = replaces.emplace(read.Raw(), TExprNode::TPtr()); ins.second) {
+ // clang-format off
+ ins.first->second = Build<TGenReadTable>(ctx, read.Pos())
+ .World(read.World())
+ .DataSource(read.DataSource())
+ .Table().Value(table).Build()
+ .Columns<TCoVoid>().Build()
+ .Timezone().Value(parse.second).Build()
+ .Done().Ptr();
+ // clang-format on
+ }
+ State_->Tables.emplace(it->first, meta);
+ } else {
+ hasErrors = true;
+ break;
+ }
+ } else {
+ Connector::ErrorToExprCtx(error, ctx, ctx.GetPosition(read.Pos()),
+ TStringBuilder()
+ << "loading metadata for table: " << cluster << '.' << table);
+ hasErrors = true;
+ break;
+ }
+ } else {
+ ctx.AddError(TIssue(ctx.GetPosition(read.Pos()),
+ TStringBuilder() << "Not found result for " << cluster << '.' << table));
+ hasErrors = true;
+ break;
+ }
+ }
+
+ if (hasErrors) {
+ return TStatus::Error;
+ }
+
+ return RemapExpr(input, output, replaces, ctx, TOptimizeExprSettings(nullptr));
+ }
+
+ void Rewind() final {
+ Results_.clear();
+ AsyncFuture_ = {};
+ }
+
+ private:
+ std::pair<const TStructExprType*, TString> ParseTableMeta(const Connector::API::Schema& schema,
+ const std::string_view& cluster,
+ const std::string_view& table, TExprContext& ctx,
+ TVector<TString>& columnOrder) try {
+ TVector<const TItemExprType*> items;
+
+ auto columns = schema.columns();
+ if (columns.empty()) {
+ ctx.AddError(TIssue({}, TStringBuilder() << "Table " << cluster << '.' << table << " doesn't exist."));
+ return {nullptr, {}};
+ }
+
+ for (auto i = 0; i < columns.size(); i++) {
+ // Make type annotation
+ NYdb::TTypeParser parser(columns.Get(i).type());
+ auto typeAnnotation = NFq::MakeType(parser, ctx);
+
+ // Create items from graph
+ items.emplace_back(ctx.MakeType<TItemExprType>(columns.Get(i).name(), typeAnnotation));
+ columnOrder.emplace_back(columns.Get(i).name());
+ }
+ // FIXME: handle on Generic's side?
+ return std::make_pair(ctx.MakeType<TStructExprType>(items), TString("Europe/Moscow"));
+ } catch (std::exception&) {
+ ctx.AddError(TIssue({}, TStringBuilder() << "Failed to parse table metadata: " << CurrentExceptionMessage()));
+ return {nullptr, {}};
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+ const Connector::IClient::TPtr Client_;
+
+ TMapType Results_;
+ NThreading::TFuture<void> AsyncFuture_;
+ };
+
+ THolder<IGraphTransformer> CreateGenericLoadTableMetadataTransformer(TGenericState::TPtr state,
+ Connector::IClient::TPtr client) {
+ return MakeHolder<TGenericLoadTableMetadataTransformer>(std::move(state), std::move(client));
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp
new file mode 100644
index 0000000000..406942a0d1
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_logical_opt.cpp
@@ -0,0 +1,106 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/core/yql_opt_utils.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/common/transform/yql_optimize.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/providers/dq/expr_nodes/dqs_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ namespace {
+
+ class TGenericLogicalOptProposalTransformer: public TOptimizeTransformerBase {
+ public:
+ TGenericLogicalOptProposalTransformer(TGenericState::TPtr state)
+ : TOptimizeTransformerBase(state->Types, NLog::EComponent::ProviderGeneric, {})
+ , State_(state)
+ {
+#define HNDL(name) "LogicalOptimizer-" #name, Hndl(&TGenericLogicalOptProposalTransformer::name)
+ AddHandler(0, &TCoLeft::Match, HNDL(TrimReadWorld));
+ AddHandler(0, &TCoExtractMembers::Match, HNDL(ExtractMembers));
+ AddHandler(0, &TCoExtractMembers::Match, HNDL(ExtractMembersOverDqWrap));
+ AddHandler(0, &TCoExtractMembers::Match, HNDL(ExtractMembersOverDqSourceWrap));
+#undef HNDL
+ }
+
+ TMaybeNode<TExprBase> TrimReadWorld(TExprBase node, TExprContext& ctx) const {
+ if (const auto maybeRead = node.Cast<TCoLeft>().Input().Maybe<TGenReadTable>())
+ return TExprBase(ctx.NewWorld(node.Pos()));
+ return node;
+ }
+
+ TMaybeNode<TExprBase> ExtractMembers(TExprBase node, TExprContext& ctx) const {
+ const auto extract = node.Cast<TCoExtractMembers>();
+ const auto input = extract.Input();
+ const auto read = input.Maybe<TCoRight>().Input().Maybe<TGenReadTable>();
+ if (!read) {
+ return node;
+ }
+
+ // clang-format off
+ return Build<TCoRight>(ctx, extract.Pos())
+ .Input<TGenReadTable>()
+ .InitFrom(read.Cast())
+ .Columns(extract.Members())
+ .Build()
+ .Done();
+ // clang-format on
+ }
+
+ TMaybeNode<TExprBase> ExtractMembersOverDqWrap(TExprBase node, TExprContext& ctx) const {
+ auto extract = node.Cast<TCoExtractMembers>();
+ auto input = extract.Input();
+ auto read = input.Maybe<TDqReadWrap>().Input().Maybe<TGenReadTable>();
+ if (!read) {
+ return node;
+ }
+
+ // clang-format off
+ return Build<TDqReadWrap>(ctx, node.Pos())
+ .InitFrom(input.Cast<TDqReadWrap>())
+ .Input<TGenReadTable>()
+ .InitFrom(read.Cast())
+ .Columns(extract.Members())
+ .Build()
+ .Done();
+ // clang-format on
+ }
+
+ TMaybeNode<TExprBase> ExtractMembersOverDqSourceWrap(TExprBase node, TExprContext& ctx) const {
+ const auto extract = node.Cast<TCoExtractMembers>();
+ const auto input = extract.Input();
+ const auto read = input.Maybe<TDqSourceWrap>().Input().Maybe<TGenSourceSettings>();
+ if (!read) {
+ return node;
+ }
+
+ // clang-format off
+ return Build<TDqSourceWrap>(ctx, node.Pos())
+ .Input<TGenSourceSettings>()
+ .InitFrom(read.Cast())
+ .Columns(extract.Members())
+ .Build()
+ .DataSource(input.Cast<TDqSourceWrap>().DataSource())
+ .RowType(ExpandType(node.Pos(), GetSeqItemType(*extract.Ref().GetTypeAnn()), ctx))
+ .Done();
+ // clang-format on
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+ };
+
+ }
+
+ THolder<IGraphTransformer> CreateGenericLogicalOptProposalTransformer(TGenericState::TPtr state) {
+ return MakeHolder<TGenericLogicalOptProposalTransformer>(state);
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp
new file mode 100644
index 0000000000..313e9a4a59
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.cpp
@@ -0,0 +1,30 @@
+#include "yql_generic_mkql_compiler.h"
+
+#include <algorithm>
+#include <library/cpp/json/json_writer.h>
+#include <ydb/library/yql/core/yql_opt_utils.h>
+#include <ydb/library/yql/minikql/mkql_node.h>
+#include <ydb/library/yql/minikql/mkql_node_cast.h>
+#include <ydb/library/yql/providers/common/mkql/parser.h>
+#include <ydb/library/yql/providers/common/mkql/yql_type_mkql.h>
+#include <ydb/library/yql/providers/dq/expr_nodes/dqs_expr_nodes.h>
+
+namespace NYql {
+ using namespace NKikimr::NMiniKQL;
+ using namespace NNodes;
+
+ void RegisterDqGenericMkqlCompilers(NCommon::TMkqlCallableCompilerBase& compiler, const TGenericState::TPtr&) {
+ compiler.ChainCallable(TDqSourceWideBlockWrap::CallableName(),
+ [](const TExprNode& node, NCommon::TMkqlBuildContext& ctx) {
+ if (const auto wrapper = TDqSourceWideBlockWrap(&node);
+ wrapper.DataSource().Category().Value() == GenericProviderName) {
+ const auto wrapped = TryWrapWithParserForArrowIPCStreaming(wrapper, ctx);
+ if (wrapped) {
+ return *wrapped;
+ }
+ }
+
+ return TRuntimeNode();
+ });
+ }
+}
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.h b/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.h
new file mode 100644
index 0000000000..681dccc105
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_mkql_compiler.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "yql_generic_provider.h"
+
+#include <ydb/library/yql/providers/common/mkql/yql_provider_mkql.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+
+namespace NYql {
+
+ void RegisterDqGenericMkqlCompilers(NCommon::TMkqlCallableCompilerBase& compiler, const TGenericState::TPtr& state);
+
+}
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
new file mode 100644
index 0000000000..a845ad9d2e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
@@ -0,0 +1,81 @@
+#include "yql_generic_provider_impl.h"
+
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+#include <ydb/library/yql/core/yql_opt_utils.h>
+#include <ydb/library/yql/providers/common/provider/yql_data_provider_impl.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+#include <ydb/library/yql/providers/common/transform/yql_optimize.h>
+#include <ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.h>
+#include <ydb/library/yql/providers/dq/expr_nodes/dqs_expr_nodes.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ using namespace NNodes;
+
+ namespace {
+
+ class TGenericPhysicalOptProposalTransformer: public TOptimizeTransformerBase {
+ public:
+ TGenericPhysicalOptProposalTransformer(TGenericState::TPtr state)
+ : TOptimizeTransformerBase(state->Types, NLog::EComponent::ProviderYdb, {})
+ , State_(state)
+ {
+#define HNDL(name) "PhysicalOptimizer-" #name, Hndl(&TGenericPhysicalOptProposalTransformer::name)
+ AddHandler(0, &TCoNarrowMap::Match, HNDL(ReadZeroColumns));
+#undef HNDL
+ }
+
+ TMaybeNode<TExprBase> ReadZeroColumns(TExprBase node, TExprContext& ctx) const {
+ const auto& narrow = node.Maybe<TCoNarrowMap>();
+ if (const auto& wide = narrow.Cast().Input().Maybe<TDqReadWideWrap>()) {
+ if (const auto& maybe = wide.Cast().Input().Maybe<TGenReadTable>()) {
+ if (!wide.Cast()
+ .Ref()
+ .GetTypeAnn()
+ ->Cast<TFlowExprType>()
+ ->GetItemType()
+ ->Cast<TMultiExprType>()
+ ->GetSize()) {
+ const auto& read = maybe.Cast();
+ const auto structType =
+ State_->Tables[std::make_pair(read.DataSource().Cluster().Value(), read.Table().Value())]
+ .ItemType;
+ YQL_ENSURE(structType->GetSize());
+ auto columns =
+ ctx.NewList(read.Pos(), {ctx.NewAtom(read.Pos(), GetLightColumn(*structType)->GetName())});
+
+ // clang-format off
+ return Build<TCoNarrowMap>(ctx, narrow.Cast().Pos())
+ .Input<TDqReadWideWrap>()
+ .InitFrom(wide.Cast())
+ .Input<TGenReadTable>()
+ .InitFrom(read)
+ .Columns(std::move(columns))
+ .Build()
+ .Build()
+ .Lambda()
+ .Args({"stub"})
+ .Body<TCoAsStruct>().Build()
+ .Build()
+ .Done();
+ // clang-format on
+ }
+ }
+ }
+
+ return node;
+ }
+
+ private:
+ const TGenericState::TPtr State_;
+ };
+
+ }
+
+ THolder<IGraphTransformer> CreateGenericPhysicalOptProposalTransformer(TGenericState::TPtr state) {
+ return MakeHolder<TGenericPhysicalOptProposalTransformer>(state);
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp
new file mode 100644
index 0000000000..4a061c552e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_provider.cpp
@@ -0,0 +1,43 @@
+#include "yql_generic_provider.h"
+
+#include <ydb/library/yql/providers/common/proto/gateways_config.pb.h>
+#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
+
+namespace NYql {
+
+ TDataProviderInitializer GetGenericDataProviderInitializer(Connector::IClient::TPtr genericClient,
+ const std::shared_ptr<NYql::IDatabaseAsyncResolver> dbResolver)
+ {
+ return [genericClient, dbResolver](const TString& userName, const TString& sessionId, const TGatewaysConfig* gatewaysConfig,
+ const NKikimr::NMiniKQL::IFunctionRegistry* functionRegistry,
+ TIntrusivePtr<IRandomProvider> randomProvider, TIntrusivePtr<TTypeAnnotationContext> typeCtx,
+ const TOperationProgressWriter& progressWriter, const TYqlOperationOptions& operationOptions,
+ THiddenQueryAborter)
+ {
+ Y_UNUSED(sessionId);
+ Y_UNUSED(userName);
+ Y_UNUSED(functionRegistry);
+ Y_UNUSED(randomProvider);
+ Y_UNUSED(progressWriter);
+ Y_UNUSED(operationOptions);
+
+ auto state = MakeIntrusive<TGenericState>();
+
+ state->Types = typeCtx.Get();
+ state->FunctionRegistry = functionRegistry;
+ state->DbResolver = dbResolver;
+ if (gatewaysConfig) {
+ state->Configuration->Init(gatewaysConfig->GetGeneric(), state->DbResolver, state->DatabaseIds);
+ }
+
+ TDataProviderInfo info;
+
+ info.Names.insert({TString{GenericProviderName}});
+ info.Source = CreateGenericDataSource(state, genericClient);
+ info.Sink = CreateGenericDataSink(state);
+
+ return info;
+ };
+ }
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_provider.h b/ydb/library/yql/providers/generic/provider/yql_generic_provider.h
new file mode 100644
index 0000000000..2189bef098
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_provider.h
@@ -0,0 +1,81 @@
+#pragma once
+
+#include "yql_generic_settings.h"
+
+#include <sstream>
+#include <ydb/library/yql/core/yql_data_provider.h>
+#include <ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h>
+#include <ydb/library/yql/providers/common/http_gateway/yql_http_gateway.h>
+#include <yql/providers/connector/libcpp/client.h>
+
+namespace NKikimr::NMiniKQL {
+ class IFunctionRegistry;
+}
+
+namespace NYql {
+
+ struct TGenericState: public TThrRefBase {
+ using TPtr = TIntrusivePtr<TGenericState>;
+
+ struct TTableMeta {
+ const TStructExprType* ItemType = nullptr;
+ TVector<TString> ColumnOrder;
+ NYql::Connector::API::Schema Schema;
+ NYql::Connector::API::DataSourceInstance DataSourceInstance;
+
+ TString ToString() const {
+ TStringBuilder sb;
+ sb << "Schema: " << Schema.ShortDebugString();
+ sb << "; ColumnOrder: ";
+ for (size_t i = 0; i < ColumnOrder.size(); i++) {
+ sb << i << " " << ColumnOrder[i];
+ }
+ if (ItemType) {
+ sb << "; ItemType: " << ItemType->ToString();
+ } else {
+ sb << "; ItemType: nullptr";
+ }
+
+ return sb;
+ }
+ };
+
+ TTableMeta& GetTable(const TString& cluster, const TString& table) {
+ auto search = Tables.find(std::make_pair(cluster, table));
+ if (search != Tables.end()) {
+ return search->second;
+ }
+
+ ythrow yexception() << "unknown (" << cluster << ", " << table << ") pair";
+ };
+
+ THashMap<std::pair<TString, TString>, TTableMeta> Tables;
+ std::unordered_map<std::string_view, std::string_view> Timezones;
+
+ TTypeAnnotationContext* Types = nullptr;
+ TGenericConfiguration::TPtr Configuration = MakeIntrusive<TGenericConfiguration>();
+ const NKikimr::NMiniKQL::IFunctionRegistry* FunctionRegistry = nullptr;
+ THashMap<std::pair<TString, NYql::DatabaseType>, NYql::TDatabaseAuth> DatabaseIds;
+ std::shared_ptr<NYql::IDatabaseAsyncResolver> DbResolver;
+
+ TString DumpToString() const {
+ TStringBuilder sb;
+ if (Tables) {
+ for (const auto& kv : Tables) {
+ sb << "Table '" << kv.first << "':";
+ sb << kv.second.ToString() << "\n";
+ }
+ }
+ return sb;
+ }
+ };
+
+ TDataProviderInitializer
+ GetGenericDataProviderInitializer(Connector::IClient::TPtr genericClient,
+ std::shared_ptr<NYql::IDatabaseAsyncResolver> dbResolver = nullptr);
+
+ TIntrusivePtr<IDataProvider> CreateGenericDataSource(TGenericState::TPtr state,
+ Connector::IClient::TPtr genericClient);
+ TIntrusivePtr<IDataProvider> CreateGenericDataSink(TGenericState::TPtr state);
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_provider_impl.h b/ydb/library/yql/providers/generic/provider/yql_generic_provider_impl.h
new file mode 100644
index 0000000000..386616afd8
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_provider_impl.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "yql_generic_provider.h"
+
+#include <util/generic/ptr.h>
+#include <ydb/library/yql/core/yql_graph_transformer.h>
+#include <ydb/library/yql/providers/common/transform/yql_exec.h>
+#include <ydb/library/yql/providers/common/transform/yql_visit.h>
+
+namespace NYql {
+
+ THolder<IGraphTransformer> CreateGenericIODiscoveryTransformer(TGenericState::TPtr state);
+ THolder<IGraphTransformer> CreateGenericLoadTableMetadataTransformer(TGenericState::TPtr state, Connector::IClient::TPtr client);
+
+ THolder<TVisitorTransformerBase> CreateGenericDataSourceTypeAnnotationTransformer(TGenericState::TPtr state);
+ THolder<TVisitorTransformerBase> CreateGenericDataSinkTypeAnnotationTransformer(TGenericState::TPtr state);
+
+ THolder<TExecTransformerBase> CreateGenericDataSinkExecTransformer(TGenericState::TPtr state);
+
+ THolder<IGraphTransformer> CreateGenericLogicalOptProposalTransformer(TGenericState::TPtr state);
+ THolder<IGraphTransformer> CreateGenericPhysicalOptProposalTransformer(TGenericState::TPtr state);
+
+} // namespace NYql
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp
new file mode 100644
index 0000000000..5c1086b81e
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_settings.cpp
@@ -0,0 +1,19 @@
+#include "yql_generic_settings.h"
+
+namespace NYql {
+
+ using namespace NCommon;
+
+ TGenericConfiguration::TGenericConfiguration()
+ {
+ }
+
+ TGenericSettings::TConstPtr TGenericConfiguration::Snapshot() const {
+ return std::make_shared<const TGenericSettings>(*this);
+ }
+
+ bool TGenericConfiguration::HasCluster(TStringBuf cluster) const {
+ return ValidClusters.contains(cluster);
+ }
+
+}
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_settings.h b/ydb/library/yql/providers/generic/provider/yql_generic_settings.h
new file mode 100644
index 0000000000..989e8b7e64
--- /dev/null
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_settings.h
@@ -0,0 +1,117 @@
+#pragma once
+
+#include <ydb/library/yql/providers/common/config/yql_dispatch.h>
+#include <ydb/library/yql/providers/common/config/yql_setting.h>
+#include <ydb/library/yql/providers/common/db_id_async_resolver/db_async_resolver.h>
+#include <ydb/library/yql/providers/common/proto/gateways_config.pb.h>
+#include <ydb/library/yql/utils/log/log.h>
+
+namespace NYql {
+
+ struct TGenericSettings {
+ using TConstPtr = std::shared_ptr<const TGenericSettings>;
+ };
+
+ struct TGenericURL {
+ TString Host;
+ ui16 Port;
+ EHostScheme Scheme;
+
+ TString Endpoint() const {
+ return Host + ':' + ToString(Port);
+ };
+ };
+
+ struct TGenericConfiguration: public TGenericSettings, public NCommon::TSettingDispatcher {
+ using TPtr = TIntrusivePtr<TGenericConfiguration>;
+
+ TGenericConfiguration();
+ TGenericConfiguration(const TGenericConfiguration&) = delete;
+
+ template <typename TProtoConfig>
+ void Init(const TProtoConfig& config, const std::shared_ptr<NYql::IDatabaseAsyncResolver> dbResolver,
+ THashMap<std::pair<TString, NYql::DatabaseType>, NYql::TDatabaseAuth>& databaseIds)
+ {
+ // TODO: support data sources other than ClickHouse here
+ TVector<TString> clusters(Reserve(config.GetClickHouse().ClusterMappingSize()));
+ for (auto& cluster : config.GetClickHouse().GetClusterMapping()) {
+ clusters.push_back(cluster.GetName());
+ }
+
+ this->SetValidClusters(clusters);
+
+ // TODO: support data sources other than ClickHouse here
+ this->Dispatch(config.GetClickHouse().GetDefaultSettings());
+ for (auto& cluster : config.GetClickHouse().GetClusterMapping()) {
+ this->Dispatch(cluster.GetName(), cluster.GetSettings());
+
+ if (dbResolver) {
+ YQL_CLOG(DEBUG, ProviderGeneric)
+ << "Settings: clusterName = " << cluster.GetName() << ", clusterDbId = " << cluster.GetId()
+ << ", cluster.GetCluster(): " << cluster.GetCluster()
+ << ", HasCluster: " << (cluster.HasCluster() ? "TRUE" : "FALSE");
+ databaseIds[std::make_pair(cluster.GetId(), NYql::DatabaseType::Generic)] =
+ NYql::TDatabaseAuth{cluster.GetCHToken(), /*AddBearer=*/false};
+ if (cluster.GetId()) {
+ DbId2Clusters[cluster.GetId()].emplace_back(cluster.GetName());
+ YQL_CLOG(DEBUG, ProviderGeneric) << "Add dbId: " << cluster.GetId() << " to DbId2Clusters";
+ }
+ }
+
+ Tokens[cluster.GetName()] = cluster.GetCHToken();
+ // TODO: Drop later
+ TString endpoint;
+ if (cluster.HasCluster()) {
+ endpoint = cluster.GetCluster();
+ if (endpoint.StartsWith("https://")) {
+ endpoint = endpoint.substr(8);
+ }
+ endpoint = endpoint.substr(0, endpoint.find(':'));
+ } else {
+ endpoint = cluster.GetId();
+ }
+ Endpoints[cluster.GetName()] =
+ std::make_pair(endpoint + ":" + ToString(cluster.GetNativeHostPort()), cluster.GetNativeSecure());
+
+ auto& url = Urls[cluster.GetName()];
+ auto& host = url.Host;
+ auto& scheme = url.Scheme;
+ auto& port = url.Port;
+ host = cluster.GetCluster();
+ while (host.EndsWith("/"))
+ host = host.substr(0u, host.length() - 1u);
+ if (host.StartsWith("http://")) {
+ scheme = HS_HTTP;
+ host = host.substr(7u);
+ port = 80;
+ } else {
+ scheme = HS_HTTPS;
+ port = 443;
+ if (host.StartsWith("https://")) {
+ host = host.substr(8u);
+ }
+ }
+
+ if (const auto p = host.rfind(':'); TString::npos != p) {
+ port = ::FromString<ui16>(host.substr(p + 1u));
+ host = host.substr(0u, p);
+ }
+
+ if (cluster.HasHostScheme())
+ scheme = cluster.GetHostScheme();
+ if (cluster.HasHostPort())
+ port = cluster.GetHostPort();
+ }
+ this->FreezeDefaults();
+ }
+
+ bool HasCluster(TStringBuf cluster) const;
+
+ TGenericSettings::TConstPtr Snapshot() const;
+ THashMap<TString, TString> Tokens;
+ THashMap<TString, TGenericURL> Urls;
+ THashMap<TString, std::pair<TString, bool>> Endpoints;
+ THashMap<TString, TVector<TString>> DbId2Clusters; // DatabaseId -> ClusterNames
+ };
+
+}
diff --git a/ydb/library/yql/utils/log/log.cpp b/ydb/library/yql/utils/log/log.cpp
index c3739d052e..58c16bc9b0 100644
--- a/ydb/library/yql/utils/log/log.cpp
+++ b/ydb/library/yql/utils/log/log.cpp
@@ -101,6 +101,7 @@ NYql::NLog::EComponent ConvertComponent(NYql::NProto::TLoggingConfig::EComponent
case TLoggingConfig::PROVIDER_S3: return EComponent::ProviderS3;
case TLoggingConfig::CORE_DQ: return EComponent::CoreDq;
case TLoggingConfig::HTTP_GATEWAY: return EComponent::HttpGateway;
+ case TLoggingConfig::PROVIDER_GENERIC: return EComponent::ProviderGeneric;
}
ythrow yexception() << "unknown log component: "
diff --git a/ydb/library/yql/utils/log/log_component.h b/ydb/library/yql/utils/log/log_component.h
index 4d82109216..1a31fc5b0f 100644
--- a/ydb/library/yql/utils/log/log_component.h
+++ b/ydb/library/yql/utils/log/log_component.h
@@ -7,7 +7,7 @@
namespace NYql {
namespace NLog {
-// keep this enum in sync with simmilar enum from yqlworker config.proto
+// keep this enum in sync with simmilar enum from ydb/library/yql/utils/log/proto/logger_config.proto
enum class EComponent {
Default = 0,
Core,
@@ -33,6 +33,7 @@ enum class EComponent {
ProviderS3,
CoreDq,
HttpGateway,
+ ProviderGeneric,
// <--- put other log components here
MaxValue
};
@@ -75,6 +76,7 @@ struct EComponentHelpers {
case EComponent::ProviderS3: return TStringBuf("S3");
case EComponent::CoreDq: return TStringBuf("core dq");
case EComponent::HttpGateway: return TStringBuf("http gw");
+ case EComponent::ProviderGeneric: return TStringBuf("generic");
default:
ythrow yexception() << "invalid log component value: "
<< ToInt(component);
@@ -106,6 +108,7 @@ struct EComponentHelpers {
if (str == TStringBuf("S3")) return EComponent::ProviderS3;
if (str == TStringBuf("core dq")) return EComponent::CoreDq;
if (str == TStringBuf("http gw")) return EComponent::HttpGateway;
+ if (str == TStringBuf("generic")) return EComponent::ProviderGeneric;
ythrow yexception() << "unknown log component: '" << str << '\'';
}
diff --git a/ydb/library/yql/utils/log/proto/logger_config.proto b/ydb/library/yql/utils/log/proto/logger_config.proto
index 35448dee78..952c65b6f1 100644
--- a/ydb/library/yql/utils/log/proto/logger_config.proto
+++ b/ydb/library/yql/utils/log/proto/logger_config.proto
@@ -45,6 +45,7 @@ message TLoggingConfig {
PROVIDER_S3 = 21;
CORE_DQ = 22;
HTTP_GATEWAY = 23;
+ PROVIDER_GENERIC = 24;
}
message TComponentLevel {
diff --git a/yql/CMakeLists.txt b/yql/CMakeLists.txt
new file mode 100644
index 0000000000..de4f7adb51
--- /dev/null
+++ b/yql/CMakeLists.txt
@@ -0,0 +1,9 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(providers)
diff --git a/yql/providers/CMakeLists.txt b/yql/providers/CMakeLists.txt
new file mode 100644
index 0000000000..d986ede663
--- /dev/null
+++ b/yql/providers/CMakeLists.txt
@@ -0,0 +1,9 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(connector)
diff --git a/yql/providers/connector/CMakeLists.txt b/yql/providers/connector/CMakeLists.txt
new file mode 100644
index 0000000000..68b7e2a023
--- /dev/null
+++ b/yql/providers/connector/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(api)
+add_subdirectory(libcpp)
diff --git a/yql/providers/connector/api/CMakeLists.darwin-x86_64.txt b/yql/providers/connector/api/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..3431919d16
--- /dev/null
+++ b/yql/providers/connector/api/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,59 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(protos)
+get_built_tool_path(
+ TOOL_grpc_cpp_bin
+ TOOL_grpc_cpp_dependency
+ contrib/tools/protoc/plugins/grpc_cpp
+ grpc_cpp
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api)
+set_property(TARGET api PROPERTY
+ PROTOC_EXTRA_OUTS .grpc.pb.cc .grpc.pb.h
+)
+target_link_libraries(api PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ contrib-libs-grpc
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/connector.proto
+)
+target_proto_addincls(api
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
+target_proto_plugin(api
+ grpc_cpp
+ grpc_cpp
+)
diff --git a/yql/providers/connector/api/CMakeLists.linux-aarch64.txt b/yql/providers/connector/api/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..52f1b95f33
--- /dev/null
+++ b/yql/providers/connector/api/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,60 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(protos)
+get_built_tool_path(
+ TOOL_grpc_cpp_bin
+ TOOL_grpc_cpp_dependency
+ contrib/tools/protoc/plugins/grpc_cpp
+ grpc_cpp
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api)
+set_property(TARGET api PROPERTY
+ PROTOC_EXTRA_OUTS .grpc.pb.cc .grpc.pb.h
+)
+target_link_libraries(api PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ contrib-libs-grpc
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/connector.proto
+)
+target_proto_addincls(api
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
+target_proto_plugin(api
+ grpc_cpp
+ grpc_cpp
+)
diff --git a/yql/providers/connector/api/CMakeLists.linux-x86_64.txt b/yql/providers/connector/api/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..52f1b95f33
--- /dev/null
+++ b/yql/providers/connector/api/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,60 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(protos)
+get_built_tool_path(
+ TOOL_grpc_cpp_bin
+ TOOL_grpc_cpp_dependency
+ contrib/tools/protoc/plugins/grpc_cpp
+ grpc_cpp
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api)
+set_property(TARGET api PROPERTY
+ PROTOC_EXTRA_OUTS .grpc.pb.cc .grpc.pb.h
+)
+target_link_libraries(api PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ contrib-libs-grpc
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/connector.proto
+)
+target_proto_addincls(api
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
+target_proto_plugin(api
+ grpc_cpp
+ grpc_cpp
+)
diff --git a/yql/providers/connector/api/CMakeLists.txt b/yql/providers/connector/api/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/yql/providers/connector/api/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/yql/providers/connector/api/CMakeLists.windows-x86_64.txt b/yql/providers/connector/api/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..3431919d16
--- /dev/null
+++ b/yql/providers/connector/api/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,59 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+add_subdirectory(protos)
+get_built_tool_path(
+ TOOL_grpc_cpp_bin
+ TOOL_grpc_cpp_dependency
+ contrib/tools/protoc/plugins/grpc_cpp
+ grpc_cpp
+)
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api)
+set_property(TARGET api PROPERTY
+ PROTOC_EXTRA_OUTS .grpc.pb.cc .grpc.pb.h
+)
+target_link_libraries(api PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ contrib-libs-grpc
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/connector.proto
+)
+target_proto_addincls(api
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
+target_proto_plugin(api
+ grpc_cpp
+ grpc_cpp
+)
diff --git a/yql/providers/connector/api/protos/CMakeLists.darwin-x86_64.txt b/yql/providers/connector/api/protos/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..d3a014a91b
--- /dev/null
+++ b/yql/providers/connector/api/protos/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,44 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api-protos)
+target_link_libraries(api-protos PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api-protos PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/protos/connector.proto
+)
+target_proto_addincls(api-protos
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api-protos
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/yql/providers/connector/api/protos/CMakeLists.linux-aarch64.txt b/yql/providers/connector/api/protos/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..41362d21ee
--- /dev/null
+++ b/yql/providers/connector/api/protos/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,45 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api-protos)
+target_link_libraries(api-protos PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api-protos PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/protos/connector.proto
+)
+target_proto_addincls(api-protos
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api-protos
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/yql/providers/connector/api/protos/CMakeLists.linux-x86_64.txt b/yql/providers/connector/api/protos/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..41362d21ee
--- /dev/null
+++ b/yql/providers/connector/api/protos/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,45 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api-protos)
+target_link_libraries(api-protos PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api-protos PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/protos/connector.proto
+)
+target_proto_addincls(api-protos
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api-protos
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/yql/providers/connector/api/protos/CMakeLists.txt b/yql/providers/connector/api/protos/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/yql/providers/connector/api/protos/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/yql/providers/connector/api/protos/CMakeLists.windows-x86_64.txt b/yql/providers/connector/api/protos/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..d3a014a91b
--- /dev/null
+++ b/yql/providers/connector/api/protos/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,44 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+get_built_tool_path(
+ TOOL_protoc_bin
+ TOOL_protoc_dependency
+ contrib/tools/protoc/bin
+ protoc
+)
+get_built_tool_path(
+ TOOL_cpp_styleguide_bin
+ TOOL_cpp_styleguide_dependency
+ contrib/tools/protoc/plugins/cpp_styleguide
+ cpp_styleguide
+)
+
+add_library(api-protos)
+target_link_libraries(api-protos PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ api-protos
+ contrib-libs-protobuf
+)
+target_proto_messages(api-protos PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/api/protos/connector.proto
+)
+target_proto_addincls(api-protos
+ ./
+ ${CMAKE_SOURCE_DIR}/
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/contrib/libs/protobuf/src
+)
+target_proto_outs(api-protos
+ --cpp_out=${CMAKE_BINARY_DIR}/
+ --cpp_styleguide_out=${CMAKE_BINARY_DIR}/
+)
diff --git a/yql/providers/connector/libcpp/CMakeLists.darwin-x86_64.txt b/yql/providers/connector/libcpp/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 0000000000..85538c6a56
--- /dev/null
+++ b/yql/providers/connector/libcpp/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,27 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-connector-libcpp)
+target_link_libraries(providers-connector-libcpp PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ libs-apache-arrow
+ contrib-libs-grpc
+ formats-arrow-serializer
+ library-yql-ast
+ yql-public-issue
+ library-yql-utils
+ api
+)
+target_sources(providers-connector-libcpp PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_grpc.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_mock.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/error.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/utils.cpp
+)
diff --git a/yql/providers/connector/libcpp/CMakeLists.linux-aarch64.txt b/yql/providers/connector/libcpp/CMakeLists.linux-aarch64.txt
new file mode 100644
index 0000000000..6f2e68e1e5
--- /dev/null
+++ b/yql/providers/connector/libcpp/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,28 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-connector-libcpp)
+target_link_libraries(providers-connector-libcpp PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ libs-apache-arrow
+ contrib-libs-grpc
+ formats-arrow-serializer
+ library-yql-ast
+ yql-public-issue
+ library-yql-utils
+ api
+)
+target_sources(providers-connector-libcpp PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_grpc.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_mock.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/error.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/utils.cpp
+)
diff --git a/yql/providers/connector/libcpp/CMakeLists.linux-x86_64.txt b/yql/providers/connector/libcpp/CMakeLists.linux-x86_64.txt
new file mode 100644
index 0000000000..6f2e68e1e5
--- /dev/null
+++ b/yql/providers/connector/libcpp/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,28 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-connector-libcpp)
+target_link_libraries(providers-connector-libcpp PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ libs-apache-arrow
+ contrib-libs-grpc
+ formats-arrow-serializer
+ library-yql-ast
+ yql-public-issue
+ library-yql-utils
+ api
+)
+target_sources(providers-connector-libcpp PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_grpc.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_mock.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/error.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/utils.cpp
+)
diff --git a/yql/providers/connector/libcpp/CMakeLists.txt b/yql/providers/connector/libcpp/CMakeLists.txt
new file mode 100644
index 0000000000..f8b31df0c1
--- /dev/null
+++ b/yql/providers/connector/libcpp/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/yql/providers/connector/libcpp/CMakeLists.windows-x86_64.txt b/yql/providers/connector/libcpp/CMakeLists.windows-x86_64.txt
new file mode 100644
index 0000000000..85538c6a56
--- /dev/null
+++ b/yql/providers/connector/libcpp/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,27 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(providers-connector-libcpp)
+target_link_libraries(providers-connector-libcpp PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ libs-apache-arrow
+ contrib-libs-grpc
+ formats-arrow-serializer
+ library-yql-ast
+ yql-public-issue
+ library-yql-utils
+ api
+)
+target_sources(providers-connector-libcpp PRIVATE
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_grpc.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/client_mock.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/error.cpp
+ ${CMAKE_SOURCE_DIR}/yql/providers/connector/libcpp/utils.cpp
+)