diff options
author | Tor Egge <Tor.Egge@online.no> | 2023-01-05 15:54:29 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2023-01-05 15:54:29 +0100 |
commit | e529812763b6c4efe2b8dbd9b4b87f581d7bec7a (patch) | |
tree | 61322da69619c961200770437c6f39cec9afdf32 /searchsummary | |
parent | 6cbf34743397d5039dcff4c19893401cfd471cd1 (diff) |
Add interface class IKeywordExtractorFactory.
Move ownership of IKeywordExtractor to JuniperDFW.
Diffstat (limited to 'searchsummary')
15 files changed, 98 insertions, 26 deletions
diff --git a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp index 3240dd43c00..93f87d9c5be 100644 --- a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp +++ b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp @@ -15,7 +15,6 @@ #include <vespa/searchsummary/docsummary/docsum_store_document.h> #include <vespa/searchsummary/docsummary/docsumstate.h> #include <vespa/searchsummary/docsummary/docsumwriter.h> -#include <vespa/searchsummary/docsummary/i_keyword_extractor.h> #include <vespa/vespalib/data/slime/slime.h> #include <vespa/vespalib/data/smart_buffer.h> #include <vespa/vespalib/gtest/gtest.h> @@ -117,7 +116,7 @@ SlimeSummaryTest::SlimeSummaryTest() EXPECT_TRUE(cfg->addConfigEntry("longdata_field")); EXPECT_TRUE(cfg->addConfigEntry("int_pair_field")); config->set_default_result_class_id(0); - writer = std::make_unique<DynamicDocsumWriter>(std::move(config), std::unique_ptr<IKeywordExtractor>()); + writer = std::make_unique<DynamicDocsumWriter>(std::move(config)); int_pair_type.addField(Field("foo", *DataType::INT)); int_pair_type.addField(Field("bar", *DataType::INT)); doc_type.addField(Field("int_field", *DataType::INT)); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt index 142fdfd8a28..1e328a275a9 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt +++ b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt @@ -24,6 +24,7 @@ vespa_add_library(searchsummary_docsummary OBJECT juniper_query_adapter.cpp juniperproperties.cpp keywordextractor.cpp + legacy_keyword_extractor_factory.cpp linguisticsannotation.cpp matched_elements_filter_dfw.cpp positionsdfw.cpp diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp index dc215d9c2ba..ee94b0d452d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp @@ -20,9 +20,10 @@ using vespalib::IllegalArgumentException; namespace search::docsummary { -DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env) +DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const IKeywordExtractorFactory& keyword_extractor_factory) : _use_v8_geo_positions(use_v8_geo_positions), _env(env), + _keyword_extractor_factory(keyword_extractor_factory), _matching_elems_fields(std::make_shared<MatchingElementsFields>()) { } @@ -65,7 +66,7 @@ DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fie auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment().getJuniper()); auto fw_ptr = fw.get(); fieldWriter = std::move(fw); - if (!fw_ptr->Init(field_name.c_str(), source)) { + if (!fw_ptr->Init(field_name.c_str(), source, _keyword_extractor_factory)) { throw IllegalArgumentException("Failed to initialize DynamicTeaserDFW."); } } else { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h index e341f49c25b..88fe5563193 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h @@ -9,6 +9,7 @@ namespace search { class MatchingElementsFields; } namespace search::docsummary { class IDocsumEnvironment; +class IKeywordExtractorFactory; /* * Factory class for creating docsum field writers. @@ -17,12 +18,13 @@ class DocsumFieldWriterFactory : public IDocsumFieldWriterFactory { bool _use_v8_geo_positions; const IDocsumEnvironment& _env; + const IKeywordExtractorFactory& _keyword_extractor_factory; protected: std::shared_ptr<MatchingElementsFields> _matching_elems_fields; const IDocsumEnvironment& getEnvironment() const noexcept { return _env; } bool has_attribute_manager() const noexcept; public: - DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env); + DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const IKeywordExtractorFactory& keyword_extractor_factory); ~DocsumFieldWriterFactory() override; std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& field_name, const vespalib::string& command, diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp index 9c810386703..2f9f47ed7b7 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp @@ -23,7 +23,6 @@ namespace search::docsummary { GetDocsumsState::GetDocsumsState(GetDocsumsStateCallback &callback) : _args(), _docsumbuf(), - _kwExtractor(nullptr), _callback(callback), _dynteaser(), _attrCtx(), diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h index a228f93e1d4..0aa77b7c71b 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h @@ -26,7 +26,6 @@ namespace search::docsummary { class GetDocsumsState; class IDocsumEnvironment; -class IKeywordExtractor; class DocsumFieldWriterState; class GetDocsumsStateCallback @@ -52,7 +51,6 @@ public: GetDocsumArgs _args; // from getdocsums request std::vector<uint32_t> _docsumbuf; // from getdocsums request - IKeywordExtractor *_kwExtractor; GetDocsumsStateCallback &_callback; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp index 8e12f0c875b..d511fdcd4be 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp @@ -86,9 +86,8 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid, } } -DynamicDocsumWriter::DynamicDocsumWriter(std::unique_ptr<ResultConfig> config, std::unique_ptr<IKeywordExtractor> extractor) - : _resultConfig(std::move(config)), - _keywordExtractor(std::move(extractor)) +DynamicDocsumWriter::DynamicDocsumWriter(std::unique_ptr<ResultConfig> config) + : _resultConfig(std::move(config)) { } @@ -98,7 +97,6 @@ DynamicDocsumWriter::~DynamicDocsumWriter() = default; void DynamicDocsumWriter::initState(const IAttributeManager & attrMan, GetDocsumsState& state, const ResolveClassInfo& rci) { - state._kwExtractor = _keywordExtractor.get(); state._attrCtx = attrMan.createContext(); auto result_class = rci.res_class; if (result_class == nullptr) { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h index 65a1d923851..0f5bc6cd204 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h @@ -17,8 +17,6 @@ namespace vespalib { class Slime; } namespace search::docsummary { -class IKeywordExtractor; - static constexpr uint32_t SLIME_MAGIC_ID = 0x55555555; /** @@ -51,10 +49,9 @@ class DynamicDocsumWriter : public IDocsumWriter { private: std::unique_ptr<ResultConfig> _resultConfig; - std::unique_ptr<IKeywordExtractor> _keywordExtractor; public: - DynamicDocsumWriter(std::unique_ptr<ResultConfig> config, std::unique_ptr<IKeywordExtractor> extractor); + DynamicDocsumWriter(std::unique_ptr<ResultConfig> config); DynamicDocsumWriter(const DynamicDocsumWriter &) = delete; DynamicDocsumWriter& operator=(const DynamicDocsumWriter &) = delete; ~DynamicDocsumWriter() override; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp index 0ea5bc9a604..78324fa4eaa 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp @@ -4,6 +4,7 @@ #include "docsumstate.h" #include "i_docsum_store_document.h" #include "i_juniper_converter.h" +#include "i_keyword_extractor_factory.h" #include "juniper_query_adapter.h" #include <vespa/document/fieldvalue/stringfieldvalue.h> #include <vespa/vespalib/objects/hexdump.h> @@ -21,7 +22,8 @@ namespace search::docsummary { JuniperDFW::JuniperDFW(const juniper::Juniper * juniper) : _input_field_name(), _juniperConfig(), - _juniper(juniper) + _juniper(juniper), + _keyword_extractor() { } @@ -31,7 +33,8 @@ JuniperDFW::~JuniperDFW() = default; bool JuniperDFW::Init( const char *fieldName, - const vespalib::string& inputField) + const vespalib::string& inputField, + const IKeywordExtractorFactory& keyword_extractor_factory) { bool rc = true; _juniperConfig = _juniper->CreateConfig(fieldName); @@ -41,22 +44,24 @@ JuniperDFW::Init( } _input_field_name = inputField; + _keyword_extractor = keyword_extractor_factory.make(_input_field_name); return rc; } bool JuniperTeaserDFW::Init( const char *fieldName, - const vespalib::string& inputField) + const vespalib::string& inputField, + const IKeywordExtractorFactory& keyword_extractor_factory) { - return JuniperDFW::Init(fieldName, inputField); + return JuniperDFW::Init(fieldName, inputField, keyword_extractor_factory); } void DynamicTeaserDFW::insert_juniper_field(uint32_t docid, vespalib::stringref input, GetDocsumsState& state, vespalib::slime::Inserter& inserter) const { if (!state._dynteaser._query) { - JuniperQueryAdapter iq(state._kwExtractor, + JuniperQueryAdapter iq(_keyword_extractor.get(), state._args.getStackDump(), &state._args.highlightTerms()); state._dynteaser._query = _juniper->CreateQueryHandle(iq, nullptr); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h new file mode 100644 index 00000000000..264af049251 --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h @@ -0,0 +1,24 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/vespalib/stllike/string.h> +#include <memory> + +namespace search::docsummary { + +class IKeywordExtractor; + +/* + * Interface class for creating an instance of IKeywordExtractor for a + * specific input field. + */ +class IKeywordExtractorFactory +{ +public: + virtual ~IKeywordExtractorFactory() = default; + + virtual std::shared_ptr<const IKeywordExtractor> make(vespalib::stringref input_field) const = 0; +}; + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp index d63c9359aec..360e97e0c04 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp @@ -10,7 +10,7 @@ namespace search::docsummary { -JuniperQueryAdapter::JuniperQueryAdapter(IKeywordExtractor *kwExtractor, vespalib::stringref buf, +JuniperQueryAdapter::JuniperQueryAdapter(const IKeywordExtractor *kwExtractor, vespalib::stringref buf, const search::fef::Properties *highlightTerms) : _kwExtractor(kwExtractor), _buf(buf), diff --git a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h index 7c975c6120d..851f0d26746 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h @@ -19,14 +19,14 @@ class IKeywordExtractor; class JuniperQueryAdapter : public juniper::IQuery { private: - IKeywordExtractor *_kwExtractor; + const IKeywordExtractor *_kwExtractor; const vespalib::stringref _buf; const search::fef::Properties *_highlightTerms; public: JuniperQueryAdapter(const JuniperQueryAdapter&) = delete; JuniperQueryAdapter operator= (const JuniperQueryAdapter&) = delete; - JuniperQueryAdapter(IKeywordExtractor *kwExtractor, vespalib::stringref buf, + JuniperQueryAdapter(const IKeywordExtractor *kwExtractor, vespalib::stringref buf, const search::fef::Properties *highlightTerms = nullptr); ~JuniperQueryAdapter() override; bool skipItem(search::SimpleQueryStackDumpIterator *iterator) const; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h b/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h index 312c4ece516..528268b8fff 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h @@ -13,12 +13,16 @@ namespace vespalib::slime { struct Inserter; } namespace search::docsummary { +class IKeywordExtractor; +class IKeywordExtractorFactory; + class JuniperDFW : public DocsumFieldWriter { public: virtual bool Init( const char *fieldName, - const vespalib::string& inputField); + const vespalib::string& inputField, + const IKeywordExtractorFactory& keyword_extractor_factory); protected: explicit JuniperDFW(const juniper::Juniper * juniper); ~JuniperDFW() override; @@ -26,6 +30,7 @@ protected: vespalib::string _input_field_name; std::unique_ptr<juniper::Config> _juniperConfig; const juniper::Juniper *_juniper; + std::shared_ptr<const IKeywordExtractor> _keyword_extractor; private: bool isGenerated() const override { return false; } JuniperDFW(const JuniperDFW &); @@ -37,7 +42,8 @@ class JuniperTeaserDFW : public JuniperDFW { public: bool Init(const char *fieldName, - const vespalib::string& inputField) override; + const vespalib::string& inputField, + const IKeywordExtractorFactory& keyword_extractor_factory) override; protected: explicit JuniperTeaserDFW(const juniper::Juniper * juniper) : JuniperDFW(juniper) { } }; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp new file mode 100644 index 00000000000..b967f7ffeff --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp @@ -0,0 +1,21 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "legacy_keyword_extractor_factory.h" + +namespace search::docsummary { + +LegacyKeywordExtractorFactory::LegacyKeywordExtractorFactory(std::shared_ptr<const IKeywordExtractor> keyword_extractor) + : IKeywordExtractorFactory(), + _keyword_extractor(std::move(keyword_extractor)) +{ +} + +LegacyKeywordExtractorFactory::~LegacyKeywordExtractorFactory() = default; + +std::shared_ptr<const IKeywordExtractor> +LegacyKeywordExtractorFactory::make(vespalib::stringref) const +{ + return _keyword_extractor; +} + +} diff --git a/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h new file mode 100644 index 00000000000..630a37cec4d --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h @@ -0,0 +1,21 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "i_keyword_extractor_factory.h" + +namespace search::docsummary { + +/* + * Class for creating an instance of IKeywordExtractor. + */ +class LegacyKeywordExtractorFactory : public IKeywordExtractorFactory +{ + std::shared_ptr<const IKeywordExtractor> _keyword_extractor; +public: + explicit LegacyKeywordExtractorFactory(std::shared_ptr<const IKeywordExtractor> keyword_extractor); + virtual ~LegacyKeywordExtractorFactory(); + std::shared_ptr<const IKeywordExtractor> make(vespalib::stringref) const override; +}; + +} |