aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2017-09-05 13:09:24 +0000
committerGeir Storli <geirst@oath.com>2017-09-06 15:45:25 +0000
commite65e07a491c8ac14d2a951158b9d446339b1ad49 (patch)
tree44cb913185cd24db64ff1e724c0a7cfce7df2079
parentb24b63018c3862a393a6e69530bafad855ae5fdd (diff)
Implement simple bitvector search cache for use in imported attribute vector.
-rw-r--r--searchlib/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/attribute/bitvector_search_cache/CMakeLists.txt8
-rw-r--r--searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp61
-rw-r--r--searchlib/src/vespa/searchlib/attribute/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.cpp53
-rw-r--r--searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h42
6 files changed, 166 insertions, 0 deletions
diff --git a/searchlib/CMakeLists.txt b/searchlib/CMakeLists.txt
index d079ef167b8..787ca6ed008 100644
--- a/searchlib/CMakeLists.txt
+++ b/searchlib/CMakeLists.txt
@@ -73,6 +73,7 @@ vespa_define_module(
src/tests/attribute/attributemanager
src/tests/attribute/benchmark
src/tests/attribute/bitvector
+ src/tests/attribute/bitvector_search_cache
src/tests/attribute/changevector
src/tests/attribute/compaction
src/tests/attribute/comparator
diff --git a/searchlib/src/tests/attribute/bitvector_search_cache/CMakeLists.txt b/searchlib/src/tests/attribute/bitvector_search_cache/CMakeLists.txt
new file mode 100644
index 00000000000..2442474bcea
--- /dev/null
+++ b/searchlib/src/tests/attribute/bitvector_search_cache/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchlib_bitvector_search_cache_test_app TEST
+ SOURCES
+ bitvector_search_cache_test.cpp
+ DEPENDS
+ searchlib
+)
+vespa_add_test(NAME searchlib_bitvector_search_cache_test_app COMMAND searchlib_bitvector_search_cache_test_app)
diff --git a/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp b/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp
new file mode 100644
index 00000000000..7b395a6459c
--- /dev/null
+++ b/searchlib/src/tests/attribute/bitvector_search_cache/bitvector_search_cache_test.cpp
@@ -0,0 +1,61 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/searchlib/attribute/bitvector_search_cache.h>
+#include <vespa/searchlib/common/bitvector.h>
+
+using namespace search;
+using namespace search::attribute;
+
+using BitVectorSP = BitVectorSearchCache::BitVectorSP;
+
+BitVectorSP
+makeBitVector()
+{
+ return BitVectorSP(BitVector::create(5).release());
+}
+
+struct Fixture {
+ BitVectorSearchCache cache;
+ BitVectorSP vec1;
+ BitVectorSP vec2;
+ Fixture()
+ : cache(),
+ vec1(makeBitVector()),
+ vec2(makeBitVector())
+ {}
+};
+
+TEST_F("require that bit vectors can be inserted and retrieved", Fixture)
+{
+ EXPECT_EQUAL(0u, f.cache.size());
+ f.cache.insert("foo", f.vec1);
+ f.cache.insert("bar", f.vec2);
+ EXPECT_EQUAL(2u, f.cache.size());
+
+ EXPECT_EQUAL(f.vec1, f.cache.find("foo"));
+ EXPECT_EQUAL(f.vec2, f.cache.find("bar"));
+ EXPECT_TRUE(f.cache.find("baz").get() == nullptr);
+}
+
+TEST_F("require that insert() doesn't replace existing bit vector", Fixture)
+{
+ f.cache.insert("foo", f.vec1);
+ f.cache.insert("foo", f.vec2);
+ EXPECT_EQUAL(1u, f.cache.size());
+ EXPECT_EQUAL(f.vec1, f.cache.find("foo"));
+}
+
+TEST_F("require that cache can be cleared", Fixture)
+{
+ f.cache.insert("foo", f.vec1);
+ f.cache.insert("bar", f.vec2);
+ EXPECT_EQUAL(2u, f.cache.size());
+ f.cache.clear();
+
+ EXPECT_EQUAL(0u, f.cache.size());
+ EXPECT_TRUE(f.cache.find("foo").get() == nullptr);
+ EXPECT_TRUE(f.cache.find("bar").get() == nullptr);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt b/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt
index aa0b63894c0..e99092f0206 100644
--- a/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt
+++ b/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt
@@ -21,6 +21,7 @@ vespa_add_library(searchlib_attribute OBJECT
attributesaver.cpp
attributevector.cpp
attrvector.cpp
+ bitvector_search_cache.cpp
changevector.cpp
configconverter.cpp
createarrayfastsearch.cpp
diff --git a/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.cpp b/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.cpp
new file mode 100644
index 00000000000..cf9b459d900
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.cpp
@@ -0,0 +1,53 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "bitvector_search_cache.h"
+#include <vespa/searchlib/common/bitvector.h>
+#include <vespa/vespalib/stllike/hash_map.hpp>
+
+namespace search::attribute {
+
+using BitVectorSP = BitVectorSearchCache::BitVectorSP;
+
+BitVectorSearchCache::BitVectorSearchCache()
+ : _mutex(),
+ _cache()
+{
+}
+
+BitVectorSearchCache::~BitVectorSearchCache()
+{
+}
+
+void
+BitVectorSearchCache::insert(const vespalib::string &term, BitVectorSP bitVector)
+{
+ LockGuard guard(_mutex);
+ _cache.insert(std::make_pair(term, std::move(bitVector)));
+}
+
+BitVectorSP
+BitVectorSearchCache::find(const vespalib::string &term) const
+{
+ LockGuard guard(_mutex);
+ auto itr = _cache.find(term);
+ if (itr != _cache.end()) {
+ return itr->second;
+ }
+ return BitVectorSP();
+}
+
+size_t
+BitVectorSearchCache::size() const
+{
+ LockGuard guard(_mutex);
+ return _cache.size();
+}
+
+void
+BitVectorSearchCache::clear()
+{
+ LockGuard guard(_mutex);
+ _cache.clear();
+}
+
+}
diff --git a/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h b/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h
new file mode 100644
index 00000000000..4b6589459ca
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/attribute/bitvector_search_cache.h
@@ -0,0 +1,42 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/hash_map.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <memory>
+#include <mutex>
+
+namespace search {
+
+class BitVector;
+
+namespace attribute {
+
+/**
+ * Class that caches posting lists (as bit vectors) for a set of search terms.
+ *
+ * Lifetime of cached bit vectors is controlled by calling clear() at regular intervals.
+ */
+class BitVectorSearchCache {
+public:
+ using BitVectorSP = std::shared_ptr<BitVector>;
+
+private:
+ using LockGuard = std::lock_guard<std::mutex>;
+ using Cache = vespalib::hash_map<vespalib::string, BitVectorSP>;
+
+ mutable std::mutex _mutex;
+ Cache _cache;
+
+public:
+ BitVectorSearchCache();
+ ~BitVectorSearchCache();
+ void insert(const vespalib::string &term, BitVectorSP bitVector);
+ BitVectorSP find(const vespalib::string &term) const;
+ size_t size() const;
+ void clear();
+};
+
+}
+}