55#include < vespa/document/fieldvalue/document.h>
66#include < vespa/document/repo/newconfigbuilder.h>
77#include < vespa/document/repo/documenttyperepo.h>
8+ #include < vespa/searchlib/common/i_document_id_provider.h>
89#include < vespa/searchlib/common/matching_elements.h>
910#include < vespa/searchsummary/docsummary/docsumstate.h>
1011#include < vespa/searchsummary/docsummary/docsum_store_document.h>
1415#include < vespa/searchsummary/docsummary/summary_elements_selector.h>
1516#include < vespa/vespalib/data/slime/slime.h>
1617#include < vespa/vespalib/gtest/gtest.h>
17- #include < iostream >
18+ #include < map >
1819#include < memory>
1920
2021using document::Document;
@@ -40,6 +41,7 @@ namespace {
4041
4142const int32_t doc_type_id = 787121340 ;
4243const std::string doc_type_name = " test" ;
44+ const std::string provided_document_id (" id:provided:test::1" );
4345
4446std::unique_ptr<const DocumentTypeRepo>
4547make_doc_type_repo ()
@@ -55,21 +57,51 @@ struct MyGetDocsumsStateCallback : GetDocsumsStateCallback {
5557 std::unique_ptr<MatchingElements> fill_matching_elements (const MatchingElementsFields &) override { abort (); }
5658};
5759
60+ class MyDocumentIdProvider : public search ::IDocumentIdProvider {
61+ std::map<uint32_t , std::string> _ids;
62+ public:
63+ MyDocumentIdProvider ();
64+ ~MyDocumentIdProvider () override ;
65+ [[nodiscard]] std::string_view get_document_id_string_view (uint32_t lid) const noexcept override ;
66+ };
67+
68+ MyDocumentIdProvider::MyDocumentIdProvider ()
69+ : search::IDocumentIdProvider(),
70+ _ids ()
71+ {
72+ _ids.emplace (1 , provided_document_id);
73+ }
74+
75+ MyDocumentIdProvider::~MyDocumentIdProvider () = default ;
76+
77+ std::string_view MyDocumentIdProvider::get_document_id_string_view (uint32_t lid) const noexcept {
78+ auto itr = _ids.find (lid);
79+ if (itr != _ids.end ()) {
80+ return itr->second ;
81+ } else {
82+ return {};
83+ }
84+ }
85+
86+ }
87+
5888class DocumentIdDFWTest : public ::testing::Test
5989{
6090 std::string _field_name;
6191 vespalib::Memory _field_name_view;
6292 std::unique_ptr<ResultConfig> _result_config;
6393 std::unique_ptr<const DocumentTypeRepo> _repo;
6494 const DocumentType* _document_type;
95+ std::shared_ptr<const search::IDocumentIdProvider> _document_id_provider;
6596
6697protected:
6798 DocumentIdDFWTest ();
6899 ~DocumentIdDFWTest () override ;
69100
70101 std::unique_ptr<IDocsumStoreDocument> make_docsum_store_document (const std::string &id);
71- vespalib:: Slime write (const IDocsumStoreDocument* doc);
102+ Slime write (uint32_t lid, const IDocsumStoreDocument* doc);
72103 vespalib::Memory get_field_name_view () const noexcept { return _field_name_view; }
104+ void enable_document_id_provider () { _document_id_provider = std::make_shared<MyDocumentIdProvider>(); }
73105};
74106
75107DocumentIdDFWTest::DocumentIdDFWTest ()
@@ -78,7 +110,8 @@ DocumentIdDFWTest::DocumentIdDFWTest()
78110 _field_name_view(_field_name.data(), _field_name.size()),
79111 _result_config(std::make_unique<ResultConfig>()),
80112 _repo(make_doc_type_repo()),
81- _document_type(_repo->getDocumentType (doc_type_name))
113+ _document_type(_repo->getDocumentType (doc_type_name)),
114+ _document_id_provider()
82115{
83116 auto * cfg = _result_config->addResultClass (" default" , 0 );
84117 cfg->addConfigEntry (_field_name);
@@ -96,41 +129,60 @@ DocumentIdDFWTest::make_docsum_store_document(const std::string& id)
96129}
97130
98131vespalib::Slime
99- DocumentIdDFWTest::write (const IDocsumStoreDocument* doc)
132+ DocumentIdDFWTest::write (uint32_t lid, const IDocsumStoreDocument* doc)
100133{
101134 Slime slime;
102135 SlimeInserter top_inserter (slime);
103136 Cursor & docsum = top_inserter.insertObject ();
104137 ObjectInserter field_inserter (docsum, _field_name_view);
105- DocumentIdDFW writer;
138+ DocumentIdDFW writer (_document_id_provider) ;
106139 MyGetDocsumsStateCallback callback;
107140 GetDocsumsState state (callback);
108- writer.insert_field (0 , doc, state, ElementIds::select_all (), field_inserter);
141+ writer.insert_field (lid , doc, state, ElementIds::select_all (), field_inserter);
109142 return slime;
110143}
111144
112145TEST_F (DocumentIdDFWTest, insert_document_id)
113146{
114147 std::string id (" id::test::0" );
115148 auto doc = make_docsum_store_document (id);
116- auto slime = write (doc.get ());
149+ auto slime = write (1 , doc.get ());
117150 EXPECT_TRUE (slime.get ()[get_field_name_view ()].valid ());
118151 EXPECT_EQ (id, slime.get ()[get_field_name_view ()].asString ().make_string ());
119152}
120153
121154TEST_F (DocumentIdDFWTest, insert_document_id_no_document_doc)
122155{
123156 auto doc = std::make_unique<DocsumStoreDocument>(std::unique_ptr<Document>());
124- auto slime = write (doc.get ());
157+ auto slime = write (1 , doc.get ());
125158 EXPECT_FALSE (slime.get ()[get_field_name_view ()].valid ());
126159}
127160
128161TEST_F (DocumentIdDFWTest, insert_document_id_no_docsum_store_doc)
129162{
130- auto slime = write (nullptr );
163+ auto slime = write (1 , nullptr );
131164 EXPECT_FALSE (slime.get ()[get_field_name_view ()].valid ());
132165}
133166
167+ TEST_F (DocumentIdDFWTest, insert_document_id_no_document_doc_but_document_id_provider)
168+ {
169+ enable_document_id_provider ();
170+ auto doc = std::make_unique<DocsumStoreDocument>(std::unique_ptr<Document>());
171+ auto slime = write (1 , doc.get ());
172+ EXPECT_TRUE (slime.get ()[get_field_name_view ()].valid ());
173+ EXPECT_EQ (provided_document_id, slime.get ()[get_field_name_view ()].asString ().make_string ());
174+ slime = write (2 , doc.get ());
175+ EXPECT_FALSE (slime.get ()[get_field_name_view ()].valid ());
176+ }
177+
178+ TEST_F (DocumentIdDFWTest, insert_document_id_no_docsum_store_doc_but_document_id_provider)
179+ {
180+ enable_document_id_provider ();
181+ auto slime = write (1 , nullptr );
182+ EXPECT_TRUE (slime.get ()[get_field_name_view ()].valid ());
183+ EXPECT_EQ (provided_document_id, slime.get ()[get_field_name_view ()].asString ().make_string ());
184+ slime = write (2 , nullptr );
185+ EXPECT_FALSE (slime.get ()[get_field_name_view ()].valid ());
134186}
135187
136188GTEST_MAIN_RUN_ALL_TESTS ()
0 commit comments