aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-07-05 19:43:24 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-07-05 19:43:24 +0300
commit4f33ac20e49231f7a57fc9f1c8fb43ce7ee2ada4 (patch)
tree4d66b88889fbe6cd560f84279cddd2fd93cd4beb
parent13b907fcea0f5d6556ecdc09830e8032f2b3a1c5 (diff)
downloadydb-4f33ac20e49231f7a57fc9f1c8fb43ce7ee2ada4.tar.gz
YQL-16167 Support many levels paths in AssumeSorted.
-rw-r--r--ydb/library/yql/core/yql_opt_utils.cpp24
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()