summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_test.cpp2
-rw-r--r--searchcore/src/tests/proton/docsummary/docsummary.cpp17
-rw-r--r--searchcore/src/tests/proton/docsummary/summary.cfg33
-rw-r--r--searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp42
-rw-r--r--searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp11
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/query.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/querylimiter.h6
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/querynodes.h8
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp1
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 &currentSnapshot, 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);