diff options
author | spuchin <spuchin@ydb.tech> | 2023-05-29 18:09:08 +0300 |
---|---|---|
committer | spuchin <spuchin@ydb.tech> | 2023-05-29 18:09:08 +0300 |
commit | 4597cb5b2afed2e2a3d316803ef7c23776258b40 (patch) | |
tree | dd44608104e5df9d8f654b43901f4b596e96e86a | |
parent | 0e07043ae62bc543d90237be4bfaf04fab67a318 (diff) | |
download | ydb-4597cb5b2afed2e2a3d316803ef7c23776258b40.tar.gz |
Explain support for ExecuteQuery (QueryService). ()
38 files changed, 378 insertions, 206 deletions
diff --git a/ydb/core/grpc_services/query/rpc_execute_query.cpp b/ydb/core/grpc_services/query/rpc_execute_query.cpp index 7e3081ecb8..47869cd383 100644 --- a/ydb/core/grpc_services/query/rpc_execute_query.cpp +++ b/ydb/core/grpc_services/query/rpc_execute_query.cpp @@ -131,11 +131,27 @@ bool FillTxControl(const Ydb::Query::TransactionControl& from, Ydb::Table::Trans return true; } +bool NeedReportStats(const Ydb::Query::ExecuteQueryRequest& req) { + switch (req.exec_mode()) { + case Ydb::Query::EXEC_MODE_EXPLAIN: + return true; + + default: + return false; + } +} + std::tuple<Ydb::StatusIds::StatusCode, NYql::TIssues> FillKqpRequest( const Ydb::Query::ExecuteQueryRequest& req, NKikimrKqp::TEvQueryRequest& kqpRequest) { kqpRequest.MutableRequest()->MutableYdbParameters()->insert(req.parameters().begin(), req.parameters().end()); switch (req.exec_mode()) { + case Ydb::Query::EXEC_MODE_VALIDATE: + kqpRequest.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_VALIDATE); + break; + case Ydb::Query::EXEC_MODE_EXPLAIN: + kqpRequest.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXPLAIN); + break; case Ydb::Query::EXEC_MODE_EXECUTE: kqpRequest.MutableRequest()->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE); break; @@ -198,7 +214,8 @@ private: HFunc(TEvents::TEvWakeup, Handle); HFunc(TRpcServices::TEvGrpcNextReply, Handle); HFunc(NKqp::TEvKqpExecuter::TEvStreamData, Handle); - hFunc(NKqp::TEvKqp::TEvQueryResponse, Handle); + HFunc(NKqp::TEvKqp::TEvQueryResponse, Handle); + HFunc(NKqp::TEvKqp::TEvProcessResponse, Handle); default: UnexpectedEvent(__func__, ev); } @@ -307,13 +324,36 @@ private: ctx.Send(ev->Sender, resp.Release()); } - void Handle(NKqp::TEvKqp::TEvQueryResponse::TPtr& ev) { + void Handle(NKqp::TEvKqp::TEvQueryResponse::TPtr& ev, const TActorContext&) { auto& record = ev->Get()->Record.GetRef(); NYql::TIssues issues; const auto& issueMessage = record.GetResponse().GetQueryIssues(); NYql::IssuesFromMessage(issueMessage, issues); + if (record.GetYdbStatus() == Ydb::StatusIds::SUCCESS && NeedReportStats(*Request_->GetProtoRequest())) { + Ydb::Query::ExecuteQueryResponsePart response; + response.set_status(Ydb::StatusIds::SUCCESS); + + auto& kqpResponse = record.GetResponse(); + FillQueryStats(*response.mutable_exec_stats(), kqpResponse); + + TString out; + Y_PROTOBUF_SUPPRESS_NODISCARD response.SerializeToString(&out); + Request_->SendSerializedResult(std::move(out), record.GetYdbStatus()); + } + + ReplyFinishStream(record.GetYdbStatus(), issues); + } + + void Handle(NKqp::TEvKqp::TEvProcessResponse::TPtr& ev, const TActorContext&) { + auto& record = ev->Get()->Record; + + NYql::TIssues issues; + if (record.HasError()) { + issues.AddIssue(MakeIssue(NKikimrIssues::TIssuesIds::DEFAULT_ERROR, record.GetError())); + } + ReplyFinishStream(record.GetYdbStatus(), issues); } diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp index 07d0ee50af..e094aab28d 100644 --- a/ydb/core/kqp/host/kqp_host.cpp +++ b/ydb/core/kqp/host/kqp_host.cpp @@ -295,7 +295,7 @@ public: void FillResult(TResult& queryResult) const override { YQL_ENSURE(ExecuteCtx.QueryResults.size() == 1); queryResult = std::move(ExecuteCtx.QueryResults[0]); - queryResult.QueryPlan = SerializeExplainPlan(queryResult.PreparingQuery->GetPhysicalQuery()); + queryResult.QueryPlan = queryResult.PreparingQuery->GetPhysicalQuery().GetQueryPlan(); } private: @@ -327,7 +327,7 @@ public: prepareResult.SqlVersion = SqlVersion; YQL_ENSURE(prepareResult.PreparingQuery->GetVersion() == NKikimrKqp::TPreparedQuery::VERSION_PHYSICAL_V1); - prepareResult.QueryPlan = SerializeExplainPlan(prepareResult.PreparingQuery->GetPhysicalQuery()); + prepareResult.QueryPlan = prepareResult.PreparingQuery->GetPhysicalQuery().GetQueryPlan(); prepareResult.QueryAst = prepareResult.PreparingQuery->GetPhysicalQuery().GetQueryAst(); } diff --git a/ydb/core/kqp/opt/kqp_query_plan.cpp b/ydb/core/kqp/opt/kqp_query_plan.cpp index 8e75bbd911..f4e4d1e3e1 100644 --- a/ydb/core/kqp/opt/kqp_query_plan.cpp +++ b/ydb/core/kqp/opt/kqp_query_plan.cpp @@ -1578,6 +1578,60 @@ void SetNonZero(NJson::TJsonValue& node, const TStringBuf& name, T value) { } } +TString SerializeTxPlans(const TVector<const TString>& txPlans, const TString commonPlanInfo = "") { + NJsonWriter::TBuf writer; + writer.SetIndentSpaces(2); + + writer.BeginObject(); + writer.WriteKey("meta"); + writer.BeginObject(); + writer.WriteKey("version").WriteString("0.2"); + writer.WriteKey("type").WriteString("query"); + writer.EndObject(); + + if (!commonPlanInfo.Empty()) { + NJson::TJsonValue commonPlanJson; + NJson::ReadJsonTree(commonPlanInfo, &commonPlanJson, true); + + writer.WriteKey("tables"); + writer.WriteJsonValue(&commonPlanJson); + } + + writer.WriteKey("Plan"); + writer.BeginObject(); + writer.WriteKey("Node Type").WriteString("Query"); + writer.WriteKey("PlanNodeType").WriteString("Query"); + writer.WriteKey("Plans"); + writer.BeginList(); + + auto removeStageGuid = [](NJson::TJsonValue& node) { + auto& map = node.GetMapSafe(); + if (map.contains("StageGuid")) { + map.erase("StageGuid"); + } + }; + + for (auto txPlanIt = txPlans.rbegin(); txPlanIt != txPlans.rend(); ++txPlanIt) { + if (txPlanIt->empty()) { + continue; + } + + NJson::TJsonValue txPlanJson; + NJson::ReadJsonTree(*txPlanIt, &txPlanJson, true); + + for (auto& subplan : txPlanJson.GetMapSafe().at("Plans").GetArraySafe()) { + ModifyPlan(subplan, removeStageGuid); + writer.WriteJsonValue(&subplan, true); + } + } + + writer.EndList(); + writer.EndObject(); + writer.EndObject(); + + return writer.Str(); +} + } // namespace // TODO(sk): check prepared statements params in read ranges @@ -1627,10 +1681,17 @@ void PhyQuerySetTxPlans(NKqpProto::TKqpPhyQuery& queryProto, const TKqpPhysicalQ setPlan(id++, query.Transactions().Item(txId), (*queryProto.MutableTransactions())[txId]); } + TVector<const TString> txPlans; + txPlans.reserve(queryProto.GetTransactions().size()); + for (const auto& phyTx: queryProto.GetTransactions()) { + txPlans.emplace_back(phyTx.GetPlan()); + } + NJsonWriter::TBuf writer; writer.SetIndentSpaces(2); WriteCommonTablesInfo(writer, serializerCtx.Tables); - queryProto.SetQueryPlan(writer.Str()); + + queryProto.SetQueryPlan(SerializeTxPlans(txPlans, writer.Str())); } TString AddExecStatsToTxPlan(const TString& txPlanJson, const NYql::NDqProto::TDqExecutionStats& stats) { @@ -1755,66 +1816,6 @@ TString AddExecStatsToTxPlan(const TString& txPlanJson, const NYql::NDqProto::TD return txWriter.Str(); } -TString SerializeTxPlans(const TVector<const TString>& txPlans, const TString commonPlanInfo = "") { - NJsonWriter::TBuf writer; - writer.SetIndentSpaces(2); - - writer.BeginObject(); - writer.WriteKey("meta"); - writer.BeginObject(); - writer.WriteKey("version").WriteString("0.2"); - writer.WriteKey("type").WriteString("query"); - writer.EndObject(); - - if (!commonPlanInfo.Empty()) { - writer.WriteKey("tables"); - writer.UnsafeWriteValue(commonPlanInfo); - } - - writer.WriteKey("Plan"); - writer.BeginObject(); - writer.WriteKey("Node Type").WriteString("Query"); - writer.WriteKey("PlanNodeType").WriteString("Query"); - writer.WriteKey("Plans"); - writer.BeginList(); - - auto removeStageGuid = [](NJson::TJsonValue& node) { - auto& map = node.GetMapSafe(); - if (map.contains("StageGuid")) { - map.erase("StageGuid"); - } - }; - - for (auto txPlanIt = txPlans.rbegin(); txPlanIt != txPlans.rend(); ++txPlanIt) { - if (txPlanIt->empty()) { - continue; - } - - NJson::TJsonValue txPlanJson; - NJson::ReadJsonTree(*txPlanIt, &txPlanJson, true); - - for (auto& subplan : txPlanJson.GetMapSafe().at("Plans").GetArraySafe()) { - ModifyPlan(subplan, removeStageGuid); - writer.WriteJsonValue(&subplan, true); - } - } - - writer.EndList(); - writer.EndObject(); - writer.EndObject(); - - return writer.Str(); -} - -TString SerializeExplainPlan(const NKqpProto::TKqpPhyQuery& phyQuery) { - TVector<const TString> txPlans; - txPlans.reserve(phyQuery.GetTransactions().size()); - for (const auto& phyTx: phyQuery.GetTransactions()) { - txPlans.emplace_back(phyTx.GetPlan()); - } - return SerializeTxPlans(txPlans, phyQuery.GetQueryPlan()); -} - TString SerializeAnalyzePlan(const NKqpProto::TKqpStatsQuery& queryStats) { TVector<const TString> txPlans; for (const auto& execStats: queryStats.GetExecutions()) { diff --git a/ydb/core/kqp/opt/kqp_query_plan.h b/ydb/core/kqp/opt/kqp_query_plan.h index ad5b004504..5b08b9d496 100644 --- a/ydb/core/kqp/opt/kqp_query_plan.h +++ b/ydb/core/kqp/opt/kqp_query_plan.h @@ -42,8 +42,6 @@ void PhyQuerySetTxPlans(NKqpProto::TKqpPhyQuery& queryProto, const NYql::NNodes: */ TString AddExecStatsToTxPlan(const TString& txPlan, const NYql::NDqProto::TDqExecutionStats& stats); -TString SerializeExplainPlan(const NKqpProto::TKqpPhyQuery& phyQuery); - TString SerializeAnalyzePlan(const NKqpProto::TKqpStatsQuery& queryStats); TString SerializeScriptPlan(const TVector<const TString>& queryPlans); diff --git a/ydb/core/kqp/session_actor/kqp_query_state.cpp b/ydb/core/kqp/session_actor/kqp_query_state.cpp index a39209ee84..d2499049f7 100644 --- a/ydb/core/kqp/session_actor/kqp_query_state.cpp +++ b/ydb/core/kqp/session_actor/kqp_query_state.cpp @@ -141,6 +141,11 @@ std::unique_ptr<TEvKqp::TEvCompileRequest> TKqpQueryState::BuildCompileRequest() keepInCache = GetQueryKeepInCache(); break; + case NKikimrKqp::QUERY_ACTION_EXPLAIN: + query = TKqpQueryId(Cluster, Database, GetQuery(), GetType(), GetQueryParameterTypes()); + keepInCache = false; + break; + default: YQL_ENSURE(false); } diff --git a/ydb/core/kqp/session_actor/kqp_session_actor.cpp b/ydb/core/kqp/session_actor/kqp_session_actor.cpp index ef2b5dc0cd..8ed504fca4 100644 --- a/ydb/core/kqp/session_actor/kqp_session_actor.cpp +++ b/ydb/core/kqp/session_actor/kqp_session_actor.cpp @@ -216,6 +216,19 @@ public: Cleanup(); } + void ForwardResponse(TEvKqp::TEvProcessResponse::TPtr& ev) { + QueryResponse = std::make_unique<TEvKqp::TEvQueryResponse>(); + auto& record = QueryResponse->Record.GetRef(); + record.SetYdbStatus(ev->Get()->Record.GetYdbStatus()); + + if (ev->Get()->Record.HasError()) { + auto issue = MakeIssue(NKikimrIssues::TIssuesIds::DEFAULT_ERROR, ev->Get()->Record.GetError()); + IssueToMessage(issue, record.MutableResponse()->AddQueryIssues()); + } + + Cleanup(); + } + void ReplyTransactionNotFound(const TString& txId) { std::vector<TIssue> issues{YqlIssue(TPosition(), TIssuesIds::KIKIMR_TRANSACTION_NOT_FOUND, TStringBuilder() << "Transaction not found: " << txId)}; @@ -384,8 +397,19 @@ public: } case NKikimrKqp::QUERY_ACTION_COMMIT_TX: return CommitTx(); + + case NKikimrKqp::QUERY_ACTION_EXPLAIN: { + auto type = QueryState->GetType(); + if (type != NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY && + type != NKikimrKqp::QUERY_TYPE_SQL_GENERIC_SCRIPT) + { + return ForwardRequest(ev); + } + + break; + } + // not supported yet - case NKikimrKqp::QUERY_ACTION_EXPLAIN: case NKikimrKqp::QUERY_ACTION_VALIDATE: case NKikimrKqp::QUERY_ACTION_PARSE: return ForwardRequest(ev); @@ -473,7 +497,9 @@ public: } void OnSuccessCompileRequest() { - if (QueryState->GetAction() == NKikimrKqp::QUERY_ACTION_PREPARE) { + if (QueryState->GetAction() == NKikimrKqp::QUERY_ACTION_PREPARE || + QueryState->GetAction() == NKikimrKqp::QUERY_ACTION_EXPLAIN) + { return ReplyPrepareResult(); } @@ -1444,6 +1470,9 @@ public: auto& preparedQuery = compileResult->PreparedQuery; response.MutableQueryParameters()->CopyFrom(preparedQuery->GetParameters()); + + response.SetQueryPlan(preparedQuery->GetPhysicalQuery().GetQueryPlan()); + response.SetQueryAst(preparedQuery->GetPhysicalQuery().GetQueryAst()); } } @@ -1769,6 +1798,7 @@ public: // always come from WorkerActor hFunc(TEvKqp::TEvQueryResponse, ForwardResponse); + hFunc(TEvKqp::TEvProcessResponse, ForwardResponse); default: UnexpectedEvent("ExecuteState", ev); } diff --git a/ydb/core/kqp/ut/common/kqp_ut_common.cpp b/ydb/core/kqp/ut/common/kqp_ut_common.cpp index 351ef6a04f..62fdc57137 100644 --- a/ydb/core/kqp/ut/common/kqp_ut_common.cpp +++ b/ydb/core/kqp/ut/common/kqp_ut_common.cpp @@ -760,6 +760,20 @@ TString ReadTablePartToYson(NYdb::NTable::TSession session, const TString& table return NYdb::FormatResultSetYson(streamPart.ExtractPart()); } +bool ValidatePlanNodeIds(const NJson::TJsonValue& plan) { + ui32 planNodeId = 0; + ui32 count = 0; + + do { + count = CountPlanNodesByKv(plan, "PlanNodeId", std::to_string(++planNodeId)); + if (count > 1) { + return false; + } + } while (count > 0); + + return true; +} + ui32 CountPlanNodesByKv(const NJson::TJsonValue& plan, const TString& key, const TString& value) { ui32 result = 0; diff --git a/ydb/core/kqp/ut/common/kqp_ut_common.h b/ydb/core/kqp/ut/common/kqp_ut_common.h index 98b08b2e1c..d92e1c8462 100644 --- a/ydb/core/kqp/ut/common/kqp_ut_common.h +++ b/ydb/core/kqp/ut/common/kqp_ut_common.h @@ -248,6 +248,7 @@ TString StreamResultToYson(NYdb::NTable::TScanQueryPartIterator& it, bool throwO TString StreamResultToYson(NYdb::NScripting::TYqlResultPartIterator& it, bool throwOnTImeout = false); TString StreamResultToYson(NYdb::NTable::TTablePartIterator& it, bool throwOnTImeout = false); +bool ValidatePlanNodeIds(const NJson::TJsonValue& plan); ui32 CountPlanNodesByKv(const NJson::TJsonValue& plan, const TString& key, const TString& value); NJson::TJsonValue FindPlanNodeByKv(const NJson::TJsonValue& plan, const TString& key, const TString& value); std::vector<NJson::TJsonValue> FindPlanNodes(const NJson::TJsonValue& plan, const TString& key); diff --git a/ydb/core/kqp/ut/query/kqp_explain_ut.cpp b/ydb/core/kqp/ut/query/kqp_explain_ut.cpp index 3b74b0e4ca..21180e5993 100644 --- a/ydb/core/kqp/ut/query/kqp_explain_ut.cpp +++ b/ydb/core/kqp/ut/query/kqp_explain_ut.cpp @@ -61,20 +61,6 @@ void CreateSampleTables(TKikimrRunner& kikimr) { session.Close(); } -bool ValidatePlanNodeIds(const NJson::TJsonValue& plan) { - ui32 planNodeId = 0; - ui32 count = 0; - - do { - count = CountPlanNodesByKv(plan, "PlanNodeId", std::to_string(++planNodeId)); - if (count > 1) { - return false; - } - } while (count > 0); - - return true; -} - } Y_UNIT_TEST_SUITE(KqpExplain) { diff --git a/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp b/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp index 33f917b03e..9457179b29 100644 --- a/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp +++ b/ydb/core/kqp/ut/service/kqp_query_service_ut.cpp @@ -142,6 +142,31 @@ Y_UNIT_TEST_SUITE(KqpQueryService) { CompareYson(R"([[6u]])", FormatResultSetYson(result.GetResultSet(1))); } + Y_UNIT_TEST(ExplainQuery) { + auto kikimr = DefaultKikimrRunner(); + auto db = kikimr.GetQueryClient(); + + auto params = TParamsBuilder() + .AddParam("$value").Int64(17).Build() + .Build(); + + auto settings = TExecuteQuerySettings() + .ExecMode(EExecMode::Explain); + + auto result = db.ExecuteQuery(R"( + SELECT $value; + )", TTxControl::NoTx(), params, settings).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + UNIT_ASSERT(result.GetResultSets().empty()); + + UNIT_ASSERT(result.GetStats().Defined()); + UNIT_ASSERT(result.GetStats()->GetPlan().Defined()); + + NJson::TJsonValue plan; + NJson::ReadJsonTree(*result.GetStats()->GetPlan(), &plan, true); + UNIT_ASSERT(ValidatePlanNodeIds(plan)); + } + NYdb::NQuery::TScriptExecutionOperation WaitScriptExecutionOperation(const NYdb::TOperation::TOperationId& operationId, const NYdb::TDriver& ydbDriver) { NYdb::NOperation::TOperationClient client(ydbDriver); NThreading::TFuture<NYdb::NQuery::TScriptExecutionOperation> op; diff --git a/ydb/public/lib/experimental/ydb_logstore.cpp b/ydb/public/lib/experimental/ydb_logstore.cpp index 0b96617433..7b7c332975 100644 --- a/ydb/public/lib/experimental/ydb_logstore.cpp +++ b/ydb/public/lib/experimental/ydb_logstore.cpp @@ -2,7 +2,7 @@ #define INCLUDE_YDB_INTERNAL_H #include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h> -#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h> +#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h> #undef INCLUDE_YDB_INTERNAL_H #include <ydb/public/api/grpc/draft/ydb_logstore_v1.grpc.pb.h> diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt index 646cde7da9..5ea0336e39 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.darwin-x86_64.txt @@ -14,11 +14,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC yutil draft-ydb_query-impl cpp-client-ydb_common_client - cpp-client-ydb_table client-ydb_types-operation ) target_sources(client-draft-ydb_query PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp ) diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt index 4f212f0f10..65fda29db5 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-aarch64.txt @@ -15,11 +15,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC yutil draft-ydb_query-impl cpp-client-ydb_common_client - cpp-client-ydb_table client-ydb_types-operation ) target_sources(client-draft-ydb_query PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp ) diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt index 4f212f0f10..65fda29db5 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.linux-x86_64.txt @@ -15,11 +15,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC yutil draft-ydb_query-impl cpp-client-ydb_common_client - cpp-client-ydb_table client-ydb_types-operation ) target_sources(client-draft-ydb_query PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp ) diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt index 646cde7da9..5ea0336e39 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/CMakeLists.windows-x86_64.txt @@ -14,11 +14,11 @@ target_link_libraries(client-draft-ydb_query PUBLIC yutil draft-ydb_query-impl cpp-client-ydb_common_client - cpp-client-ydb_table client-ydb_types-operation ) target_sources(client-draft-ydb_query PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/client.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/query.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/draft/ydb_query/tx.cpp ) diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp b/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp index 0a342a423b..248f952ae3 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/impl/exec_query.cpp @@ -60,7 +60,7 @@ public: auto readCb = [self, promise](TGRpcStatus&& grpcStatus) mutable { if (!grpcStatus.Ok()) { self->Finished_ = true; - promise.SetValue({TStatus(TPlainStatus(grpcStatus, self->Endpoint_))}); + promise.SetValue({TStatus(TPlainStatus(grpcStatus, self->Endpoint_)), {}}); } else { NYql::TIssues issues; NYql::IssuesFromMessage(self->Response_.issues(), issues); @@ -69,14 +69,20 @@ public: TPlainStatus plainStatus{clientStatus, std::move(issues), self->Endpoint_, {}}; TStatus status{std::move(plainStatus)}; + TMaybe<TExecStats> stats; + if (self->Response_.has_exec_stats()) { + stats = TExecStats(std::move(*self->Response_.mutable_exec_stats())); + } + if (self->Response_.has_result_set()) { promise.SetValue({ std::move(status), TResultSet(std::move(*self->Response_.mutable_result_set())), - self->Response_.result_set_index() + self->Response_.result_set_index(), + std::move(stats) }); } else { - promise.SetValue({std::move(status)}); + promise.SetValue({std::move(status), std::move(stats)}); } } }; @@ -112,6 +118,7 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable { TExecuteQueryIterator Iterator_; TVector<NYql::TIssue> Issues_; TVector<Ydb::ResultSet> ResultSets_; + TMaybe<TExecStats> Stats_; void Next() { TPtr self(this); @@ -123,9 +130,11 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable { if (part.EOS()) { TVector<NYql::TIssue> issues; TVector<Ydb::ResultSet> resultProtos; + TMaybe<TExecStats> stats; std::swap(self->Issues_, issues); std::swap(self->ResultSets_, resultProtos); + std::swap(self->Stats_, stats); TVector<TResultSet> resultSets; for (auto& proto : resultProtos) { @@ -134,10 +143,11 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable { self->Promise_.SetValue(TExecuteQueryResult( TStatus(EStatus::SUCCESS, NYql::TIssues(std::move(issues))), - std::move(resultSets) + std::move(resultSets), + std::move(stats) )); } else { - self->Promise_.SetValue(TExecuteQueryResult(std::move(part), {})); + self->Promise_.SetValue(TExecuteQueryResult(std::move(part), {}, {})); } return; @@ -160,6 +170,10 @@ struct TExecuteQueryBuffer : public TThrRefBase, TNonCopyable { resultSet.mutable_rows()->Add(inRsProto.rows().begin(), inRsProto.rows().end()); } + if (part.GetStats().Defined()) { + self->Stats_ = part.GetStats(); + } + self->Next(); }); } @@ -171,16 +185,20 @@ TFuture<std::pair<TPlainStatus, TExecuteQueryProcessorPtr>> StreamExecuteQueryIm const TExecuteQuerySettings& settings) { auto request = MakeRequest<Ydb::Query::ExecuteQueryRequest>(); - request.set_exec_mode(Ydb::Query::EXEC_MODE_EXECUTE); + request.set_exec_mode(::Ydb::Query::ExecMode(settings.ExecMode_)); request.mutable_query_content()->set_text(query); - auto requestTxControl = request.mutable_tx_control(); - requestTxControl->set_commit_tx(txControl.CommitTx_); - if (txControl.TxId_) { - requestTxControl->set_tx_id(*txControl.TxId_); + if (txControl.HasTx()) { + auto requestTxControl = request.mutable_tx_control(); + requestTxControl->set_commit_tx(txControl.CommitTx_); + if (txControl.TxId_) { + requestTxControl->set_tx_id(*txControl.TxId_); + } else { + Y_ASSERT(txControl.TxSettings_); + SetTxSettings(*txControl.TxSettings_, requestTxControl->mutable_begin_tx()); + } } else { - Y_ASSERT(txControl.TxSettings_); - SetTxSettings(*txControl.TxSettings_, requestTxControl->mutable_begin_tx()); + Y_ASSERT(!txControl.CommitTx_); } if (params) { diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/query.h b/ydb/public/sdk/cpp/client/draft/ydb_query/query.h index b75b03053b..5214a6385c 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/query.h +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/query.h @@ -2,6 +2,7 @@ #include <ydb/public/api/grpc/draft/ydb_query_v1.grpc.pb.h> +#include <ydb/public/sdk/cpp/client/draft/ydb_query/stats.h> #include <ydb/public/sdk/cpp/client/ydb_result/result.h> #include <ydb/public/sdk/cpp/client/ydb_types/fluent_settings_helpers.h> #include <ydb/public/sdk/cpp/client/ydb_types/operation/operation.h> @@ -44,19 +45,24 @@ public: const TResultSet& GetResultSet() const { return *ResultSet_; } TResultSet ExtractResultSet() { return std::move(*ResultSet_); } - TExecuteQueryPart(TStatus&& status) + const TMaybe<TExecStats>& GetStats() const { return Stats_; } + + TExecuteQueryPart(TStatus&& status, TMaybe<TExecStats>&& queryStats) : TStreamPartStatus(std::move(status)) + , Stats_(std::move(queryStats)) {} - TExecuteQueryPart(TStatus&& status, TResultSet&& resultSet, i64 resultSetIndex) + TExecuteQueryPart(TStatus&& status, TResultSet&& resultSet, i64 resultSetIndex, TMaybe<TExecStats>&& queryStats) : TStreamPartStatus(std::move(status)) , ResultSet_(std::move(resultSet)) , ResultSetIndex_(resultSetIndex) + , Stats_(std::move(queryStats)) {} private: TMaybe<TResultSet> ResultSet_; i64 ResultSetIndex_ = 0; + TMaybe<TExecStats> Stats_; }; using TAsyncExecuteQueryPart = NThreading::TFuture<TExecuteQueryPart>; @@ -81,31 +87,34 @@ private: using TAsyncExecuteQueryIterator = NThreading::TFuture<TExecuteQueryIterator>; struct TExecuteQuerySettings : public TRequestSettings<TExecuteQuerySettings> { + FLUENT_SETTING_DEFAULT(EExecMode, ExecMode, EExecMode::Execute); }; class TExecuteQueryResult : public TStatus { public: const TVector<TResultSet>& GetResultSets() const; TResultSet GetResultSet(size_t resultIndex) const; - TResultSetParser GetResultSetParser(size_t resultIndex) const; + const TMaybe<TExecStats>& GetStats() const { return Stats_; } + TExecuteQueryResult(TStatus&& status) : TStatus(std::move(status)) {} - TExecuteQueryResult(TStatus&& status, TVector<TResultSet>&& resultSets) + TExecuteQueryResult(TStatus&& status, TVector<TResultSet>&& resultSets, TMaybe<TExecStats>&& stats) : TStatus(std::move(status)) , ResultSets_(std::move(resultSets)) + , Stats_(std::move(stats)) {} private: TVector<TResultSet> ResultSets_; + TMaybe<TExecStats> Stats_; }; using TAsyncExecuteQueryResult = NThreading::TFuture<TExecuteQueryResult>; - struct TExecuteScriptSettings : public TOperationRequestSettings<TExecuteScriptSettings> { }; diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp new file mode 100644 index 0000000000..f5fbc9d6c0 --- /dev/null +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.cpp @@ -0,0 +1,61 @@ +#include "stats.h" + +#include <ydb/public/api/protos/ydb_table.pb.h> + +#include <util/datetime/base.h> + +#include <google/protobuf/text_format.h> + +namespace NYdb::NQuery { + +class TExecStats::TImpl { +public: + Ydb::TableStats::QueryStats Proto; +}; + +TExecStats::TExecStats(const Ydb::TableStats::QueryStats& proto) { + Impl_ = std::make_shared<TImpl>(); + Impl_->Proto = proto; +} + +TExecStats::TExecStats(Ydb::TableStats::QueryStats&& proto) { + Impl_ = std::make_shared<TImpl>(); + Impl_->Proto = std::move(proto); +} + +TString TExecStats::ToString(bool withPlan) const { + auto proto = Impl_->Proto; + + if (!withPlan) { + proto.clear_query_plan(); + proto.clear_query_ast(); + } + + TString res; + ::google::protobuf::TextFormat::PrintToString(proto, &res); + return res; +} + +TMaybe<TString> TExecStats::GetPlan() const { + auto proto = Impl_->Proto; + + if (proto.query_plan().empty()) { + return {}; + } + + return proto.query_plan(); +} + +TDuration TExecStats::GetTotalDuration() const { + return TDuration::MicroSeconds(Impl_->Proto.total_duration_us()); +} + +TDuration TExecStats::GetTotalCpuTime() const { + return TDuration::MicroSeconds(Impl_->Proto.total_cpu_time_us()); +} + +const Ydb::TableStats::QueryStats& TExecStats::GetProto() const { + return Impl_->Proto; +} + +} // namespace NYdb::NQuery diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/stats.h b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.h new file mode 100644 index 0000000000..1fed19f6e3 --- /dev/null +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/stats.h @@ -0,0 +1,43 @@ +#pragma once + +#include <util/datetime/base.h> +#include <util/generic/maybe.h> +#include <util/generic/string.h> + +#include <memory> + +class TDuration; + +namespace Ydb::TableStats { + class QueryStats; +} + +namespace NYdb { + class TProtoAccessor; +} + +namespace NYdb::NQuery { + +class TExecStats { + friend class NYdb::TProtoAccessor; + +public: + explicit TExecStats(Ydb::TableStats::QueryStats&& proto); + explicit TExecStats(const Ydb::TableStats::QueryStats& proto); + + TString ToString(bool withPlan = false) const; + + TMaybe<TString> GetPlan() const; + + TDuration GetTotalDuration() const; + TDuration GetTotalCpuTime() const; + +private: + const Ydb::TableStats::QueryStats& GetProto() const; + +private: + class TImpl; + std::shared_ptr<TImpl> Impl_; +}; + +} // namespace NYdb::NQuery diff --git a/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h b/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h index 1e1517b02d..e32a5315d0 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h +++ b/ydb/public/sdk/cpp/client/draft/ydb_query/tx.h @@ -82,11 +82,19 @@ struct TTxControl { return TTxControl(settings); } + static TTxControl NoTx() { + return TTxControl(); + } + const TMaybe<TString> TxId_; const TMaybe<TTxSettings> TxSettings_; FLUENT_SETTING_FLAG(CommitTx); + bool HasTx() const { return TxId_.Defined() || TxSettings_.Defined(); } + private: + TTxControl() {} + TTxControl(const TString& txId) : TxId_(txId) {} diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h new file mode 100644 index 0000000000..bd43f2b21d --- /dev/null +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h @@ -0,0 +1,17 @@ +#pragma once + +#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> + +namespace NYdb { + +template<typename TFrom> +inline void PermissionToSchemeEntry(const TFrom& from, TVector<NScheme::TPermissions>* to) { + for (const auto& effPerm : from) { + to->push_back(NScheme::TPermissions{effPerm.subject(), TVector<TString>()}); + for (const auto& permName : effPerm.permission_names()) { + to->back().PermissionNames.push_back(permName); + } + } +} + +} // namespace NYdb diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h index 96e8ee2801..c6fa2c2679 100644 --- a/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h @@ -3,21 +3,10 @@ #include <ydb/public/sdk/cpp/client/impl/ydb_internal/internal_header.h> #include <ydb/public/api/protos/ydb_table.pb.h> -#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> #include <ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h> namespace NYdb { -template<typename TFrom> -inline void PermissionToSchemeEntry(const TFrom& from, TVector<NScheme::TPermissions>* to) { - for (const auto& effPerm : from) { - to->push_back(NScheme::TPermissions{effPerm.subject(), TVector<TString>()}); - for (const auto& permName : effPerm.permission_names()) { - to->back().PermissionNames.push_back(permName); - } - } -} - inline Ydb::Table::QueryStatsCollection::Mode GetStatsCollectionMode(TMaybe<NTable::ECollectQueryStatsMode> mode) { if (mode) { switch (*mode) { diff --git a/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp b/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp index 01828ddf99..8fe30d6734 100644 --- a/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp +++ b/ydb/public/sdk/cpp/client/ydb_coordination/coordination.cpp @@ -2,7 +2,7 @@ #define INCLUDE_YDB_INTERNAL_H #include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h> -#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h> +#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h> #undef INCLUDE_YDB_INTERNAL_H #include <ydb/public/api/grpc/ydb_coordination_v1.grpc.pb.h> diff --git a/ydb/public/sdk/cpp/client/ydb_proto/accessor.h b/ydb/public/sdk/cpp/client/ydb_proto/accessor.h index 33223c3bfc..541fc54809 100644 --- a/ydb/public/sdk/cpp/client/ydb_proto/accessor.h +++ b/ydb/public/sdk/cpp/client/ydb_proto/accessor.h @@ -25,7 +25,6 @@ class TType; class TParams; namespace NTable { -class TQueryStats; class TTableDescription; class TIndexDescription; } diff --git a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp index 120b254444..98b7aa55b6 100644 --- a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp +++ b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp @@ -2,7 +2,7 @@ #define INCLUDE_YDB_INTERNAL_H #include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h> -#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h> +#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h> #undef INCLUDE_YDB_INTERNAL_H #include <ydb/public/api/grpc/ydb_scheme_v1.grpc.pb.h> diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt index 50213bcb6f..2569e1c3f0 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.darwin-x86_64.txt @@ -15,6 +15,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC api-protos lib-operation_id-protos client-impl-ydb_endpoints + client-ydb_table-query_stats public-issue-protos ) target_sources(client-ydb_table-impl PRIVATE diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt index 70b0b70fea..e56b888c90 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-aarch64.txt @@ -16,6 +16,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC api-protos lib-operation_id-protos client-impl-ydb_endpoints + client-ydb_table-query_stats public-issue-protos ) target_sources(client-ydb_table-impl PRIVATE diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt index 70b0b70fea..e56b888c90 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.linux-x86_64.txt @@ -16,6 +16,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC api-protos lib-operation_id-protos client-impl-ydb_endpoints + client-ydb_table-query_stats public-issue-protos ) target_sources(client-ydb_table-impl PRIVATE diff --git a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt index 50213bcb6f..2569e1c3f0 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/impl/CMakeLists.windows-x86_64.txt @@ -15,6 +15,7 @@ target_link_libraries(client-ydb_table-impl PUBLIC api-protos lib-operation_id-protos client-impl-ydb_endpoints + client-ydb_table-query_stats public-issue-protos ) target_sources(client-ydb_table-impl PRIVATE diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt index 15f141ce6c..d7aff0e3a1 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.darwin-x86_64.txt @@ -13,6 +13,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC yutil contrib-libs-protobuf api-protos + client-draft-ydb_query ) target_sources(client-ydb_table-query_stats PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt index 093bc872cc..5c45e2a70d 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-aarch64.txt @@ -14,6 +14,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC yutil contrib-libs-protobuf api-protos + client-draft-ydb_query ) target_sources(client-ydb_table-query_stats PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt index 093bc872cc..5c45e2a70d 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.linux-x86_64.txt @@ -14,6 +14,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC yutil contrib-libs-protobuf api-protos + client-draft-ydb_query ) target_sources(client-ydb_table-query_stats PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt index 15f141ce6c..d7aff0e3a1 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/CMakeLists.windows-x86_64.txt @@ -13,6 +13,7 @@ target_link_libraries(client-ydb_table-query_stats PUBLIC yutil contrib-libs-protobuf api-protos + client-draft-ydb_query ) target_sources(client-ydb_table-query_stats PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp index 64e63194ff..7dd7622062 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.cpp @@ -1,63 +1 @@ #include "stats.h" - -#include <ydb/public/api/protos/ydb_table.pb.h> - -#include <util/datetime/base.h> - -#include <google/protobuf/text_format.h> - -namespace NYdb { -namespace NTable { - -class TQueryStats::TImpl { -public: - Ydb::TableStats::QueryStats Proto; -}; - -TQueryStats::TQueryStats(const Ydb::TableStats::QueryStats& proto) { - Impl_ = std::make_shared<TImpl>(); - Impl_->Proto = proto; -} - -TQueryStats::TQueryStats(Ydb::TableStats::QueryStats&& proto) { - Impl_ = std::make_shared<TImpl>(); - Impl_->Proto = std::move(proto); -} - -TString TQueryStats::ToString(bool withPlan) const { - auto proto = Impl_->Proto; - - if (!withPlan) { - proto.clear_query_plan(); - proto.clear_query_ast(); - } - - TString res; - ::google::protobuf::TextFormat::PrintToString(proto, &res); - return res; -} - -TMaybe<TString> TQueryStats::GetPlan() const { - auto proto = Impl_->Proto; - - if (proto.query_plan().empty()) { - return {}; - } - - return proto.query_plan(); -} - -TDuration TQueryStats::GetTotalDuration() const { - return TDuration::MicroSeconds(Impl_->Proto.total_duration_us()); -} - -TDuration TQueryStats::GetTotalCpuTime() const { - return TDuration::MicroSeconds(Impl_->Proto.total_cpu_time_us()); -} - -const Ydb::TableStats::QueryStats& TQueryStats::GetProto() const { - return Impl_->Proto; -} - -} // namespace NTable -} // namespace NYdb diff --git a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h index a07773ba45..e8a5992159 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h +++ b/ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h @@ -1,5 +1,7 @@ #pragma once +#include <ydb/public/sdk/cpp/client/draft/ydb_query/stats.h> + #include <util/generic/maybe.h> #include <util/generic/string.h> @@ -37,28 +39,7 @@ enum class ECollectQueryStatsMode { Profile = 3 // Detailed execution stats including stats for individual tasks and channels }; -class TQueryStats { - friend class TTableClient; - friend class NYdb::TProtoAccessor; - friend class NYdb::NScripting::TScriptingClient; - friend class NYdb::NScripting::TYqlResultPartIterator; - friend class TScanQueryPartIterator; - -public: - TQueryStats(Ydb::TableStats::QueryStats&& proto); - TString ToString(bool withPlan = false) const; - TMaybe<TString> GetPlan() const; - TDuration GetTotalDuration() const; - TDuration GetTotalCpuTime() const; - -private: - explicit TQueryStats(const Ydb::TableStats::QueryStats& proto); - const Ydb::TableStats::QueryStats& GetProto() const; - -private: - class TImpl; - std::shared_ptr<TImpl> Impl_; -}; +using TQueryStats = NQuery::TExecStats; } // namespace NTable } // namespace NYdb diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp index d210c752b9..922261d5ca 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp @@ -1,6 +1,7 @@ #include "table.h" #define INCLUDE_YDB_INTERNAL_H +#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h> #include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h> #include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h> #undef INCLUDE_YDB_INTERNAL_H diff --git a/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp b/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp index 2541430996..35869b47aa 100644 --- a/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp +++ b/ydb/public/sdk/cpp/client/ydb_topic/impl/topic.cpp @@ -1,7 +1,7 @@ #include <ydb/public/sdk/cpp/client/ydb_topic/topic.h> #include <ydb/public/sdk/cpp/client/ydb_topic/impl/topic_impl.h> #include <ydb/public/sdk/cpp/client/ydb_topic/impl/executor.h> -#include <ydb/public/sdk/cpp/client/impl/ydb_internal/table_helpers/helpers.h> +#include <ydb/public/sdk/cpp/client/impl/ydb_internal/scheme_helpers/helpers.h> #include <ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.h> #include <ydb/library/persqueue/obfuscate/obfuscate.h> diff --git a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan index eb9c3f9bc2..8d8c3f1b7e 100644 --- a/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan +++ b/ydb/tests/functional/canonical/canondata/test_sql.TestCanonicalFolder1.test_case_write_multi_usage.script-script_/write_multi_usage.script.plan @@ -16,11 +16,11 @@ "Group", "Name" ], - "limit": "1001", "scan_by": [ "Group (-\u221e, +\u221e)", "Name (-\u221e, +\u221e)" ], + "limit": "1001", "type": "FullScan" } ] @@ -33,10 +33,10 @@ "Name", "Value" ], - "limit": "1001", "scan_by": [ "Name (-\u221e, +\u221e)" ], + "limit": "1001", "type": "FullScan" } ] |