aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-05-15 11:14:22 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-05-15 11:14:22 +0300
commit6247839c1bd9fd6a2d540ebba3eb28b42f7e2b4f (patch)
treef4b917961025e41c5132795608665d56f2f0f3fd
parent58ef99d80c324d9dbe029bde0c9075364a1d8957 (diff)
downloadydb-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.cpp90
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;