diff options
author | a-romanov <[email protected]> | 2023-03-22 13:46:01 +0300 |
---|---|---|
committer | a-romanov <[email protected]> | 2023-03-22 13:46:01 +0300 |
commit | d4fbfbc142aae0ab5d500fdca8c8aa99691f22d6 (patch) | |
tree | aae2660f3cfd5d7715ef199b0832a83dc2a34339 | |
parent | a01ef539b97d8eb4028a31320431266b063607d8 (diff) |
YQL-15415 Inject Unordered on constraints transformer.
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_simple1.cpp | 21 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_constraint.cpp | 11 |
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>()) |