diff options
Diffstat (limited to 'searchcore')
10 files changed, 89 insertions, 39 deletions
diff --git a/searchcore/src/tests/proton/attribute/attribute_test.cpp b/searchcore/src/tests/proton/attribute/attribute_test.cpp index 800cb8aa0ce..e5314d1bf5d 100644 --- a/searchcore/src/tests/proton/attribute/attribute_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_test.cpp @@ -149,7 +149,7 @@ public: { setup(1); } - ~AttributeWriterTest(); + ~AttributeWriterTest() override; void setup(uint32_t threads) { _aw.reset(); _attributeFieldWriterReal = std::make_unique<ForegroundTaskExecutor>(threads); diff --git a/searchcore/src/tests/proton/docsummary/docsummary.cpp b/searchcore/src/tests/proton/docsummary/docsummary.cpp index 93e8f3d248b..b034b77086c 100644 --- a/searchcore/src/tests/proton/docsummary/docsummary.cpp +++ b/searchcore/src/tests/proton/docsummary/docsummary.cpp @@ -35,6 +35,7 @@ #include <vespa/searchlib/tensor/tensor_attribute.h> #include <vespa/searchlib/transactionlog/nosyncproxy.h> #include <vespa/searchlib/transactionlog/translogserver.h> +#include <vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h> #include <vespa/searchsummary/docsummary/i_docsum_store_document.h> #include <vespa/searchsummary/docsummary/summaryfieldconverter.h> #include <vespa/vespalib/data/simple_buffer.h> @@ -77,6 +78,19 @@ using namespace vespalib::slime; namespace proton { +class MockDocsumFieldWriterFactory : public search::docsummary::IDocsumFieldWriterFactory +{ +public: + std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) override { + (void) fieldName; + (void) overrideName; + (void) argument; + (void) rc; + return {}; + } + +}; + class DirMaker { public: @@ -1121,7 +1135,8 @@ Fixture::Fixture() std::string cfgId("summary"); _summaryCfg = ConfigGetter<vespa::config::search::SummaryConfig>::getConfig( cfgId, ::config::FileSpec(TEST_PATH("summary.cfg"))); - _resultCfg.ReadConfig(*_summaryCfg, cfgId.c_str()); + auto docsum_field_writer_factory = std::make_unique<MockDocsumFieldWriterFactory>(); + _resultCfg.ReadConfig(*_summaryCfg, cfgId.c_str(), *docsum_field_writer_factory); } Fixture::~Fixture() = default; diff --git a/searchcore/src/tests/proton/docsummary/summary.cfg b/searchcore/src/tests/proton/docsummary/summary.cfg index cceb15c8fd2..33641351c02 100644 --- a/searchcore/src/tests/proton/docsummary/summary.cfg +++ b/searchcore/src/tests/proton/docsummary/summary.cfg @@ -61,31 +61,54 @@ classes[2].id 2 classes[2].fields[2] classes[2].fields[0].name "aa" classes[2].fields[0].type "integer" +classes[2].fields[0].command "copy" +classes[2].fields[0].source "ab" classes[2].fields[1].name "ab" classes[2].fields[1].type "integer" +classes[2].fields[1].command "empty" classes[3].name "class3" classes[3].id 3 classes[3].fields[10] classes[3].fields[0].name "ba" classes[3].fields[0].type "integer" +classes[3].fields[0].command "attribute" +classes[3].fields[0].source "ba" classes[3].fields[1].name "bb" classes[3].fields[1].type "float" +classes[3].fields[1].command "attribute" +classes[3].fields[1].source "bb" classes[3].fields[2].name "bc" classes[3].fields[2].type "longstring" +classes[3].fields[2].command "attribute" +classes[3].fields[2].source "bc" classes[3].fields[3].name "bd" classes[3].fields[3].type "jsonstring" +classes[3].fields[3].command "attribute" +classes[3].fields[3].source "bd" classes[3].fields[4].name "be" classes[3].fields[4].type "jsonstring" +classes[3].fields[4].command "attribute" +classes[3].fields[4].source "be" classes[3].fields[5].name "bf" classes[3].fields[5].type "jsonstring" +classes[3].fields[5].command "attribute" +classes[3].fields[5].source "bf" classes[3].fields[6].name "bg" classes[3].fields[6].type "jsonstring" +classes[3].fields[6].command "attribute" +classes[3].fields[6].source "bg" classes[3].fields[7].name "bh" classes[3].fields[7].type "jsonstring" +classes[3].fields[7].command "attribute" +classes[3].fields[7].source "bh" classes[3].fields[8].name "bi" classes[3].fields[8].type "jsonstring" +classes[3].fields[8].command "attribute" +classes[3].fields[8].source "bi" classes[3].fields[9].name "bj" classes[3].fields[9].type "tensor" +classes[3].fields[9].command "attribute" +classes[3].fields[9].source "bj" classes[4].name "class4" classes[4].id 4 classes[4].fields[1] @@ -98,18 +121,28 @@ classes[5].fields[0].name "sp2" classes[5].fields[0].type "int64" classes[5].fields[1].name "sp2x" classes[5].fields[1].type "xmlstring" +classes[5].fields[1].command "positions" +classes[5].fields[1].source "sp2" classes[5].fields[2].name "ap2" classes[5].fields[2].type "jsonstring" classes[5].fields[3].name "ap2x" classes[5].fields[3].type "xmlstring" +classes[5].fields[3].command "positions" +classes[5].fields[3].source "ap2" classes[5].fields[4].name "wp2" classes[5].fields[4].type "jsonstring" classes[5].fields[5].name "wp2x" classes[5].fields[5].type "xmlstring" +classes[5].fields[5].command "positions" +classes[5].fields[5].source "wp2" classes[6].name "class6" classes[6].id 6 classes[6].fields[6] classes[6].fields[0].name "ba" classes[6].fields[0].type "integer" +classes[6].fields[0].command "attribute" +classes[6].fields[0].source "ba" classes[6].fields[1].name "bb" classes[6].fields[1].type "float" +classes[6].fields[1].command "attribute" +classes[6].fields[1].source "bb" diff --git a/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp b/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp index 73771d700b4..5b3b9f962f7 100644 --- a/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp +++ b/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp @@ -41,7 +41,7 @@ struct MockSearch : SearchIterator { bool postings_fetched; uint32_t last_seek = beginId(); uint32_t last_unpack = beginId(); - MockSearch(const vespalib::string &term_in) + explicit MockSearch(const vespalib::string &term_in) : spec("", 0, 0), term(term_in), _strict(vespalib::Trinary::True), tfmda(), postings_fetched(false) {} MockSearch(const FieldSpec &spec_in, const vespalib::string &term_in, bool strict_in, const TermFieldMatchDataArray &tfmda_in, bool postings_fetched_in) @@ -65,16 +65,14 @@ struct MockBlueprint : SimpleLeafBlueprint { { setEstimate(HitEstimate(756, false)); } - virtual SearchIterator::UP createLeafSearch(const TermFieldMatchDataArray &tfmda, - bool strict) const override + SearchIterator::UP createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override { if (postings_fetched) { EXPECT_EQUAL(postings_strict.isStrict(), strict); } - return SearchIterator::UP(new MockSearch(spec, term, strict, tfmda, - postings_fetched)); + return std::make_unique<MockSearch>(spec, term, strict, tfmda, postings_fetched); } - virtual void fetchPostings(const search::queryeval::ExecuteInfo &execInfo) override { + void fetchPostings(const search::queryeval::ExecuteInfo &execInfo) override { postings_strict = execInfo; postings_fetched = true; } @@ -88,7 +86,7 @@ struct MockSearchable : Searchable { { (void) requestContext; ++create_cnt; - return Blueprint::UP(new MockBlueprint(field, termAsString(term))); + return std::make_unique<MockBlueprint>(field, termAsString(term)); } }; @@ -175,7 +173,7 @@ TEST("require that the attribute limiter works correctly") { EXPECT_EQUAL(1u, searchable.create_cnt); SearchIterator::UP s2 = limiter.create_search(42, diverse ? 3 : 42, strict); EXPECT_EQUAL(1u, searchable.create_cnt); - MockSearch *ms = dynamic_cast<MockSearch*>(s1.get()); + auto *ms = dynamic_cast<MockSearch*>(s1.get()); ASSERT_TRUE(ms != nullptr); EXPECT_EQUAL("limiter_attribute", ms->spec.getName()); EXPECT_EQUAL(0u, ms->spec.getFieldId()); @@ -208,7 +206,7 @@ TEST("require that no limiter has no behavior") { SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 1.0, 100000000, nullptr); limiter.updateDocIdSpaceEstimate(1000, 9000); EXPECT_EQUAL(std::numeric_limits<size_t>::max(), limiter.getDocIdSpaceEstimate()); - MockSearch *ms = dynamic_cast<MockSearch*>(search.get()); + auto *ms = dynamic_cast<MockSearch*>(search.get()); ASSERT_TRUE(ms != nullptr); EXPECT_EQUAL("search", ms->term); EXPECT_FALSE(limiter.was_limited()); @@ -226,7 +224,7 @@ TEST("require that the match phase limiter may chose not to limit the query") { SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 0.005, 100000, nullptr); limiter.updateDocIdSpaceEstimate(1000, 9000); EXPECT_EQUAL(10000u, limiter.getDocIdSpaceEstimate()); - MockSearch *ms = dynamic_cast<MockSearch*>(search.get()); + auto *ms = dynamic_cast<MockSearch*>(search.get()); ASSERT_TRUE(ms != nullptr); EXPECT_EQUAL("search", ms->term); EXPECT_FALSE(limiter.was_limited()); @@ -254,7 +252,7 @@ TEST_F("require that the match phase limiter may chose not to limit the query wh SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 0.10, 1900000, nullptr); limiter.updateDocIdSpaceEstimate(1000, 1899000); EXPECT_EQUAL(1900000u, limiter.getDocIdSpaceEstimate()); - MockSearch *ms = dynamic_cast<MockSearch *>(search.get()); + auto *ms = dynamic_cast<MockSearch *>(search.get()); ASSERT_TRUE(ms != nullptr); EXPECT_EQUAL("search", ms->term); EXPECT_FALSE(limiter.was_limited()); @@ -266,11 +264,11 @@ TEST_F("require that the match phase limiter may chose to limit the query even w SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 0.10, 2100000, nullptr); limiter.updateDocIdSpaceEstimate(1000, 2099000); EXPECT_EQUAL(159684u, limiter.getDocIdSpaceEstimate()); - LimitedSearch *strict_and = dynamic_cast<LimitedSearch*>(search.get()); + auto *strict_and = dynamic_cast<LimitedSearch*>(search.get()); ASSERT_TRUE(strict_and != nullptr); - const MockSearch *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); + const auto *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); ASSERT_TRUE(ms1 != nullptr); - const MockSearch *ms2 = dynamic_cast<const MockSearch*>(&strict_and->getSecond()); + const auto *ms2 = dynamic_cast<const MockSearch*>(&strict_and->getSecond()); ASSERT_TRUE(ms2 != nullptr); EXPECT_EQUAL("[;;-100000]", ms1->term); EXPECT_EQUAL("search", ms2->term); @@ -300,11 +298,11 @@ TEST("require that the match phase limiter is able to pre-limit the query") { SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 0.1, 100000, trace.maybeCreateCursor(7, "limit")); limiter.updateDocIdSpaceEstimate(1000, 9000); EXPECT_EQUAL(1680u, limiter.getDocIdSpaceEstimate()); - LimitedSearch *strict_and = dynamic_cast<LimitedSearch*>(search.get()); + auto *strict_and = dynamic_cast<LimitedSearch*>(search.get()); ASSERT_TRUE(strict_and != nullptr); - const MockSearch *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); + const auto *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); ASSERT_TRUE(ms1 != nullptr); - const MockSearch *ms2 = dynamic_cast<const MockSearch*>(&strict_and->getSecond()); + const auto *ms2 = dynamic_cast<const MockSearch*>(&strict_and->getSecond()); ASSERT_TRUE(ms2 != nullptr); EXPECT_EQUAL("[;;-5000]", ms1->term); EXPECT_EQUAL("search", ms2->term); @@ -352,11 +350,11 @@ TEST("require that the match phase limiter is able to post-limit the query") { SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 0.1, 100000, nullptr); limiter.updateDocIdSpaceEstimate(1000, 9000); EXPECT_EQUAL(1680u, limiter.getDocIdSpaceEstimate()); - LimitedSearch *strict_and = dynamic_cast<LimitedSearch*>(search.get()); + auto *strict_and = dynamic_cast<LimitedSearch*>(search.get()); ASSERT_TRUE(strict_and != nullptr); - const MockSearch *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); + const auto *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); ASSERT_TRUE(ms1 != nullptr); - const MockSearch *ms2 = dynamic_cast<const MockSearch*>(&strict_and->getSecond()); + const auto *ms2 = dynamic_cast<const MockSearch*>(&strict_and->getSecond()); ASSERT_TRUE(ms2 != nullptr); EXPECT_EQUAL("search", ms1->term); EXPECT_EQUAL("[;;-15000]", ms2->term); @@ -382,9 +380,9 @@ void verifyDiversity(AttributeLimiter::DiversityCutoffStrategy strategy) SearchIterator::UP search = limiter.maybe_limit(prepare(new MockSearch("search")), 0.1, 100000, nullptr); limiter.updateDocIdSpaceEstimate(1000, 9000); EXPECT_EQUAL(1680u, limiter.getDocIdSpaceEstimate()); - LimitedSearch *strict_and = dynamic_cast<LimitedSearch*>(search.get()); + auto *strict_and = dynamic_cast<LimitedSearch*>(search.get()); ASSERT_TRUE(strict_and != nullptr); - const MockSearch *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); + const auto *ms1 = dynamic_cast<const MockSearch*>(&strict_and->getFirst()); ASSERT_TRUE(ms1 != nullptr); if (strategy == AttributeLimiter::LOOSE) { EXPECT_EQUAL("[;;-5000;category;500;131;loose]", ms1->term); diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp index 942dac63955..9a4ec121d3b 100644 --- a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp @@ -71,13 +71,13 @@ makeSlimeParams(size_t chunkSize) { vespalib::Slime::UP DocsumContext::createSlimeReply() { - _docsumWriter.InitState(_attrMgr, &_docsumState); + IDocsumWriter::ResolveClassInfo rci = _docsumWriter.resolveClassInfo(_docsumState._args.getResultClassName()); + _docsumWriter.InitState(_attrMgr, _docsumState, rci); const size_t estimatedChunkSize(std::min(0x200000ul, _docsumState._docsumbuf.size()*0x400ul)); vespalib::Slime::UP response(std::make_unique<vespalib::Slime>(makeSlimeParams(estimatedChunkSize))); Cursor & root = response->setObject(); Cursor & array = root.setArray(DOCSUMS); const Symbol docsumSym = response->insert(DOCSUM); - IDocsumWriter::ResolveClassInfo rci = _docsumWriter.resolveClassInfo(_docsumState._args.getResultClassName()); _docsumState._omit_summary_features = (rci.outputClass != nullptr) ? rci.outputClass->omit_summary_features() : true; uint32_t num_ok(0); for (uint32_t docId : _docsumState._docsumbuf) { diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp index 3e3a3529e46..6a0133e913d 100644 --- a/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp +++ b/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp @@ -9,7 +9,7 @@ #include <vespa/juniper/rpinterface.h> #include <vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.h> #include <vespa/vespalib/util/lambdatask.h> -#include <vespa/searchsummary/docsummary/docsumconfig.h> +#include <vespa/searchsummary/docsummary/docsum_field_writer_factory.h> #include <vespa/searchsummary/docsummary/keywordextractor.h> #include <vespa/vespalib/util/exceptions.h> #include <vespa/fastlib/text/normwordfolder.h> @@ -92,8 +92,10 @@ SummarySetup(const vespalib::string & baseDir, const SummaryConfig & summaryCfg, _docStore(std::move(docStore)), _repo(std::move(repo)) { + _juniperConfig = std::make_unique<juniper::Juniper>(&_juniperProps, _wordFolder.get()); auto resultConfig = std::make_unique<ResultConfig>(); - if (!resultConfig->ReadConfig(summaryCfg, make_string("SummaryManager(%s)", baseDir.c_str()).c_str())) { + auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summaryCfg.usev8geopositions, *this); + if (!resultConfig->ReadConfig(summaryCfg, make_string("SummaryManager(%s)", baseDir.c_str()).c_str(), *docsum_field_writer_factory)) { std::ostringstream oss; ::config::OstreamConfigWriter writer(oss); writer.write(summaryCfg); @@ -101,11 +103,10 @@ SummarySetup(const vespalib::string & baseDir, const SummaryConfig & summaryCfg, (make_string("Could not initialize summary result config for directory '%s' based on summary config '%s'", baseDir.c_str(), oss.str().c_str())); } + docsum_field_writer_factory.reset(); - _juniperConfig = std::make_unique<juniper::Juniper>(&_juniperProps, _wordFolder.get()); _docsumWriter = std::make_unique<DynamicDocsumWriter>(std::move(resultConfig), std::unique_ptr<KeywordExtractor>()); - DynamicDocsumConfig dynCfg(*this, _docsumWriter.get()); - dynCfg.configure(summarymapCfg); + (void) summarymapCfg; } IDocsumStore::UP diff --git a/searchcore/src/vespa/searchcore/proton/matching/query.cpp b/searchcore/src/vespa/searchcore/proton/matching/query.cpp index aaacb971ee0..ec289c06122 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/query.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/query.cpp @@ -52,7 +52,7 @@ inject(Node::UP query, Node::UP to_inject) { if (auto * my_and = dynamic_cast<search::query::And *>(query.get())) { my_and->append(std::move(to_inject)); } else if (dynamic_cast<search::query::Rank *>(query.get()) || dynamic_cast<search::query::AndNot *>(query.get())) { - search::query::Intermediate & root = static_cast<search::query::Intermediate &>(*query); + auto & root = static_cast<search::query::Intermediate &>(*query); root.prepend(inject(root.stealFirst(), std::move(to_inject))); } else { auto new_root = std::make_unique<ProtonAnd>(); @@ -82,7 +82,7 @@ find_location_terms(Node *tree) { return locations; } -GeoLocationSpec parse_location_string(string str) { +GeoLocationSpec parse_location_string(const string & str) { GeoLocationSpec empty; if (str.empty()) { return empty; diff --git a/searchcore/src/vespa/searchcore/proton/matching/querylimiter.h b/searchcore/src/vespa/searchcore/proton/matching/querylimiter.h index 67faf74a65d..c3e6e9af475 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/querylimiter.h +++ b/searchcore/src/vespa/searchcore/proton/matching/querylimiter.h @@ -17,7 +17,7 @@ public: class Token { public: typedef std::unique_ptr<Token> UP; - virtual ~Token() { } + virtual ~Token() = default; }; public: QueryLimiter(); @@ -31,7 +31,9 @@ private: QueryLimiter & _limiter; public: LimitedToken(const Doom & doom, QueryLimiter & limiter); - virtual ~LimitedToken(); + LimitedToken(const NoLimitToken &) = delete; + LimitedToken & operator =(const NoLimitToken &) = delete; + ~LimitedToken() override; }; void grabToken(const Doom & doom); void releaseToken(); diff --git a/searchcore/src/vespa/searchcore/proton/matching/querynodes.h b/searchcore/src/vespa/searchcore/proton/matching/querynodes.h index bbe58338b12..20d602b7814 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/querynodes.h +++ b/searchcore/src/vespa/searchcore/proton/matching/querynodes.h @@ -61,7 +61,7 @@ public: ProtonTermData & operator = (const ProtonTermData &); ProtonTermData(ProtonTermData &&) = default; ProtonTermData & operator = (ProtonTermData &&) = default; - ~ProtonTermData(); + ~ProtonTermData() override; void resolveFromChildren(const std::vector<search::query::Node *> &children); void allocateTerms(search::fef::MatchDataLayout &mdl); void setDocumentFrequency(uint32_t estHits, uint32_t numDocs); @@ -93,9 +93,9 @@ struct ProtonTermBase : public Base, } // ITermData interface - uint32_t getPhraseLength() const override final { return numTerms<Base>(*this); } - search::query::Weight getWeight() const override final { return Base::getWeight(); } - uint32_t getUniqueId() const override final { return Base::getId(); } + uint32_t getPhraseLength() const final { return numTerms<Base>(*this); } + search::query::Weight getWeight() const final { return Base::getWeight(); } + uint32_t getUniqueId() const final { return Base::getId(); } }; template <typename Base> diff --git a/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp b/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp index 820e61bc7a7..5ee70575916 100644 --- a/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp @@ -328,6 +328,7 @@ FileConfigManager::loadConfig(const DocumentDBConfig ¤tSnapshot, search::S addEmptyFile(snapDir, "ranking-expressions.cfg"); addEmptyFile(snapDir, "onnx-models.cfg"); addEmptyFile(snapDir, "imported-fields.cfg"); + addEmptyFile(snapDir, "summarymap.cfg"); DocumentDBConfigHelper dbc(spec, _docTypeName); |