diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-05-15 11:14:22 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-05-15 11:14:22 +0300 |
commit | 6247839c1bd9fd6a2d540ebba3eb28b42f7e2b4f (patch) | |
tree | f4b917961025e41c5132795608665d56f2f0f3fd | |
parent | 58ef99d80c324d9dbe029bde0c9075364a1d8957 (diff) | |
download | ydb-6247839c1bd9fd6a2d540ebba3eb28b42f7e2b4f.tar.gz |
YQL-8971 YQL-15555 Drop single row constrints from Condense1 with 'false' in switch.
Для указания на максимум одну строку в выхлопе потом будет специальный констрейнт Bounded.
-rw-r--r-- | ydb/library/yql/core/yql_expr_constraint.cpp | 90 |
1 files changed, 22 insertions, 68 deletions
diff --git a/ydb/library/yql/core/yql_expr_constraint.cpp b/ydb/library/yql/core/yql_expr_constraint.cpp index e42ce542b8e..f94333de64a 100644 --- a/ydb/library/yql/core/yql_expr_constraint.cpp +++ b/ydb/library/yql/core/yql_expr_constraint.cpp @@ -2749,37 +2749,34 @@ private: const auto initLambda = input->Child(1); const auto switchLambda = input->Child(2); - const bool singleRowOut = switchLambda->Tail().IsCallable(TCoBool::CallableName()) && IsFalse(switchLambda->Tail().Head().Content()); const TUniqueConstraintNode* unique = nullptr; const TDistinctConstraintNode* distinct = nullptr; - if (!singleRowOut) { - const auto sorted = input->Head().GetConstraint<TSortedConstraintNode>(); - const auto chopped = input->Head().GetConstraint<TChoppedConstraintNode>(); - if (sorted || chopped) { - if (const auto& keys = GetSimpleKeys<Wide>(*FuseInitLambda(*initLambda, *switchLambda, ctx), ctx); !keys.empty()) { - if (sorted && sorted->StartsWith(keys) || chopped && chopped->Equals(keys)) { - unique = ctx.MakeConstraint<TUniqueConstraintNode>(TUniqueConstraintNode::TFullSetType{keys}); - distinct = ctx.MakeConstraint<TDistinctConstraintNode>(TDistinctConstraintNode::TFullSetType{keys}); - if constexpr (Wide) { - if (const auto& mapping = TPartOfUniqueConstraintNode::GetCommonMapping(unique); !mapping.empty()) { - for (ui32 i = 0U; i < argsConstraints.size(); ++i) { - if (auto extracted = TPartOfUniqueConstraintNode::ExtractField(mapping, ctx.GetIndexAsString(i)); !extracted.empty()) { - argsConstraints[i].emplace_back(ctx.MakeConstraint<TPartOfUniqueConstraintNode>(std::move(extracted))); - } + const auto sorted = input->Head().GetConstraint<TSortedConstraintNode>(); + const auto chopped = input->Head().GetConstraint<TChoppedConstraintNode>(); + if (sorted || chopped) { + if (const auto& keys = GetSimpleKeys<Wide>(*FuseInitLambda(*initLambda, *switchLambda, ctx), ctx); !keys.empty()) { + if (sorted && sorted->StartsWith(keys) || chopped && chopped->Equals(keys)) { + unique = ctx.MakeConstraint<TUniqueConstraintNode>(TUniqueConstraintNode::TFullSetType{keys}); + distinct = ctx.MakeConstraint<TDistinctConstraintNode>(TDistinctConstraintNode::TFullSetType{keys}); + if constexpr (Wide) { + if (const auto& mapping = TPartOfUniqueConstraintNode::GetCommonMapping(unique); !mapping.empty()) { + for (ui32 i = 0U; i < argsConstraints.size(); ++i) { + if (auto extracted = TPartOfUniqueConstraintNode::ExtractField(mapping, ctx.GetIndexAsString(i)); !extracted.empty()) { + argsConstraints[i].emplace_back(ctx.MakeConstraint<TPartOfUniqueConstraintNode>(std::move(extracted))); } } + } - if (const auto& mapping = TPartOfDistinctConstraintNode::GetCommonMapping(distinct); !mapping.empty()) { - for (ui32 i = 0U; i < argsConstraints.size(); ++i) { - if (auto extracted = TPartOfDistinctConstraintNode::ExtractField(mapping, ctx.GetIndexAsString(i)); !extracted.empty()) { - argsConstraints[i].emplace_back(ctx.MakeConstraint<TPartOfDistinctConstraintNode>(std::move(extracted))); - } + if (const auto& mapping = TPartOfDistinctConstraintNode::GetCommonMapping(distinct); !mapping.empty()) { + for (ui32 i = 0U; i < argsConstraints.size(); ++i) { + if (auto extracted = TPartOfDistinctConstraintNode::ExtractField(mapping, ctx.GetIndexAsString(i)); !extracted.empty()) { + argsConstraints[i].emplace_back(ctx.MakeConstraint<TPartOfDistinctConstraintNode>(std::move(extracted))); } } - } else { - argsConstraints.front().emplace_back(ctx.MakeConstraint<TPartOfUniqueConstraintNode>(TPartOfUniqueConstraintNode::GetCommonMapping(unique))); - argsConstraints.front().emplace_back(ctx.MakeConstraint<TPartOfDistinctConstraintNode>(TPartOfDistinctConstraintNode::GetCommonMapping(distinct))); } + } else { + argsConstraints.front().emplace_back(ctx.MakeConstraint<TPartOfUniqueConstraintNode>(TPartOfUniqueConstraintNode::GetCommonMapping(unique))); + argsConstraints.front().emplace_back(ctx.MakeConstraint<TPartOfDistinctConstraintNode>(TPartOfDistinctConstraintNode::GetCommonMapping(distinct))); } } } @@ -2805,20 +2802,8 @@ private: } } - if (singleRowOut) { - if (const auto& fields = GetAllItemTypeFields(*input->GetTypeAnn(), ctx); !fields.empty()) { - TUniqueConstraintNode::TFullSetType sets; - sets.reserve(fields.size()); - for (const auto& field: fields) - sets.insert_unique(TUniqueConstraintNode::TSetType{TConstraintNode::TPathType(1U, field)}); - input->AddConstraint(ctx.MakeConstraint<TDistinctConstraintNode>(TDistinctConstraintNode::TFullSetType(sets))); - input->AddConstraint(ctx.MakeConstraint<TUniqueConstraintNode>(std::move(sets))); - } - } else { - GetCommonFromBothLambdas<TPartOfUniqueConstraintNode, Wide>(input, unique, ctx); - GetCommonFromBothLambdas<TPartOfDistinctConstraintNode, Wide>(input, distinct, ctx); - } - + GetCommonFromBothLambdas<TPartOfUniqueConstraintNode, Wide>(input, unique, ctx); + GetCommonFromBothLambdas<TPartOfDistinctConstraintNode, Wide>(input, distinct, ctx); return FromFirst<TEmptyConstraintNode>(input, output, ctx); } @@ -3169,37 +3154,6 @@ private: ExtractSimpleKeys(body, arg, columns); } - static std::vector<std::string_view> GetAllItemTypeFields(const TTypeAnnotationNode& type, TExprContext& ctx) { - std::vector<std::string_view> fields; - if (const auto itemType = GetSeqItemType(&type)) { - switch (itemType->GetKind()) { - case ETypeAnnotationKind::Struct: - if (const auto structType = itemType->Cast<TStructExprType>()) { - fields.reserve(structType->GetSize()); - std::transform(structType->GetItems().cbegin(), structType->GetItems().cend(), std::back_inserter(fields), std::bind(&TItemExprType::GetName, std::placeholders::_1)); - } - break; - case ETypeAnnotationKind::Tuple: - if (const auto size = itemType->Cast<TTupleExprType>()->GetSize()) { - fields.resize(size); - ui32 i = 0U; - std::generate(fields.begin(), fields.end(), [&]() { return ctx.GetIndexAsString(i++); }); - } - break; - case ETypeAnnotationKind::Multi: - if (const auto size = itemType->Cast<TMultiExprType>()->GetSize()) { - fields.resize(size); - ui32 i = 0U; - std::generate(fields.begin(), fields.end(), [&]() { return ctx.GetIndexAsString(i++); }); - } - break; - default: - break; - } - } - return fields; - } - template<bool Distinct> static const TUniqueConstraintNodeBase<Distinct>* GetDetailed(const TUniqueConstraintNodeBase<Distinct>* unique, const TTypeAnnotationNode& type, TExprContext& ctx) { return unique ? unique->GetComplicatedForType(type, ctx) : nullptr; |