summaryrefslogtreecommitdiff
path: root/src/mongo/db/fts
diff options
context:
space:
mode:
authorDrew Paroski <drew.paroski@mongodb.com>2021-10-13 20:20:05 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-16 00:29:02 +0000
commit1b95b9f923a5bcbdd755672abffc3c14d1a4d7db (patch)
tree2b9aadbf9e80acfb16758815633f676e8a73eef3 /src/mongo/db/fts
parente77eda3f09dcd2be820b1f1eec7ce8ac6c0cf477 (diff)
downloadmongo-1b95b9f923a5bcbdd755672abffc3c14d1a4d7db.tar.gz
SERVER-60273 Calculate the estimated size for missing types in sbe::value::getApproximateSize()
Diffstat (limited to 'src/mongo/db/fts')
-rw-r--r--src/mongo/db/fts/fts_matcher.cpp7
-rw-r--r--src/mongo/db/fts/fts_matcher.h2
-rw-r--r--src/mongo/db/fts/fts_query.h4
-rw-r--r--src/mongo/db/fts/fts_query_impl.cpp27
-rw-r--r--src/mongo/db/fts/fts_query_impl.h2
-rw-r--r--src/mongo/db/fts/fts_spec.cpp27
-rw-r--r--src/mongo/db/fts/fts_spec.h2
7 files changed, 71 insertions, 0 deletions
diff --git a/src/mongo/db/fts/fts_matcher.cpp b/src/mongo/db/fts/fts_matcher.cpp
index be9daa5801d..a248d9600d8 100644
--- a/src/mongo/db/fts/fts_matcher.cpp
+++ b/src/mongo/db/fts/fts_matcher.cpp
@@ -141,6 +141,13 @@ bool FTSMatcher::negativePhrasesMatch(const BSONObj& obj) const {
return true;
}
+size_t FTSMatcher::getApproximateSize() const {
+ auto size = sizeof(FTSMatcher);
+ size += _query.getApproximateSize() - sizeof(_query);
+ size += _spec.getApproximateSize() - sizeof(_spec);
+ return size;
+}
+
bool FTSMatcher::_phraseMatch(const string& phrase, const BSONObj& obj) const {
FTSElementIterator it(_spec, obj);
diff --git a/src/mongo/db/fts/fts_matcher.h b/src/mongo/db/fts/fts_matcher.h
index 1f3de2c91f6..8698ba0648d 100644
--- a/src/mongo/db/fts/fts_matcher.h
+++ b/src/mongo/db/fts/fts_matcher.h
@@ -83,6 +83,8 @@ public:
return _spec;
}
+ size_t getApproximateSize() const;
+
private:
/**
* For matching, can we skip the positive term check? This is done as optimization when
diff --git a/src/mongo/db/fts/fts_query.h b/src/mongo/db/fts/fts_query.h
index 2cfce1326cb..5469f83a313 100644
--- a/src/mongo/db/fts/fts_query.h
+++ b/src/mongo/db/fts/fts_query.h
@@ -97,6 +97,10 @@ public:
*/
virtual std::unique_ptr<FTSQuery> clone() const = 0;
+ virtual size_t getApproximateSize() const {
+ return sizeof(FTSQuery) + _query.size() + 1 + _language.size() + 1;
+ }
+
private:
std::string _query;
std::string _language;
diff --git a/src/mongo/db/fts/fts_query_impl.cpp b/src/mongo/db/fts/fts_query_impl.cpp
index e996a12862c..c5b7ed85c0f 100644
--- a/src/mongo/db/fts/fts_query_impl.cpp
+++ b/src/mongo/db/fts/fts_query_impl.cpp
@@ -206,5 +206,32 @@ BSONObj FTSQueryImpl::toBSON() const {
bob.append("negatedPhrases", getNegatedPhr());
return bob.obj();
}
+
+size_t FTSQueryImpl::getApproximateSize() const {
+ auto computeVectorSize = [](const std::vector<std::string>& v) {
+ size_t size = 0;
+ for (const auto& str : v) {
+ size += sizeof(str) + str.size() + 1;
+ }
+ return size;
+ };
+
+ auto computeSetSize = [](const std::set<std::string>& s) {
+ size_t size = 0;
+ for (const auto& str : s) {
+ size += sizeof(str) + str.size() + 1;
+ }
+ return size;
+ };
+
+ auto size = sizeof(FTSQueryImpl);
+ size += FTSQuery::getApproximateSize() - sizeof(FTSQuery);
+ size += computeSetSize(_positiveTerms);
+ size += computeSetSize(_negatedTerms);
+ size += computeVectorSize(_positivePhrases);
+ size += computeVectorSize(_negatedPhrases);
+ size += computeSetSize(_termsForBounds);
+ return size;
+}
} // namespace fts
} // namespace mongo
diff --git a/src/mongo/db/fts/fts_query_impl.h b/src/mongo/db/fts/fts_query_impl.h
index 97cdb8388df..06d400b5a19 100644
--- a/src/mongo/db/fts/fts_query_impl.h
+++ b/src/mongo/db/fts/fts_query_impl.h
@@ -75,6 +75,8 @@ public:
*/
BSONObj toBSON() const;
+ size_t getApproximateSize() const final;
+
private:
void _addTerms(FTSTokenizer* tokenizer, const std::string& tokens, bool negated);
diff --git a/src/mongo/db/fts/fts_spec.cpp b/src/mongo/db/fts/fts_spec.cpp
index 7226ff5bb44..4306cb9e3c5 100644
--- a/src/mongo/db/fts/fts_spec.cpp
+++ b/src/mongo/db/fts/fts_spec.cpp
@@ -512,5 +512,32 @@ StatusWith<BSONObj> FTSSpec::fixSpec(const BSONObj& spec) {
return b.obj();
}
+
+size_t FTSSpec::getApproximateSize() const {
+ auto computeVectorSize = [](const std::vector<std::string>& v) {
+ size_t size = 0;
+ for (const auto& str : v) {
+ size += sizeof(str) + str.size() + 1;
+ }
+ return size;
+ };
+
+ auto computeWeightsSize = [](const Weights& w) {
+ size_t size = 0;
+ for (const auto& p : w) {
+ size += sizeof(p) + p.first.size() + 1;
+ }
+ return size;
+ };
+
+ // _defaultLanguage is owned by the LanguageRegistry class and may be shared across many
+ // FTSSpec's, so we don't account for the size of _defaultLanguage here.
+ auto size = sizeof(FTSSpec);
+ size += _languageOverrideField.size() + 1;
+ size += computeWeightsSize(_weights);
+ size += computeVectorSize(_extraBefore);
+ size += computeVectorSize(_extraAfter);
+ return size;
+}
} // namespace fts
} // namespace mongo
diff --git a/src/mongo/db/fts/fts_spec.h b/src/mongo/db/fts/fts_spec.h
index 1061865bcbd..dbc67857b82 100644
--- a/src/mongo/db/fts/fts_spec.h
+++ b/src/mongo/db/fts/fts_spec.h
@@ -122,6 +122,8 @@ public:
return _textIndexVersion;
}
+ size_t getApproximateSize() const;
+
private:
//
// Helper methods. Invoked for TEXT_INDEX_VERSION_2 spec objects only.