aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2022-07-21 21:18:49 +0300
committeraneporada <aneporada@ydb.tech>2022-07-21 21:18:49 +0300
commitc178dc74ea9d590af4bd804d76bec5db47ddcb33 (patch)
treeaf628a06a912f80c33105b456c4a1215541d4f81
parentfc5f9cf5dc8228e32562168d4608e200b21371b2 (diff)
downloadydb-c178dc74ea9d590af4bd804d76bec5db47ddcb33.tar.gz
[] Fix AND predicates processing (handle case of duplicate key range)
-rw-r--r--ydb/library/yql/core/extract_predicate/extract_predicate_impl.cpp55
1 files changed, 25 insertions, 30 deletions
diff --git a/ydb/library/yql/core/extract_predicate/extract_predicate_impl.cpp b/ydb/library/yql/core/extract_predicate/extract_predicate_impl.cpp
index 647b53252f..2c45d66ffa 100644
--- a/ydb/library/yql/core/extract_predicate/extract_predicate_impl.cpp
+++ b/ydb/library/yql/core/extract_predicate/extract_predicate_impl.cpp
@@ -1136,48 +1136,43 @@ TExprNode::TPtr DoRebuildRangeForIndexKeys(const TStructExprType& rowType, const
TExprNodeList rests;
- TVector<TExprNodeList> childrenChains;
- THashMap<size_t, TSet<size_t>> chainIdxByEndIdx;
-
+ TMap<TIndexRange, TExprNodeList> children;
for (auto& current : toRebuild) {
if (current.IndexRange.IsEmpty()) {
YQL_ENSURE(current.Node->IsCallable("RangeRest"));
rests.emplace_back(std::move(current.Node));
- continue;
- }
- const size_t beginIdx = current.IndexRange.Begin;
- const size_t endIdx = current.IndexRange.End;
- if (!commonIndexRange || beginIdx == commonIndexRange->Begin) {
- if (!commonIndexRange) {
- commonIndexRange = current.IndexRange;
- } else {
- commonIndexRange->End = std::max(commonIndexRange->End, endIdx);
- }
- chainIdxByEndIdx[endIdx].insert(childrenChains.size());
- childrenChains.emplace_back();
- childrenChains.back().push_back(current.Node);
} else {
- auto it = chainIdxByEndIdx.find(beginIdx);
- if (it == chainIdxByEndIdx.end()) {
- rests.emplace_back(RebuildAsRangeRest(rowType, *current.Node, ctx));
- continue;
- }
+ children[current.IndexRange].push_back(current.Node);
+ }
+ }
- YQL_ENSURE(!it->second.empty());
- const size_t tgtChainIdx = *it->second.begin();
- it->second.erase(tgtChainIdx);
- if (it->second.empty()) {
- chainIdxByEndIdx.erase(it);
+ TVector<TExprNodeList> childrenChains;
+ for (auto it = children.begin(); it != children.end(); ++it) {
+ if (!commonIndexRange) {
+ commonIndexRange = it->first;
+ childrenChains.emplace_back(std::move(it->second));
+ continue;
+ }
+ if (commonIndexRange->Begin == it->first.Begin) {
+ YQL_ENSURE(it->first.End > commonIndexRange->End);
+ for (auto& asRest : childrenChains) {
+ rests.push_back(RebuildAsRangeRest(rowType, *MakeRangeAnd(range->Pos(), std::move(asRest), ctx), ctx));
}
+ childrenChains.clear();
+ childrenChains.push_back(std::move(it->second));
+ commonIndexRange = it->first;
+ continue;
+ }
- childrenChains[tgtChainIdx].push_back(current.Node);
- chainIdxByEndIdx[endIdx].insert(tgtChainIdx);
- commonIndexRange->End = std::max(commonIndexRange->End, endIdx);
+ if (commonIndexRange->End == it->first.Begin) {
+ commonIndexRange->End = it->first.End;
+ childrenChains.push_back(std::move(it->second));
+ } else {
+ rests.push_back(RebuildAsRangeRest(rowType, *MakeRangeAnd(range->Pos(), std::move(it->second), ctx), ctx));
}
}
for (auto& chain : childrenChains) {
- YQL_ENSURE(!chain.empty());
rebuilt.push_back(MakeRangeAnd(range->Pos(), std::move(chain), ctx));
}