summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2017-08-31 13:06:02 +0000
committerTor Egge <Tor.Egge@oath.com>2017-08-31 13:14:54 +0000
commit4c2c98fbf3ecd1ae88fb97a01aa8dcf5b2863bbc (patch)
tree679b2fde8b805e93d671893ac7a0c32f90090d88 /searchcore
parent033d298bc2e29fb43640e478c2ecabad21e4e4da (diff)
Keep track of mapping from gid to referenced lid in reference attribute
even when no documents currently reference that gid in the reference attribute. This eliminates the need for using the gid to lid mapper after populateReferencedLids() has been called.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp31
-rw-r--r--searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.cpp12
-rw-r--r--searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.h8
3 files changed, 20 insertions, 31 deletions
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp
index 08787e41438..4c6f9017000 100644
--- a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp
+++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp
@@ -7,6 +7,7 @@
#include <vespa/searchcore/proton/reference/gid_to_lid_change_listener.h>
#include <vespa/searchlib/common/i_gid_to_lid_mapper_factory.h>
#include <vespa/searchlib/common/i_gid_to_lid_mapper.h>
+#include <vespa/searchlib/test/mock_gid_to_lid_mapping.h>
#include <map>
#include <vespa/log/log.h>
LOG_SETUP("gid_to_lid_change_listener_test");
@@ -19,6 +20,7 @@ using search::attribute::Config;
using search::attribute::BasicType;
using search::attribute::Reference;
using search::attribute::ReferenceAttribute;
+using search::attribute::test::MockGidToLidMapperFactory;
namespace proton {
@@ -32,39 +34,14 @@ vespalib::string doc1("id:test:music::1");
vespalib::string doc2("id:test:music::2");
vespalib::string doc3("id:test:music::3");
-using MockGidToLidMap = std::map<GlobalId, uint32_t>;
-
-struct MyGidToLidMapper : public search::IGidToLidMapper
+struct MyGidToLidMapperFactory : public MockGidToLidMapperFactory
{
- const MockGidToLidMap &_map;
- MyGidToLidMapper(const MockGidToLidMap &map)
- : _map(map)
- {
- }
- virtual uint32_t mapGidToLid(const document::GlobalId &gid) const override {
- auto itr = _map.find(gid);
- if (itr != _map.end()) {
- return itr->second;
- } else {
- return 0u;
- }
- }
-};
-
-struct MyGidToLidMapperFactory : public search::IGidToLidMapperFactory
-{
- MockGidToLidMap _map;
-
MyGidToLidMapperFactory()
- : _map()
+ : MockGidToLidMapperFactory()
{
_map.insert({toGid(doc1), 10});
_map.insert({toGid(doc2), 17});
}
-
- virtual std::unique_ptr<search::IGidToLidMapper> getMapper() const override {
- return std::make_unique<MyGidToLidMapper>(_map);
- }
};
}
diff --git a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.cpp b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.cpp
index 7364e6ee6c0..db990dff3bc 100644
--- a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.cpp
+++ b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.cpp
@@ -1,11 +1,12 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "gid_to_lid_mapper.h"
+#include <vespa/searchcore/proton/documentmetastore/documentmetastore.h>
namespace proton {
GidToLidMapper::GidToLidMapper(vespalib::GenerationHandler::Guard &&guard,
- const search::IDocumentMetaStore &dms)
+ const DocumentMetaStore &dms)
: _guard(std::move(guard)),
_dms(dms)
{
@@ -26,4 +27,13 @@ GidToLidMapper::mapGidToLid(const document::GlobalId &gid) const
}
}
+void
+GidToLidMapper::foreach(const search::IGidToLidMapperVisitor &visitor) const
+{
+ const auto &dms = _dms;
+ dms.beginFrozen().foreach_key([&dms,&visitor](uint32_t lid)
+ { visitor.visit(dms.getRawMetaData(lid).getGid(), lid); });
+}
+
+
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.h b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.h
index 7c5dc840af5..ed6bf91dbd3 100644
--- a/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.h
+++ b/searchcore/src/vespa/searchcore/proton/reference/gid_to_lid_mapper.h
@@ -4,10 +4,11 @@
#include <vespa/searchlib/common/i_gid_to_lid_mapper.h>
#include <vespa/vespalib/util/generationhandler.h>
-#include <vespa/searchlib/common/idocumentmetastore.h>
namespace proton {
+class DocumentMetaStore;
+
/*
* Class for mapping from gid to lid. Instances should be short lived
* due to read guards preventing resource reuse.
@@ -15,12 +16,13 @@ namespace proton {
class GidToLidMapper : public search::IGidToLidMapper
{
vespalib::GenerationHandler::Guard _guard;
- const search::IDocumentMetaStore &_dms;
+ const DocumentMetaStore &_dms;
public:
GidToLidMapper(vespalib::GenerationHandler::Guard &&guard,
- const search::IDocumentMetaStore &dms);
+ const DocumentMetaStore &dms);
virtual ~GidToLidMapper();
virtual uint32_t mapGidToLid(const document::GlobalId &gid) const override;
+ virtual void foreach(const search::IGidToLidMapperVisitor &visitor) const override;
};
} // namespace proton