diff options
author | Pisarenko Grigoriy <grigoriypisar@ydb.tech> | 2024-12-10 15:27:33 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-10 15:27:33 +0300 |
commit | 137077a1934dbbe468bb8e5fb2a1b71f41aa773e (patch) | |
tree | a2809b5d5c67dc4c1c11fcb74bfbe07516b4d94c | |
parent | 9adb0efc93f0e7949349bc244d342b09a711d0c2 (diff) | |
download | ydb-137077a1934dbbe468bb8e5fb2a1b71f41aa773e.tar.gz |
Added TYQLConclusionStatusImpl with NYql::TIssues as error (#12452)
-rw-r--r-- | ydb/library/conclusion/generic/generic_status.h | 74 | ||||
-rw-r--r-- | ydb/library/conclusion/generic/result.h | 14 | ||||
-rw-r--r-- | ydb/library/conclusion/generic/status.h | 94 | ||||
-rw-r--r-- | ydb/library/conclusion/generic/string_status.h | 42 | ||||
-rw-r--r-- | ydb/library/conclusion/generic/ya.make | 2 | ||||
-rw-r--r-- | ydb/library/conclusion/generic/yql_status.h | 55 | ||||
-rw-r--r-- | ydb/library/conclusion/status.h | 7 |
7 files changed, 185 insertions, 103 deletions
diff --git a/ydb/library/conclusion/generic/generic_status.h b/ydb/library/conclusion/generic/generic_status.h new file mode 100644 index 00000000000..e0a66bee606 --- /dev/null +++ b/ydb/library/conclusion/generic/generic_status.h @@ -0,0 +1,74 @@ +#pragma once + +#include <util/generic/singleton.h> +#include <util/system/yassert.h> + +#include <optional> + +namespace NKikimr { + +template <class TDerived, class TErrorDescription, class TStatus, TStatus StatusOk, TStatus DefaultError> +class TConclusionStatusGenericImpl { +protected: + std::optional<TErrorDescription> ErrorDescription; + TStatus Status = StatusOk; + + TConclusionStatusGenericImpl() = default; + + TConclusionStatusGenericImpl(const TErrorDescription& error, TStatus status = DefaultError) + : ErrorDescription(error) + , Status(status) { + Y_ABORT_UNLESS(!!ErrorDescription); + } + + TConclusionStatusGenericImpl(TErrorDescription&& error, TStatus status = DefaultError) + : ErrorDescription(std::move(error)) + , Status(status) { + Y_ABORT_UNLESS(!!ErrorDescription); + } + +public: + virtual ~TConclusionStatusGenericImpl() = default; + +public: + [[nodiscard]] const TErrorDescription& GetErrorDescription() const { + return ErrorDescription ? *ErrorDescription : Default<TErrorDescription>(); + } + + [[nodiscard]] TStatus GetStatus() const { + return Status; + } + + template <class TErrorMessage> + [[nodiscard]] static TDerived Fail(const TErrorMessage& errorMessage) { + return TDerived(errorMessage); + } + + template <class TErrorMessage> + [[nodiscard]] static TDerived Fail(const TStatus& status, const TErrorMessage& errorMessage) { + Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk); + return TDerived(errorMessage, status); + } + + [[nodiscard]] bool IsFail() const { + return !Ok(); + } + + [[nodiscard]] bool IsSuccess() const { + return Ok(); + } + + [[nodiscard]] bool Ok() const { + return !ErrorDescription; + } + + [[nodiscard]] bool operator!() const { + return !!ErrorDescription; + } + + [[nodiscard]] static TDerived Success() { + return TDerived(); + } +}; + +} // namespace NKikimr diff --git a/ydb/library/conclusion/generic/result.h b/ydb/library/conclusion/generic/result.h index b0d93d3a404..768ef2bceef 100644 --- a/ydb/library/conclusion/generic/result.h +++ b/ydb/library/conclusion/generic/result.h @@ -1,5 +1,6 @@ #pragma once #include <util/generic/singleton.h> +#include <util/generic/string.h> #include <util/system/yassert.h> #include <optional> @@ -55,13 +56,13 @@ public: const TResult& GetResult() const { auto result = std::get_if<TResult>(&Result); - Y_ABORT_UNLESS(result, "incorrect object for result request"); + Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorMessage().data()); return *result; } TResult& MutableResult() { auto result = std::get_if<TResult>(&Result); - Y_ABORT_UNLESS(result, "incorrect object for result request"); + Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorMessage().data()); return *result; } @@ -91,13 +92,10 @@ public: return GetError(); } - const TString& GetErrorMessage() const { + TString GetErrorMessage() const { auto* status = std::get_if<TStatus>(&Result); - if (!status) { - return Default<TString>(); - } else { - return status->GetErrorMessage(); - } + Y_ABORT_UNLESS(status, "incorrect object for extracting error message"); + return status->GetErrorMessage(); } auto GetStatus() const { diff --git a/ydb/library/conclusion/generic/status.h b/ydb/library/conclusion/generic/status.h deleted file mode 100644 index 26be88712b5..00000000000 --- a/ydb/library/conclusion/generic/status.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -#include <util/generic/string.h> -#include <util/system/yassert.h> - -#include <optional> - -namespace NKikimr { - -template <class TStatus, TStatus StatusOk, TStatus DefaultError> -class TConclusionStatusImpl { -private: - std::optional<TString> ErrorMessage; - TStatus Status = StatusOk; - TConclusionStatusImpl() = default; - TConclusionStatusImpl(const TString& errorMessage, TStatus status = DefaultError) - : ErrorMessage(errorMessage) - , Status(status) { - Y_ABORT_UNLESS(!!ErrorMessage); - } - - TConclusionStatusImpl(const char* errorMessage, TStatus status = DefaultError) - : ErrorMessage(errorMessage) - , Status(status) { - Y_ABORT_UNLESS(!!ErrorMessage); - } - - TConclusionStatusImpl(const std::string& errorMessage, TStatus status = DefaultError) - : ErrorMessage(TString(errorMessage.data(), errorMessage.size())) - , Status(status) { - Y_ABORT_UNLESS(!!ErrorMessage); - } - -public: - void Validate(const TString& processInfo = Default<TString>()) const { - if (processInfo) { - Y_ABORT_UNLESS(Ok(), "error=%s, processInfo=%s", GetErrorMessage().c_str(), processInfo.c_str()); - } else { - Y_ABORT_UNLESS(Ok(), "error=%s", GetErrorMessage().c_str()); - } - } - - [[nodiscard]] const TString& GetErrorMessage() const { - return ErrorMessage ? *ErrorMessage : Default<TString>(); - } - - [[nodiscard]] TStatus GetStatus() const { - return Status; - } - - [[nodiscard]] static TConclusionStatusImpl Fail(const char* errorMessage) { - return TConclusionStatusImpl(errorMessage); - } - - [[nodiscard]] static TConclusionStatusImpl Fail(const TString& errorMessage) { - return TConclusionStatusImpl(errorMessage); - } - - [[nodiscard]] static TConclusionStatusImpl Fail(const std::string& errorMessage) { - return TConclusionStatusImpl(errorMessage); - } - - [[nodiscard]] static TConclusionStatusImpl Fail(const TStatus& status, const char* errorMessage) { - Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk); - return TConclusionStatusImpl(errorMessage, status); - } - - [[nodiscard]] static TConclusionStatusImpl Fail(const TStatus& status, const TString& errorMessage) { - Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk); - return TConclusionStatusImpl(errorMessage, status); - } - - [[nodiscard]] bool IsFail() const { - return !Ok(); - } - - [[nodiscard]] bool IsSuccess() const { - return Ok(); - } - - [[nodiscard]] bool Ok() const { - return !ErrorMessage; - } - - [[nodiscard]] bool operator!() const { - return !!ErrorMessage; - } - - [[nodiscard]] static TConclusionStatusImpl Success() { - return TConclusionStatusImpl(); - } -}; - -} // namespace NKikimr diff --git a/ydb/library/conclusion/generic/string_status.h b/ydb/library/conclusion/generic/string_status.h new file mode 100644 index 00000000000..ccb8ff11214 --- /dev/null +++ b/ydb/library/conclusion/generic/string_status.h @@ -0,0 +1,42 @@ +#pragma once + +#include "generic_status.h" + +#include <util/generic/string.h> + +namespace NKikimr { + +template <class TStatus, TStatus StatusOk, TStatus DefaultError> +class TConclusionStatusImpl : public TConclusionStatusGenericImpl<TConclusionStatusImpl<TStatus, StatusOk, DefaultError>, TString, TStatus, StatusOk, DefaultError> { +protected: + using TSelf = TConclusionStatusImpl<TStatus, StatusOk, DefaultError>; + using TBase = TConclusionStatusGenericImpl<TSelf, TString, TStatus, StatusOk, DefaultError>; + using TBase::TBase; + + friend class TConclusionStatusGenericImpl<TSelf, TString, TStatus, StatusOk, DefaultError>; + + TConclusionStatusImpl() = default; + + TConclusionStatusImpl(const char* errorMessage, TStatus status = DefaultError) + : TBase(TString(errorMessage), status) { + } + + TConclusionStatusImpl(const std::string& errorMessage, TStatus status = DefaultError) + : TBase(TString(errorMessage), status) { + } + +public: + void Validate(const TString& processInfo = Default<TString>()) const { + if (processInfo) { + Y_ABORT_UNLESS(TBase::Ok(), "error=%s, processInfo=%s", GetErrorMessage().c_str(), processInfo.c_str()); + } else { + Y_ABORT_UNLESS(TBase::Ok(), "error=%s", GetErrorMessage().c_str()); + } + } + + [[nodiscard]] TString GetErrorMessage() const { + return TBase::GetErrorDescription(); + } +}; + +} // namespace NKikimr diff --git a/ydb/library/conclusion/generic/ya.make b/ydb/library/conclusion/generic/ya.make index 1e614b2bfb5..5232905ff9f 100644 --- a/ydb/library/conclusion/generic/ya.make +++ b/ydb/library/conclusion/generic/ya.make @@ -4,6 +4,8 @@ SRCS() PEERDIR( util + + yql/essentials/public/issue ) END() diff --git a/ydb/library/conclusion/generic/yql_status.h b/ydb/library/conclusion/generic/yql_status.h new file mode 100644 index 00000000000..5a86b609f81 --- /dev/null +++ b/ydb/library/conclusion/generic/yql_status.h @@ -0,0 +1,55 @@ +#pragma once + +#include "generic_status.h" + +#include <yql/essentials/public/issue/yql_issue.h> + +namespace NKikimr { + +template <class TStatus, TStatus StatusOk, TStatus DefaultError> +class TYQLConclusionStatusImpl : public TConclusionStatusGenericImpl<TYQLConclusionStatusImpl<TStatus, StatusOk, DefaultError>, NYql::TIssues, TStatus, StatusOk, DefaultError> { +protected: + using TSelf = TYQLConclusionStatusImpl<TStatus, StatusOk, DefaultError>; + using TBase = TConclusionStatusGenericImpl<TSelf, NYql::TIssues, TStatus, StatusOk, DefaultError>; + using TBase::TBase; + + friend class TConclusionStatusGenericImpl<TSelf, NYql::TIssues, TStatus, StatusOk, DefaultError>; + + TYQLConclusionStatusImpl() = default; + + TYQLConclusionStatusImpl(const TString& errorMessage, TStatus status = DefaultError) + : TBase({NYql::TIssue(errorMessage)}, status) { + } + +public: + TYQLConclusionStatusImpl& AddParentIssue(NYql::TIssue issue) { + Y_ABORT_UNLESS(!!TBase::ErrorMessage); + for (const auto& childIssue : *TBase::ErrorMessage) { + issue.AddSubIssue(MakeIntrusive<NYql::TIssue>(childIssue)); + } + TBase::ErrorMessage = {std::move(issue)}; + return *this; + } + + TYQLConclusionStatusImpl& AddParentIssue(const TString& message) { + AddParentIssue(NYql::TIssue(message)); + return *this; + } + + TYQLConclusionStatusImpl& AddIssue(NYql::TIssue issue) { + Y_ABORT_UNLESS(!!TBase::ErrorMessage); + TBase::ErrorMessage->AddIssue(std::move(issue)); + return *this; + } + + TYQLConclusionStatusImpl& AddIssue(const TString& message) { + AddIssue(NYql::TIssue(message)); + return *this; + } + + [[nodiscard]] TString GetErrorMessage() const { + return TBase::GetErrorDescription().ToOneLineString(); + } +}; + +} // namespace NKikimr diff --git a/ydb/library/conclusion/status.h b/ydb/library/conclusion/status.h index b6a0830cf7a..3a56012ca36 100644 --- a/ydb/library/conclusion/status.h +++ b/ydb/library/conclusion/status.h @@ -1,5 +1,7 @@ #pragma once -#include <ydb/library/conclusion/generic/status.h> + +#include <ydb/library/conclusion/generic/string_status.h> +#include <ydb/library/conclusion/generic/yql_status.h> namespace NKikimr { @@ -8,4 +10,7 @@ using TConclusionStatus = TConclusionStatusImpl<::TNull, ::TNull{}, ::TNull{}>; template <class TStatus, TStatus StatusOk, TStatus DefaultError> using TConclusionSpecialStatus = TConclusionStatusImpl<TStatus, StatusOk, DefaultError>; +template <class TStatus, TStatus StatusOk, TStatus DefaultError> +using TYQLConclusionSpecialStatus = TYQLConclusionStatusImpl<TStatus, StatusOk, DefaultError>; + } |