summaryrefslogtreecommitdiffstats
path: root/yql/essentials/core/yql_expr_constraint.cpp
diff options
context:
space:
mode:
authormpereskokova <[email protected]>2025-06-03 15:52:10 +0300
committermpereskokova <[email protected]>2025-06-03 17:18:41 +0300
commitf341c9126a1c66f49b841f6ef787ab18bc3d3bf5 (patch)
tree59f68f1118f69ec0fd34a3e086dd18a5a87d590a /yql/essentials/core/yql_expr_constraint.cpp
parentb51b122d7876de2baef5405f3c7da3b10cf99b26 (diff)
Save distinct constraint for PruneKeys
commit_hash:c571530f0a74edc44a65da0388e8e4c543121044
Diffstat (limited to 'yql/essentials/core/yql_expr_constraint.cpp')
-rw-r--r--yql/essentials/core/yql_expr_constraint.cpp51
1 files changed, 41 insertions, 10 deletions
diff --git a/yql/essentials/core/yql_expr_constraint.cpp b/yql/essentials/core/yql_expr_constraint.cpp
index 7fcf560a2cf..dede320a721 100644
--- a/yql/essentials/core/yql_expr_constraint.cpp
+++ b/yql/essentials/core/yql_expr_constraint.cpp
@@ -822,23 +822,54 @@ private:
}
if constexpr (Adjacent) {
- if (const auto status = CopyAllFrom<0>(input, output, ctx); status != TStatus::Ok) {
- return status;
- }
+ TSet<TStringBuf> except = {
+ TUniqueConstraintNode::Name(),
+ TDistinctConstraintNode::Name(),
+ };
+ CopyExcept(*input, *input->Child(0), except);
+
+ auto uniqueConstraint = input->Child(0)->GetConstraint<TUniqueConstraintNode>();
+ auto distinctConstraint = input->Child(0)->GetConstraint<TDistinctConstraintNode>();
TPartOfConstraintBase::TSetType keys = GetPathsToKeys<true>(input->Child(1)->Tail(), input->Child(1)->Head().Head());
- TPartOfConstraintBase::TSetOfSetsType uniqueKeys;
- for (const auto& elem : keys) {
- uniqueKeys.insert(TPartOfConstraintBase::TSetType{elem});
- }
if (!keys.empty()) {
- input->AddConstraint(ctx.MakeConstraint<TUniqueConstraintNode>(TUniqueConstraintNode::TContentType{uniqueKeys}));
- input->AddConstraint(ctx.MakeConstraint<TDistinctConstraintNode>(TDistinctConstraintNode::TContentType{uniqueKeys}));
+ TPartOfConstraintBase::TSetOfSetsType uniqueKeys;
+ for (const auto& elem : keys) {
+ uniqueKeys.insert(TPartOfConstraintBase::TSetType{elem});
+ }
+
+ auto newUniqueConstraint = ctx.MakeConstraint<TUniqueConstraintNode>(TUniqueConstraintNode::TContentType{uniqueKeys});
+ if (uniqueConstraint) {
+ uniqueConstraint = TUniqueConstraintNode::Merge(
+ newUniqueConstraint,
+ dynamic_cast<const TUniqueConstraintNode*>(uniqueConstraint),
+ ctx);
+ } else {
+ uniqueConstraint = newUniqueConstraint;
+ }
+
+ auto newDistinctConstraint = ctx.MakeConstraint<TDistinctConstraintNode>(TDistinctConstraintNode::TContentType{uniqueKeys});
+ if (distinctConstraint) {
+ distinctConstraint = TDistinctConstraintNode::Merge(
+ newDistinctConstraint,
+ dynamic_cast<const TDistinctConstraintNode*>(distinctConstraint),
+ ctx);
+ } else {
+ distinctConstraint = newDistinctConstraint;
+ }
+ }
+
+ if (uniqueConstraint) {
+ input->AddConstraint(uniqueConstraint);
+ }
+ if (distinctConstraint) {
+ input->AddConstraint(distinctConstraint);
}
+
return TStatus::Ok;
}
- return FromFirst<TEmptyConstraintNode>(input, output, ctx);
+ return FromFirst<TEmptyConstraintNode, TUniqueConstraintNode, TDistinctConstraintNode>(input, output, ctx);
}
template<class TConstraint>