diff options
author | Mohammad Dashti <mdashti@gmail.com> | 2021-07-14 06:20:55 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-07-14 06:47:23 +0000 |
commit | 5de13812ae182fae098fecd5f3a6874fa6b0c749 (patch) | |
tree | c53ccd852baed0a195c25e2eac268093033106f3 /src/mongo/db/query/sbe_stage_builder_filter.cpp | |
parent | e6ee438de6915c717986bb48bf9a857537ee6bb1 (diff) | |
download | mongo-5de13812ae182fae098fecd5f3a6874fa6b0c749.tar.gz |
SERVER-54078 [SBE] Exponential Vector Expansion (Instead of Linear Expansion) in SBE Arrays and Objects.
Diffstat (limited to 'src/mongo/db/query/sbe_stage_builder_filter.cpp')
-rw-r--r-- | src/mongo/db/query/sbe_stage_builder_filter.cpp | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/src/mongo/db/query/sbe_stage_builder_filter.cpp b/src/mongo/db/query/sbe_stage_builder_filter.cpp index cedb52a3f5b..f58ee002164 100644 --- a/src/mongo/db/query/sbe_stage_builder_filter.cpp +++ b/src/mongo/db/query/sbe_stage_builder_filter.cpp @@ -848,14 +848,16 @@ void generateBitTest(MatchExpressionVisitorContext* context, // checking if an item has already been seen. auto [bitPosTag, bitPosVal] = sbe::value::makeNewArray(); auto arr = sbe::value::getArrayView(bitPosVal); - arr->reserve(bitPositions.size()); - - std::set<uint32_t> seenBits; - for (size_t index = 0; index < bitPositions.size(); ++index) { - auto currentBit = bitPositions[index]; - if (auto result = seenBits.insert(currentBit); result.second) { - arr->push_back(sbe::value::TypeTags::NumberInt64, - sbe::value::bitcastFrom<int64_t>(currentBit)); + if (bitPositions.size()) { + arr->reserve(bitPositions.size()); + + std::set<uint32_t> seenBits; + for (size_t index = 0; index < bitPositions.size(); ++index) { + auto currentBit = bitPositions[index]; + if (auto result = seenBits.insert(currentBit); result.second) { + arr->push_back(sbe::value::TypeTags::NumberInt64, + sbe::value::bitcastFrom<int64_t>(currentBit)); + } } } @@ -1441,18 +1443,21 @@ public: auto hasArray = false; auto hasNull = false; - for (auto&& equality : equalities) { - auto [tagView, valView] = - sbe::bson::convertFrom<true>(equality.rawdata(), - equality.rawdata() + equality.size(), - equality.fieldNameSize() - 1); - - hasNull |= tagView == sbe::value::TypeTags::Null; - hasArray |= sbe::value::isArray(tagView); - - // An ArraySet assumes ownership of it's values so we have to make a copy here. - auto [tag, val] = sbe::value::copyValue(tagView, valView); - arrSet->push_back(tag, val); + if (equalities.size()) { + arrSet->reserve(equalities.size()); + for (auto&& equality : equalities) { + auto [tagView, valView] = + sbe::bson::convertFrom<true>(equality.rawdata(), + equality.rawdata() + equality.size(), + equality.fieldNameSize() - 1); + + hasNull |= tagView == sbe::value::TypeTags::Null; + hasArray |= sbe::value::isArray(tagView); + + // An ArraySet assumes ownership of it's values so we have to make a copy here. + auto [tag, val] = sbe::value::copyValue(tagView, valView); + arrSet->push_back(tag, val); + } } const auto traversalMode = hasArray ? LeafTraversalMode::kArrayAndItsElements @@ -1495,12 +1500,14 @@ public: auto arr = sbe::value::getArrayView(arrVal); - arr->reserve(regexes.size()); + if (regexes.size()) { + arr->reserve(regexes.size()); - for (auto&& r : regexes) { - auto [regexTag, regexVal] = - sbe::value::makeNewPcreRegex(r->getString(), r->getFlags()); - arr->push_back(regexTag, regexVal); + for (auto&& r : regexes) { + auto [regexTag, regexVal] = + sbe::value::makeNewPcreRegex(r->getString(), r->getFlags()); + arr->push_back(regexTag, regexVal); + } } auto makePredicate = |