aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivanmorozov <ivanmorozov@yandex-team.com>2023-05-21 21:43:49 +0300
committerivanmorozov <ivanmorozov@yandex-team.com>2023-05-21 21:43:49 +0300
commit1adca918f6d75cefd276edfcb74f9560a85de778 (patch)
tree3b44ad9171a621c33d9284754300aaa3f5e65ca2
parentd39e5e82c2e2b6b4c83ce0e26e66a3aa61d3b540 (diff)
downloadydb-1adca918f6d75cefd276edfcb74f9560a85de778.tar.gz
use conclusion for object modifications
-rw-r--r--ydb/core/formats/arrow/compression/diff.cpp14
-rw-r--r--ydb/core/formats/arrow/compression/diff.h3
-rw-r--r--ydb/core/formats/arrow/compression/object.cpp4
-rw-r--r--ydb/core/formats/arrow/dictionary/conversion.cpp2
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp33
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/manager.h2
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.cpp19
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.h4
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.cpp26
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.h2
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.cpp22
-rw-r--r--ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.h2
-rw-r--r--ydb/core/kqp/gateway/kqp_ic_gateway.cpp20
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_exec.cpp14
-rw-r--r--ydb/core/tx/tiering/rule/manager.cpp12
-rw-r--r--ydb/core/tx/tiering/tier/manager.cpp20
-rw-r--r--ydb/services/ext_index/metadata/manager.cpp21
-rw-r--r--ydb/services/metadata/abstract/CMakeLists.darwin-x86_64.txt3
-rw-r--r--ydb/services/metadata/abstract/CMakeLists.linux-aarch64.txt3
-rw-r--r--ydb/services/metadata/abstract/CMakeLists.linux-x86_64.txt3
-rw-r--r--ydb/services/metadata/abstract/CMakeLists.windows-x86_64.txt3
-rw-r--r--ydb/services/metadata/abstract/parsing.cpp5
-rw-r--r--ydb/services/metadata/abstract/parsing.h50
-rw-r--r--ydb/services/metadata/abstract/request_features.cpp25
-rw-r--r--ydb/services/metadata/abstract/request_features.h44
-rw-r--r--ydb/services/metadata/manager/abstract.cpp12
-rw-r--r--ydb/services/metadata/manager/abstract.h113
-rw-r--r--ydb/services/metadata/manager/generic_manager.h29
-rw-r--r--ydb/services/metadata/secret/manager.cpp26
29 files changed, 300 insertions, 236 deletions
diff --git a/ydb/core/formats/arrow/compression/diff.cpp b/ydb/core/formats/arrow/compression/diff.cpp
index a3eb9a51f7..8d1cca9354 100644
--- a/ydb/core/formats/arrow/compression/diff.cpp
+++ b/ydb/core/formats/arrow/compression/diff.cpp
@@ -15,21 +15,21 @@ NKikimrSchemeOp::TCompressionOptions TCompressionDiff::SerializeToProto() const
return result;
}
-TConclusionStatus TCompressionDiff::DeserializeFromRequestFeatures(const std::map<TString, TString>& features) {
+TConclusionStatus TCompressionDiff::DeserializeFromRequestFeatures(NYql::TFeaturesExtractor& features) {
{
- auto it = features.find("COMPRESSION.TYPE");
- if (it != features.end()) {
- Codec = NArrow::CompressionFromString(it->second);
+ auto fValue = features.Extract("COMPRESSION.TYPE");
+ if (fValue) {
+ Codec = NArrow::CompressionFromString(*fValue);
if (!Codec) {
return TConclusionStatus::Fail("cannot parse COMPRESSION.TYPE as arrow::Compression");
}
}
}
{
- auto it = features.find("COMPRESSION.LEVEL");
- if (it != features.end()) {
+ auto fValue = features.Extract("COMPRESSION.LEVEL");
+ if (fValue) {
ui32 level;
- if (!TryFromString<ui32>(it->second, level)) {
+ if (!TryFromString<ui32>(*fValue, level)) {
return TConclusionStatus::Fail("cannot parse COMPRESSION.LEVEL as ui32");
}
Level = level;
diff --git a/ydb/core/formats/arrow/compression/diff.h b/ydb/core/formats/arrow/compression/diff.h
index 490e5e8493..d2deae3cbf 100644
--- a/ydb/core/formats/arrow/compression/diff.h
+++ b/ydb/core/formats/arrow/compression/diff.h
@@ -4,6 +4,7 @@
#include <ydb/library/conclusion/result.h>
#include <ydb/library/accessor/accessor.h>
#include <ydb/core/protos/flat_scheme_op.pb.h>
+#include <ydb/services/metadata/abstract/request_features.h>
#include <contrib/libs/apache/arrow/cpp/src/arrow/util/compression.h>
#include <optional>
#include <map>
@@ -20,7 +21,7 @@ public:
}
NKikimrSchemeOp::TCompressionOptions SerializeToProto() const;
bool DeserializeFromProto(const NKikimrSchemeOp::TCompressionOptions& proto);
- TConclusionStatus DeserializeFromRequestFeatures(const std::map<TString, TString>& features);
+ TConclusionStatus DeserializeFromRequestFeatures(NYql::TFeaturesExtractor& features);
const std::optional<arrow::Compression::type>& GetCodec() const {
return Codec;
}
diff --git a/ydb/core/formats/arrow/compression/object.cpp b/ydb/core/formats/arrow/compression/object.cpp
index 17753c833f..21be59b594 100644
--- a/ydb/core/formats/arrow/compression/object.cpp
+++ b/ydb/core/formats/arrow/compression/object.cpp
@@ -11,7 +11,9 @@ TConclusionStatus NKikimr::NArrow::TCompression::Validate() const {
const int levelMin = codec->minimum_compression_level();
const int levelMax = codec->maximum_compression_level();
if (Level && (*Level < levelMin || levelMax < *Level)) {
- return TConclusionStatus::Fail("incorrect level for codec");
+ TStringBuilder sb;
+ sb << "incorrect level for codec. have to be: [" << levelMin << ":" << levelMax << "]";
+ return TConclusionStatus::Fail(sb);
}
}
return TConclusionStatus::Success();
diff --git a/ydb/core/formats/arrow/dictionary/conversion.cpp b/ydb/core/formats/arrow/dictionary/conversion.cpp
index e7e08f7790..8c96ea23ae 100644
--- a/ydb/core/formats/arrow/dictionary/conversion.cpp
+++ b/ydb/core/formats/arrow/dictionary/conversion.cpp
@@ -118,7 +118,7 @@ bool IsDictionableArray(const std::shared_ptr<arrow::Array>& data) {
bool result = false;
SwitchType(data->type_id(), [&](const auto& type) {
using TWrap = std::decay_t<decltype(type)>;
- result = arrow::has_c_type<typename TWrap::T>::value;
+ result = arrow::has_string_view<typename TWrap::T>::value;
return true;
});
return result;
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp b/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp
index 600d85e7a0..ac8987f898 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/manager.cpp
@@ -11,32 +11,32 @@
namespace NKikimr::NKqp {
-NThreading::TFuture<NMetadata::NModifications::TObjectOperatorResult> TTableStoreManager::DoModify(const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
+NThreading::TFuture<TConclusionStatus> TTableStoreManager::DoModify(const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
NMetadata::IClassBehaviour::TPtr manager, TInternalModificationContext& context) const {
Y_UNUSED(nodeId);
Y_UNUSED(manager);
- auto promise = NThreading::NewPromise<NMetadata::NModifications::TObjectOperatorResult>();
+ auto promise = NThreading::NewPromise<TConclusionStatus>();
auto result = promise.GetFuture();
switch (context.GetActivityType()) {
case EActivityType::Create:
case EActivityType::Drop:
case EActivityType::Undefined:
- return NThreading::MakeFuture<NMetadata::NModifications::TObjectOperatorResult>(NMetadata::NModifications::TObjectOperatorResult("not impelemented"));
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("not implemented"));
case EActivityType::Alter:
try {
- auto actionIt = settings.GetFeatures().find("ACTION");
- if (actionIt == settings.GetFeatures().end()) {
- return NThreading::MakeFuture<NMetadata::NModifications::TObjectOperatorResult>(NMetadata::NModifications::TObjectOperatorResult("can't find ACTION"));
+ auto actionName = settings.GetFeaturesExtractor().Extract("ACTION");
+ if (!actionName) {
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("can't find ACTION parameter"));
}
- ITableStoreOperation::TPtr operation(ITableStoreOperation::TFactory::Construct(actionIt->second));
+ ITableStoreOperation::TPtr operation(ITableStoreOperation::TFactory::Construct(*actionName));
if (!operation) {
- return NThreading::MakeFuture<NMetadata::NModifications::TObjectOperatorResult>(NMetadata::NModifications::TObjectOperatorResult("invalid ACTION: " + actionIt->second));
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("invalid ACTION: " + *actionName));
}
{
auto parsingResult = operation->Deserialize(settings);
- if (!parsingResult.IsSuccess()) {
- return NThreading::MakeFuture<NMetadata::NModifications::TObjectOperatorResult>(parsingResult);
+ if (!parsingResult) {
+ return NThreading::MakeFuture<TConclusionStatus>(parsingResult);
}
}
auto ev = MakeHolder<TEvTxUserProxy::TEvProposeTransaction>();
@@ -51,17 +51,14 @@ NThreading::TFuture<NMetadata::NModifications::TObjectOperatorResult> TTableStor
TActivationContext::AsActorContext().Register(new NKqp::TSchemeOpRequestHandler(ev.Release(), promiseScheme, false));
return promiseScheme.GetFuture().Apply([](const NThreading::TFuture<NKqp::TSchemeOpRequestHandler::TResult>& f) {
if (f.HasValue() && !f.HasException() && f.GetValue().Success()) {
- NMetadata::NModifications::TObjectOperatorResult localResult(true);
- return localResult;
+ return TConclusionStatus::Success();
} else if (f.HasValue()) {
- NMetadata::NModifications::TObjectOperatorResult localResult(f.GetValue().Issues().ToString());
- return localResult;
+ return TConclusionStatus::Fail(f.GetValue().Issues().ToString());
}
- NMetadata::NModifications::TObjectOperatorResult localResult(false);
- return localResult;
- });
+ return TConclusionStatus::Fail("no value in result");
+ });
} catch (yexception& e) {
- return NThreading::MakeFuture<NMetadata::NModifications::TObjectOperatorResult>(NMetadata::NModifications::TObjectOperatorResult(e.what()));
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail(e.what()));
}
}
return result;
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/manager.h b/ydb/core/kqp/gateway/behaviour/tablestore/manager.h
index ba16d6b7a1..d9cf3fad03 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/manager.h
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/manager.h
@@ -8,7 +8,7 @@ namespace NKikimr::NKqp {
class TTableStoreManager: public NMetadata::NModifications::IOperationsManager {
protected:
- NThreading::TFuture<NMetadata::NModifications::TObjectOperatorResult> DoModify(const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
+ NThreading::TFuture<TConclusionStatus> DoModify(const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
NMetadata::IClassBehaviour::TPtr manager, TInternalModificationContext& context) const override;
public:
};
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.cpp b/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.cpp
index e57de2e38a..a74ea0c7a5 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.cpp
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.cpp
@@ -3,23 +3,30 @@
namespace NKikimr::NKqp {
-NKikimr::NMetadata::NModifications::TObjectOperatorResult ITableStoreOperation::Deserialize(const NYql::TObjectSettingsImpl& settings) {
+TConclusionStatus ITableStoreOperation::Deserialize(const NYql::TObjectSettingsImpl& settings) {
std::pair<TString, TString> pathPair;
{
TString error;
if (!NYql::IKikimrGateway::TrySplitTablePath(settings.GetObjectId(), pathPair, error)) {
- return NMetadata::NModifications::TObjectOperatorResult(error);
+ return TConclusionStatus::Fail(error);
}
WorkingDir = pathPair.first;
StoreName = pathPair.second;
}
{
- auto it = settings.GetFeatures().find("PRESET_NAME");
- if (it != settings.GetFeatures().end()) {
- PresetName = it->second;
+ auto presetName = settings.GetFeaturesExtractor().Extract("PRESET_NAME");
+ if (presetName) {
+ PresetName = *presetName;
}
}
- return DoDeserialize(settings.GetFeatures());
+ auto serializationResult = DoDeserialize(settings.GetFeaturesExtractor());
+ if (!serializationResult) {
+ return serializationResult;
+ }
+ if (!settings.GetFeaturesExtractor().IsFinished()) {
+ return TConclusionStatus::Fail("there are undefined parameters: " + settings.GetFeaturesExtractor().GetRemainedParamsString());
+ }
+ return TConclusionStatus::Success();
}
void ITableStoreOperation::SerializeScheme(NKikimrSchemeOp::TModifyScheme& scheme) const {
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.h b/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.h
index c0ee04c1fe..a77c5d3b7f 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.h
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/operations/abstract.h
@@ -14,11 +14,11 @@ private:
public:
virtual ~ITableStoreOperation() {};
- NMetadata::NModifications::TObjectOperatorResult Deserialize(const NYql::TObjectSettingsImpl& settings);
+ TConclusionStatus Deserialize(const NYql::TObjectSettingsImpl& settings);
void SerializeScheme(NKikimrSchemeOp::TModifyScheme& scheme) const;
private:
- virtual NMetadata::NModifications::TObjectOperatorResult DoDeserialize(const NYql::TObjectSettingsImpl::TFeatures& features) = 0;
+ virtual TConclusionStatus DoDeserialize(NYql::TObjectSettingsImpl::TFeaturesExtractor& features) = 0;
virtual void DoSerializeScheme(NKikimrSchemeOp::TAlterColumnTableSchemaPreset& scheme) const = 0;
};
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.cpp b/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.cpp
index 4939aa5c3d..d002c7bbc6 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.cpp
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.cpp
@@ -3,28 +3,28 @@
namespace NKikimr::NKqp {
-NMetadata::NModifications::TObjectOperatorResult TAddColumnOperation::DoDeserialize(const NYql::TObjectSettingsImpl::TFeatures& features) {
+TConclusionStatus TAddColumnOperation::DoDeserialize(NYql::TObjectSettingsImpl::TFeaturesExtractor& features) {
{
- auto it = features.find("NAME");
- if (it == features.end()) {
- return NMetadata::NModifications::TObjectOperatorResult("can't find alter parameter NAME");
+ auto fValue = features.Extract("NAME");
+ if (!fValue) {
+ return TConclusionStatus::Fail("can't find alter parameter NAME");
}
- ColumnName = it->second;
+ ColumnName = *fValue;
}
{
- auto it = features.find("TYPE");
- if (it == features.end()) {
- return NMetadata::NModifications::TObjectOperatorResult("can't find alter parameter TYPE");
+ auto fValue = features.Extract("TYPE");
+ if (!fValue) {
+ return TConclusionStatus::Fail("can't find alter parameter TYPE");
}
- ColumnType = it->second;
+ ColumnType = *fValue;
}
{
- auto it = features.find("NOT_NULL");
- if (it != features.end()) {
- NotNull = IsTrue(it->second);
+ auto fValue = features.Extract("NOT_NULL");
+ if (!!fValue) {
+ NotNull = IsTrue(*fValue);
}
}
- return NMetadata::NModifications::TObjectOperatorResult(true);
+ return TConclusionStatus::Success();
}
void TAddColumnOperation::DoSerializeScheme(NKikimrSchemeOp::TAlterColumnTableSchemaPreset& presetProto) const {
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.h b/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.h
index d5f8677e23..30405d1a68 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.h
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/operations/add_column.h
@@ -13,7 +13,7 @@ private:
TString ColumnType;
bool NotNull = false;
public:
- NMetadata::NModifications::TObjectOperatorResult DoDeserialize(const NYql::TObjectSettingsImpl::TFeatures& features) override;
+ TConclusionStatus DoDeserialize(NYql::TObjectSettingsImpl::TFeaturesExtractor& features) override;
void DoSerializeScheme(NKikimrSchemeOp::TAlterColumnTableSchemaPreset& presetProto) const override;
};
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.cpp b/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.cpp
index 068bae1fc9..e78d16f928 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.cpp
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.cpp
@@ -2,29 +2,29 @@
namespace NKikimr::NKqp::NColumnshard {
-NKikimr::NMetadata::NModifications::TObjectOperatorResult TAlterColumnOperation::DoDeserialize(const NYql::TObjectSettingsImpl::TFeatures& features) {
+TConclusionStatus TAlterColumnOperation::DoDeserialize(NYql::TObjectSettingsImpl::TFeaturesExtractor& features) {
{
- auto it = features.find("NAME");
- if (it == features.end()) {
- return NMetadata::NModifications::TObjectOperatorResult("can't find alter parameter NAME");
+ auto fValue = features.Extract("NAME");
+ if (!fValue) {
+ return TConclusionStatus::Fail("can't find alter parameter NAME");
}
- ColumnName = it->second;
+ ColumnName = *fValue;
}
{
- auto it = features.find("LOW_CARDINALITY");
- if (it != features.end()) {
+ auto fValue = features.Extract("LOW_CARDINALITY");
+ if (fValue) {
bool value;
- if (!TryFromString<bool>(it->second, value)) {
- return NMetadata::NModifications::TObjectOperatorResult("cannot parse LOW_CARDINALITY as bool");
+ if (!TryFromString<bool>(*fValue, value)) {
+ return TConclusionStatus::Fail("cannot parse LOW_CARDINALITY as bool");
}
LowCardinality = value;
}
}
auto result = CompressionDiff.DeserializeFromRequestFeatures(features);
if (!result) {
- return NMetadata::NModifications::TObjectOperatorResult(result.GetErrorMessage());
+ return TConclusionStatus::Fail(result.GetErrorMessage());
}
- return NMetadata::NModifications::TObjectOperatorResult(true);
+ return TConclusionStatus::Success();
}
void TAlterColumnOperation::DoSerializeScheme(NKikimrSchemeOp::TAlterColumnTableSchemaPreset& presetProto) const {
diff --git a/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.h b/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.h
index 34f1e26380..13927b8e63 100644
--- a/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.h
+++ b/ydb/core/kqp/gateway/behaviour/tablestore/operations/alter_column.h
@@ -16,7 +16,7 @@ private:
NArrow::TCompressionDiff CompressionDiff;
std::optional<bool> LowCardinality;
public:
- NMetadata::NModifications::TObjectOperatorResult DoDeserialize(const NYql::TObjectSettingsImpl::TFeatures& features) override;
+ TConclusionStatus DoDeserialize(NYql::TObjectSettingsImpl::TFeaturesExtractor& features) override;
void DoSerializeScheme(NKikimrSchemeOp::TAlterColumnTableSchemaPreset& presetProto) const override;
};
diff --git a/ydb/core/kqp/gateway/kqp_ic_gateway.cpp b/ydb/core/kqp/gateway/kqp_ic_gateway.cpp
index bad166e2bb..19a6fdc31d 100644
--- a/ydb/core/kqp/gateway/kqp_ic_gateway.cpp
+++ b/ydb/core/kqp/gateway/kqp_ic_gateway.cpp
@@ -1401,7 +1401,7 @@ public:
private:
TKikimrIcGateway& Owner;
protected:
- virtual TFuture<NMetadata::NModifications::TObjectOperatorResult> DoExecute(
+ virtual TFuture<TConclusionStatus> DoExecute(
NMetadata::IClassBehaviour::TPtr manager, const TSettings& settings,
const NMetadata::NModifications::IOperationsManager::TExternalModificationContext& context) = 0;
ui32 GetNodeId() const {
@@ -1437,17 +1437,21 @@ public:
context.SetUserToken(*GetUserToken());
}
context.SetDatabase(Owner.Database);
- return DoExecute(cBehaviour, settings, context).Apply([](const NThreading::TFuture<NMetadata::NModifications::TObjectOperatorResult>& f) {
- if (f.HasValue() && !f.HasException() && f.GetValue().IsSuccess()) {
+ return DoExecute(cBehaviour, settings, context).Apply([](const NThreading::TFuture<TConclusionStatus>& f) {
+ if (f.HasValue() && !f.HasException() && f.GetValue().Ok()) {
TGenericResult result;
result.SetSuccess();
return NThreading::MakeFuture<TGenericResult>(result);
- } else {
+ } else if (f.HasValue()) {
TGenericResult result;
result.AddIssue(NYql::TIssue(f.GetValue().GetErrorMessage()));
return NThreading::MakeFuture<TGenericResult>(result);
+ } else {
+ TGenericResult result;
+ result.AddIssue(NYql::TIssue("Haven't reply"));
+ return NThreading::MakeFuture<TGenericResult>(result);
}
- });
+ });
} catch (yexception& e) {
return MakeFuture(ResultFromException<TGenericResult>(e));
}
@@ -1458,7 +1462,7 @@ public:
private:
using TBase = IObjectModifier<NYql::TCreateObjectSettings>;
protected:
- virtual TFuture<NMetadata::NModifications::TObjectOperatorResult> DoExecute(
+ virtual TFuture<TConclusionStatus> DoExecute(
NMetadata::IClassBehaviour::TPtr manager, const NYql::TCreateObjectSettings& settings,
const NMetadata::NModifications::IOperationsManager::TExternalModificationContext& context) override
{
@@ -1472,7 +1476,7 @@ public:
private:
using TBase = IObjectModifier<NYql::TAlterObjectSettings>;
protected:
- virtual TFuture<NMetadata::NModifications::TObjectOperatorResult> DoExecute(
+ virtual TFuture<TConclusionStatus> DoExecute(
NMetadata::IClassBehaviour::TPtr manager, const NYql::TAlterObjectSettings& settings,
const NMetadata::NModifications::IOperationsManager::TExternalModificationContext& context) override {
return manager->GetOperationsManager()->AlterObject(settings, TBase::GetNodeId(), manager, context);
@@ -1485,7 +1489,7 @@ public:
private:
using TBase = IObjectModifier<NYql::TDropObjectSettings>;
protected:
- virtual TFuture<NMetadata::NModifications::TObjectOperatorResult> DoExecute(
+ virtual TFuture<TConclusionStatus> DoExecute(
NMetadata::IClassBehaviour::TPtr manager, const NYql::TDropObjectSettings& settings,
const NMetadata::NModifications::IOperationsManager::TExternalModificationContext& context) override {
return manager->GetOperationsManager()->DropObject(settings, TBase::GetNodeId(), manager, context);
diff --git a/ydb/core/kqp/provider/yql_kikimr_exec.cpp b/ydb/core/kqp/provider/yql_kikimr_exec.cpp
index 3ffd5f8fb6..16b62feae6 100644
--- a/ydb/core/kqp/provider/yql_kikimr_exec.cpp
+++ b/ydb/core/kqp/provider/yql_kikimr_exec.cpp
@@ -133,18 +133,18 @@ namespace {
return dropGroupSettings;
}
- TString GetOrDefault(const std::map<TString, TString>& container, const TString& key, const TString& defaultValue = TString{}) {
- auto it = container.find(key);
- return it == container.end() ? defaultValue : it->second;
+ TString GetOrDefault(const TCreateObjectSettings& container, const TString& key, const TString& defaultValue = TString{}) {
+ auto fValue = container.GetFeaturesExtractor().Extract(key);
+ return fValue ? *fValue : defaultValue;
}
TCreateExternalDataSourceSettings ParseCreateExternalDataSourceSettings(const TCreateObjectSettings& settings) {
TCreateExternalDataSourceSettings out;
out.ExternalDataSource = settings.GetObjectId();
- out.SourceType = GetOrDefault(settings.GetFeatures(), "source_type");
- out.AuthMethod = GetOrDefault(settings.GetFeatures(), "auth_method");
- out.Installation = GetOrDefault(settings.GetFeatures(), "installation");
- out.Location = GetOrDefault(settings.GetFeatures(), "location");
+ out.SourceType = GetOrDefault(settings, "source_type");
+ out.AuthMethod = GetOrDefault(settings, "auth_method");
+ out.Installation = GetOrDefault(settings, "installation");
+ out.Location = GetOrDefault(settings, "location");
return out;
}
diff --git a/ydb/core/tx/tiering/rule/manager.cpp b/ydb/core/tx/tiering/rule/manager.cpp
index b3f53c7ba1..bdcfac875c 100644
--- a/ydb/core/tx/tiering/rule/manager.cpp
+++ b/ydb/core/tx/tiering/rule/manager.cpp
@@ -16,15 +16,15 @@ NMetadata::NModifications::TOperationParsingResult TTieringRulesManager::DoBuild
NMetadata::NInternal::TTableRecord result;
result.SetColumn(TTieringRule::TDecoder::TieringRuleId, NMetadata::NInternal::TYDBValue::Utf8(settings.GetObjectId()));
{
- auto it = settings.GetFeatures().find(TTieringRule::TDecoder::DefaultColumn);
- if (it != settings.GetFeatures().end()) {
- result.SetColumn(TTieringRule::TDecoder::DefaultColumn, NMetadata::NInternal::TYDBValue::Utf8(it->second));
+ auto fValue = settings.GetFeaturesExtractor().Extract(TTieringRule::TDecoder::DefaultColumn);
+ if (fValue) {
+ result.SetColumn(TTieringRule::TDecoder::DefaultColumn, NMetadata::NInternal::TYDBValue::Utf8(*fValue));
}
}
{
- auto it = settings.GetFeatures().find(TTieringRule::TDecoder::Description);
- if (it != settings.GetFeatures().end()) {
- result.SetColumn(TTieringRule::TDecoder::Description, NMetadata::NInternal::TYDBValue::Utf8(it->second));
+ auto fValue = settings.GetFeaturesExtractor().Extract(TTieringRule::TDecoder::Description);
+ if (fValue) {
+ result.SetColumn(TTieringRule::TDecoder::Description, NMetadata::NInternal::TYDBValue::Utf8(*fValue));
}
}
return result;
diff --git a/ydb/core/tx/tiering/tier/manager.cpp b/ydb/core/tx/tiering/tier/manager.cpp
index 27a4732515..69bd962233 100644
--- a/ydb/core/tx/tiering/tier/manager.cpp
+++ b/ydb/core/tx/tiering/tier/manager.cpp
@@ -11,11 +11,11 @@ NMetadata::NModifications::TOperationParsingResult TTiersManager::DoBuildPatchFr
NMetadata::NInternal::TTableRecord result;
result.SetColumn(TTierConfig::TDecoder::TierName, NMetadata::NInternal::TYDBValue::Utf8(settings.GetObjectId()));
{
- auto it = settings.GetFeatures().find(TTierConfig::TDecoder::TierConfig);
- if (it != settings.GetFeatures().end()) {
+ auto fConfig = settings.GetFeaturesExtractor().Extract(TTierConfig::TDecoder::TierConfig);
+ if (fConfig) {
NKikimrSchemeOp::TStorageTierConfig proto;
- if (!::google::protobuf::TextFormat::ParseFromString(it->second, &proto)) {
- return "incorrect proto format";
+ if (!::google::protobuf::TextFormat::ParseFromString(*fConfig, &proto)) {
+ return TConclusionStatus::Fail("incorrect proto format");
} else if (proto.HasObjectStorage()) {
TString defaultUserId;
if (context.GetExternalData().GetUserToken()) {
@@ -25,33 +25,33 @@ NMetadata::NModifications::TOperationParsingResult TTiersManager::DoBuildPatchFr
if (proto.GetObjectStorage().HasSecretableAccessKey()) {
auto accessKey = NMetadata::NSecret::TSecretIdOrValue::DeserializeFromProto(proto.GetObjectStorage().GetSecretableAccessKey(), defaultUserId);
if (!accessKey) {
- return "AccessKey description is incorrect";
+ return TConclusionStatus::Fail("AccessKey description is incorrect");
}
*proto.MutableObjectStorage()->MutableSecretableAccessKey() = accessKey->SerializeToProto();
} else if (proto.GetObjectStorage().HasAccessKey()) {
auto accessKey = NMetadata::NSecret::TSecretIdOrValue::DeserializeFromString(proto.GetObjectStorage().GetAccessKey(), defaultUserId);
if (!accessKey) {
- return "AccessKey is incorrect";
+ return TConclusionStatus::Fail("AccessKey is incorrect");
}
*proto.MutableObjectStorage()->MutableAccessKey() = accessKey->SerializeToString();
} else {
- return "AccessKey not configured";
+ return TConclusionStatus::Fail("AccessKey not configured");
}
if (proto.GetObjectStorage().HasSecretableSecretKey()) {
auto secretKey = NMetadata::NSecret::TSecretIdOrValue::DeserializeFromProto(proto.GetObjectStorage().GetSecretableSecretKey(), defaultUserId);
if (!secretKey) {
- return "SecretKey description is incorrect";
+ return TConclusionStatus::Fail("SecretKey description is incorrect");
}
*proto.MutableObjectStorage()->MutableSecretableSecretKey() = secretKey->SerializeToProto();
} else if (proto.GetObjectStorage().HasSecretKey()) {
auto secretKey = NMetadata::NSecret::TSecretIdOrValue::DeserializeFromString(proto.GetObjectStorage().GetSecretKey(), defaultUserId);
if (!secretKey) {
- return "SecretKey is incorrect";
+ return TConclusionStatus::Fail("SecretKey is incorrect");
}
*proto.MutableObjectStorage()->MutableSecretKey() = secretKey->SerializeToString();
} else {
- return "SecretKey not configured";
+ return TConclusionStatus::Fail("SecretKey not configured");
}
}
result.SetColumn(TTierConfig::TDecoder::TierConfig, NMetadata::NInternal::TYDBValue::Utf8(proto.DebugString()));
diff --git a/ydb/services/ext_index/metadata/manager.cpp b/ydb/services/ext_index/metadata/manager.cpp
index cfdd7d681c..9e7b701287 100644
--- a/ydb/services/ext_index/metadata/manager.cpp
+++ b/ydb/services/ext_index/metadata/manager.cpp
@@ -45,14 +45,14 @@ void TManager::DoPrepareObjectsBeforeModification(std::vector<TObject>&& patched
NModifications::TOperationParsingResult TManager::DoBuildPatchFromSettings(const NYql::TObjectSettingsImpl& settings,
TInternalModificationContext& context) const {
if (context.GetActivityType() == IOperationsManager::EActivityType::Alter) {
- return "index modification currently unsupported";
+ return TConclusionStatus::Fail("index modification currently unsupported");
} else {
NInternal::TTableRecord result;
TStringBuf sb(settings.GetObjectId().data(), settings.GetObjectId().size());
TStringBuf l;
TStringBuf r;
if (!sb.TrySplit(':', l, r)) {
- return "incorrect objectId format (path:index_id)";
+ return TConclusionStatus::Fail("incorrect objectId format (path:index_id)");
}
result.SetColumn(TObject::TDecoder::TablePath, NInternal::TYDBValue::Utf8(l));
result.SetColumn(TObject::TDecoder::IndexId, NInternal::TYDBValue::Utf8(r));
@@ -61,25 +61,28 @@ NModifications::TOperationParsingResult TManager::DoBuildPatchFromSettings(const
context.SetActivityType(IOperationsManager::EActivityType::Alter);
result.SetColumn(TObject::TDecoder::Delete, NInternal::TYDBValue::Bool(true));
} else if (context.GetActivityType() == IOperationsManager::EActivityType::Create) {
- if (auto dValue = settings.GetFeature<bool>(TObject::TDecoder::Delete, false)) {
+ if (auto dValue = settings.GetFeaturesExtractor().Extract<bool>(TObject::TDecoder::Delete, false)) {
result.SetColumn(TObject::TDecoder::Delete, NInternal::TYDBValue::Bool(*dValue));
} else {
- return "'delete' flag is incorrect";
+ return TConclusionStatus::Fail("'delete' flag is incorrect");
}
- if (auto extractorStr = settings.GetFeature<TString>(TObject::TDecoder::Extractor)) {
+ if (auto extractorStr = settings.GetFeaturesExtractor().Extract(TObject::TDecoder::Extractor)) {
TInterfaceContainer<IIndexExtractor> object;
if (!object.DeserializeFromJson(*extractorStr)) {
- return "cannot parse extractor info";
+ return TConclusionStatus::Fail("cannot parse extractor info");
}
result.SetColumn(TObject::TDecoder::Extractor, NInternal::TYDBValue::Utf8(object.SerializeToJson().GetStringRobust()));
} else {
- return "cannot found extractor info";
+ return TConclusionStatus::Fail("cannot found extractor info");
}
- if (auto aValue = settings.GetFeature<bool>(TObject::TDecoder::Active, false)) {
+ if (auto aValue = settings.GetFeaturesExtractor().Extract<bool>(TObject::TDecoder::Active, false)) {
result.SetColumn(TObject::TDecoder::Active, NInternal::TYDBValue::Bool(*aValue));
} else {
- return "'active' flag is incorrect";
+ return TConclusionStatus::Fail("'active' flag is incorrect");
+ }
+ if (!settings.GetFeaturesExtractor().IsFinished()) {
+ return TConclusionStatus::Fail("undefined parameters: " + settings.GetFeaturesExtractor().GetRemainedParamsString());
}
}
diff --git a/ydb/services/metadata/abstract/CMakeLists.darwin-x86_64.txt b/ydb/services/metadata/abstract/CMakeLists.darwin-x86_64.txt
index 42d363b209..a6d838e7a9 100644
--- a/ydb/services/metadata/abstract/CMakeLists.darwin-x86_64.txt
+++ b/ydb/services/metadata/abstract/CMakeLists.darwin-x86_64.txt
@@ -23,6 +23,7 @@ target_link_libraries(services-metadata-abstract PUBLIC
services-metadata-request
api-protos
ydb-core-base
+ yql-core-expr_nodes
)
target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/common.cpp
@@ -30,6 +31,8 @@ target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/fetcher.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/initialization.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/parsing.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/request_features.cpp
)
generate_enum_serilization(services-metadata-abstract
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.h
diff --git a/ydb/services/metadata/abstract/CMakeLists.linux-aarch64.txt b/ydb/services/metadata/abstract/CMakeLists.linux-aarch64.txt
index 1d6133cd26..8f7886ef57 100644
--- a/ydb/services/metadata/abstract/CMakeLists.linux-aarch64.txt
+++ b/ydb/services/metadata/abstract/CMakeLists.linux-aarch64.txt
@@ -24,6 +24,7 @@ target_link_libraries(services-metadata-abstract PUBLIC
services-metadata-request
api-protos
ydb-core-base
+ yql-core-expr_nodes
)
target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/common.cpp
@@ -31,6 +32,8 @@ target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/fetcher.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/initialization.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/parsing.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/request_features.cpp
)
generate_enum_serilization(services-metadata-abstract
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.h
diff --git a/ydb/services/metadata/abstract/CMakeLists.linux-x86_64.txt b/ydb/services/metadata/abstract/CMakeLists.linux-x86_64.txt
index 1d6133cd26..8f7886ef57 100644
--- a/ydb/services/metadata/abstract/CMakeLists.linux-x86_64.txt
+++ b/ydb/services/metadata/abstract/CMakeLists.linux-x86_64.txt
@@ -24,6 +24,7 @@ target_link_libraries(services-metadata-abstract PUBLIC
services-metadata-request
api-protos
ydb-core-base
+ yql-core-expr_nodes
)
target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/common.cpp
@@ -31,6 +32,8 @@ target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/fetcher.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/initialization.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/parsing.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/request_features.cpp
)
generate_enum_serilization(services-metadata-abstract
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.h
diff --git a/ydb/services/metadata/abstract/CMakeLists.windows-x86_64.txt b/ydb/services/metadata/abstract/CMakeLists.windows-x86_64.txt
index 42d363b209..a6d838e7a9 100644
--- a/ydb/services/metadata/abstract/CMakeLists.windows-x86_64.txt
+++ b/ydb/services/metadata/abstract/CMakeLists.windows-x86_64.txt
@@ -23,6 +23,7 @@ target_link_libraries(services-metadata-abstract PUBLIC
services-metadata-request
api-protos
ydb-core-base
+ yql-core-expr_nodes
)
target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/common.cpp
@@ -30,6 +31,8 @@ target_sources(services-metadata-abstract PRIVATE
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/fetcher.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.cpp
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/initialization.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/parsing.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/request_features.cpp
)
generate_enum_serilization(services-metadata-abstract
${CMAKE_SOURCE_DIR}/ydb/services/metadata/abstract/kqp_common.h
diff --git a/ydb/services/metadata/abstract/parsing.cpp b/ydb/services/metadata/abstract/parsing.cpp
new file mode 100644
index 0000000000..7f32bfff28
--- /dev/null
+++ b/ydb/services/metadata/abstract/parsing.cpp
@@ -0,0 +1,5 @@
+#include "parsing.h"
+
+namespace NYql {
+
+}
diff --git a/ydb/services/metadata/abstract/parsing.h b/ydb/services/metadata/abstract/parsing.h
new file mode 100644
index 0000000000..01e0972a32
--- /dev/null
+++ b/ydb/services/metadata/abstract/parsing.h
@@ -0,0 +1,50 @@
+#pragma once
+#include "request_features.h"
+#include <ydb/library/accessor/accessor.h>
+#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
+
+#include <util/generic/string.h>
+#include <map>
+#include <optional>
+
+namespace NYql {
+class TObjectSettingsImpl {
+public:
+ using TFeaturesExtractor = NYql::TFeaturesExtractor;
+private:
+ using TFeatures = THashMap<TString, TString>;
+ YDB_READONLY_DEF(TString, TypeId);
+ YDB_READONLY_DEF(TString, ObjectId);
+ TFeatures Features;
+ std::shared_ptr<TFeaturesExtractor> FeaturesExtractor;
+public:
+
+ TFeaturesExtractor& GetFeaturesExtractor() const {
+ Y_VERIFY(!!FeaturesExtractor);
+ return *FeaturesExtractor;
+ }
+
+ template <class TKiObject>
+ bool DeserializeFromKi(const TKiObject& data) {
+ ObjectId = data.ObjectId();
+ TypeId = data.TypeId();
+ for (auto&& i : data.Features()) {
+ if (auto maybeAtom = i.template Maybe<NYql::NNodes::TCoAtom>()) {
+ Features.emplace(maybeAtom.Cast().StringValue(), "");
+ } else if (auto maybeTuple = i.template Maybe<NNodes::TCoNameValueTuple>()) {
+ auto tuple = maybeTuple.Cast();
+ if (auto tupleValue = tuple.Value().template Maybe<NNodes::TCoAtom>()) {
+ Features.emplace(tuple.Name().Value(), tupleValue.Cast().Value());
+ }
+ }
+ }
+ FeaturesExtractor = std::make_shared<TFeaturesExtractor>(Features);
+ return true;
+ }
+};
+
+using TCreateObjectSettings = TObjectSettingsImpl;
+using TAlterObjectSettings = TObjectSettingsImpl;
+using TDropObjectSettings = TObjectSettingsImpl;
+
+}
diff --git a/ydb/services/metadata/abstract/request_features.cpp b/ydb/services/metadata/abstract/request_features.cpp
new file mode 100644
index 0000000000..8f364838df
--- /dev/null
+++ b/ydb/services/metadata/abstract/request_features.cpp
@@ -0,0 +1,25 @@
+#include "request_features.h"
+#include <util/string/join.h>
+#include <set>
+
+namespace NYql {
+TString TFeaturesExtractor::GetRemainedParamsString() const {
+ std::set<TString> features;
+ for (auto&& i : Features) {
+ features.emplace(i.first);
+ }
+ return JoinSeq(",", features);
+}
+
+std::optional<TString> TFeaturesExtractor::Extract(const TString& paramName) {
+ auto it = Features.find(paramName);
+ if (it == Features.end()) {
+ return {};
+ } else {
+ const TString result = it->second;
+ Features.erase(it);
+ return result;
+ }
+}
+
+}
diff --git a/ydb/services/metadata/abstract/request_features.h b/ydb/services/metadata/abstract/request_features.h
new file mode 100644
index 0000000000..c985276ceb
--- /dev/null
+++ b/ydb/services/metadata/abstract/request_features.h
@@ -0,0 +1,44 @@
+#pragma once
+#include <util/generic/string.h>
+#include <util/generic/hash.h>
+#include <map>
+#include <optional>
+
+namespace NYql {
+class TFeaturesExtractor: TNonCopyable {
+private:
+ THashMap<TString, TString> Features;
+public:
+ explicit TFeaturesExtractor(const THashMap<TString, TString>& features)
+ : Features(features) {
+
+ }
+
+ explicit TFeaturesExtractor(THashMap<TString, TString>&& features)
+ : Features(std::move(features)) {
+
+ }
+
+ bool IsFinished() const {
+ return Features.empty();
+ }
+
+ TString GetRemainedParamsString() const;
+
+ template <class T>
+ std::optional<T> Extract(const TString& featureId, const std::optional<T> noExistsValue = {}) {
+ T result;
+ auto it = Features.find(featureId);
+ if (it == Features.end()) {
+ return noExistsValue;
+ } else if (TryFromString(it->second, result)) {
+ Features.erase(it);
+ return result;
+ } else {
+ return {};
+ }
+ }
+
+ std::optional<TString> Extract(const TString& paramName);
+};
+}
diff --git a/ydb/services/metadata/manager/abstract.cpp b/ydb/services/metadata/manager/abstract.cpp
index b824874d72..a039dc9db2 100644
--- a/ydb/services/metadata/manager/abstract.cpp
+++ b/ydb/services/metadata/manager/abstract.cpp
@@ -34,33 +34,33 @@ NKikimr::NMetadata::NModifications::TTableSchema& TTableSchema::AddColumn(const
return *this;
}
-NThreading::TFuture<NKikimr::NMetadata::NModifications::TObjectOperatorResult> IOperationsManager::DropObject(const NYql::TDropObjectSettings& settings,
+NThreading::TFuture<TConclusionStatus> IOperationsManager::DropObject(const NYql::TDropObjectSettings& settings,
const ui32 nodeId, IClassBehaviour::TPtr manager, const TExternalModificationContext& context) const
{
if (!NMetadata::NProvider::TServiceOperator::IsEnabled()) {
- return NThreading::MakeFuture<TObjectOperatorResult>("metadata provider service is disabled");
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("metadata provider service is disabled"));
}
TInternalModificationContext internalContext(context);
internalContext.SetActivityType(EActivityType::Drop);
return DoModify(settings, nodeId, manager, internalContext);
}
-NThreading::TFuture<NKikimr::NMetadata::NModifications::TObjectOperatorResult> IOperationsManager::AlterObject(const NYql::TAlterObjectSettings& settings,
+NThreading::TFuture<TConclusionStatus> IOperationsManager::AlterObject(const NYql::TAlterObjectSettings& settings,
const ui32 nodeId, IClassBehaviour::TPtr manager, const TExternalModificationContext& context) const
{
if (!NMetadata::NProvider::TServiceOperator::IsEnabled()) {
- return NThreading::MakeFuture<TObjectOperatorResult>("metadata provider service is disabled");
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("metadata provider service is disabled"));
}
TInternalModificationContext internalContext(context);
internalContext.SetActivityType(EActivityType::Alter);
return DoModify(settings, nodeId, manager, internalContext);
}
-NThreading::TFuture<NKikimr::NMetadata::NModifications::TObjectOperatorResult> IOperationsManager::CreateObject(const NYql::TCreateObjectSettings& settings,
+NThreading::TFuture<TConclusionStatus> IOperationsManager::CreateObject(const NYql::TCreateObjectSettings& settings,
const ui32 nodeId, IClassBehaviour::TPtr manager, const TExternalModificationContext& context) const
{
if (!NMetadata::NProvider::TServiceOperator::IsEnabled()) {
- return NThreading::MakeFuture<TObjectOperatorResult>("metadata provider service is disabled");
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("metadata provider service is disabled"));
}
TInternalModificationContext internalContext(context);
internalContext.SetActivityType(EActivityType::Create);
diff --git a/ydb/services/metadata/manager/abstract.h b/ydb/services/metadata/manager/abstract.h
index 747b46f223..f761061f9c 100644
--- a/ydb/services/metadata/manager/abstract.h
+++ b/ydb/services/metadata/manager/abstract.h
@@ -5,108 +5,19 @@
#include <ydb/core/tx/datashard/sys_tables.h>
#include <ydb/library/accessor/accessor.h>
#include <ydb/library/aclib/aclib.h>
+#include <ydb/library/conclusion/status.h>
+#include <ydb/library/conclusion/result.h>
#include <ydb/library/yql/ast/yql_expr_builder.h>
#include <ydb/library/yql/core/expr_nodes/yql_expr_nodes.h>
#include <ydb/services/metadata/abstract/kqp_common.h>
+#include <ydb/services/metadata/abstract/parsing.h>
#include <library/cpp/threading/future/core/future.h>
-namespace NYql {
-class TObjectSettingsImpl {
-public:
- using TFeatures = std::map<TString, TString>;
-private:
- YDB_READONLY_DEF(TString, TypeId);
- YDB_READONLY_DEF(TString, ObjectId);
- YDB_READONLY_DEF(TFeatures, Features);
-public:
- template <class T>
- std::optional<T> GetFeature(const TString& featureId, const std::optional<T> noExistsValue = {}) const {
- T result;
- auto it = Features.find(featureId);
- if (it == Features.end()) {
- return noExistsValue;
- } else if (TryFromString(it->second, result)) {
- return result;
- } else {
- return {};
- }
- }
-
- template <class TKiObject>
- bool DeserializeFromKi(const TKiObject& data) {
- ObjectId = data.ObjectId();
- TypeId = data.TypeId();
- for (auto&& i : data.Features()) {
- if (auto maybeAtom = i.template Maybe<NYql::NNodes::TCoAtom>()) {
- Features.emplace(maybeAtom.Cast().StringValue(), "");
- } else if (auto maybeTuple = i.template Maybe<NNodes::TCoNameValueTuple>()) {
- auto tuple = maybeTuple.Cast();
- if (auto tupleValue = tuple.Value().template Maybe<NNodes::TCoAtom>()) {
- Features.emplace(tuple.Name().Value(), tupleValue.Cast().Value());
- }
- }
- }
- return true;
- }
-};
-
-using TCreateObjectSettings = TObjectSettingsImpl;
-using TAlterObjectSettings = TObjectSettingsImpl;
-using TDropObjectSettings = TObjectSettingsImpl;
-
-}
-
namespace NKikimr::NMetadata::NModifications {
-class TOperationParsingResult {
-private:
- YDB_READONLY_FLAG(Success, false);
- YDB_READONLY_DEF(TString, ErrorMessage);
- YDB_READONLY_DEF(NInternal::TTableRecord, Record);
-public:
- TOperationParsingResult(const char* errorMessage)
- : SuccessFlag(false)
- , ErrorMessage(errorMessage) {
-
- }
-
- TOperationParsingResult(const TString& errorMessage)
- : SuccessFlag(false)
- , ErrorMessage(errorMessage) {
-
- }
-
- TOperationParsingResult(NInternal::TTableRecord&& record)
- : SuccessFlag(true)
- , Record(record) {
-
- }
-};
-
-class TObjectOperatorResult {
-private:
- YDB_READONLY_FLAG(Success, false);
- YDB_ACCESSOR_DEF(TString, ErrorMessage);
-public:
- explicit TObjectOperatorResult(const bool success)
- : SuccessFlag(success) {
-
- }
-
- TObjectOperatorResult(const TString& errorMessage)
- : SuccessFlag(false)
- , ErrorMessage(errorMessage) {
-
- }
-
- TObjectOperatorResult(const char* errorMessage)
- : SuccessFlag(false)
- , ErrorMessage(errorMessage) {
-
- }
-};
+using TOperationParsingResult = TConclusion<NInternal::TTableRecord>;
class TColumnInfo {
private:
@@ -165,18 +76,18 @@ public:
private:
YDB_ACCESSOR_DEF(std::optional<TTableSchema>, ActualSchema);
protected:
- virtual NThreading::TFuture<TObjectOperatorResult> DoModify(const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
+ virtual NThreading::TFuture<TConclusionStatus> DoModify(const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
IClassBehaviour::TPtr manager, TInternalModificationContext& context) const = 0;
public:
virtual ~IOperationsManager() = default;
- NThreading::TFuture<TObjectOperatorResult> CreateObject(const NYql::TCreateObjectSettings& settings, const ui32 nodeId,
+ NThreading::TFuture<TConclusionStatus> CreateObject(const NYql::TCreateObjectSettings& settings, const ui32 nodeId,
IClassBehaviour::TPtr manager, const TExternalModificationContext& context) const;
- NThreading::TFuture<TObjectOperatorResult> AlterObject(const NYql::TAlterObjectSettings& settings, const ui32 nodeId,
+ NThreading::TFuture<TConclusionStatus> AlterObject(const NYql::TAlterObjectSettings& settings, const ui32 nodeId,
IClassBehaviour::TPtr manager, const TExternalModificationContext& context) const;
- NThreading::TFuture<TObjectOperatorResult> DropObject(const NYql::TDropObjectSettings& settings, const ui32 nodeId,
+ NThreading::TFuture<TConclusionStatus> DropObject(const NYql::TDropObjectSettings& settings, const ui32 nodeId,
IClassBehaviour::TPtr manager, const TExternalModificationContext& context) const;
const TTableSchema& GetSchema() const {
@@ -198,7 +109,13 @@ public:
TOperationParsingResult BuildPatchFromSettings(const NYql::TObjectSettingsImpl& settings,
IOperationsManager::TInternalModificationContext& context) const {
- return DoBuildPatchFromSettings(settings, context);
+ TOperationParsingResult result = DoBuildPatchFromSettings(settings, context);
+ if (result) {
+ if (!settings.GetFeaturesExtractor().IsFinished()) {
+ return TConclusionStatus::Fail("undefined params: " + settings.GetFeaturesExtractor().GetRemainedParamsString());
+ }
+ }
+ return result;
}
void PrepareObjectsBeforeModification(std::vector<TObject>&& patchedObjects,
diff --git a/ydb/services/metadata/manager/generic_manager.h b/ydb/services/metadata/manager/generic_manager.h
index b3f23d1a21..473badf2ce 100644
--- a/ydb/services/metadata/manager/generic_manager.h
+++ b/ydb/services/metadata/manager/generic_manager.h
@@ -6,19 +6,19 @@ namespace NKikimr::NMetadata::NModifications {
class TOperationsController: public IAlterController {
private:
- YDB_READONLY_DEF(NThreading::TPromise<TObjectOperatorResult>, Promise);
+ YDB_READONLY_DEF(NThreading::TPromise<TConclusionStatus>, Promise);
public:
- TOperationsController(NThreading::TPromise<TObjectOperatorResult>&& p)
+ TOperationsController(NThreading::TPromise<TConclusionStatus>&& p)
: Promise(std::move(p))
{
}
virtual void OnAlteringProblem(const TString& errorMessage) override {
- Promise.SetValue(TObjectOperatorResult(false).SetErrorMessage(errorMessage));
+ Promise.SetValue(TConclusionStatus::Fail(errorMessage));
}
virtual void OnAlteringFinished() override {
- Promise.SetValue(TObjectOperatorResult(true));
+ Promise.SetValue(TConclusionStatus::Success());
}
};
@@ -30,40 +30,37 @@ private:
public:
using TInternalModificationContext = typename TBase::TInternalModificationContext;
protected:
- virtual NThreading::TFuture<TObjectOperatorResult> DoModify(
+ virtual NThreading::TFuture<TConclusionStatus> DoModify(
const NYql::TObjectSettingsImpl& settings, const ui32 nodeId,
IClassBehaviour::TPtr manager, TInternalModificationContext& context) const override
{
if (!manager) {
- TObjectOperatorResult result("modification object behaviour not initialized");
- return NThreading::MakeFuture<TObjectOperatorResult>(result);
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("modification object behaviour not initialized"));
}
if (!manager->GetOperationsManager()) {
- TObjectOperatorResult result("modification is unavailable for " + manager->GetTypeId());
- return NThreading::MakeFuture<TObjectOperatorResult>(result);
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("modification is unavailable for " + manager->GetTypeId()));
}
- auto promise = NThreading::NewPromise<TObjectOperatorResult>();
+ auto promise = NThreading::NewPromise<TConclusionStatus>();
auto result = promise.GetFuture();
{
TOperationParsingResult patch(TBase::BuildPatchFromSettings(settings, context));
if (!patch.IsSuccess()) {
- TObjectOperatorResult result(patch.GetErrorMessage());
- return NThreading::MakeFuture<TObjectOperatorResult>(result);
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail(patch.GetErrorMessage()));
}
auto c = std::make_shared<TOperationsController>(std::move(promise));
IAlterCommand::TPtr alterCommand;
switch (context.GetActivityType()) {
case IOperationsManager::EActivityType::Create:
- alterCommand = std::make_shared<TCreateCommand<T>>(patch.GetRecord(), manager, c, context);
+ alterCommand = std::make_shared<TCreateCommand<T>>(patch.GetResult(), manager, c, context);
break;
case IOperationsManager::EActivityType::Alter:
- alterCommand = std::make_shared<TAlterCommand<T>>(patch.GetRecord(), manager, c, context);
+ alterCommand = std::make_shared<TAlterCommand<T>>(patch.GetResult(), manager, c, context);
break;
case IOperationsManager::EActivityType::Drop:
- alterCommand = std::make_shared<TDropCommand<T>>(patch.GetRecord(), manager, c, context);
+ alterCommand = std::make_shared<TDropCommand<T>>(patch.GetResult(), manager, c, context);
break;
case IOperationsManager::EActivityType::Undefined:
- return NThreading::MakeFuture<TObjectOperatorResult>(TObjectOperatorResult("undefined action type"));
+ return NThreading::MakeFuture<TConclusionStatus>(TConclusionStatus::Fail("undefined action type"));
}
TActivationContext::Send(new IEventHandle(NProvider::MakeServiceId(nodeId), {}, new NProvider::TEvObjectsOperation(alterCommand)));
}
diff --git a/ydb/services/metadata/secret/manager.cpp b/ydb/services/metadata/secret/manager.cpp
index b4b776abd8..12f4b49bdc 100644
--- a/ydb/services/metadata/secret/manager.cpp
+++ b/ydb/services/metadata/secret/manager.cpp
@@ -29,16 +29,16 @@ NModifications::TOperationParsingResult TAccessManager::DoBuildPatchFromSettings
TStringBuf l;
TStringBuf r;
if (!sb.TrySplit(':', l, r)) {
- return "incorrect objectId format (secretId:accessSID)";
+ return TConclusionStatus::Fail("incorrect objectId format (secretId:accessSID)");
}
result.SetColumn(TAccess::TDecoder::SecretId, NInternal::TYDBValue::Utf8(l));
result.SetColumn(TAccess::TDecoder::AccessSID, NInternal::TYDBValue::Utf8(r));
if (!context.GetExternalData().GetUserToken()) {
- auto it = settings.GetFeatures().find(TAccess::TDecoder::OwnerUserId);
- if (it != settings.GetFeatures().end()) {
- result.SetColumn(TAccess::TDecoder::OwnerUserId, NInternal::TYDBValue::Utf8(it->second));
+ auto fValue = settings.GetFeaturesExtractor().Extract(TAccess::TDecoder::OwnerUserId);
+ if (fValue) {
+ result.SetColumn(TAccess::TDecoder::OwnerUserId, NInternal::TYDBValue::Utf8(*fValue));
} else {
- return "OwnerUserId not defined";
+ return TConclusionStatus::Fail("OwnerUserId not defined");
}
} else {
result.SetColumn(TAccess::TDecoder::OwnerUserId, NInternal::TYDBValue::Utf8(context.GetExternalData().GetUserToken()->GetUserSID()));
@@ -50,11 +50,11 @@ NModifications::TOperationParsingResult TSecretManager::DoBuildPatchFromSettings
TInternalModificationContext& context) const {
NInternal::TTableRecord result;
if (!context.GetExternalData().GetUserToken()) {
- auto it = settings.GetFeatures().find(TSecret::TDecoder::OwnerUserId);
- if (it != settings.GetFeatures().end()) {
- result.SetColumn(TSecret::TDecoder::OwnerUserId, NInternal::TYDBValue::Utf8(it->second));
+ auto fValue = settings.GetFeaturesExtractor().Extract(TSecret::TDecoder::OwnerUserId);
+ if (fValue) {
+ result.SetColumn(TSecret::TDecoder::OwnerUserId, NInternal::TYDBValue::Utf8(*fValue));
} else {
- return "OwnerUserId not defined";
+ return TConclusionStatus::Fail("OwnerUserId not defined");
}
} else {
result.SetColumn(TSecret::TDecoder::OwnerUserId, NInternal::TYDBValue::Utf8(context.GetExternalData().GetUserToken()->GetUserSID()));
@@ -72,15 +72,15 @@ NModifications::TOperationParsingResult TSecretManager::DoBuildPatchFromSettings
if (c == '_') {
continue;
}
- return "incorrect character for secret id: '" + TString(c) + "'";
+ return TConclusionStatus::Fail("incorrect character for secret id: '" + TString(c) + "'");
}
{
result.SetColumn(TSecret::TDecoder::SecretId, NInternal::TYDBValue::Utf8(settings.GetObjectId()));
}
{
- auto it = settings.GetFeatures().find(TSecret::TDecoder::Value);
- if (it != settings.GetFeatures().end()) {
- result.SetColumn(TSecret::TDecoder::Value, NInternal::TYDBValue::Utf8(it->second));
+ auto fValue = settings.GetFeaturesExtractor().Extract(TSecret::TDecoder::Value);
+ if (fValue) {
+ result.SetColumn(TSecret::TDecoder::Value, NInternal::TYDBValue::Utf8(*fValue));
}
}
return result;