diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-07-05 19:43:24 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-07-05 19:43:24 +0300 |
commit | 4f33ac20e49231f7a57fc9f1c8fb43ce7ee2ada4 (patch) | |
tree | 4d66b88889fbe6cd560f84279cddd2fd93cd4beb | |
parent | 13b907fcea0f5d6556ecdc09830e8032f2b3a1c5 (diff) | |
download | ydb-4f33ac20e49231f7a57fc9f1c8fb43ce7ee2ada4.tar.gz |
YQL-16167 Support many levels paths in AssumeSorted.
-rw-r--r-- | ydb/library/yql/core/yql_opt_utils.cpp | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/ydb/library/yql/core/yql_opt_utils.cpp b/ydb/library/yql/core/yql_opt_utils.cpp index 94f95771e52..657aee76784 100644 --- a/ydb/library/yql/core/yql_opt_utils.cpp +++ b/ydb/library/yql/core/yql_opt_utils.cpp @@ -43,6 +43,15 @@ TExprNode::TPtr KeepConstraint(TExprNode::TPtr node, const TExprNode& src, TExpr return node; } +TExprNodeBuilder GetterBuilder(TExprNodeBuilder parent, ui32 index, TConstraintNode::TPathType path) { + if (path.empty()) + return parent.Arg(index, "item"); + + const auto& name = path.back(); + path.pop_back(); + return GetterBuilder(parent.Callable(index, "Member"), 0U, path).Atom(1, name).Seal(); +} + } TExprNode::TPtr MakeBoolNothing(TPositionHandle position, TExprContext& ctx) { @@ -1749,19 +1758,8 @@ TExprNode::TPtr KeepSortedConstraint(TExprNode::TPtr node, const TSortedConstrai .List() .Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder& { size_t index = 0; - for (auto c : constent) { - if (c.first.front().empty()) - parent.Arg(index++, "item"); - else if (1U == c.first.front().size()) { - parent.Callable(index++, "Member") - .Arg(0, "item") - .Atom(1, c.first.front().front()) - .Seal(); - } else { - parent.Callable(index++, "Null").Seal(); - break; - } - } + for (const auto& c : constent) + GetterBuilder(parent, index++, c.first.front()); return parent; }) .Seal() |