diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-03-18 20:31:49 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-03-18 20:31:49 +0000 |
commit | 3a785aa5363cb143a04988b39975f33431a54bf4 (patch) | |
tree | f619fef4fdd97ad2cae9aba7232ec12aab52ccb0 /searchlib | |
parent | bd5cc0e691e3d79de3c206c6195955c99239eec2 (diff) |
Use an more optimal SingleValueExecutor for single constants.
Diffstat (limited to 'searchlib')
6 files changed, 30 insertions, 17 deletions
diff --git a/searchlib/src/vespa/searchlib/features/fieldlengthfeature.cpp b/searchlib/src/vespa/searchlib/features/fieldlengthfeature.cpp index 74bfa156b5f..0cbcf62de6b 100644 --- a/searchlib/src/vespa/searchlib/features/fieldlengthfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/fieldlengthfeature.cpp @@ -92,9 +92,7 @@ FeatureExecutor & FieldLengthBlueprint::createExecutor(const IQueryEnvironment &env, vespalib::Stash &stash) const { if (_field == 0) { - std::vector<feature_t> values; - values.push_back(fef::FieldPositionsIterator::UNKNOWN_LENGTH); - return stash.create<ValueExecutor>(values); + return stash.create<SingleValueExecutor>(fef::FieldPositionsIterator::UNKNOWN_LENGTH); } return stash.create<FieldLengthExecutor>(env, _field->id()); } diff --git a/searchlib/src/vespa/searchlib/features/queryfeature.cpp b/searchlib/src/vespa/searchlib/features/queryfeature.cpp index b927188c1aa..12cad613a80 100644 --- a/searchlib/src/vespa/searchlib/features/queryfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/queryfeature.cpp @@ -146,11 +146,10 @@ QueryBlueprint::createExecutor(const IQueryEnvironment &env, vespalib::Stash &st p = env.getProperties().lookup(_key2); } if (p.found()) { - values.push_back(asFeature(p.get())); + return stash.create<SingleValueExecutor>(asFeature(p.get())); } else { - values.push_back(_defaultValue); + return stash.create<SingleValueExecutor>(_defaultValue); } - return stash.create<ValueExecutor>(values); } } diff --git a/searchlib/src/vespa/searchlib/features/querytermcountfeature.cpp b/searchlib/src/vespa/searchlib/features/querytermcountfeature.cpp index cbaf9e97cb6..741501d3b6d 100644 --- a/searchlib/src/vespa/searchlib/features/querytermcountfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/querytermcountfeature.cpp @@ -43,9 +43,7 @@ QueryTermCountBlueprint::setup(const IIndexEnvironment &, FeatureExecutor & QueryTermCountBlueprint::createExecutor(const IQueryEnvironment &env, vespalib::Stash &stash) const { - std::vector<feature_t> values; - values.push_back(static_cast<feature_t>(env.getNumTerms())); - return stash.create<ValueExecutor>(values); + return stash.create<SingleValueExecutor>(env.getNumTerms()); } } diff --git a/searchlib/src/vespa/searchlib/features/terminfofeature.cpp b/searchlib/src/vespa/searchlib/features/terminfofeature.cpp index ca7a5d8e248..b61021c4aa2 100644 --- a/searchlib/src/vespa/searchlib/features/terminfofeature.cpp +++ b/searchlib/src/vespa/searchlib/features/terminfofeature.cpp @@ -39,9 +39,7 @@ TermInfoBlueprint::createExecutor(const IQueryEnvironment &queryEnv, vespalib::S if (queryEnv.getNumTerms() > _termIdx) { queryIdx = _termIdx; } - std::vector<feature_t> values; - values.push_back(queryIdx); - return stash.create<ValueExecutor>(values); + return stash.create<SingleValueExecutor>(queryIdx); } } diff --git a/searchlib/src/vespa/searchlib/features/valuefeature.cpp b/searchlib/src/vespa/searchlib/features/valuefeature.cpp index 2b91cf1688b..64f2ba862e2 100644 --- a/searchlib/src/vespa/searchlib/features/valuefeature.cpp +++ b/searchlib/src/vespa/searchlib/features/valuefeature.cpp @@ -22,6 +22,12 @@ ValueExecutor::execute(uint32_t) } void +SingleValueExecutor::execute(uint32_t) +{ + outputs().set_number(0, _value); +} + +void SingleZeroValueExecutor::execute(uint32_t) { outputs().set_number(0, 0.0); @@ -56,10 +62,13 @@ ValueBlueprint::setup(const IIndexEnvironment &, const ParameterList & params) } FeatureExecutor & -ValueBlueprint::createExecutor(const IQueryEnvironment &queryEnv, vespalib::Stash &stash) const +ValueBlueprint::createExecutor(const IQueryEnvironment &, vespalib::Stash &stash) const { - (void) queryEnv; - return stash.create<ValueExecutor>(_values); + if (_values.size() == 1) { + return stash.create<SingleValueExecutor>(_values[0]); + } else { + return stash.create<ValueExecutor>(_values); + } } diff --git a/searchlib/src/vespa/searchlib/features/valuefeature.h b/searchlib/src/vespa/searchlib/features/valuefeature.h index 1cc6bd55bc1..d8e2ab70d0b 100644 --- a/searchlib/src/vespa/searchlib/features/valuefeature.h +++ b/searchlib/src/vespa/searchlib/features/valuefeature.h @@ -7,7 +7,7 @@ namespace search::features { -class ValueExecutor : public fef::FeatureExecutor +class ValueExecutor final : public fef::FeatureExecutor { private: std::vector<feature_t> _values; @@ -19,7 +19,18 @@ public: const std::vector<feature_t> & getValues() const { return _values; } }; -class SingleZeroValueExecutor : public fef::FeatureExecutor +class SingleValueExecutor final : public fef::FeatureExecutor +{ +private: + feature_t _value; + +public: + SingleValueExecutor(feature_t value) : _value(value) { } + bool isPure() override { return true; } + void execute(uint32_t docId) override; +}; + +class SingleZeroValueExecutor final : public fef::FeatureExecutor { public: SingleZeroValueExecutor() : FeatureExecutor() {} |