summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/sbe_stage_builder_filter.cpp
diff options
context:
space:
mode:
authorMohammad Dashti <mdashti@gmail.com>2021-07-14 06:20:55 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-07-14 06:47:23 +0000
commit5de13812ae182fae098fecd5f3a6874fa6b0c749 (patch)
treec53ccd852baed0a195c25e2eac268093033106f3 /src/mongo/db/query/sbe_stage_builder_filter.cpp
parente6ee438de6915c717986bb48bf9a857537ee6bb1 (diff)
downloadmongo-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.cpp57
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 =