diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2020-05-26 14:20:35 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2020-05-26 14:30:17 +0200 |
commit | 35345d4574228e201942bceaebd348e4518a4107 (patch) | |
tree | 8efb2941749533063621810312201c95e74a7ca5 /searchlib | |
parent | 2db5075555f93d5adbc5db67c53935d904e4aceb (diff) |
Setup field match executor shared state.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp | 60 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/features/fieldmatchfeature.h | 1 |
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: |