diff options
author | Drew Paroski <drew.paroski@mongodb.com> | 2021-10-13 20:20:05 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-16 00:29:02 +0000 |
commit | 1b95b9f923a5bcbdd755672abffc3c14d1a4d7db (patch) | |
tree | 2b9aadbf9e80acfb16758815633f676e8a73eef3 /src/mongo/db/fts | |
parent | e77eda3f09dcd2be820b1f1eec7ce8ac6c0cf477 (diff) | |
download | mongo-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.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_matcher.h | 2 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_query.h | 4 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_query_impl.cpp | 27 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_query_impl.h | 2 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_spec.cpp | 27 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_spec.h | 2 |
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. |