summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-05-27 22:19:38 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-05-27 22:19:38 +0000
commit48830aa130c67574cdf2ffefc43072e6704f8c65 (patch)
treed5051b375e31ea21e7fcc17aa1c68e8fda4af691 /searchlib
parent031e0b85bb6498f3071598a3daaf6bc5721745e1 (diff)
Simplify AttributeVector by moving out ValueModifier, EnumModifier and BaseName.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/attribute/attribute_test.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/attribute/CMakeLists.txt3
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributemanager.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.cpp88
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.h71
-rw-r--r--searchlib/src/vespa/searchlib/attribute/basename.cpp52
-rw-r--r--searchlib/src/vespa/searchlib/attribute/basename.h25
-rw-r--r--searchlib/src/vespa/searchlib/attribute/enummodifier.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/attribute/enummodifier.h20
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.h7
-rw-r--r--searchlib/src/vespa/searchlib/attribute/load_utils.h9
-rw-r--r--searchlib/src/vespa/searchlib/attribute/load_utils.hpp7
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp3
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singleenumattribute.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singleenumattribute.hpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/valuemodifier.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/attribute/valuemodifier.h22
-rw-r--r--searchlib/src/vespa/searchlib/util/logutil.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/util/logutil.h7
24 files changed, 215 insertions, 165 deletions
diff --git a/searchlib/src/tests/attribute/attribute_test.cpp b/searchlib/src/tests/attribute/attribute_test.cpp
index ab0c6c28ad1..6f86112a0f2 100644
--- a/searchlib/src/tests/attribute/attribute_test.cpp
+++ b/searchlib/src/tests/attribute/attribute_test.cpp
@@ -303,7 +303,7 @@ AttributeTest::AttributeTest() = default;
void AttributeTest::testBaseName()
{
- AttributeVector::BaseName v("attr1");
+ attribute::BaseName v("attr1");
EXPECT_EQ(v.getAttributeName(), "attr1");
EXPECT_TRUE(v.getDirName().empty());
v = "attribute/attr1/attr1";
@@ -320,12 +320,10 @@ void AttributeTest::testBaseName()
EXPECT_EQ(v.getDirName(), "index.1/1.ready/attribute/attr1/snapshot-X");
v = "/index.1/1.ready/attribute/attr1/snapshot-X/attr1";
EXPECT_EQ(v.getAttributeName(), "attr1");
- EXPECT_EQ(v.getDirName(),
- "/index.1/1.ready/attribute/attr1/snapshot-X");
+ EXPECT_EQ(v.getDirName(), "/index.1/1.ready/attribute/attr1/snapshot-X");
v = "xxxyyyy/zzz/index.1/1.ready/attribute/attr1/snapshot-X/attr1";
EXPECT_EQ(v.getAttributeName(), "attr1");
- EXPECT_EQ(v.getDirName(),
- "xxxyyyy/zzz/index.1/1.ready/attribute/attr1/snapshot-X");
+ EXPECT_EQ(v.getDirName(), "xxxyyyy/zzz/index.1/1.ready/attribute/attr1/snapshot-X");
}
void AttributeTest::addDocs(const AttributePtr & v, size_t sz)
diff --git a/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt b/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt
index 5fa691394fb..5e86c350b55 100644
--- a/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt
+++ b/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt
@@ -23,6 +23,7 @@ vespa_add_library(searchlib_attribute OBJECT
attributesaver.cpp
attributevector.cpp
attrvector.cpp
+ basename.cpp
bitvector_search_cache.cpp
changevector.cpp
configconverter.cpp
@@ -42,6 +43,7 @@ vespa_add_library(searchlib_attribute OBJECT
enumattributesaver.cpp
enumcomparator.cpp
enumhintsearchcontext.cpp
+ enummodifier.cpp
enum_store_compaction_spec.cpp
enum_store_dictionary.cpp
enum_store_loaders.cpp
@@ -128,5 +130,6 @@ vespa_add_library(searchlib_attribute OBJECT
string_matcher.cpp
string_search_context.cpp
string_search_helper.cpp
+ valuemodifier.cpp
DEPENDS
)
diff --git a/searchlib/src/vespa/searchlib/attribute/attributemanager.cpp b/searchlib/src/vespa/searchlib/attribute/attributemanager.cpp
index d218f11d198..38416b009eb 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributemanager.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attributemanager.cpp
@@ -206,7 +206,7 @@ AttributeManager::createBaseFileName(const string & name) const
dir += "/";
dir += getSnapshot().dirName;
}
- return AttributeVector::BaseName(dir, name);
+ return attribute::BaseName(dir, name);
}
bool
diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp
index 5db3411ba73..c0df44d26e9 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp
@@ -1,15 +1,17 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include "attributevector.h"
#include "address_space_components.h"
#include "attribute_read_guard.h"
#include "attributefilesavetarget.h"
#include "attributesaver.h"
-#include "attributevector.h"
#include "attributevector.hpp"
#include "floatbase.h"
#include "interlock.h"
#include "ipostinglistattributebase.h"
#include "stringbase.h"
+#include "enummodifier.h"
+#include "valuemodifier.h"
#include <vespa/document/update/assignvalueupdate.h>
#include <vespa/document/update/mapvalueupdate.h>
#include <vespa/fastlib/io/bufferedfile.h>
@@ -19,7 +21,7 @@
#include <vespa/searchlib/index/dummyfileheadercontext.h>
#include <vespa/searchlib/query/query_term_decoder.h>
#include <vespa/searchlib/util/file_settings.h>
-#include <vespa/searchlib/util/logutil.h>
+#include <vespa/vespalib/util/jsonwriter.h>
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/vespalib/util/mmap_file_allocator_factory.h>
#include <vespa/vespalib/util/size_literals.h>
@@ -32,13 +34,12 @@ using vespalib::getLastErrorString;
using document::ValueUpdate;
using document::AssignValueUpdate;
-using vespalib::make_string;
-using vespalib::Array;
using vespalib::IllegalStateException;
using search::attribute::SearchContextParams;
using search::common::FileHeaderContext;
using search::index::DummyFileHeaderContext;
using search::queryeval::SearchIterator;
+using namespace vespalib::make_string_short;
namespace {
@@ -51,59 +52,6 @@ const vespalib::string docIdLimitTag = "docIdLimit";
namespace search {
-AttributeVector::BaseName::BaseName(vespalib::stringref base, vespalib::stringref name)
- : string(base),
- _name(name)
-{
- if (!empty()) {
- push_back('/');
- }
- append(name);
-}
-
-AttributeVector::BaseName::~BaseName() = default;
-
-
-AttributeVector::BaseName::string
-AttributeVector::BaseName::createAttributeName(vespalib::stringref s)
-{
- size_t p(s.rfind('/'));
- if (p == string::npos) {
- return s;
- } else {
- return s.substr(p+1);
- }
-}
-
-
-AttributeVector::BaseName::string
-AttributeVector::BaseName::getDirName() const
-{
- size_t p = rfind('/');
- if (p == string::npos) {
- return "";
- } else {
- return substr(0, p);
- }
-}
-
-
-AttributeVector::ValueModifier::ValueModifier(AttributeVector &attr)
- : _attr(&attr)
-{ }
-
-
-AttributeVector::ValueModifier::ValueModifier(const ValueModifier &rhs)
- : _attr(rhs.stealAttr())
-{ }
-
-
-AttributeVector::ValueModifier::~ValueModifier() {
- if (_attr) {
- _attr->incGeneration();
- }
-}
-
namespace {
bool
@@ -226,7 +174,6 @@ AttributeVector::addDocs(DocId &startDoc, DocId &lastDoc, uint32_t numDocs)
return true;
}
-
bool
AttributeVector::addDocs(uint32_t numDocs)
{
@@ -234,7 +181,6 @@ AttributeVector::addDocs(uint32_t numDocs)
return addDocs(doc, doc, numDocs);
}
-
void
AttributeVector::incGeneration()
{
@@ -245,7 +191,6 @@ AttributeVector::incGeneration()
removeAllOldGenerations();
}
-
void
AttributeVector::updateStatistics(uint64_t numValues, uint64_t numUniqueValue, uint64_t allocated,
uint64_t used, uint64_t dead, uint64_t onHold)
@@ -360,21 +305,21 @@ void AttributeVector::onSave(IAttributeSaveTarget &)
bool
AttributeVector::hasLoadData() const {
FastOS_StatInfo statInfo;
- if (!FastOS_File::Stat(make_string("%s.dat", getBaseFileName().c_str()).c_str(), &statInfo)) {
+ if (!FastOS_File::Stat(fmt("%s.dat", getBaseFileName().c_str()).c_str(), &statInfo)) {
return false;
}
if (hasMultiValue() &&
- !FastOS_File::Stat(make_string("%s.idx", getBaseFileName().c_str()).c_str(), &statInfo))
+ !FastOS_File::Stat(fmt("%s.idx", getBaseFileName().c_str()).c_str(), &statInfo))
{
return false;
}
if (hasWeightedSetType() &&
- !FastOS_File::Stat(make_string("%s.weight", getBaseFileName().c_str()).c_str(), &statInfo))
+ !FastOS_File::Stat(fmt("%s.weight", getBaseFileName().c_str()).c_str(), &statInfo))
{
return false;
}
if (isEnumeratedSaveFormat() &&
- !FastOS_File::Stat(make_string("%s.udat", getBaseFileName().c_str()).c_str(), &statInfo))
+ !FastOS_File::Stat(fmt("%s.udat", getBaseFileName().c_str()).c_str(), &statInfo))
{
return false;
}
@@ -385,12 +330,12 @@ AttributeVector::hasLoadData() const {
bool
AttributeVector::isEnumeratedSaveFormat() const
{
- vespalib::string datName(vespalib::make_string("%s.dat", getBaseFileName().c_str()));
+ vespalib::string datName(fmt("%s.dat", getBaseFileName().c_str()));
Fast_BufferedFile datFile;
vespalib::FileHeader datHeader(FileSettings::DIRECTIO_ALIGNMENT);
if ( ! datFile.OpenReadOnly(datName.c_str()) ) {
LOG(error, "could not open %s: %s", datFile.GetFileName(), getLastErrorString().c_str());
- throw IllegalStateException(make_string("Failed opening attribute data file '%s' for reading",
+ throw IllegalStateException(fmt("Failed opening attribute data file '%s' for reading",
datFile.GetFileName()));
}
datHeader.readFile(datFile);
@@ -589,11 +534,16 @@ AttributeVector::clearDocs(DocId lidLow, DocId lidLimit, bool in_shrink_lid_spac
}
}
-AttributeVector::EnumModifier
+attribute::EnumModifier
AttributeVector::getEnumModifier()
{
attribute::InterlockGuard interlockGuard(*_interlock);
- return EnumModifier(_enumLock, interlockGuard);
+ return attribute::EnumModifier(_enumLock, interlockGuard);
+}
+
+attribute::ValueModifier
+AttributeVector::getValueModifier() {
+ return ValueModifier(*this);
}
@@ -759,7 +709,7 @@ AttributeVector::logEnumStoreEvent(const char *reason, const char *stage)
jstr.beginObject();
jstr.appendKey("path").appendString(getBaseFileName());
jstr.endObject();
- vespalib::string eventName(make_string("%s.attribute.enumstore.%s", reason, stage));
+ vespalib::string eventName(fmt("%s.attribute.enumstore.%s", reason, stage));
EV_STATE(eventName.c_str(), jstr.toString().data());
}
diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h
index 2d0a03a0d90..f245a216aeb 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributevector.h
+++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h
@@ -5,6 +5,7 @@
#include "address_space_usage.h"
#include "changevector.h"
#include "readable_attribute_vector.h"
+#include "basename.h"
#include <vespa/searchcommon/attribute/i_search_context.h>
#include <vespa/searchcommon/attribute/iattributevector.h>
#include <vespa/searchcommon/attribute/search_context_params.h>
@@ -61,6 +62,8 @@ namespace search {
class SearchContext;
class MultiValueMappingBase;
class Config;
+ class ValueModifier;
+ class EnumModifier;
}
namespace fileutil {
@@ -97,31 +100,10 @@ protected:
using QueryTermSimpleUP = std::unique_ptr<QueryTermSimple>;
using QueryPacketT = vespalib::stringref;
using stringref = vespalib::stringref;
+ using ValueModifier = attribute::ValueModifier;
+ using EnumModifier = attribute::EnumModifier;
public:
- typedef std::shared_ptr<AttributeVector> SP;
- class BaseName : public vespalib::string
- {
- public:
- typedef vespalib::string string;
- BaseName(vespalib::stringref s)
- : string(s),
- _name(createAttributeName(s))
- { }
- BaseName & operator = (vespalib::stringref s) {
- BaseName n(s);
- std::swap(*this, n);
- return *this;
- }
-
- BaseName(vespalib::stringref base, vespalib::stringref name);
- ~BaseName();
-
- const string & getAttributeName() const { return _name; }
- string getDirName() const;
- private:
- static string createAttributeName(vespalib::stringref s);
- string _name;
- };
+ using SP = std::shared_ptr<AttributeVector>;
using GenerationHandler = vespalib::GenerationHandler;
using GenerationHolder = vespalib::GenerationHolder;
@@ -157,46 +139,11 @@ protected:
void setNumDocs(uint32_t n) { _status.setNumDocs(n); }
void incNumDocs() { _status.incNumDocs(); }
- class ValueModifier
- {
- public:
- ValueModifier(AttributeVector &attr);
- ValueModifier(const ValueModifier &rhs);
- ~ValueModifier();
- private:
- AttributeVector * stealAttr() const {
- AttributeVector * ret(_attr);
- _attr = nullptr;
- return ret;
- }
-
- mutable AttributeVector * _attr;
- };
-
public:
- class EnumModifier
- {
- std::unique_lock<std::shared_mutex> _enumLock;
- public:
- EnumModifier(std::shared_mutex &lock, attribute::InterlockGuard &interlockGuard)
- : _enumLock(lock)
- {
- (void) interlockGuard;
- }
- EnumModifier(EnumModifier &&rhs)
- : _enumLock(std::move(rhs._enumLock))
- { }
- EnumModifier &operator=(EnumModifier &&rhs)
- {
- _enumLock = std::move(rhs._enumLock);
- return *this;
- }
- virtual ~EnumModifier() { }
- };
EnumModifier getEnumModifier();
protected:
- ValueModifier getValueModifier() { return ValueModifier(*this); }
+ ValueModifier getValueModifier();
void updateCommittedDocIdLimit() {
if (_uncommittedDocIdLimit != 0) {
@@ -341,7 +288,7 @@ public:
const Config &getConfig() const noexcept { return *_config; }
void update_config(const Config& cfg);
- const BaseName & getBaseFileName() const { return _baseFileName; }
+ const attribute::BaseName & getBaseFileName() const { return _baseFileName; }
void setBaseFileName(vespalib::stringref name) { _baseFileName = name; }
bool isUpdateableInMemoryOnly() const { return _isUpdateableInMemoryOnly; }
@@ -470,7 +417,7 @@ private:
virtual bool onLoad(vespalib::Executor * executor);
- BaseName _baseFileName;
+ attribute::BaseName _baseFileName;
std::unique_ptr<Config> _config;
std::shared_ptr<attribute::Interlock> _interlock;
mutable std::shared_mutex _enumLock;
diff --git a/searchlib/src/vespa/searchlib/attribute/basename.cpp b/searchlib/src/vespa/searchlib/attribute/basename.cpp
new file mode 100644
index 00000000000..34a98c19630
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/basename.cpp
@@ -0,0 +1,52 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "basename.h"
+
+namespace search::attribute {
+
+BaseName::BaseName(vespalib::stringref base, vespalib::stringref name)
+ : string(base),
+ _name(name)
+{
+ if (!empty()) {
+ push_back('/');
+ }
+ append(name);
+}
+
+BaseName::BaseName(vespalib::stringref s)
+ : string(s),
+ _name(createAttributeName(s))
+{ }
+BaseName &
+BaseName::operator = (vespalib::stringref s) {
+ BaseName n(s);
+ std::swap(*this, n);
+ return *this;
+ }
+
+BaseName::~BaseName() = default;
+
+vespalib::string
+BaseName::createAttributeName(vespalib::stringref s)
+{
+ size_t p(s.rfind('/'));
+ if (p == string::npos) {
+ return s;
+ } else {
+ return s.substr(p+1);
+ }
+}
+
+vespalib::string
+BaseName::getDirName() const
+{
+ size_t p = rfind('/');
+ if (p == string::npos) {
+ return "";
+ } else {
+ return substr(0, p);
+ }
+}
+
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/basename.h b/searchlib/src/vespa/searchlib/attribute/basename.h
new file mode 100644
index 00000000000..23c8d28b2d8
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/basename.h
@@ -0,0 +1,25 @@
+// 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>
+
+namespace search::attribute {
+
+class BaseName : public vespalib::string
+{
+public:
+ using string = vespalib::string;
+ BaseName(vespalib::stringref s);
+ BaseName(vespalib::stringref base, vespalib::stringref name);
+ BaseName & operator = (vespalib::stringref s);
+ ~BaseName();
+
+ const string & getAttributeName() const { return _name; }
+ string getDirName() const;
+private:
+ static string createAttributeName(vespalib::stringref s);
+ string _name;
+};
+
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/enummodifier.cpp b/searchlib/src/vespa/searchlib/attribute/enummodifier.cpp
new file mode 100644
index 00000000000..72fd624d18a
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/enummodifier.cpp
@@ -0,0 +1,15 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "enummodifier.h"
+
+namespace search::attribute {
+
+EnumModifier::EnumModifier(std::shared_mutex &lock, attribute::InterlockGuard &interlockGuard)
+ : _enumLock(lock)
+{
+ (void) interlockGuard;
+}
+
+EnumModifier::~EnumModifier() = default;
+
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/enummodifier.h b/searchlib/src/vespa/searchlib/attribute/enummodifier.h
new file mode 100644
index 00000000000..c147ac5cd75
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/enummodifier.h
@@ -0,0 +1,20 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <shared_mutex>
+#include <mutex>
+
+namespace search::attribute {
+
+class InterlockGuard;
+
+class EnumModifier
+{
+ std::unique_lock<std::shared_mutex> _enumLock;
+public:
+ EnumModifier(std::shared_mutex &lock, InterlockGuard &interlockGuard);
+ ~EnumModifier();
+};
+
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h
index 0b36e5657f8..15e0c3228bb 100644
--- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h
+++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h
@@ -2,8 +2,8 @@
#pragma once
-#include "attributevector.h"
#include "bitvector_search_cache.h"
+#include <vespa/searchcommon/attribute/search_context_params.h>
#include <vespa/searchcommon/attribute/i_search_context.h>
#include <vespa/searchlib/attribute/posting_list_merger.h>
#include <vespa/searchlib/common/i_document_meta_store_context.h>
@@ -11,9 +11,10 @@
#include <vespa/vespalib/util/arrayref.h>
namespace search::fef { class TermFieldMatchData; }
-
+namespace search { class QueryTermSimple; }
namespace search::attribute {
+class IAttributeVector;
class ReferenceAttribute;
class ImportedAttributeVector;
class SearchContextParams;
@@ -65,7 +66,7 @@ public:
const QueryTermUCS4 * queryTerm() const override;
const vespalib::string& attributeName() const override;
- using DocId = IAttributeVector::DocId;
+ using DocId = uint32_t;
int32_t find(DocId docId, int32_t elemId, int32_t& weight) const {
return _target_search_context->find(getTargetLid(docId), elemId, weight);
diff --git a/searchlib/src/vespa/searchlib/attribute/load_utils.h b/searchlib/src/vespa/searchlib/attribute/load_utils.h
index 8801b0fe5a4..98b32031d1f 100644
--- a/searchlib/src/vespa/searchlib/attribute/load_utils.h
+++ b/searchlib/src/vespa/searchlib/attribute/load_utils.h
@@ -3,17 +3,18 @@
#pragma once
#include "atomic_utils.h"
-#include "attributevector.h"
#include "readerbase.h"
#include <vespa/vespalib/util/arrayref.h>
#include <vespa/searchcommon/attribute/multi_value_traits.h>
namespace vespalib::datastore {
+ class AtomicEntryRef;
+ class EntryRef;
+}
-class AtomicEntryRef;
-class EntryRef;
+namespace vespalib { class GenerationHolder; }
-}
+namespace search { class AttributeVector; }
namespace search::attribute {
diff --git a/searchlib/src/vespa/searchlib/attribute/load_utils.hpp b/searchlib/src/vespa/searchlib/attribute/load_utils.hpp
index 47839f4af98..62d645326ce 100644
--- a/searchlib/src/vespa/searchlib/attribute/load_utils.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/load_utils.hpp
@@ -3,10 +3,10 @@
#pragma once
#include "load_utils.h"
+#include "attributevector.h"
#include <vespa/searchcommon/attribute/multivalue.h>
-namespace search {
-namespace attribute {
+namespace search::attribute {
template <class MvMapping, class Saver>
uint32_t
@@ -86,5 +86,4 @@ loadFromEnumeratedSingleValue(Vector &vector,
}
}
-} // namespace search::attribute
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp b/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp
index c3eefaaaf93..80ba87dde0e 100644
--- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp
@@ -2,6 +2,7 @@
#include "multienumattribute.h"
#include "multienumattribute.hpp"
+#include "enummodifier.h"
#include <stdexcept>
namespace search::multienumattribute {
@@ -18,7 +19,7 @@ remap_enum_store_refs(const EnumIndexRemapper& remapper, AttributeVector& v, att
// update multi_value_mapping with new EnumIndex values after enum store has been compacted.
v.logEnumStoreEvent("compactfixup", "drain");
{
- AttributeVector::EnumModifier enum_guard(v.getEnumModifier());
+ attribute::EnumModifier enum_guard(v.getEnumModifier());
auto& filter = remapper.get_entry_ref_filter();
v.logEnumStoreEvent("compactfixup", "start");
for (uint32_t doc = 0; doc < v.getNumDocs(); ++doc) {
diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp
index c1cb6b1f75b..ec948882312 100644
--- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp
@@ -8,6 +8,7 @@
#include "load_utils.h"
#include "enum_store_loaders.h"
#include "ipostinglistattributebase.h"
+#include "valuemodifier.h"
#include <vespa/vespalib/stllike/hashtable.hpp>
#include <vespa/vespalib/datastore/unique_store_remapper.h>
diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp
index 0946994f8ec..8cabd8483bf 100644
--- a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp
@@ -8,6 +8,7 @@
#include "multi_numeric_search_context.h"
#include "load_utils.h"
#include "primitivereader.h"
+#include "valuemodifier.h"
#include <vespa/searchlib/query/query_term_simple.h>
#include <vespa/searchlib/util/fileutil.h>
diff --git a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp
index bb45e5dbbf3..7574508517d 100644
--- a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp
@@ -6,6 +6,7 @@
#include "ipostinglistsearchcontext.h"
#include "primitivereader.h"
#include "search_context.h"
+#include "valuemodifier.h"
#include <vespa/searchlib/common/bitvectoriterator.h>
#include <vespa/searchlib/query/query_term_simple.h>
#include <vespa/searchlib/queryeval/emptysearch.h>
diff --git a/searchlib/src/vespa/searchlib/attribute/singleenumattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singleenumattribute.cpp
index aada952a7c9..a0a93946bb0 100644
--- a/searchlib/src/vespa/searchlib/attribute/singleenumattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/singleenumattribute.cpp
@@ -5,6 +5,8 @@
#include "stringbase.h"
#include "integerbase.h"
#include "floatbase.h"
+#include "enumattribute.h"
+#include "enummodifier.h"
#include <vespa/log/log.h>
LOG_SETUP(".searchlib.attribute.single_enum_attribute");
@@ -19,11 +21,7 @@ SingleValueEnumAttributeBase(const Config & c, GenerationHolder &genHolder, cons
{
}
-
-SingleValueEnumAttributeBase::~SingleValueEnumAttributeBase()
-{
-}
-
+SingleValueEnumAttributeBase::~SingleValueEnumAttributeBase() = default;
AttributeVector::DocId
SingleValueEnumAttributeBase::addDoc(bool &incGeneration)
@@ -33,7 +31,6 @@ SingleValueEnumAttributeBase::addDoc(bool &incGeneration)
return _enumIndices.size() - 1;
}
-
SingleValueEnumAttributeBase::EnumIndexCopyVector
SingleValueEnumAttributeBase::getIndicesCopy(uint32_t size) const
{
@@ -65,7 +62,7 @@ SingleValueEnumAttributeBase::remap_enum_store_refs(const EnumIndexRemapper& rem
}
v.logEnumStoreEvent("compactfixup", "drain");
{
- AttributeVector::EnumModifier enum_guard(v.getEnumModifier());
+ attribute::EnumModifier enum_guard(v.getEnumModifier());
v.logEnumStoreEvent("compactfixup", "start");
_enumIndices.replaceVector(std::move(new_indexes));
}
diff --git a/searchlib/src/vespa/searchlib/attribute/singleenumattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singleenumattribute.hpp
index 9f11b444c2c..c4abcfbc25a 100644
--- a/searchlib/src/vespa/searchlib/attribute/singleenumattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/singleenumattribute.hpp
@@ -8,6 +8,7 @@
#include "singleenumattributesaver.h"
#include "load_utils.h"
#include "enum_store_loaders.h"
+#include "valuemodifier.h"
#include <vespa/vespalib/datastore/unique_store_remapper.h>
namespace search {
diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp
index 7a72572745a..b9c1c3686de 100644
--- a/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp
@@ -9,6 +9,7 @@
#include "singlenumericattribute.h"
#include "singlenumericattributesaver.h"
#include "single_numeric_search_context.h"
+#include "valuemodifier.h"
#include <vespa/searchlib/query/query_term_simple.h>
#include <vespa/searchcommon/attribute/config.h>
diff --git a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp
index a98b32d705a..b69ed017b52 100644
--- a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp
@@ -5,6 +5,7 @@
#include "iattributesavetarget.h"
#include "primitivereader.h"
#include "single_small_numeric_search_context.h"
+#include "valuemodifier.h"
#include <vespa/searchlib/query/query_term_simple.h>
#include <vespa/searchlib/util/file_settings.h>
#include <vespa/searchcommon/attribute/config.h>
diff --git a/searchlib/src/vespa/searchlib/attribute/valuemodifier.cpp b/searchlib/src/vespa/searchlib/attribute/valuemodifier.cpp
new file mode 100644
index 00000000000..56bffa2a551
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/valuemodifier.cpp
@@ -0,0 +1,18 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "valuemodifier.h"
+#include "attributevector.h"
+
+namespace search::attribute {
+
+ValueModifier::ValueModifier(AttributeVector &attr)
+ : _attr(&attr)
+{ }
+
+ValueModifier::~ValueModifier() {
+ if (_attr) {
+ _attr->incGeneration();
+ }
+}
+
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/valuemodifier.h b/searchlib/src/vespa/searchlib/attribute/valuemodifier.h
new file mode 100644
index 00000000000..47416eedc51
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/valuemodifier.h
@@ -0,0 +1,22 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "interlock.h"
+
+namespace search { class AttributeVector; }
+
+namespace search::attribute {
+
+class ValueModifier
+{
+public:
+ ValueModifier(AttributeVector &attr);
+ ValueModifier(const ValueModifier &) = delete;
+ ValueModifier & operator = (const ValueModifier &) = delete;
+ ~ValueModifier();
+private:
+ AttributeVector * _attr;
+};
+
+}
diff --git a/searchlib/src/vespa/searchlib/util/logutil.cpp b/searchlib/src/vespa/searchlib/util/logutil.cpp
index 0f8e28adeb0..7f10c1598df 100644
--- a/searchlib/src/vespa/searchlib/util/logutil.cpp
+++ b/searchlib/src/vespa/searchlib/util/logutil.cpp
@@ -6,8 +6,7 @@
using vespalib::JSONStringer;
-namespace search {
-namespace util {
+namespace search::util {
vespalib::string
LogUtil::extractLastElements(const vespalib::string & path, size_t numElems)
@@ -47,5 +46,4 @@ LogUtil::logDir(JSONStringer & jstr, const vespalib::string & path, size_t numEl
jstr.endObject();
}
-} // namespace util
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/util/logutil.h b/searchlib/src/vespa/searchlib/util/logutil.h
index e30fd15a33a..6afb654a960 100644
--- a/searchlib/src/vespa/searchlib/util/logutil.h
+++ b/searchlib/src/vespa/searchlib/util/logutil.h
@@ -3,8 +3,7 @@
#include <vespa/vespalib/util/jsonwriter.h>
-namespace search {
-namespace util {
+namespace search::util {
class LogUtil {
public:
@@ -24,6 +23,4 @@ public:
static void logDir(vespalib::JSONStringer & jstr, const vespalib::string & path, size_t numElems);
};
-} // namespace util
-} // namespace search
-
+}