diff options
author | aneporada <aneporada@ydb.tech> | 2022-07-21 21:18:49 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2022-07-21 21:18:49 +0300 |
commit | c178dc74ea9d590af4bd804d76bec5db47ddcb33 (patch) | |
tree | af628a06a912f80c33105b456c4a1215541d4f81 | |
parent | fc5f9cf5dc8228e32562168d4608e200b21371b2 (diff) | |
download | ydb-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.cpp | 55 |
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)); } |