summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/sbe
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/sbe')
-rw-r--r--src/mongo/db/exec/sbe/expressions/expression.h6
-rw-r--r--src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp3
-rw-r--r--src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp7
-rw-r--r--src/mongo/db/exec/sbe/parser/parser.cpp4
-rw-r--r--src/mongo/db/exec/sbe/sbe_filter_test.cpp3
-rw-r--r--src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp3
-rw-r--r--src/mongo/db/exec/sbe/sbe_hash_join_test.cpp1
-rw-r--r--src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp1
-rw-r--r--src/mongo/db/exec/sbe/sbe_sort_test.cpp1
-rw-r--r--src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp1
-rw-r--r--src/mongo/db/exec/sbe/sbe_test.cpp25
-rw-r--r--src/mongo/db/exec/sbe/sbe_unique_test.cpp1
-rw-r--r--src/mongo/db/exec/sbe/stages/ix_scan.cpp2
-rw-r--r--src/mongo/db/exec/sbe/stages/ix_scan.h2
-rw-r--r--src/mongo/db/exec/sbe/util/debug_print.cpp12
-rw-r--r--src/mongo/db/exec/sbe/util/debug_print.h8
-rw-r--r--src/mongo/db/exec/sbe/values/bson.cpp14
-rw-r--r--src/mongo/db/exec/sbe/values/bson.h4
-rw-r--r--src/mongo/db/exec/sbe/values/slot.h2
-rw-r--r--src/mongo/db/exec/sbe/values/value.cpp83
-rw-r--r--src/mongo/db/exec/sbe/values/value.h53
-rw-r--r--src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp10
-rw-r--r--src/mongo/db/exec/sbe/vm/datetime.cpp6
-rw-r--r--src/mongo/db/exec/sbe/vm/vm.cpp64
-rw-r--r--src/mongo/db/exec/sbe/vm/vm.h6
25 files changed, 148 insertions, 174 deletions
diff --git a/src/mongo/db/exec/sbe/expressions/expression.h b/src/mongo/db/exec/sbe/expressions/expression.h
index 4e811337cc3..f52acef32ca 100644
--- a/src/mongo/db/exec/sbe/expressions/expression.h
+++ b/src/mongo/db/exec/sbe/expressions/expression.h
@@ -317,7 +317,7 @@ auto makeSV(Args&&... args) {
class EConstant final : public EExpression {
public:
EConstant(value::TypeTags tag, value::Value val) : _tag(tag), _val(val) {}
- EConstant(std::string_view str) {
+ EConstant(StringData str) {
// Views are non-owning so we have to make a copy.
std::tie(_tag, _val) = value::makeNewString(str);
}
@@ -448,7 +448,7 @@ private:
*/
class EFunction final : public EExpression {
public:
- EFunction(std::string_view name, std::vector<std::unique_ptr<EExpression>> args) : _name(name) {
+ EFunction(StringData name, std::vector<std::unique_ptr<EExpression>> args) : _name(name) {
_nodes = std::move(args);
validateNodes();
}
@@ -513,7 +513,7 @@ private:
*/
class EFail final : public EExpression {
public:
- EFail(ErrorCodes::Error code, std::string_view message) : _code(code) {
+ EFail(ErrorCodes::Error code, StringData message) : _code(code) {
std::tie(_messageTag, _messageVal) = value::makeNewString(message);
}
diff --git a/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp b/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp
index 857704fb5b5..4275ae03eee 100644
--- a/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp
+++ b/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp
@@ -33,8 +33,7 @@
namespace mongo::sbe {
class SBEConcatTest : public EExpressionTestFixture {
protected:
- void runAndAssertExpression(const vm::CodeFragment* compiledExpr,
- std::string_view expectedVal) {
+ void runAndAssertExpression(const vm::CodeFragment* compiledExpr, StringData expectedVal) {
auto [tag, val] = runCompiledExpression(compiledExpr);
value::ValueGuard guard(tag, val);
diff --git a/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp b/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp
index 2e3c87789cb..8486a7c65f8 100644
--- a/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp
+++ b/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp
@@ -32,8 +32,7 @@
namespace mongo::sbe {
class SBERegexTest : public EExpressionTestFixture {
protected:
- void runAndAssertRegexCompile(const vm::CodeFragment* compiledExpr,
- std::string_view regexString) {
+ void runAndAssertRegexCompile(const vm::CodeFragment* compiledExpr, StringData regexString) {
auto [tag, val] = runCompiledExpression(compiledExpr);
value::ValueGuard guard(tag, val);
@@ -53,7 +52,7 @@ protected:
}
void runAndAssertFindExpression(const vm::CodeFragment* compiledExpr,
- std::string_view expectedMatch,
+ StringData expectedMatch,
int idx) {
auto [tag, val] = runCompiledExpression(compiledExpr);
value::ValueGuard guard(tag, val);
@@ -72,7 +71,7 @@ protected:
ASSERT_EQUALS(value::numericCast<int32_t>(idxTag, idxVal), idx);
}
- void addMatchResult(value::Array* arrayPtr, std::string_view matchStr, int32_t idx) {
+ void addMatchResult(value::Array* arrayPtr, StringData matchStr, int32_t idx) {
auto [objTag, objVal] = value::makeNewObject();
value::ValueGuard objGuard{objTag, objVal};
auto obj = value::getObjectView(objVal);
diff --git a/src/mongo/db/exec/sbe/parser/parser.cpp b/src/mongo/db/exec/sbe/parser/parser.cpp
index 19fe41378ef..a426b9d9a8d 100644
--- a/src/mongo/db/exec/sbe/parser/parser.cpp
+++ b/src/mongo/db/exec/sbe/parser/parser.cpp
@@ -1161,7 +1161,7 @@ std::unique_ptr<PlanStage> Parser::walkPathValue(AstQuery& ast,
std::move(inputStage),
getCurrentPlanNodeId(),
outputSlot,
- makeE<EFunction>("getField"sv,
+ makeE<EFunction>("getField"_sd,
makeEs(makeE<EVariable>(inputSlot),
makeE<EConstant>(ast.nodes[0]->identifier))));
}
@@ -1172,7 +1172,7 @@ std::unique_ptr<PlanStage> Parser::walkPathValue(AstQuery& ast,
makeProjectStage(std::move(inputStage),
getCurrentPlanNodeId(),
traverseIn,
- makeE<EFunction>("getField"sv,
+ makeE<EFunction>("getField"_sd,
makeEs(makeE<EVariable>(inputSlot),
makeE<EConstant>(ast.nodes[0]->identifier))));
auto in = makeS<LimitSkipStage>(
diff --git a/src/mongo/db/exec/sbe/sbe_filter_test.cpp b/src/mongo/db/exec/sbe/sbe_filter_test.cpp
index eb7c7c05214..15a34975c9f 100644
--- a/src/mongo/db/exec/sbe/sbe_filter_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_filter_test.cpp
@@ -33,7 +33,6 @@
#include "mongo/platform/basic.h"
-#include <string_view>
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
#include "mongo/db/exec/sbe/stages/filter.h"
@@ -148,7 +147,7 @@ TEST_F(FilterStageTest, FilterIsNumberTest) {
// Build a FilterStage whose filter expression is "isNumber(scanSlot)".
auto filter = makeS<FilterStage<false>>(
std::move(scanStage),
- makeE<EFunction>("isNumber"sv, makeEs(makeE<EVariable>(scanSlot))),
+ makeE<EFunction>("isNumber"_sd, makeEs(makeE<EVariable>(scanSlot))),
kEmptyPlanNodeId);
return std::make_pair(scanSlot, std::move(filter));
diff --git a/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp b/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp
index 281a7cf0684..2c3bd3d335d 100644
--- a/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp
@@ -33,7 +33,6 @@
#include "mongo/platform/basic.h"
-#include <string_view>
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
#include "mongo/db/exec/sbe/stages/hash_agg.h"
@@ -115,7 +114,7 @@ TEST_F(HashAggStageTest, HashAggAddToSetTest) {
auto [expectedTag, expectedVal] = value::makeNewArray();
value::ValueGuard expectedGuard{expectedTag, expectedVal};
- for (auto&& sv : std::array<std::string_view, 4>{"Aa", "BB", "cc", "dD"}) {
+ for (auto&& sv : std::array<StringData, 4>{"Aa", "BB", "cc", "dD"}) {
auto [tag, val] = value::makeNewString(sv);
value::getArrayView(expectedVal)->push_back(tag, val);
}
diff --git a/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp b/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp
index 956831cc8e0..fc9b18a2fdc 100644
--- a/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp
@@ -33,7 +33,6 @@
#include "mongo/platform/basic.h"
-#include <string_view>
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
#include "mongo/db/exec/sbe/stages/hash_join.h"
diff --git a/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp b/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp
index 473ffbe5510..0782f0bdc42 100644
--- a/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp
@@ -36,7 +36,6 @@
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
-#include <string_view>
#include "mongo/logv2/log.h"
diff --git a/src/mongo/db/exec/sbe/sbe_sort_test.cpp b/src/mongo/db/exec/sbe/sbe_sort_test.cpp
index 1d4574f2d50..83b59daa535 100644
--- a/src/mongo/db/exec/sbe/sbe_sort_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_sort_test.cpp
@@ -29,7 +29,6 @@
#include "mongo/platform/basic.h"
-#include <string_view>
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
#include "mongo/db/exec/sbe/stages/sort.h"
diff --git a/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp b/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp
index 37cad8d4532..009106f8c59 100644
--- a/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp
@@ -29,7 +29,6 @@
#include "mongo/platform/basic.h"
-#include <string_view>
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
#include "mongo/db/exec/sbe/stages/sorted_merge.h"
diff --git a/src/mongo/db/exec/sbe/sbe_test.cpp b/src/mongo/db/exec/sbe/sbe_test.cpp
index 74460db8e2c..ad7529e96bd 100644
--- a/src/mongo/db/exec/sbe/sbe_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_test.cpp
@@ -35,16 +35,15 @@
namespace mongo::sbe {
TEST(SBEValues, Basic) {
- using namespace std::literals;
{
- const auto [tag, val] = value::makeNewString("small"sv);
+ const auto [tag, val] = value::makeNewString("small"_sd);
ASSERT_EQUALS(tag, value::TypeTags::StringSmall);
value::releaseValue(tag, val);
}
{
- const auto [tag, val] = value::makeNewString("not so small string"sv);
+ const auto [tag, val] = value::makeNewString("not so small string"_sd);
ASSERT_EQUALS(tag, value::TypeTags::StringBig);
value::releaseValue(tag, val);
@@ -53,11 +52,11 @@ TEST(SBEValues, Basic) {
const auto [tag, val] = value::makeNewObject();
auto obj = value::getObjectView(val);
- const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"sv);
- obj->push_back("field"sv, fieldTag, fieldVal);
+ const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"_sd);
+ obj->push_back("field"_sd, fieldTag, fieldVal);
ASSERT_EQUALS(obj->size(), 1);
- const auto [checkTag, checkVal] = obj->getField("field"sv);
+ const auto [checkTag, checkVal] = obj->getField("field"_sd);
ASSERT_EQUALS(fieldTag, checkTag);
ASSERT_EQUALS(fieldVal, checkVal);
@@ -68,7 +67,7 @@ TEST(SBEValues, Basic) {
const auto [tag, val] = value::makeNewArray();
auto obj = value::getArrayView(val);
- const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"sv);
+ const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"_sd);
obj->push_back(fieldTag, fieldVal);
ASSERT_EQUALS(obj->size(), 1);
@@ -198,15 +197,15 @@ TEST(SBEValues, HashCompound) {
{
auto [tag1, val1] = value::makeNewObject();
auto obj1 = value::getObjectView(val1);
- obj1->push_back("a"sv, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-5));
- obj1->push_back("b"sv, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-6));
- obj1->push_back("c"sv, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-7));
+ obj1->push_back("a"_sd, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-5));
+ obj1->push_back("b"_sd, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-6));
+ obj1->push_back("c"_sd, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-7));
auto [tag2, val2] = value::makeNewObject();
auto obj2 = value::getObjectView(val2);
- obj2->push_back("a"sv, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-5.0));
- obj2->push_back("b"sv, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-6.0));
- obj2->push_back("c"sv, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-7.0));
+ obj2->push_back("a"_sd, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-5.0));
+ obj2->push_back("b"_sd, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-6.0));
+ obj2->push_back("c"_sd, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-7.0));
ASSERT_EQUALS(value::hashValue(tag1, val1), value::hashValue(tag2, val2));
diff --git a/src/mongo/db/exec/sbe/sbe_unique_test.cpp b/src/mongo/db/exec/sbe/sbe_unique_test.cpp
index 08ed98c1723..812b7383b1e 100644
--- a/src/mongo/db/exec/sbe/sbe_unique_test.cpp
+++ b/src/mongo/db/exec/sbe/sbe_unique_test.cpp
@@ -29,7 +29,6 @@
#include "mongo/platform/basic.h"
-#include <string_view>
#include "mongo/db/exec/sbe/sbe_plan_stage_test.h"
#include "mongo/db/exec/sbe/stages/unique.h"
diff --git a/src/mongo/db/exec/sbe/stages/ix_scan.cpp b/src/mongo/db/exec/sbe/stages/ix_scan.cpp
index 854af856cd2..8e70ccd2004 100644
--- a/src/mongo/db/exec/sbe/stages/ix_scan.cpp
+++ b/src/mongo/db/exec/sbe/stages/ix_scan.cpp
@@ -39,7 +39,7 @@
namespace mongo::sbe {
IndexScanStage::IndexScanStage(CollectionUUID collUuid,
- std::string_view indexName,
+ StringData indexName,
bool forward,
boost::optional<value::SlotId> recordSlot,
boost::optional<value::SlotId> recordIdSlot,
diff --git a/src/mongo/db/exec/sbe/stages/ix_scan.h b/src/mongo/db/exec/sbe/stages/ix_scan.h
index da10c9bf126..63c583764ab 100644
--- a/src/mongo/db/exec/sbe/stages/ix_scan.h
+++ b/src/mongo/db/exec/sbe/stages/ix_scan.h
@@ -60,7 +60,7 @@ namespace mongo::sbe {
class IndexScanStage final : public PlanStage {
public:
IndexScanStage(CollectionUUID collUuid,
- std::string_view indexName,
+ StringData indexName,
bool forward,
boost::optional<value::SlotId> recordSlot,
boost::optional<value::SlotId> recordIdSlot,
diff --git a/src/mongo/db/exec/sbe/util/debug_print.cpp b/src/mongo/db/exec/sbe/util/debug_print.cpp
index 939779be8de..e3d831b5ab5 100644
--- a/src/mongo/db/exec/sbe/util/debug_print.cpp
+++ b/src/mongo/db/exec/sbe/util/debug_print.cpp
@@ -92,20 +92,20 @@ std::string DebugPrinter::print(const std::vector<Block>& blocks) {
break;
}
- std::string_view sv(b.str);
+ StringData sv(b.str);
if (!sv.empty()) {
- if (sv.front() == '`') {
- sv.remove_prefix(1);
+ if (*sv.begin() == '`') {
+ sv = sv.substr(1);
if (!ret.empty() && ret.back() == ' ') {
ret.resize(ret.size() - 1, 0);
}
}
- if (!sv.empty() && sv.back() == '`') {
- sv.remove_suffix(1);
+ if (!sv.empty() && *(sv.end() - 1) == '`') {
+ sv = sv.substr(0, sv.size() - 1);
addSpace = false;
}
if (!sv.empty()) {
- ret.append(sv);
+ ret.append(sv.begin(), sv.end());
if (addSpace) {
ret.append(" ");
}
diff --git a/src/mongo/db/exec/sbe/util/debug_print.h b/src/mongo/db/exec/sbe/util/debug_print.h
index 19e29d7bdf4..a11bb24c75c 100644
--- a/src/mongo/db/exec/sbe/util/debug_print.h
+++ b/src/mongo/db/exec/sbe/util/debug_print.h
@@ -60,16 +60,16 @@ public:
Command cmd;
std::string str;
- Block(std::string_view s) : cmd(cmdNone), str(s) {}
+ Block(StringData s) : cmd(cmdNone), str(s) {}
- Block(Command c, std::string_view s) : cmd(c), str(s) {}
+ Block(Command c, StringData s) : cmd(c), str(s) {}
Block(Command c) : cmd(c) {}
};
DebugPrinter(bool colorConsole = false) : _colorConsole(colorConsole) {}
- static void addKeyword(std::vector<Block>& ret, std::string_view k) {
+ static void addKeyword(std::vector<Block>& ret, StringData k) {
ret.emplace_back(Block::cmdColorCyan);
ret.emplace_back(Block{Block::cmdNoneNoSpace, k});
ret.emplace_back(Block::cmdColorNone);
@@ -92,7 +92,7 @@ public:
ret.emplace_back(Block{Block::cmdNoneNoSpace, " "});
}
- static void addIdentifier(std::vector<Block>& ret, std::string_view k) {
+ static void addIdentifier(std::vector<Block>& ret, StringData k) {
ret.emplace_back(Block::cmdColorGreen);
ret.emplace_back(Block{Block::cmdNoneNoSpace, k});
ret.emplace_back(Block::cmdColorNone);
diff --git a/src/mongo/db/exec/sbe/values/bson.cpp b/src/mongo/db/exec/sbe/values/bson.cpp
index ea5f50b7e58..6a67127bd6f 100644
--- a/src/mongo/db/exec/sbe/values/bson.cpp
+++ b/src/mongo/db/exec/sbe/values/bson.cpp
@@ -290,8 +290,7 @@ void convertToBsonObj(ArrayBuilder& builder, value::ArrayEnumerator arr) {
case value::TypeTags::StringSmall:
case value::TypeTags::StringBig:
case value::TypeTags::bsonString: {
- auto sv = value::getStringView(tag, val);
- builder.append(StringData{sv.data(), sv.size()});
+ builder.append(value::getStringView(tag, val));
break;
}
case value::TypeTags::Array: {
@@ -385,11 +384,9 @@ template void convertToBsonObj<UniqueBSONObjBuilder>(UniqueBSONObjBuilder& build
template <class ObjBuilder>
void appendValueToBsonObj(ObjBuilder& builder,
- std::string_view nameSV,
+ StringData name,
value::TypeTags tag,
value::Value val) {
- StringData name{nameSV.data(), nameSV.size()};
-
switch (tag) {
case value::TypeTags::Nothing:
break;
@@ -421,8 +418,7 @@ void appendValueToBsonObj(ObjBuilder& builder,
case value::TypeTags::StringSmall:
case value::TypeTags::StringBig:
case value::TypeTags::bsonString: {
- auto sv = value::getStringView(tag, val);
- builder.append(name, StringData{sv.data(), sv.size()});
+ builder.append(name, value::getStringView(tag, val));
break;
}
case value::TypeTags::Array: {
@@ -485,11 +481,11 @@ void appendValueToBsonObj(ObjBuilder& builder,
}
template void appendValueToBsonObj<BSONObjBuilder>(BSONObjBuilder& builder,
- std::string_view name,
+ StringData name,
value::TypeTags tag,
value::Value val);
template void appendValueToBsonObj<UniqueBSONObjBuilder>(UniqueBSONObjBuilder& builder,
- std::string_view name,
+ StringData name,
value::TypeTags tag,
value::Value val);
} // namespace bson
diff --git a/src/mongo/db/exec/sbe/values/bson.h b/src/mongo/db/exec/sbe/values/bson.h
index a8839d511fa..af37f80f76b 100644
--- a/src/mongo/db/exec/sbe/values/bson.h
+++ b/src/mongo/db/exec/sbe/values/bson.h
@@ -42,7 +42,7 @@ std::pair<value::TypeTags, value::Value> convertFrom(bool view,
const char* advance(const char* be, size_t fieldNameSize);
inline auto fieldNameView(const char* be) noexcept {
- return std::string_view{be + 1};
+ return StringData{be + 1};
}
template <class ArrayBuilder>
@@ -53,7 +53,7 @@ void convertToBsonObj(ObjBuilder& builder, value::Object* obj);
template <class ObjBuilder>
void appendValueToBsonObj(ObjBuilder& builder,
- std::string_view name,
+ StringData name,
value::TypeTags tag,
value::Value val);
} // namespace bson
diff --git a/src/mongo/db/exec/sbe/values/slot.h b/src/mongo/db/exec/sbe/values/slot.h
index fbfc7239d3b..44fcde13d1d 100644
--- a/src/mongo/db/exec/sbe/values/slot.h
+++ b/src/mongo/db/exec/sbe/values/slot.h
@@ -633,7 +633,7 @@ void readKeyStringValueIntoAccessors(
template <typename T>
using SlotMap = absl::flat_hash_map<SlotId, T>;
using SlotAccessorMap = SlotMap<SlotAccessor*>;
-using FieldAccessorMap = absl::flat_hash_map<std::string, std::unique_ptr<ViewOfValueAccessor>>;
+using FieldAccessorMap = StringMap<std::unique_ptr<ViewOfValueAccessor>>;
using SlotSet = absl::flat_hash_set<SlotId>;
using SlotVector = std::vector<SlotId>;
diff --git a/src/mongo/db/exec/sbe/values/value.cpp b/src/mongo/db/exec/sbe/values/value.cpp
index 3522679d78f..9fd512ea9d0 100644
--- a/src/mongo/db/exec/sbe/values/value.cpp
+++ b/src/mongo/db/exec/sbe/values/value.cpp
@@ -44,21 +44,32 @@ namespace mongo {
namespace sbe {
namespace value {
+namespace {
+template <typename T>
+auto abslHash(const T& val) {
+ if constexpr (std::is_same_v<T, StringData>) {
+ return absl::Hash<absl::string_view>{}(absl::string_view{val.rawData(), val.size()});
+ } else {
+ return absl::Hash<T>{}(val);
+ }
+}
+} // namespace
+
std::pair<TypeTags, Value> makeCopyBsonRegex(const BsonRegex& regex) {
auto buffer = std::make_unique<char[]>(regex.byteSize());
memcpy(buffer.get(), regex.data(), regex.byteSize());
return {TypeTags::bsonRegex, bitcastFrom<char*>(buffer.release())};
}
-std::pair<TypeTags, Value> makeNewBsonRegex(std::string_view pattern, std::string_view flags) {
+std::pair<TypeTags, Value> makeNewBsonRegex(StringData pattern, StringData flags) {
// Add 2 to account NULL bytes after pattern and flags.
auto totalSize = pattern.size() + flags.size() + 2;
auto buffer = std::make_unique<char[]>(totalSize);
auto rawBuffer = buffer.get();
// Copy pattern first and flags after it.
- memcpy(rawBuffer, pattern.data(), pattern.size());
- memcpy(rawBuffer + pattern.size() + 1, flags.data(), flags.size());
+ memcpy(rawBuffer, pattern.rawData(), pattern.size());
+ memcpy(rawBuffer + pattern.size() + 1, flags.rawData(), flags.size());
// Ensure NULL byte is placed after each part.
rawBuffer[pattern.size()] = '\0';
@@ -66,7 +77,7 @@ std::pair<TypeTags, Value> makeNewBsonRegex(std::string_view pattern, std::strin
return {TypeTags::bsonRegex, bitcastFrom<char*>(buffer.release())};
}
-std::pair<TypeTags, Value> makeCopyBsonJavascript(std::string_view code) {
+std::pair<TypeTags, Value> makeCopyBsonJavascript(StringData code) {
auto [_, strVal] = makeBigString(code);
return {TypeTags::bsonJavascript, strVal};
}
@@ -76,7 +87,7 @@ std::pair<TypeTags, Value> makeCopyKeyString(const KeyString::Value& inKey) {
return {TypeTags::ksValue, bitcastFrom<KeyString::Value*>(k)};
}
-std::pair<TypeTags, Value> makeNewPcreRegex(std::string_view pattern, std::string_view options) {
+std::pair<TypeTags, Value> makeNewPcreRegex(StringData pattern, StringData options) {
auto regex = std::make_unique<PcreRegex>(pattern, options);
return {TypeTags::pcreRegex, bitcastFrom<PcreRegex*>(regex.release())};
}
@@ -94,11 +105,11 @@ void PcreRegex::_compile() {
uassert(5073402, str::stream() << "Invalid Regex: " << compile_error, _pcrePtr != nullptr);
}
-int PcreRegex::execute(std::string_view stringView, int startPos, std::vector<int>& buf) {
+int PcreRegex::execute(StringData stringView, int startPos, std::vector<int>& buf) {
return pcre_exec(_pcrePtr,
nullptr,
- stringView.data(),
- stringView.length(),
+ stringView.rawData(),
+ stringView.size(),
startPos,
0,
&(buf.front()),
@@ -417,11 +428,11 @@ void writeValueToStream(T& stream, TypeTags tag, Value val) {
case TypeTags::StringBig:
case TypeTags::bsonString: {
auto sv = getStringView(tag, val);
- if (sv.length() <= kStringMaxDisplayLength) {
- stream << '"' << StringData{sv.data(), sv.size()} << '"';
+ if (sv.size() <= kStringMaxDisplayLength) {
+ stream << '"' << sv << '"';
} else {
auto sub = sv.substr(0, kStringMaxDisplayLength);
- stream << '"' << StringData{sub.data(), sub.size()} << '"' << "...";
+ stream << '"' << sub << '"' << "...";
}
break;
}
@@ -595,36 +606,35 @@ BSONType tagToType(TypeTags tag) noexcept {
std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator) noexcept {
switch (tag) {
case TypeTags::NumberInt32:
- return absl::Hash<int32_t>{}(bitcastTo<int32_t>(val));
+ return abslHash(bitcastTo<int32_t>(val));
case TypeTags::RecordId:
case TypeTags::NumberInt64:
- return absl::Hash<int64_t>{}(bitcastTo<int64_t>(val));
+ return abslHash(bitcastTo<int64_t>(val));
case TypeTags::NumberDouble: {
// Force doubles to integers for hashing.
auto dbl = bitcastTo<double>(val);
if (auto asInt = representAs<int64_t>(dbl); asInt) {
- return absl::Hash<int64_t>{}(*asInt);
+ return abslHash(*asInt);
} else {
// Doubles not representable as int64_t will hash as doubles.
- return absl::Hash<double>{}(dbl);
+ return abslHash(dbl);
}
}
case TypeTags::NumberDecimal: {
// Force decimals to integers for hashing.
auto dec = bitcastTo<Decimal128>(val);
if (auto asInt = representAs<int64_t>(dec); asInt) {
- return absl::Hash<int64_t>{}(*asInt);
+ return abslHash(*asInt);
} else if (auto asDbl = representAs<double>(dec); asDbl) {
- return absl::Hash<double>{}(*asDbl);
+ return abslHash(*asDbl);
} else {
- return absl::Hash<uint64_t>{}(dec.getValue().low64) ^
- absl::Hash<uint64_t>{}(dec.getValue().high64);
+ return abslHash(dec.getValue().low64) ^ abslHash(dec.getValue().high64);
}
}
case TypeTags::Date:
- return absl::Hash<int64_t>{}(bitcastTo<int64_t>(val));
+ return abslHash(bitcastTo<int64_t>(val));
case TypeTags::Timestamp:
- return absl::Hash<uint64_t>{}(bitcastTo<uint64_t>(val));
+ return abslHash(bitcastTo<uint64_t>(val));
case TypeTags::Boolean:
return bitcastTo<bool>(val);
case TypeTags::Null:
@@ -637,18 +647,15 @@ std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator
case TypeTags::bsonString: {
auto sv = getStringView(tag, val);
if (collator) {
- auto key = collator->getComparisonKey(StringData{sv.data(), sv.size()});
- auto keyData = key.getKeyData();
- return absl::Hash<std::string_view>{}(
- std::string_view{keyData.rawData(), keyData.size()});
+ return abslHash(collator->getComparisonKey(sv).getKeyData());
} else {
- return absl::Hash<std::string_view>{}(sv);
+ return abslHash(sv);
}
}
case TypeTags::ObjectId: {
auto id = getObjectIdView(val);
- return absl::Hash<uint64_t>{}(readFromMemory<uint64_t>(id->data())) ^
- absl::Hash<uint32_t>{}(readFromMemory<uint32_t>(id->data() + 8));
+ return abslHash(readFromMemory<uint64_t>(id->data())) ^
+ abslHash(readFromMemory<uint32_t>(id->data() + 8));
}
case TypeTags::ksValue: {
return getKeyStringView(val)->hash();
@@ -690,19 +697,19 @@ std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator
memcpy(buffer, getRawPointerView(val), size);
// Hash as if it is 64bit integer.
- return absl::Hash<uint64_t>{}(readFromMemory<uint64_t>(buffer));
+ return abslHash(readFromMemory<uint64_t>(buffer));
} else {
// Hash only the first 8 bytes. It should be enough.
- return absl::Hash<uint64_t>{}(
+ return abslHash(
readFromMemory<uint64_t>(getRawPointerView(val) + sizeof(uint32_t)));
}
}
case TypeTags::bsonRegex: {
auto regex = getBsonRegexView(val);
- return absl::Hash<std::string_view>{}(regex.dataView());
+ return abslHash(regex.dataView());
}
case TypeTags::bsonJavascript:
- return absl::Hash<std::string_view>{}(getBsonJavascriptView(val));
+ return abslHash(getBsonJavascriptView(val));
default:
break;
}
@@ -715,7 +722,7 @@ std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator
* guarantees that the result will be exactlty -1, 0, or 1, which is important, because not all
* comparison functions make that guarantee.
*
- * The std::string_view::compare(basic_string_view s) function, for example, only promises that it
+ * The StringData::compare(basic_string_view s) function, for example, only promises that it
* will return a value less than 0 in the case that 'this' is less than 's,' whereas we want to
* return exactly -1.
*/
@@ -761,9 +768,7 @@ std::pair<TypeTags, Value> compareValue(TypeTags lhsTag,
auto lhsStr = getStringView(lhsTag, lhsValue);
auto rhsStr = getStringView(rhsTag, rhsValue);
- auto result = comparator ? comparator->compare(StringData{lhsStr.data(), lhsStr.size()},
- StringData{rhsStr.data(), rhsStr.size()})
- : lhsStr.compare(rhsStr);
+ auto result = comparator ? comparator->compare(lhsStr, rhsStr) : lhsStr.compare(rhsStr);
return {TypeTags::NumberInt32, bitcastFrom<int32_t>(compareHelper(result, 0))};
} else if (lhsTag == TypeTags::Date && rhsTag == TypeTags::Date) {
@@ -969,19 +974,19 @@ bool ObjectEnumerator::advance() {
}
}
-std::string_view ObjectEnumerator::getFieldName() const {
+StringData ObjectEnumerator::getFieldName() const {
using namespace std::literals;
if (_object) {
if (_index < _object->size()) {
return _object->field(_index);
} else {
- return ""sv;
+ return ""_sd;
}
} else {
if (*_objectCurrent != 0) {
return bson::fieldNameView(_objectCurrent);
} else {
- return ""sv;
+ return ""_sd;
}
}
}
diff --git a/src/mongo/db/exec/sbe/values/value.h b/src/mongo/db/exec/sbe/values/value.h
index 31ade47676d..a70a48bbbee 100644
--- a/src/mongo/db/exec/sbe/values/value.h
+++ b/src/mongo/db/exec/sbe/values/value.h
@@ -422,7 +422,7 @@ public:
}
}
- void push_back(std::string_view name, TypeTags tag, Value val) {
+ void push_back(StringData name, TypeTags tag, Value val) {
if (tag != TypeTags::Nothing) {
ValueGuard guard{tag, val};
// Reserve space in all vectors, they are the same size. We arbitrarily picked _typeTags
@@ -437,7 +437,7 @@ public:
}
}
- std::pair<TypeTags, Value> getField(std::string_view field) {
+ std::pair<TypeTags, Value> getField(StringData field) {
for (size_t idx = 0; idx < _typeTags.size(); ++idx) {
if (_names[idx] == field) {
return {_typeTags[idx], _values[idx]};
@@ -597,12 +597,11 @@ private:
*/
class PcreRegex {
public:
- PcreRegex(std::string_view pattern, std::string_view options)
- : _pattern(pattern), _options(options) {
+ PcreRegex(StringData pattern, StringData options) : _pattern(pattern), _options(options) {
_compile();
}
- PcreRegex(std::string_view pattern) : PcreRegex(pattern, "") {}
+ PcreRegex(StringData pattern) : PcreRegex(pattern, "") {}
PcreRegex(const PcreRegex& other) : PcreRegex(other._pattern, other._options) {}
@@ -639,7 +638,7 @@ public:
* = 0 there was a match, but not enough space in the buffer
* > 0 the number of matches
*/
- int execute(std::string_view input, int startPos, std::vector<int>& buf);
+ int execute(StringData input, int startPos, std::vector<int>& buf);
size_t getNumberCaptures() const;
@@ -715,7 +714,7 @@ inline size_t getStringLength(TypeTags tag, const Value& val) noexcept {
/**
* getStringView() should be preferred over getRawStringView() where possible.
*/
-inline std::string_view getStringView(TypeTags tag, const Value& val) noexcept {
+inline StringData getStringView(TypeTags tag, const Value& val) noexcept {
return {getRawStringView(tag, val), getStringLength(tag, val)};
}
@@ -776,9 +775,9 @@ inline uint8_t* getBSONBinDataCompat(TypeTags tag, Value val) {
}
}
-inline bool canUseSmallString(std::string_view input) {
+inline bool canUseSmallString(StringData input) {
auto length = input.size();
- auto ptr = input.data();
+ auto ptr = input.rawData();
auto end = ptr + length;
return length <= kSmallStringMaxLength && std::find(ptr, end, '\0') == end;
}
@@ -787,18 +786,18 @@ inline bool canUseSmallString(std::string_view input) {
* Callers must check that canUseSmallString() returns true before calling this function.
* makeNewString() should be preferred over makeSmallString() where possible.
*/
-inline std::pair<TypeTags, Value> makeSmallString(std::string_view input) {
+inline std::pair<TypeTags, Value> makeSmallString(StringData input) {
dassert(canUseSmallString(input));
Value smallString{0};
auto buf = getRawStringView(TypeTags::StringSmall, smallString);
- memcpy(buf, input.data(), input.size());
+ memcpy(buf, input.rawData(), input.size());
return {TypeTags::StringSmall, smallString};
}
-inline std::pair<TypeTags, Value> makeBigString(std::string_view input) {
+inline std::pair<TypeTags, Value> makeBigString(StringData input) {
auto len = input.size();
- auto ptr = input.data();
+ auto ptr = input.rawData();
invariant(len < static_cast<uint32_t>(std::numeric_limits<int32_t>::max()));
@@ -810,7 +809,7 @@ inline std::pair<TypeTags, Value> makeBigString(std::string_view input) {
return {TypeTags::StringBig, reinterpret_cast<Value>(buf)};
}
-inline std::pair<TypeTags, Value> makeNewString(std::string_view input) {
+inline std::pair<TypeTags, Value> makeNewString(StringData input) {
if (canUseSmallString(input)) {
return makeSmallString(input);
} else {
@@ -886,7 +885,7 @@ inline KeyString::Value* getKeyStringView(Value val) noexcept {
return reinterpret_cast<KeyString::Value*>(val);
}
-std::pair<TypeTags, Value> makeNewPcreRegex(std::string_view pattern, std::string_view options);
+std::pair<TypeTags, Value> makeNewPcreRegex(StringData pattern, StringData options);
std::pair<TypeTags, Value> makeCopyPcreRegex(const PcreRegex& regex);
@@ -923,13 +922,13 @@ struct BsonRegex {
BsonRegex(const char* rawValue) {
pattern = rawValue;
// We add 1 to account NULL byte after pattern.
- flags = pattern.data() + pattern.size() + 1;
+ flags = pattern.rawData() + pattern.size() + 1;
}
- BsonRegex(std::string_view pattern, std::string_view flags) : pattern(pattern), flags(flags) {
+ BsonRegex(StringData pattern, StringData flags) : pattern(pattern), flags(flags) {
// Ensure that flags follow right after pattern in memory. Otherwise 'dataView()' may return
- // invalid 'std::string_view' object.
- invariant(pattern.data() + pattern.size() + 1 == flags.data());
+ // invalid 'StringData' object.
+ invariant(pattern.rawData() + pattern.size() + 1 == flags.rawData());
}
size_t byteSize() const {
@@ -938,15 +937,15 @@ struct BsonRegex {
}
const char* data() const {
- return pattern.data();
+ return pattern.rawData();
}
- std::string_view dataView() const {
+ StringData dataView() const {
return {data(), byteSize()};
}
- std::string_view pattern;
- std::string_view flags;
+ StringData pattern;
+ StringData flags;
};
inline BsonRegex getBsonRegexView(Value val) noexcept {
@@ -955,13 +954,13 @@ inline BsonRegex getBsonRegexView(Value val) noexcept {
std::pair<TypeTags, Value> makeCopyBsonRegex(const BsonRegex& regex);
-std::pair<TypeTags, Value> makeNewBsonRegex(std::string_view pattern, std::string_view flags);
+std::pair<TypeTags, Value> makeNewBsonRegex(StringData pattern, StringData flags);
-inline std::string_view getBsonJavascriptView(Value val) noexcept {
+inline StringData getBsonJavascriptView(Value val) noexcept {
return getStringView(TypeTags::StringBig, val);
}
-std::pair<TypeTags, Value> makeCopyBsonJavascript(std::string_view code);
+std::pair<TypeTags, Value> makeCopyBsonJavascript(StringData code);
std::pair<TypeTags, Value> makeCopyKeyString(const KeyString::Value& inKey);
@@ -1146,7 +1145,7 @@ public:
}
}
std::pair<TypeTags, Value> getViewOfValue() const;
- std::string_view getFieldName() const;
+ StringData getFieldName() const;
bool atEnd() const {
if (_object) {
diff --git a/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp b/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp
index 766bdac983a..3eedbc5dfbb 100644
--- a/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp
+++ b/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp
@@ -58,16 +58,16 @@ TEST(ValueSerializeForSorter, Serialize) {
testData->push_back(value::TypeTags::MaxKey, 0);
testData->push_back(value::TypeTags::bsonUndefined, 0);
- std::string_view smallString = "perfect";
+ StringData smallString = "perfect";
invariant(sbe::value::canUseSmallString(smallString));
- std::string_view bigString = "too big string to fit into value";
+ StringData bigString = "too big string to fit into value";
invariant(!sbe::value::canUseSmallString(bigString));
- std::string_view smallStringWithNull = "a\0b";
+ StringData smallStringWithNull = "a\0b";
invariant(smallStringWithNull.size() <= sbe::value::kSmallStringMaxLength);
- std::string_view bigStringWithNull = "too big string \0 to fit into value";
+ StringData bigStringWithNull = "too big string \0 to fit into value";
invariant(bigStringWithNull.size() > sbe::value::kSmallStringMaxLength);
- std::vector<std::string_view> stringCases = {
+ std::vector<StringData> stringCases = {
smallString,
smallStringWithNull,
bigString,
diff --git a/src/mongo/db/exec/sbe/vm/datetime.cpp b/src/mongo/db/exec/sbe/vm/datetime.cpp
index 09c4188ea17..84839a4a2d4 100644
--- a/src/mongo/db/exec/sbe/vm/datetime.cpp
+++ b/src/mongo/db/exec/sbe/vm/datetime.cpp
@@ -45,9 +45,7 @@ bool isValidTimezone(value::TypeTags timezoneTag,
return false;
}
auto timezoneStringView = value::getStringView(timezoneTag, timezoneValue);
- return timezoneStringView.empty() ||
- timezoneDB->isTimeZoneIdentifier(
- StringData{timezoneStringView.data(), timezoneStringView.size()});
+ return timezoneStringView.empty() || timezoneDB->isTimeZoneIdentifier(timezoneStringView);
}
TimeZone getTimezone(value::TypeTags timezoneTag,
@@ -57,7 +55,7 @@ TimeZone getTimezone(value::TypeTags timezoneTag,
if (timezoneStr.empty()) {
return timezoneDB->utcZone();
} else {
- return timezoneDB->getTimeZone(StringData{timezoneStr.data(), timezoneStr.size()});
+ return timezoneDB->getTimeZone(timezoneStr);
}
}
diff --git a/src/mongo/db/exec/sbe/vm/vm.cpp b/src/mongo/db/exec/sbe/vm/vm.cpp
index dd207101ee6..09361aaea04 100644
--- a/src/mongo/db/exec/sbe/vm/vm.cpp
+++ b/src/mongo/db/exec/sbe/vm/vm.cpp
@@ -750,12 +750,9 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::aggLast(value::TypeTag
}
-bool hasSeparatorAt(size_t idx, std::string_view input, std::string_view separator) {
- if (separator.size() + idx > input.size()) {
- return false;
- }
-
- return input.compare(idx, separator.size(), separator) == 0;
+bool hasSeparatorAt(size_t idx, StringData input, StringData separator) {
+ return (idx + separator.size() <= input.size()) &&
+ input.substr(idx, separator.size()) == separator;
}
std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinSplit(ArityType arity) {
@@ -775,7 +772,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinSplit(ArityType
size_t splitStart = 0;
size_t splitPos;
- while ((splitPos = input.find(separator, splitStart)) != std::string_view::npos) {
+ while ((splitPos = input.find(separator, splitStart)) != std::string::npos) {
auto [tag, val] = value::makeNewString(input.substr(splitStart, splitPos - splitStart));
arr->push_back(tag, val);
@@ -835,7 +832,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDropFields(Arit
} else if (tagInObj == value::TypeTags::Object) {
auto objRoot = value::getObjectView(valInObj);
for (size_t idx = 0; idx < objRoot->size(); ++idx) {
- std::string_view sv(objRoot->field(idx));
+ StringData sv(objRoot->field(idx));
if (restrictFieldsSet.count(sv) == 0) {
@@ -947,7 +944,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinNewKeyString(Ar
kb.appendNumberLong(num);
} else if (value::isString(tag)) {
auto str = value::getStringView(tag, val);
- kb.appendString(StringData{str.data(), str.length()});
+ kb.appendString(str);
} else {
uasserted(4822802, "unsuppored key string type");
}
@@ -1154,20 +1151,16 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinReplaceOne(Arit
return {false, value::TypeTags::Nothing, 0};
}
- auto inputStrView = value::getStringView(typeTagInputStr, valueInputStr);
- auto findStrView = value::getStringView(typeTagFindStr, valueFindStr);
- auto replacementStrView = value::getStringView(typeTagReplacementStr, valueReplacementStr);
+ auto input = value::getStringView(typeTagInputStr, valueInputStr);
+ auto find = value::getStringView(typeTagFindStr, valueFindStr);
+ auto replacement = value::getStringView(typeTagReplacementStr, valueReplacementStr);
// If find string is empty, return nothing, since an empty find will match every position in a
// string.
- if (findStrView.empty()) {
+ if (find.empty()) {
return {false, value::TypeTags::Nothing, 0};
}
- auto input = StringData(inputStrView.data(), inputStrView.length());
- auto find = StringData(findStrView.data(), findStrView.length());
- auto replacement = StringData(replacementStrView.data(), replacementStrView.length());
-
// If find string is not found, return the original string.
size_t startIndex = input.find(find);
if (startIndex == std::string::npos) {
@@ -1182,8 +1175,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinReplaceOne(Arit
output << input.substr(endIndex);
auto strData = output.stringData();
- auto [outputStrTypeTag, outputStrValue] =
- sbe::value::makeNewString({strData.rawData(), strData.size()});
+ auto [outputStrTypeTag, outputStrValue] = sbe::value::makeNewString(strData);
return {true, outputStrTypeTag, outputStrValue};
}
@@ -1321,9 +1313,7 @@ std::tuple<bool, value::TypeTags, value::Value> builtinDateHelper(
invariant(timeZoneDB);
auto tzString = value::getStringView(typeTagTz, valueTz);
- const auto tz = tzString == ""
- ? timeZoneDB->utcZone()
- : timeZoneDB->getTimeZone(StringData{tzString.data(), tzString.size()});
+ const auto tz = tzString == "" ? timeZoneDB->utcZone() : timeZoneDB->getTimeZone(tzString);
auto date =
computeDateFn(tz,
@@ -1858,8 +1848,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinConcat(ArityTyp
if (!value::isString(tag)) {
return {false, value::TypeTags::Nothing, 0};
}
- auto sv = sbe::value::getStringView(tag, value);
- result << StringData{sv.data(), sv.size()};
+ result << sbe::value::getStringView(tag, value);
}
auto [strTag, strValue] = sbe::value::makeNewString(result.str());
@@ -1956,7 +1945,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIndexOfBytes(Ar
return {false, value::TypeTags::Nothing, 0};
}
// Check for valid bounds.
- if (static_cast<size_t>(startIndex) > str.length()) {
+ if (static_cast<size_t>(startIndex) > str.size()) {
return {false, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-1)};
}
}
@@ -2003,7 +1992,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIndexOfCP(Arity
return {false, value::TypeTags::Nothing, 0};
}
// Check for valid bounds.
- if (static_cast<size_t>(startCodePointIndex) > str.length()) {
+ if (static_cast<size_t>(startCodePointIndex) > str.size()) {
return {false, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-1)};
}
}
@@ -2044,7 +2033,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIndexOfCP(Arity
byteIndex = startByteIndex;
for (codePointIndex = startCodePointIndex; codePointIndex < endCodePointIndex;
++codePointIndex) {
- if (str.compare(byteIndex, substr.size(), substr) == 0) {
+ if (str.substr(byteIndex, substr.size()).compare(substr) == 0) {
return {
false, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(codePointIndex)};
}
@@ -2088,7 +2077,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIsTimezone(Arit
return {false, value::TypeTags::Boolean, false};
}
auto timezoneStr = value::getStringView(timezoneTag, timezoneVal);
- if (timezoneDB->isTimeZoneIdentifier((StringData{timezoneStr.data(), timezoneStr.size()}))) {
+ if (timezoneDB->isTimeZoneIdentifier(timezoneStr)) {
return {false, value::TypeTags::Boolean, true};
}
return {false, value::TypeTags::Boolean, false};
@@ -2322,7 +2311,7 @@ namespace {
* ...} from the result of pcre_exec().
*/
std::tuple<bool, value::TypeTags, value::Value> buildRegexMatchResultObject(
- std::string_view inputString,
+ StringData inputString,
const std::vector<int>& capturesBuffer,
size_t numCaptures,
uint32_t& startBytePos,
@@ -2419,7 +2408,7 @@ std::tuple<bool, value::TypeTags, value::Value> buildRegexMatchResultObject(
* returned is true/false.
*/
std::tuple<bool, value::TypeTags, value::Value> pcreNextMatch(value::PcreRegex* pcre,
- std::string_view inputString,
+ StringData inputString,
std::vector<int>& capturesBuffer,
uint32_t& startBytePos,
uint32_t& codePointPos,
@@ -2454,7 +2443,7 @@ std::tuple<bool, value::TypeTags, value::Value> pcreNextMatch(value::PcreRegex*
*/
std::tuple<bool, value::TypeTags, value::Value> pcreFirstMatch(
value::PcreRegex* pcre,
- std::string_view inputString,
+ StringData inputString,
bool isMatch = false,
std::vector<int>* capturesBuffer = nullptr,
uint32_t* startBytePos = nullptr,
@@ -2507,16 +2496,15 @@ std::pair<value::TypeTags, value::Value> collComparisonKey(value::TypeTags tag,
// For strings, call CollatorInterface::getComparisonKey() to obtain the comparison key.
if (value::isString(tag)) {
- auto sv = value::getStringView(tag, val);
- auto compKey = collator->getComparisonKey(StringData{sv.data(), sv.size()});
+ auto compKey = collator->getComparisonKey(value::getStringView(tag, val));
auto keyData = compKey.getKeyData();
- return value::makeNewString(std::string_view{keyData.rawData(), keyData.size()});
+ return value::makeNewString(keyData);
}
// For collatable types other than strings (such as arrays and objects), we take the slow
// path and round-trip the value through BSON.
BSONObjBuilder input;
- bson::appendValueToBsonObj<BSONObjBuilder>(input, ""sv, tag, val);
+ bson::appendValueToBsonObj<BSONObjBuilder>(input, ""_sd, tag, val);
BSONObjBuilder output;
CollationIndexKey::collationAwareIndexKeyAppend(input.obj().firstElement(), collator, &output);
@@ -2625,8 +2613,8 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinRegexFindAll(Ar
startBytePos += str::getCodePointLength(inputString[startBytePos]);
++codePointPos;
} else {
- startBytePos += matchString.length();
- for (size_t byteIdx = 0; byteIdx < matchString.length(); ++codePointPos) {
+ startBytePos += matchString.size();
+ for (size_t byteIdx = 0; byteIdx < matchString.size(); ++codePointPos) {
byteIdx += str::getCodePointLength(matchString[byteIdx]);
}
}
@@ -2801,7 +2789,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinHasNullBytes(Ar
}
auto stringView = value::getStringView(strType, strValue);
- auto hasNullBytes = stringView.find('\0') != std::string_view::npos;
+ auto hasNullBytes = stringView.find('\0') != std::string::npos;
return {false, value::TypeTags::Boolean, value::bitcastFrom<bool>(hasNullBytes)};
}
diff --git a/src/mongo/db/exec/sbe/vm/vm.h b/src/mongo/db/exec/sbe/vm/vm.h
index b98f3261d12..1d11e835858 100644
--- a/src/mongo/db/exec/sbe/vm/vm.h
+++ b/src/mongo/db/exec/sbe/vm/vm.h
@@ -79,10 +79,8 @@ std::pair<value::TypeTags, value::Value> genericCompare(
auto lhsStr = getStringView(lhsTag, lhsValue);
auto rhsStr = getStringView(rhsTag, rhsValue);
- auto result = op(comparator ? comparator->compare(StringData{lhsStr.data(), lhsStr.size()},
- StringData{rhsStr.data(), rhsStr.size()})
- : lhsStr.compare(rhsStr),
- 0);
+ auto result =
+ op(comparator ? comparator->compare(lhsStr, rhsStr) : lhsStr.compare(rhsStr), 0);
return {value::TypeTags::Boolean, value::bitcastFrom<bool>(result)};
} else if (lhsTag == value::TypeTags::Date && rhsTag == value::TypeTags::Date) {