summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-03-18 20:31:49 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-03-18 20:31:49 +0000
commit3a785aa5363cb143a04988b39975f33431a54bf4 (patch)
treef619fef4fdd97ad2cae9aba7232ec12aab52ccb0 /searchlib
parentbd5cc0e691e3d79de3c206c6195955c99239eec2 (diff)
Use an more optimal SingleValueExecutor for single constants.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldlengthfeature.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/features/queryfeature.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/features/querytermcountfeature.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/features/terminfofeature.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/features/valuefeature.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/features/valuefeature.h15
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() {}