summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <[email protected]>2023-03-22 13:46:01 +0300
committera-romanov <[email protected]>2023-03-22 13:46:01 +0300
commitd4fbfbc142aae0ab5d500fdca8c8aa99691f22d6 (patch)
treeaae2660f3cfd5d7715ef199b0832a83dc2a34339
parenta01ef539b97d8eb4028a31320431266b063607d8 (diff)
YQL-15415 Inject Unordered on constraints transformer.
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_simple1.cpp21
-rw-r--r--ydb/library/yql/core/yql_expr_constraint.cpp11
2 files changed, 16 insertions, 16 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp
index 4061dab082e..fc5e95e8700 100644
--- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp
+++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp
@@ -1180,7 +1180,7 @@ TExprNode::TPtr OptimizeFlatContainerIf(const TExprNode::TPtr& node, TExprContex
return node;
}
-template <bool HeadOrTail, bool OrderAware = true>
+template <bool HeadOrTail>
TExprNode::TPtr OptimizeToOptional(const TExprNode::TPtr& node, TExprContext& ctx) {
if (node->Head().IsCallable("ToList")) {
YQL_CLOG(DEBUG, Core) << node->Content() << " over " << node->Head().Content();
@@ -1198,13 +1198,6 @@ TExprNode::TPtr OptimizeToOptional(const TExprNode::TPtr& node, TExprContext& ct
return ctx.NewCallable(node->Head().Pos(), "Nothing", {ExpandType(node->Pos(), *node->GetTypeAnn(), ctx)});
}
- if constexpr (!OrderAware) {
- if (node->Head().GetConstraint<TSortedConstraintNode>()) {
- YQL_CLOG(DEBUG, Core) << node->Content() << " over sorted collection";
- return ctx.ChangeChild(*node, 0, ctx.NewCallable(node->Head().Pos(), "Unordered", {node->HeadPtr()}));
- }
- }
-
return node;
}
@@ -4566,7 +4559,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) {
return node;
};
- map["ToOptional"] = std::bind(OptimizeToOptional<true, false>, _1, _2);
+ map["ToOptional"] = std::bind(OptimizeToOptional<true>, _1, _2);
map["Head"] = std::bind(OptimizeToOptional<true>, _1, _2);
map["Last"] = std::bind(OptimizeToOptional<false>, _1, _2);
@@ -4688,7 +4681,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) {
return node->Head().HeadPtr();
}
- if (node->Head().IsCallable({"Map", "FlatMap", "Filter", "Extend"})) {
+ if (node->Head().IsCallable({"Unordered", "Map", "FlatMap", "MultiMap", "Filter", "Extend"})) {
YQL_CLOG(DEBUG, Core) << "Drop " << node->Content() << " over unordered " << node->Head().Content();
return node->HeadPtr();
}
@@ -5327,11 +5320,9 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) {
}
if (TCoNothing::Match(&node->Head())) {
YQL_CLOG(DEBUG, Core) << node->Content() << " over " << node->Head().Content();
- return ctx.Builder(node->Pos())
- .Callable("Nothing")
- .Add(0, ExpandType(node->Pos(), *node->GetTypeAnn(), ctx))
- .Seal()
- .Build();
+ return Build<TCoNothing>(ctx, node->Pos())
+ .OptionalType(ExpandType(node->Pos(), *node->GetTypeAnn(), ctx))
+ .Done().Ptr();
}
return node;
};
diff --git a/ydb/library/yql/core/yql_expr_constraint.cpp b/ydb/library/yql/core/yql_expr_constraint.cpp
index f66b4a6d7c3..55bebec750a 100644
--- a/ydb/library/yql/core/yql_expr_constraint.cpp
+++ b/ydb/library/yql/core/yql_expr_constraint.cpp
@@ -152,7 +152,7 @@ public:
Functions["Just"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>;
Functions["Unwrap"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>;
Functions["ToList"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>;
- Functions["ToOptional"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>;
+ Functions["ToOptional"] = &TCallableConstraintTransformer::ToOptionalWrap;
Functions["Head"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>;
Functions["Last"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>;
Functions["Reverse"] = &TCallableConstraintTransformer::ReverseWrap;
@@ -1698,6 +1698,15 @@ private:
return TStatus::Ok;
}
+ TStatus ToOptionalWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const {
+ if (input->Head().GetConstraint<TSortedConstraintNode>()) {
+ output = ctx.ChangeChild(*input, 0U, ctx.NewCallable(input->Pos(), "Unordered", {input->HeadPtr()}));
+ return TStatus::Repeat;
+ }
+
+ return FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>(input, output, ctx);
+ }
+
template<bool IsList, bool IsFlat>
TStatus PassOrEmptyWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const {
if (const auto part = input->Tail().GetConstraint<TPartOfSortedConstraintNode>())