summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-04-27 08:58:01 +0200
committerGitHub <noreply@github.com>2020-04-27 08:58:01 +0200
commit6eec72125244ca7b0738af4c616f378ced98dd13 (patch)
tree21c67942e07e8aac3dfbd62a4122c0d9789fd2ab /vespalib
parente4ec145b7597adec17295beea741b9f9f800dec5 (diff)
parent5e9b98aecac6a8919a22b6e73861e6f2af07df72 (diff)
Merge pull request #13063 from vespa-engine/toregge/extend-btree-frozen-view
Extend BTree frozen view with empty() and getAggregated() methods.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/btree/btreeaggregation_test.cpp20
-rw-r--r--vespalib/src/tests/btree/frozenbtree_test.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeroot.h6
3 files changed, 28 insertions, 0 deletions
diff --git a/vespalib/src/tests/btree/btreeaggregation_test.cpp b/vespalib/src/tests/btree/btreeaggregation_test.cpp
index b64bbb105c5..2b4b37af171 100644
--- a/vespalib/src/tests/btree/btreeaggregation_test.cpp
+++ b/vespalib/src/tests/btree/btreeaggregation_test.cpp
@@ -332,6 +332,7 @@ private:
void requireThatTreeIteratorAssignWorks();
void requireThatUpdateOfKeyWorks();
void requireThatUpdateOfDataWorks();
+ void requireThatFrozenViewProvidesAggregatedValues();
template <typename TreeStore>
void
@@ -1185,6 +1186,24 @@ Test::requireThatSmallNodesWorks()
s.trimHoldLists(g.getFirstUsedGeneration());
}
+void
+Test::requireThatFrozenViewProvidesAggregatedValues()
+{
+ MyTree t;
+ t.insert(20, 102);
+ t.insert(10, 101);
+ t.insert(30, 103);
+ t.insert(40, 104);
+ auto old_view = t.getFrozenView();
+ t.getAllocator().freeze();
+ auto new_view = t.getFrozenView();
+ auto new_aggregated = new_view.getAggregated();
+ EXPECT_EQUAL(new_aggregated.getMin(), 101);
+ EXPECT_EQUAL(new_aggregated.getMax(), 104);
+ auto old_aggregated = old_view.getAggregated();
+ EXPECT_EQUAL(old_aggregated.getMin(), std::numeric_limits<int32_t>::max());
+ EXPECT_EQUAL(old_aggregated.getMax(), std::numeric_limits<int32_t>::min());
+}
int
Test::Main()
@@ -1208,6 +1227,7 @@ Test::Main()
requireThatUpdateOfDataWorks();
TEST_DO(requireThatSmallNodesWorks<MyTreeStore>());
TEST_DO(requireThatSmallNodesWorks<MyTreeForceApplyStore>());
+ TEST_DO(requireThatFrozenViewProvidesAggregatedValues());
TEST_DONE();
}
diff --git a/vespalib/src/tests/btree/frozenbtree_test.cpp b/vespalib/src/tests/btree/frozenbtree_test.cpp
index 42410d824e8..9bf6f3773eb 100644
--- a/vespalib/src/tests/btree/frozenbtree_test.cpp
+++ b/vespalib/src/tests/btree/frozenbtree_test.cpp
@@ -421,7 +421,9 @@ FrozenBTreeTest::Main()
allocTree();
insertRandomValues(*_tree, *_allocator, _randomValues);
lookupRandomValues(*_tree, *_allocator, _randomValues);
+ EXPECT_TRUE(_tree->getFrozenView(*_allocator).empty());
_allocator->freeze();
+ EXPECT_FALSE(_tree->getFrozenView(*_allocator).empty());
_allocator->transferHoldLists(_generationHandler->getCurrentGeneration());
lookupFrozenRandomValues(*_tree, *_allocator, _randomValues);
traverseTreeIterator(*_tree,
diff --git a/vespalib/src/vespa/vespalib/btree/btreeroot.h b/vespalib/src/vespa/vespalib/btree/btreeroot.h
index b5759a6a341..471f4273632 100644
--- a/vespalib/src/vespa/vespalib/btree/btreeroot.h
+++ b/vespalib/src/vespa/vespalib/btree/btreeroot.h
@@ -83,6 +83,12 @@ public:
size_t size() const;
const NodeAllocatorType &getAllocator() const { return _allocator; }
+ const AggrT &getAggregated() const {
+ return _allocator.getAggregated(_frozenRoot);
+ }
+
+ bool empty() const { return !_frozenRoot.valid(); }
+
template <typename FunctionType>
void foreach_key(FunctionType func) const {
_allocator.getNodeStore().foreach_key(_frozenRoot, func);