diff options
author | ivanmorozov <ivanmorozov@yandex-team.com> | 2023-05-21 21:43:49 +0300 |
---|---|---|
committer | ivanmorozov <ivanmorozov@yandex-team.com> | 2023-05-21 21:43:49 +0300 |
commit | 1adca918f6d75cefd276edfcb74f9560a85de778 (patch) | |
tree | 3b44ad9171a621c33d9284754300aaa3f5e65ca2 | |
parent | d39e5e82c2e2b6b4c83ce0e26e66a3aa61d3b540 (diff) | |
download | ydb-1adca918f6d75cefd276edfcb74f9560a85de778.tar.gz |
use conclusion for object modifications
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; |