diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-06-20 16:36:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-20 16:36:45 +0200 |
commit | a3057f2436aad98d7a07a6bd467c0cf7b3a3d924 (patch) | |
tree | 55fd3f1d24d1834a2ffc43ed6c018813841c16cf | |
parent | fb2ad971b8f14d40a88d6a3cacd7744de244a09c (diff) | |
parent | 3c720effede799a8aed52b25dde45fb8b43acebf (diff) |
Merge pull request #12 from yahoo/balder/micro-optimize-query-setup-based-on-gemini
Balder/micro optimize query setup based on gemini
5 files changed, 38 insertions, 44 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp b/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp index 2acb9c3a165..8667cdb234b 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp @@ -24,7 +24,6 @@ using search::fef::FieldType; using search::fef::IIndexEnvironment; using search::fef::MatchData; using search::fef::MatchDataLayout; -using search::fef::SimpleTermData; using search::fef::TermFieldHandle; using search::query::Node; using search::query::TemplateTermVisitor; @@ -109,25 +108,12 @@ ProtonTermData::setDocumentFrequency(uint32_t estHits, uint32_t docIdLimit) } } -size_t -ProtonTermData::numFields() const -{ - return _fields.size(); -} - -const ProtonTermData::FieldEntry & -ProtonTermData::field(size_t i) const -{ - assert(i < _fields.size()); - return _fields[i]; -} - const ProtonTermData::FieldEntry * ProtonTermData::lookupField(uint32_t fieldId) const { - for (size_t i = 0; i < numFields(); ++i) { - if (field(i).getFieldId() == fieldId) { - return &field(i); + for (size_t i = 0; i < _fields.size(); ++i) { + if (_fields[i].getFieldId() == fieldId) { + return &_fields[i]; } } return 0; diff --git a/searchcore/src/vespa/searchcore/proton/matching/querynodes.h b/searchcore/src/vespa/searchcore/proton/matching/querynodes.h index 63052d633d1..b0f844b779c 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/querynodes.h +++ b/searchcore/src/vespa/searchcore/proton/matching/querynodes.h @@ -27,7 +27,7 @@ class ProtonTermData : public search::fef::ITermData public: typedef search::queryeval::FieldSpec FieldSpec; - struct FieldEntry : search::fef::SimpleTermFieldData { + struct FieldEntry final : search::fef::SimpleTermFieldData { vespalib::string field_name; bool attribute_field; bool filter_field; @@ -42,7 +42,7 @@ public: return FieldSpec(field_name, getFieldId(), getHandle(), filter_field); } - virtual search::fef::TermFieldHandle getHandle() const; + search::fef::TermFieldHandle getHandle() const override; }; private: @@ -62,9 +62,9 @@ public: void setDocumentFrequency(uint32_t estHits, uint32_t numDocs); // ITermData interface - virtual size_t numFields() const; - virtual const FieldEntry &field(size_t i) const; - virtual const FieldEntry *lookupField(uint32_t fieldId) const; + size_t numFields() const override final { return _fields.size(); } + const FieldEntry &field(size_t i) const override final { return _fields[i]; } + const FieldEntry *lookupField(uint32_t fieldId) const override final; }; namespace { @@ -76,8 +76,8 @@ uint32_t numTerms<search::query::Phrase>(const search::query::Phrase &n) { } // namespace proton::matching::<unnamed> template <typename Base> -struct ProtonTerm : public Base, - public ProtonTermData +struct ProtonTermBase : public Base, + public ProtonTermData { using Base::Base; @@ -89,10 +89,15 @@ struct ProtonTerm : public Base, } // ITermData interface - virtual uint32_t getPhraseLength() const { return numTerms<Base>(*this); } - virtual uint32_t getTermIndex() const { return -1; } - virtual search::query::Weight getWeight() const { return Base::getWeight(); } - virtual uint32_t getUniqueId() const { return Base::getId(); } + uint32_t getPhraseLength() const override final { return numTerms<Base>(*this); } + uint32_t getTermIndex() const override final { return -1; } + search::query::Weight getWeight() const override final { return Base::getWeight(); } + uint32_t getUniqueId() const override final { return Base::getId(); } +}; + +template <typename Base> +struct ProtonTerm : public ProtonTermBase<Base> { + using ProtonTermBase<Base>::ProtonTermBase; }; typedef search::query::SimpleAnd ProtonAnd; @@ -103,10 +108,10 @@ typedef search::query::SimpleOr ProtonOr; typedef search::query::SimpleRank ProtonRank; typedef search::query::SimpleWeakAnd ProtonWeakAnd; -struct ProtonEquiv : public ProtonTerm<search::query::Equiv> +struct ProtonEquiv final : public ProtonTermBase<search::query::Equiv> { search::fef::MatchDataLayout children_mdl; - using ProtonTerm::ProtonTerm; + using ProtonTermBase::ProtonTermBase; }; typedef ProtonTerm<search::query::LocationTerm> ProtonLocationTerm; diff --git a/searchlib/src/vespa/searchlib/features/item_raw_score_feature.cpp b/searchlib/src/vespa/searchlib/features/item_raw_score_feature.cpp index 1fc8203a58e..a4dfc4821df 100644 --- a/searchlib/src/vespa/searchlib/features/item_raw_score_feature.cpp +++ b/searchlib/src/vespa/searchlib/features/item_raw_score_feature.cpp @@ -68,10 +68,13 @@ ItemRawScoreBlueprint::resolve(const search::fef::IQueryEnvironment &env, { HandleVector handles; const ITermData *term = util::getTermByLabel(env, label); - for (uint32_t i = 0; (term != 0) && (i < term->numFields()); ++i) { - TermFieldHandle handle = term->field(i).getHandle(); - if (handle != IllegalHandle) { - handles.push_back(handle); + if (term != nullptr) { + uint32_t numFields(term->numFields()); + for (uint32_t i(0); i < numFields; ++i) { + TermFieldHandle handle = term->field(i).getHandle(); + if (handle != IllegalHandle) { + handles.push_back(handle); + } } } return handles; diff --git a/searchlib/src/vespa/searchlib/fef/simpletermdata.h b/searchlib/src/vespa/searchlib/fef/simpletermdata.h index ee4cab468e1..68d6dcd1160 100644 --- a/searchlib/src/vespa/searchlib/fef/simpletermdata.h +++ b/searchlib/src/vespa/searchlib/fef/simpletermdata.h @@ -14,7 +14,7 @@ namespace fef { /** * Static match data for a single unit (term/phrase/etc). **/ -class SimpleTermData : public ITermData +class SimpleTermData final : public ITermData { private: query::Weight _weight; @@ -40,37 +40,37 @@ public: /** * Returns the term weight. **/ - virtual query::Weight getWeight() const { return _weight; } + query::Weight getWeight() const override { return _weight; } /** * Returns the number of terms represented by this term data object. **/ - virtual uint32_t getPhraseLength() const { return _numTerms; } + uint32_t getPhraseLength() const override { return _numTerms; } /** * Obtain the location of this term in the original user query. * * @return term index **/ - virtual uint32_t getTermIndex() const { return _termIndex; } + uint32_t getTermIndex() const override { return _termIndex; } /** * Obtain the unique id of this term. 0 means not set. * * @return unique id or 0 **/ - virtual uint32_t getUniqueId() const { return _uniqueId; } + uint32_t getUniqueId() const override { return _uniqueId; } /** * Get number of fields searched **/ - virtual size_t numFields() const { return _fields.size(); } + size_t numFields() const override { return _fields.size(); } /** * Direct access to data for individual fields * @param i local index, must have: 0 <= i < numFields() */ - virtual const ITermFieldData &field(size_t i) const { + const ITermFieldData &field(size_t i) const override { return _fields[i]; } @@ -81,7 +81,7 @@ public: * * @return term field data, or NULL if not found **/ - virtual const ITermFieldData *lookupField(uint32_t fieldId) const { + const ITermFieldData *lookupField(uint32_t fieldId) const override { for (size_t fieldIdx(0), m(numFields()); fieldIdx < m; ++fieldIdx) { const ITermFieldData &tfd = field(fieldIdx); if (tfd.getFieldId() == fieldId) { diff --git a/searchlib/src/vespa/searchlib/fef/simpletermfielddata.h b/searchlib/src/vespa/searchlib/fef/simpletermfielddata.h index f95ca5b3472..190ae8e80d2 100644 --- a/searchlib/src/vespa/searchlib/fef/simpletermfielddata.h +++ b/searchlib/src/vespa/searchlib/fef/simpletermfielddata.h @@ -38,14 +38,14 @@ public: * * @return field id **/ - virtual uint32_t getFieldId() const { return _fieldId; } + uint32_t getFieldId() const override final { return _fieldId; } /** * Obtain the document frequency. * * @return document frequency **/ - virtual double getDocFreq() const { return _docFreq; } + double getDocFreq() const override final { return _docFreq; } /** * Obtain the match handle for this field. |