aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPisarenko Grigoriy <grigoriypisar@ydb.tech>2024-12-10 15:27:33 +0300
committerGitHub <noreply@github.com>2024-12-10 15:27:33 +0300
commit137077a1934dbbe468bb8e5fb2a1b71f41aa773e (patch)
treea2809b5d5c67dc4c1c11fcb74bfbe07516b4d94c
parent9adb0efc93f0e7949349bc244d342b09a711d0c2 (diff)
downloadydb-137077a1934dbbe468bb8e5fb2a1b71f41aa773e.tar.gz
Added TYQLConclusionStatusImpl with NYql::TIssues as error (#12452)
-rw-r--r--ydb/library/conclusion/generic/generic_status.h74
-rw-r--r--ydb/library/conclusion/generic/result.h14
-rw-r--r--ydb/library/conclusion/generic/status.h94
-rw-r--r--ydb/library/conclusion/generic/string_status.h42
-rw-r--r--ydb/library/conclusion/generic/ya.make2
-rw-r--r--ydb/library/conclusion/generic/yql_status.h55
-rw-r--r--ydb/library/conclusion/status.h7
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>;
+
}