diff options
author | Geir Storli <geirst@oath.com> | 2017-09-05 13:09:24 +0000 |
---|---|---|
committer | Geir Storli <geirst@oath.com> | 2017-09-06 15:45:25 +0000 |
commit | e65e07a491c8ac14d2a951158b9d446339b1ad49 (patch) | |
tree | 44cb913185cd24db64ff1e724c0a7cfce7df2079 | |
parent | b24b63018c3862a393a6e69530bafad855ae5fdd (diff) |
Implement simple bitvector search cache for use in imported attribute vector.
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(); +}; + +} +} |