aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2020-05-26 14:20:35 +0200
committerTor Egge <Tor.Egge@broadpark.no>2020-05-26 14:30:17 +0200
commit35345d4574228e201942bceaebd348e4518a4107 (patch)
tree8efb2941749533063621810312201c95e74a7ca5 /searchlib
parent2db5075555f93d5adbc5db67c53935d904e4aceb (diff)
Setup field match executor shared state.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp60
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldmatchfeature.h1
2 files changed, 41 insertions, 20 deletions
diff --git a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp
index 9e4aa0d96ab..8ccf9cf4b3e 100644
--- a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp
@@ -18,35 +18,50 @@ using CollectionType = FieldInfo::CollectionType;
namespace search::features {
+class FieldMatchExecutorSharedState : public Anything {
+private:
+ PhraseSplitterQueryEnv _splitter_env;
+ fieldmatch::ComputerSharedState _cmp_shared_state;
+public:
+ FieldMatchExecutorSharedState(const fef::IQueryEnvironment& query_env,
+ const fef::FieldInfo& field,
+ const fieldmatch::Params& params);
+ ~FieldMatchExecutorSharedState() override;
+ const PhraseSplitterQueryEnv& get_phrase_splitter_query_env() const { return _splitter_env; }
+ const fieldmatch::ComputerSharedState &get_field_match_computer_shared_state() const { return _cmp_shared_state; }
+};
+
+FieldMatchExecutorSharedState::FieldMatchExecutorSharedState(const IQueryEnvironment& query_env,
+ const FieldInfo& field,
+ const fieldmatch::Params& params)
+ : Anything(),
+ _splitter_env(query_env, field.id()),
+ _cmp_shared_state(vespalib::make_string("fieldMatch(%s)", field.name().c_str()), _splitter_env, field, params)
+{
+ // empty
+}
+
+FieldMatchExecutorSharedState::~FieldMatchExecutorSharedState() = default;
+
/**
* Implements the executor for THE field match feature.
*/
class FieldMatchExecutor : public fef::FeatureExecutor {
private:
- PhraseSplitterQueryEnv _splitter_env;
fef::PhraseSplitter _splitter;
- const fef::FieldInfo & _field;
- fieldmatch::ComputerSharedState _cmp_shared_state;
fieldmatch::Computer _cmp;
void handle_bind_match_data(const fef::MatchData &md) override;
public:
- FieldMatchExecutor(const fef::IQueryEnvironment & queryEnv,
- const fef::FieldInfo & field,
- const fieldmatch::Params & params);
+ FieldMatchExecutor(const FieldMatchExecutorSharedState& shared_state);
void execute(uint32_t docId) override;
};
-FieldMatchExecutor::FieldMatchExecutor(const IQueryEnvironment & queryEnv,
- const FieldInfo & field,
- [[maybe_unused]] const fieldmatch::Params & params) :
- FeatureExecutor(),
- _splitter_env(queryEnv, field.id()),
- _splitter(_splitter_env),
- _field(field),
- _cmp_shared_state(vespalib::make_string("fieldMatch(%s)", _field.name().c_str()), _splitter_env, field, params),
- _cmp(_cmp_shared_state, _splitter)
+FieldMatchExecutor::FieldMatchExecutor(const FieldMatchExecutorSharedState& shared_state)
+ : FeatureExecutor(),
+ _splitter(shared_state.get_phrase_splitter_query_env()),
+ _cmp(shared_state.get_field_match_computer_shared_state(), _splitter)
{
// empty
}
@@ -118,6 +133,7 @@ FieldMatchExecutor::handle_bind_match_data(const fef::MatchData &md)
FieldMatchBlueprint::FieldMatchBlueprint() :
Blueprint("fieldMatch"),
_field(nullptr),
+ _shared_state_key(),
_params()
{
}
@@ -189,6 +205,7 @@ FieldMatchBlueprint::setup(const IIndexEnvironment & env,
const ParameterList & params)
{
_field = params[0].asField();
+ _shared_state_key = "fef.fieldmatch." + _field->name();
const Properties & lst = env.getProperties();
Property obj;
@@ -326,14 +343,17 @@ FieldMatchBlueprint::setup(const IIndexEnvironment & env,
FeatureExecutor &
FieldMatchBlueprint::createExecutor(const IQueryEnvironment & env, vespalib::Stash &stash) const
{
- return stash.create<FieldMatchExecutor>(env, *_field, _params);
+ auto *shared_state = dynamic_cast<const FieldMatchExecutorSharedState *>(env.getObjectStore().get(_shared_state_key));
+ if (shared_state == nullptr) {
+ shared_state = &stash.create<FieldMatchExecutorSharedState>(env, *_field, _params);
+ }
+ return stash.create<FieldMatchExecutor>(*shared_state);
}
void FieldMatchBlueprint::prepareSharedState(const IQueryEnvironment &env, IObjectStore & store) const {
- (void) env;
- (void) store;
- //TODO WE need too extract the const and costly parts from PhraseSpiltter and Computer
- // and initialize it here for later reuse in the multiple search threads.
+ if (store.get(_shared_state_key) == nullptr) {
+ store.add(_shared_state_key, std::make_unique<FieldMatchExecutorSharedState>(env, *_field, _params));
+ }
}
}
diff --git a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h
index 0e5f873005d..f203574e588 100644
--- a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h
+++ b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h
@@ -13,6 +13,7 @@ namespace search::features {
class FieldMatchBlueprint : public fef::Blueprint {
private:
const fef::FieldInfo * _field;
+ vespalib::string _shared_state_key;
fieldmatch::Params _params;
public: