diff options
author | vitalyisaev <vitalyisaev@yandex-team.com> | 2023-05-31 13:58:42 +0300 |
---|---|---|
committer | vitalyisaev <vitalyisaev@yandex-team.com> | 2023-05-31 13:58:42 +0300 |
commit | a495c64ce9b1f2df1299aa415287a90e61719400 (patch) | |
tree | 1655f42a7a5dbe0ff660c5860babf8722c021933 | |
parent | 905720a7f9489423c651bcb8cd567eb92f0f3101 (diff) | |
download | ydb-a495c64ce9b1f2df1299aa415287a90e61719400.tar.gz |
PR from branch users/vitalyisaev/
Generic provider to external data sources
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 +) |