diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2019-10-23 12:20:37 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2019-10-23 12:20:37 +0200 |
commit | 54d302f21a82c3b8a3e8c286c20c4b577cfe8a0a (patch) | |
tree | c13cacec88d322512f5207c52437f0669531127d /vsm | |
parent | 29b1475210960916b2e11d67345fba57f13096cf (diff) |
Use std::unique_ptr<vsm::FieldSearcher> to store field searhers.
Diffstat (limited to 'vsm')
24 files changed, 91 insertions, 42 deletions
diff --git a/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp index bf40a679bab..a9f765546a8 100644 --- a/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp @@ -12,7 +12,11 @@ vespalib::stringref TRUE = "true"; vespalib::stringref FALSE = "false"; } -IMPLEMENT_DUPLICATE(BoolFieldSearcher); +std::unique_ptr<FieldSearcher> +BoolFieldSearcher::duplicate() const +{ + return std::make_unique<BoolFieldSearcher>(*this); +} BoolFieldSearcher::BoolFieldSearcher(FieldIdT fId) : FieldSearcher(fId), diff --git a/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h index 139645bf0ba..b7f9419465d 100644 --- a/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h @@ -8,7 +8,7 @@ namespace vsm { class BoolFieldSearcher : public FieldSearcher { public: - DUPLICATE(BoolFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; BoolFieldSearcher(FieldIdT fId); ~BoolFieldSearcher(); void prepare(search::QueryTermList & qtl, const SharedSearcherBuf & buf) override; diff --git a/vsm/src/vespa/vsm/searcher/fieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/fieldsearcher.cpp index 2ba5fea3153..4bb36d3f968 100644 --- a/vsm/src/vespa/vsm/searcher/fieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/fieldsearcher.cpp @@ -69,7 +69,6 @@ void FieldSearcherBase::prepare(const QueryTermList & qtl) FieldSearcher::FieldSearcher(const FieldIdT & fId, bool defaultPrefix) : FieldSearcherBase(), - Object(), _field(fId), _matchType(defaultPrefix ? PREFIX : REGULAR), _maxFieldLength(0x100000), diff --git a/vsm/src/vespa/vsm/searcher/fieldsearcher.h b/vsm/src/vespa/vsm/searcher/fieldsearcher.h index 2bf976de017..8bfb5a3af31 100644 --- a/vsm/src/vespa/vsm/searcher/fieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/fieldsearcher.h @@ -38,7 +38,7 @@ protected: search::v16qi *_qtlFast; }; -class FieldSearcher : public FieldSearcherBase, public search::Object +class FieldSearcher : public FieldSearcherBase { public: enum MatchType { @@ -50,7 +50,8 @@ public: }; FieldSearcher(const FieldIdT & fId, bool defaultPrefix=false); - ~FieldSearcher(); + ~FieldSearcher() override; + virtual std::unique_ptr<FieldSearcher> duplicate() const = 0; bool search(const StorageDocument & doc); virtual void prepare(search::QueryTermList & qtl, const SharedSearcherBuf & buf); const FieldIdT & field() const { return _field; } @@ -133,7 +134,7 @@ public: static search::byte _wordChar[256]; }; -typedef search::ObjectContainer<FieldSearcher> FieldSearcherContainer; +typedef std::unique_ptr<FieldSearcher> FieldSearcherContainer; typedef std::vector<FieldSearcherContainer> FieldIdTSearcherMapT; class FieldIdTSearcherMap : public FieldIdTSearcherMapT diff --git a/vsm/src/vespa/vsm/searcher/floatfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/floatfieldsearcher.cpp index 0f31c6420be..41a07a03bf2 100644 --- a/vsm/src/vespa/vsm/searcher/floatfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/floatfieldsearcher.cpp @@ -7,8 +7,17 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(FloatFieldSearcher); -IMPLEMENT_DUPLICATE(DoubleFieldSearcher); +std::unique_ptr<FieldSearcher> +FloatFieldSearcher::duplicate() const +{ + return std::make_unique<FloatFieldSearcher>(*this); +} + +std::unique_ptr<FieldSearcher> +DoubleFieldSearcher::duplicate() const +{ + return std::make_unique<DoubleFieldSearcher>(*this); +} template<typename T> FloatFieldSearcherT<T>::FloatFieldSearcherT(FieldIdT fId) : diff --git a/vsm/src/vespa/vsm/searcher/floatfieldsearcher.h b/vsm/src/vespa/vsm/searcher/floatfieldsearcher.h index a589706ff39..5f56ff67b30 100644 --- a/vsm/src/vespa/vsm/searcher/floatfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/floatfieldsearcher.h @@ -38,14 +38,14 @@ typedef FloatFieldSearcherT<double> FloatFieldSearcherTD; class FloatFieldSearcher : public FloatFieldSearcherTF { public: - DUPLICATE(FloatFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; FloatFieldSearcher(FieldIdT fId=0) : FloatFieldSearcherTF(fId) { } }; class DoubleFieldSearcher : public FloatFieldSearcherTD { public: - DUPLICATE(DoubleFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; DoubleFieldSearcher(FieldIdT fId=0) : FloatFieldSearcherTD(fId) { } }; diff --git a/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp index 335f6e81d23..e85cc20d418 100644 --- a/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp @@ -10,7 +10,11 @@ using search::v16qi; namespace vsm { -IMPLEMENT_DUPLICATE(FUTF8StrChrFieldSearcher); +std::unique_ptr<FieldSearcher> +FUTF8StrChrFieldSearcher::duplicate() const +{ + return std::make_unique<FUTF8StrChrFieldSearcher>(*this); +} FUTF8StrChrFieldSearcher::FUTF8StrChrFieldSearcher() : UTF8StrChrFieldSearcher(), diff --git a/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.h b/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.h index 265bca253d9..0539bdc6ea6 100644 --- a/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.h @@ -8,7 +8,7 @@ namespace vsm { class FUTF8StrChrFieldSearcher : public UTF8StrChrFieldSearcher { public: - DUPLICATE(FUTF8StrChrFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; FUTF8StrChrFieldSearcher(); FUTF8StrChrFieldSearcher(FieldIdT fId); ~FUTF8StrChrFieldSearcher(); diff --git a/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp index 30d9992e2d4..5886a17cf4a 100644 --- a/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp @@ -6,7 +6,11 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(IntFieldSearcher); +std::unique_ptr<FieldSearcher> +IntFieldSearcher::duplicate() const +{ + return std::make_unique<IntFieldSearcher>(*this); +} IntFieldSearcher::IntFieldSearcher(FieldIdT fId) : FieldSearcher(fId), diff --git a/vsm/src/vespa/vsm/searcher/intfieldsearcher.h b/vsm/src/vespa/vsm/searcher/intfieldsearcher.h index 3e158b2d93c..ea190bf07cd 100644 --- a/vsm/src/vespa/vsm/searcher/intfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/intfieldsearcher.h @@ -8,7 +8,7 @@ namespace vsm { class IntFieldSearcher : public FieldSearcher { public: - DUPLICATE(IntFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; IntFieldSearcher(FieldIdT fId=0); ~IntFieldSearcher(); void prepare(search::QueryTermList & qtl, const SharedSearcherBuf & buf) override; diff --git a/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.cpp index 26c4021ac40..1de8c40c93a 100644 --- a/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.cpp @@ -7,7 +7,11 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(UTF8ExactStringFieldSearcher); +std::unique_ptr<FieldSearcher> +UTF8ExactStringFieldSearcher::duplicate() const +{ + return std::make_unique<UTF8ExactStringFieldSearcher>(*this); +} size_t UTF8ExactStringFieldSearcher::matchTerms(const FieldRef & f, const size_t mintsz) diff --git a/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.h b/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.h index 9cca519d720..49557b8097d 100644 --- a/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/utf8exactstringfieldsearcher.h @@ -16,7 +16,7 @@ protected: virtual size_t matchTerms(const FieldRef & f, const size_t shortestTerm) override; public: - DUPLICATE(UTF8ExactStringFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; UTF8ExactStringFieldSearcher() : UTF8StringFieldSearcherBase() { } UTF8ExactStringFieldSearcher(FieldIdT fId) : UTF8StringFieldSearcherBase(fId) { } }; diff --git a/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.cpp index b458b73be61..77708a682a2 100644 --- a/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.cpp @@ -9,7 +9,11 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(UTF8FlexibleStringFieldSearcher); +std::unique_ptr<FieldSearcher> +UTF8FlexibleStringFieldSearcher::duplicate() const +{ + return std::make_unique<UTF8FlexibleStringFieldSearcher>(*this); +} size_t UTF8FlexibleStringFieldSearcher::matchTerms(const FieldRef & f, const size_t mintsz) diff --git a/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.h b/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.h index 0e58cae0938..f91bb48a068 100644 --- a/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/utf8flexiblestringfieldsearcher.h @@ -26,7 +26,7 @@ private: virtual size_t matchTerms(const FieldRef & f, const size_t shortestTerm) override; public: - DUPLICATE(UTF8FlexibleStringFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; UTF8FlexibleStringFieldSearcher(); UTF8FlexibleStringFieldSearcher(FieldIdT fId); }; diff --git a/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.cpp index b54ed2c583d..fc78101737e 100644 --- a/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.cpp @@ -7,7 +7,11 @@ using search::byte; namespace vsm { -IMPLEMENT_DUPLICATE(UTF8StrChrFieldSearcher); +std::unique_ptr<FieldSearcher> +UTF8StrChrFieldSearcher::duplicate() const +{ + return std::make_unique<UTF8StrChrFieldSearcher>(*this); +} size_t UTF8StrChrFieldSearcher::matchTerms(const FieldRef & f, const size_t mintsz) diff --git a/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.h b/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.h index b109ede3e03..acfe1256ee5 100644 --- a/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/utf8strchrfieldsearcher.h @@ -12,7 +12,7 @@ namespace vsm { class UTF8StrChrFieldSearcher : public UTF8StringFieldSearcherBase { public: - DUPLICATE(UTF8StrChrFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; UTF8StrChrFieldSearcher() : UTF8StringFieldSearcherBase() { } UTF8StrChrFieldSearcher(FieldIdT fId) : UTF8StringFieldSearcherBase(fId) { } diff --git a/vsm/src/vespa/vsm/searcher/utf8substringsearcher.cpp b/vsm/src/vespa/vsm/searcher/utf8substringsearcher.cpp index 4b8c6e31927..8cda3e27bd5 100644 --- a/vsm/src/vespa/vsm/searcher/utf8substringsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/utf8substringsearcher.cpp @@ -8,7 +8,11 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(UTF8SubStringFieldSearcher); +std::unique_ptr<FieldSearcher> +UTF8SubStringFieldSearcher::duplicate() const +{ + return std::make_unique<UTF8SubStringFieldSearcher>(*this); +} size_t UTF8SubStringFieldSearcher::matchTerms(const FieldRef & f, const size_t mintsz) diff --git a/vsm/src/vespa/vsm/searcher/utf8substringsearcher.h b/vsm/src/vespa/vsm/searcher/utf8substringsearcher.h index e034adeb1b5..9e01a56bdba 100644 --- a/vsm/src/vespa/vsm/searcher/utf8substringsearcher.h +++ b/vsm/src/vespa/vsm/searcher/utf8substringsearcher.h @@ -11,7 +11,7 @@ namespace vsm { class UTF8SubStringFieldSearcher : public UTF8StringFieldSearcherBase { public: - DUPLICATE(UTF8SubStringFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; UTF8SubStringFieldSearcher() : UTF8StringFieldSearcherBase() { } UTF8SubStringFieldSearcher(FieldIdT fId) : UTF8StringFieldSearcherBase(fId) { } protected: diff --git a/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.cpp b/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.cpp index eee88b34ea6..c19259273d0 100644 --- a/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.cpp +++ b/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.cpp @@ -8,7 +8,11 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(UTF8SubstringSnippetModifier); +std::unique_ptr<FieldSearcher> +UTF8SubstringSnippetModifier::duplicate() const +{ + return std::make_unique<UTF8SubstringSnippetModifier>(*this); +} size_t UTF8SubstringSnippetModifier::matchTerms(const FieldRef & f, const size_t mintsz) diff --git a/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.h b/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.h index 3d266174f3d..fce0fdc2175 100644 --- a/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.h +++ b/vsm/src/vespa/vsm/searcher/utf8substringsnippetmodifier.h @@ -49,7 +49,7 @@ private: public: typedef std::shared_ptr<UTF8SubstringSnippetModifier> SP; - DUPLICATE(UTF8SubstringSnippetModifier); + std::unique_ptr<FieldSearcher> duplicate() const override; UTF8SubstringSnippetModifier(); UTF8SubstringSnippetModifier(FieldIdT fId); diff --git a/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.cpp index 13074937185..1e9ec246743 100644 --- a/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.cpp @@ -7,7 +7,11 @@ using search::QueryTermList; namespace vsm { -IMPLEMENT_DUPLICATE(UTF8SuffixStringFieldSearcher); +std::unique_ptr<FieldSearcher> +UTF8SuffixStringFieldSearcher::duplicate() const +{ + return std::make_unique<UTF8SuffixStringFieldSearcher>(*this); +} size_t UTF8SuffixStringFieldSearcher::matchTerms(const FieldRef & f, const size_t mintsz) diff --git a/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.h b/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.h index 8bb32ab3c39..cc55ee7bb43 100644 --- a/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/utf8suffixstringfieldsearcher.h @@ -16,7 +16,7 @@ protected: virtual size_t matchTerms(const FieldRef & f, const size_t shortestTerm) override; public: - DUPLICATE(UTF8SuffixStringFieldSearcher); + std::unique_ptr<FieldSearcher> duplicate() const override; UTF8SuffixStringFieldSearcher() : UTF8StringFieldSearcherBase() { } UTF8SuffixStringFieldSearcher(FieldIdT fId) : UTF8StringFieldSearcherBase(fId) { } }; diff --git a/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp b/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp index 8d4cf72b824..8bb047beb24 100644 --- a/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp +++ b/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp @@ -52,6 +52,9 @@ FieldSearchSpec::FieldSearchSpec() : } FieldSearchSpec::~FieldSearchSpec() = default; +FieldSearchSpec& +FieldSearchSpec::operator=(FieldSearchSpec&& rhs) = default; + FieldSearchSpec::FieldSearchSpec(const FieldIdT & fid, const vespalib::string & fname, VsmfieldsConfig::Fieldspec::Searchmethod searchDef, const vespalib::string & arg1, size_t maxLength_) : @@ -72,36 +75,36 @@ FieldSearchSpec::FieldSearchSpec(const FieldIdT & fid, const vespalib::string & case VsmfieldsConfig::Fieldspec::Searchmethod::SSE2UTF8: case VsmfieldsConfig::Fieldspec::Searchmethod::UTF8: if (arg1 == "substring") { - _searcher = UTF8SubStringFieldSearcher(fid); + _searcher = std::make_unique<UTF8SubStringFieldSearcher>(fid); } else if (arg1 == "suffix") { - _searcher = UTF8SuffixStringFieldSearcher(fid); + _searcher = std::make_unique<UTF8SuffixStringFieldSearcher>(fid); } else if (arg1 == "exact") { - _searcher = UTF8ExactStringFieldSearcher(fid); + _searcher = std::make_unique<UTF8ExactStringFieldSearcher>(fid); } else if (arg1 == "word") { - _searcher = UTF8ExactStringFieldSearcher(fid); + _searcher = std::make_unique<UTF8ExactStringFieldSearcher>(fid); } else if (searchDef == VsmfieldsConfig::Fieldspec::Searchmethod::UTF8) { - _searcher = UTF8StrChrFieldSearcher(fid); + _searcher = std::make_unique<UTF8StrChrFieldSearcher>(fid); } else { - _searcher = FUTF8StrChrFieldSearcher(fid); + _searcher = std::make_unique<FUTF8StrChrFieldSearcher>(fid); } break; case VsmfieldsConfig::Fieldspec::Searchmethod::BOOL: - _searcher = BoolFieldSearcher(fid); + _searcher = std::make_unique<BoolFieldSearcher>(fid); break; case VsmfieldsConfig::Fieldspec::Searchmethod::INT8: case VsmfieldsConfig::Fieldspec::Searchmethod::INT16: case VsmfieldsConfig::Fieldspec::Searchmethod::INT32: case VsmfieldsConfig::Fieldspec::Searchmethod::INT64: - _searcher = IntFieldSearcher(fid); + _searcher = std::make_unique<IntFieldSearcher>(fid); break; case VsmfieldsConfig::Fieldspec::Searchmethod::FLOAT: - _searcher = FloatFieldSearcher(fid); + _searcher = std::make_unique<FloatFieldSearcher>(fid); break; case VsmfieldsConfig::Fieldspec::Searchmethod::DOUBLE: - _searcher = DoubleFieldSearcher(fid); + _searcher = std::make_unique<DoubleFieldSearcher>(fid); break; } - if (_searcher.valid()) { + if (_searcher) { setMatchType(_searcher, arg1); _searcher->maxFieldLength(maxLength()); } @@ -123,7 +126,7 @@ FieldSearchSpec::reconfig(const search::QueryTerm & term) (term.isExactstring() && _arg1 != "exact") || (term.isPrefix() && _arg1 == "suffix")) { - _searcher = UTF8FlexibleStringFieldSearcher(id()); + _searcher = std::make_unique<UTF8FlexibleStringFieldSearcher>(id()); // preserve the basic match property of the searcher setMatchType(_searcher, _arg1); LOG(debug, "Reconfigured to use UTF8FlexibleStringFieldSearcher (%s) for field '%s' with id '%d'", @@ -139,7 +142,7 @@ FieldSearchSpec::reconfig(const search::QueryTerm & term) vespalib::asciistream & operator <<(vespalib::asciistream & os, const FieldSearchSpec & f) { os << f._id << ' ' << f._name << ' '; - if ( ! f._searcher.valid()) { + if ( ! f._searcher) { os << " No searcher defined.\n"; } return os; @@ -251,7 +254,7 @@ bool FieldSearchSpecMap::buildFromConfig(const VsmfieldsHandle & conf) LOG(spam, "Parsing %s", cfs.name.c_str()); FieldIdT fieldId = specMap().size(); FieldSearchSpec fss(fieldId, cfs.name, cfs.searchmethod, cfs.arg1.c_str(), cfs.maxlength); - _specMap[fieldId] = fss; + _specMap[fieldId] = std::move(fss); _nameIdMap.add(cfs.name, fieldId); LOG(spam, "M in %d = %s", fieldId, cfs.name.c_str()); } @@ -298,7 +301,7 @@ void FieldSearchSpecMap::buildSearcherMap(const StringFieldIdTMapT & fieldsInQue for (const auto & entry : fieldsInQuery) { FieldIdT fId = entry.second; const FieldSearchSpec & spec = specMap().find(fId)->second; - fieldSearcherMap.push_back(spec.searcher()); + fieldSearcherMap.emplace_back(spec.searcher().duplicate()); } std::sort(fieldSearcherMap.begin(), fieldSearcherMap.end(), lesserField); } diff --git a/vsm/src/vespa/vsm/vsm/fieldsearchspec.h b/vsm/src/vespa/vsm/vsm/fieldsearchspec.h index 445334bd182..d3feb8621b5 100644 --- a/vsm/src/vespa/vsm/vsm/fieldsearchspec.h +++ b/vsm/src/vespa/vsm/vsm/fieldsearchspec.h @@ -14,10 +14,11 @@ public: VsmfieldsConfig::Fieldspec::Searchmethod searchMethod, const vespalib::string & arg1, size_t maxLength); ~FieldSearchSpec(); + FieldSearchSpec& operator=(FieldSearchSpec&& rhs); const FieldSearcher & searcher() const { return *_searcher; } const vespalib::string & name() const { return _name; } FieldIdT id() const { return _id; } - bool valid() const { return _searcher.valid(); } + bool valid() const { return static_cast<bool>(_searcher); } size_t maxLength() const { return _maxLength; } /** |