From 0c657642eff7d85c000464e9edba16ded4845e7d Mon Sep 17 00:00:00 2001 From: Geir Storli Date: Mon, 13 Mar 2023 13:55:29 +0000 Subject: Reduce creation of Document instances without DocumentTypeRepo. --- document/src/tests/documentcalculatortestcase.cpp | 20 +-- document/src/tests/documentselectparsertest.cpp | 6 +- document/src/tests/documenttestcase.cpp | 32 ++-- document/src/tests/documenttypetestcase.cpp | 2 +- document/src/tests/documentupdatetestcase.cpp | 6 +- document/src/tests/fieldpathupdatetestcase.cpp | 101 ++++--------- document/src/tests/fieldsettest.cpp | 10 +- document/src/tests/fieldvalue/document_test.cpp | 4 +- document/src/tests/select/select_test.cpp | 4 +- .../serialization/vespadocumentserializer_test.cpp | 21 +-- document/src/tests/testxml.cpp | 5 +- document/src/vespa/document/base/forcelink.cpp | 8 +- document/src/vespa/document/base/testdocman.cpp | 2 +- .../src/vespa/document/datatype/documenttype.cpp | 2 +- document/src/vespa/document/fieldset/fieldset.h | 3 +- document/src/vespa/document/fieldset/fieldsets.cpp | 4 +- .../src/vespa/document/fieldvalue/document.cpp | 20 +++ document/src/vespa/document/fieldvalue/document.h | 6 + .../vespa/document/fieldvalue/structfieldvalue.cpp | 10 ++ .../vespa/document/fieldvalue/structfieldvalue.h | 1 + documentapi/src/tests/messages/messages60test.cpp | 4 +- documentapi/src/tests/policies/policies_test.cpp | 21 +-- .../persistence/dummyimpl/dummypersistence.cpp | 4 +- .../attribute_populator_test.cpp | 2 +- .../src/tests/proton/attribute/attribute_test.cpp | 2 +- .../document_field_extractor_test.cpp | 2 +- .../src/tests/proton/common/cachedselect_test.cpp | 4 +- .../src/tests/proton/common/selectpruner_test.cpp | 3 +- .../document_iterator/document_iterator_test.cpp | 168 +++++++++++---------- .../maintenancecontroller_test.cpp | 3 +- .../proton/feedoperation/feedoperation_test.cpp | 2 +- .../persistenceengine/persistenceengine_test.cpp | 2 +- .../tests/proton/server/documentretriever_test.cpp | 2 +- .../src/vespa/searchcore/bmcluster/bm_feed.cpp | 3 +- .../searchcore/proton/server/documentretriever.cpp | 3 +- .../proton/server/documentretrieverbase.cpp | 3 +- .../vespa/searchcore/proton/server/feedhandler.cpp | 4 +- .../searchcore/proton/server/storeonlyfeedview.cpp | 3 +- .../src/apps/tests/memoryindexstress_test.cpp | 3 +- .../document_store_visitor_test.cpp | 2 +- .../docstore/logdatastore/logdatastore_test.cpp | 2 +- searchlib/src/vespa/searchlib/test/doc_builder.cpp | 3 +- .../document_id_dfw/document_id_dfw_test.cpp | 3 +- .../matched_elements_filter_test.cpp | 2 +- .../slime_summary/slime_summary_test.cpp | 2 +- storage/src/tests/bucketdb/bucketmanagertest.cpp | 2 +- storage/src/tests/distributor/getoperationtest.cpp | 2 +- storage/src/tests/distributor/putoperationtest.cpp | 10 +- .../distributor/twophaseupdateoperationtest.cpp | 2 +- .../filestorage/filestormanagertest.cpp | 12 +- .../storageserver/documentapiconvertertest.cpp | 4 +- .../rpc/storage_api_rpc_service_test.cpp | 2 +- .../external/twophaseupdateoperation.cpp | 3 +- streamingvisitors/src/tests/document/document.cpp | 2 +- .../src/tests/hitcollector/hitcollector_test.cpp | 4 +- .../matching_elements_filler_test.cpp | 2 +- 56 files changed, 285 insertions(+), 279 deletions(-) diff --git a/document/src/tests/documentcalculatortestcase.cpp b/document/src/tests/documentcalculatortestcase.cpp index 7e27dcf2d36..dafc87f4ccd 100644 --- a/document/src/tests/documentcalculatortestcase.cpp +++ b/document/src/tests/documentcalculatortestcase.cpp @@ -24,7 +24,7 @@ TEST_F(DocumentCalculatorTest, testConstant) { auto variables = std::make_unique(); DocumentCalculator calc(getRepo(), "4.0"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); EXPECT_EQ(4.0, calc.evaluate(doc, std::move(variables))); } @@ -32,7 +32,7 @@ TEST_F(DocumentCalculatorTest, testSimple) { auto variables = std::make_unique(); DocumentCalculator calc(getRepo(), "(3 + 5) / 2"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); EXPECT_EQ(4.0, calc.evaluate(doc, std::move(variables))); } @@ -42,7 +42,7 @@ TEST_F(DocumentCalculatorTest, testVariables) { (*variables)["y"] = 5.0; DocumentCalculator calc(getRepo(), "($x + $y) / 2"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); EXPECT_EQ(4.0, calc.evaluate(doc, std::move(variables))); } @@ -53,7 +53,7 @@ TEST_F(DocumentCalculatorTest, testFields) { DocumentCalculator calc(getRepo(), "(testdoctype1.headerval + testdoctype1" ".hfloatval) / testdoctype1.headerlongval"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); doc.setValue(doc.getField("headerval"), IntFieldValue(5)); doc.setValue(doc.getField("hfloatval"), FloatFieldValue(3.0)); doc.setValue(doc.getField("headerlongval"), LongFieldValue(2)); @@ -67,7 +67,7 @@ TEST_F(DocumentCalculatorTest, testFieldsDivZero) { DocumentCalculator calc(getRepo(), "(testdoctype1.headerval + testdoctype1" ".hfloatval) / testdoctype1.headerlongval"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); doc.setValue(doc.getField("headerval"), IntFieldValue(5)); doc.setValue(doc.getField("hfloatval"), FloatFieldValue(3.0)); doc.setValue(doc.getField("headerlongval"), LongFieldValue(0)); @@ -79,7 +79,7 @@ TEST_F(DocumentCalculatorTest, testDivideByZero) { auto variables = std::make_unique(); DocumentCalculator calc(getRepo(), "(3 + 5) / 0"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); EXPECT_THROW(calc.evaluate(doc, std::move(variables)), vespalib::IllegalArgumentException); } @@ -88,7 +88,7 @@ TEST_F(DocumentCalculatorTest, testModByZero) { auto variables = std::make_unique(); DocumentCalculator calc(getRepo(), "(3 + 5) % 0"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); EXPECT_THROW(calc.evaluate(doc, std::move(variables)), vespalib::IllegalArgumentException); } @@ -98,7 +98,7 @@ TEST_F(DocumentCalculatorTest, testFieldNotSet) { DocumentCalculator calc(getRepo(), "(testdoctype1.headerval + testdoctype1" ".hfloatval) / testdoctype1.headerlongval"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); doc.setValue(doc.getField("hfloatval"), FloatFieldValue(3.0)); doc.setValue(doc.getField("headerlongval"), LongFieldValue(2)); EXPECT_THROW(calc.evaluate(doc, std::move(variables)), @@ -111,7 +111,7 @@ TEST_F(DocumentCalculatorTest, testFieldNotFound) { "(testdoctype1.mynotfoundfield + testdoctype1" ".hfloatval) / testdoctype1.headerlongval"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); doc.setValue(doc.getField("hfloatval"), FloatFieldValue(3.0)); doc.setValue(doc.getField("headerlongval"), LongFieldValue(2)); EXPECT_THROW(calc.evaluate(doc, std::move(variables)), @@ -122,7 +122,7 @@ TEST_F(DocumentCalculatorTest, testByteSubtractionZeroResult) { auto variables = std::make_unique(); DocumentCalculator calc(getRepo(), "testdoctype1.byteval - 3"); - Document doc(*_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); + Document doc(_testRepo.getTypeRepo(), *_testRepo.getDocumentType("testdoctype1"), DocumentId("id:ns:testdoctype1::foo")); doc.setValue(doc.getField("byteval"), ByteFieldValue(3)); EXPECT_EQ(0.0, calc.evaluate(doc, std::move(variables))); } diff --git a/document/src/tests/documentselectparsertest.cpp b/document/src/tests/documentselectparsertest.cpp index 5e14a080f27..13ad2873bfa 100644 --- a/document/src/tests/documentselectparsertest.cpp +++ b/document/src/tests/documentselectparsertest.cpp @@ -120,7 +120,7 @@ Document::SP DocumentSelectParserTest::createDoc( uint64_t hlong) { const DocumentType* type = _repo->getDocumentType(doctype); - auto doc = std::make_shared(*type, DocumentId(id)); + auto doc = std::make_shared(*_repo, *type, DocumentId(id)); doc->setValue(doc->getField("headerval"), IntFieldValue(hint)); if (hlong != 0) { @@ -1662,7 +1662,7 @@ TEST_F(DocumentSelectParserTest, test_parse_utilities_handle_malformed_input) TEST_F(DocumentSelectParserTest, imported_field_references_are_treated_as_valid_field_with_missing_value) { const DocumentType* type = _repo->getDocumentType("with_imported"); ASSERT_TRUE(type != nullptr); - Document doc(*type, DocumentId("id::with_imported::foo")); + Document doc(*_repo, *type, DocumentId("id::with_imported::foo")); PARSE("with_imported.my_imported_field == null", doc, True); PARSE("with_imported.my_imported_field != null", doc, False); @@ -1674,7 +1674,7 @@ TEST_F(DocumentSelectParserTest, imported_field_references_are_treated_as_valid_ TEST_F(DocumentSelectParserTest, imported_field_references_only_support_for_simple_expressions) { const DocumentType* type = _repo->getDocumentType("with_imported"); ASSERT_TRUE(type != nullptr); - Document doc(*type, DocumentId("id::with_imported::foo")); + Document doc(*_repo, *type, DocumentId("id::with_imported::foo")); PARSE("with_imported.my_imported_field.foo", doc, Invalid); PARSE("with_imported.my_imported_field[0]", doc, Invalid); diff --git a/document/src/tests/documenttestcase.cpp b/document/src/tests/documenttestcase.cpp index bc4065438e6..2e9e783470c 100644 --- a/document/src/tests/documenttestcase.cpp +++ b/document/src/tests/documenttestcase.cpp @@ -136,8 +136,8 @@ TEST(DocumentTest, testTraversing) type.addField(primitive1); type.addField(structl1s1); - Document doc(type, DocumentId("id:ns:test::1")); - doc.setValue(primitive1, IntFieldValue(1)); + auto doc = Document::make_without_repo(type, DocumentId("id:ns:test::1")); + doc->setValue(primitive1, IntFieldValue(1)); StructFieldValue l1s1(struct3); l1s1.setValue(primitive1, IntFieldValue(2)); @@ -159,11 +159,11 @@ TEST(DocumentTest, testTraversing) l2s1.setValue(sarrF, sarr1); l1s1.setValue(s2, l2s1); - doc.setValue(structl1s1, l1s1); + doc->setValue(structl1s1, l1s1); Handler fullTraverser; FieldPath empty; - doc.iterateNested(empty.getFullRange(), fullTraverser); + doc->iterateNested(empty.getFullRange(), fullTraverser); EXPECT_EQ(fullTraverser.getResult(), std::string("<0:P-0<0:P-0<0:P-0P-0[P-0P-1P-2][<0:P-0P-0><1:P-1P-1>]>>>")); } @@ -208,14 +208,14 @@ TEST(DocumentTest, testVariables) iiiaV.add(iiaV); } - Document doc(type, DocumentId("id:ns:test::1")); - doc.setValue(iiiarrF, iiiaV); + auto doc = Document::make_without_repo(type, DocumentId("id:ns:test::1")); + doc->setValue(iiiarrF, iiiaV); { VariableIteratorHandler handler; FieldPath path; type.buildFieldPath(path, "iiiarray[$x][$y][$z]"); - doc.iterateNested(path.getFullRange(), handler); + doc->iterateNested(path.getFullRange(), handler); std::string fasit = "x: 0,y: 0,z: 0, - 1\n" @@ -315,7 +315,7 @@ TEST(DocumentTest, testModifyDocument) type.addField(primitive1); type.addField(structl1s1); - Document::UP doc(new Document(type, DocumentId("id:ns:test::1"))); + auto doc = Document::make_without_repo(type, DocumentId("id:ns:test::1")); doc->setValue(primitive1, IntFieldValue(1)); StructFieldValue l1s1(struct3); @@ -389,7 +389,7 @@ TEST(DocumentTest, testSimpleUsage) type->addField(strF); DocumentTypeRepo repo(*type); - Document value(*repo.getDocumentType("test"), DocumentId("id:ns:test::1")); + Document value(repo, *repo.getDocumentType("test"), DocumentId("id:ns:test::1")); // Initially empty EXPECT_EQ(size_t(0), value.getSetFieldCount()); @@ -412,7 +412,7 @@ TEST(DocumentTest, testSimpleUsage) // Serialize & equality nbostream buffer; value.serialize(buffer); - Document value2(*repo.getDocumentType("test"), + Document value2(repo, *repo.getDocumentType("test"), DocumentId("id::test:n=3:foo")); EXPECT_TRUE(value != value2); value2.deserialize(repo, buffer); @@ -508,7 +508,7 @@ TEST(DocumentTest, testSimpleUsage) // Refuse to accept non-document types try{ StructDataType otherType("foo", 4); - Document value6(otherType, DocumentId("id:ns:foo::1")); + auto doc = Document::make_without_repo(otherType, DocumentId("id:ns:foo::1")); FAIL() << "Didn't complain about non-document type"; } catch (std::exception& e) { EXPECT_THAT(e.what(), HasSubstr("Cannot generate a document with non-document type")); @@ -706,7 +706,7 @@ TEST(DocumentTest,testReadSerializedAllVersions) // Create a memory instance of document { - Document doc(*docType, DocumentId("id:ns:serializetest::http://test.doc.id/")); + Document doc(repo, *docType, DocumentId("id:ns:serializetest::http://test.doc.id/")); doc.setValue("intfield", IntFieldValue::make(5)); doc.setValue("floatfield", FloatFieldValue::make(-9.23)); doc.setValue("stringfield", StringFieldValue::make("This is a string.")); @@ -714,7 +714,7 @@ TEST(DocumentTest,testReadSerializedAllVersions) doc.setValue("doublefield", DoubleFieldValue::make(98374532.398820)); doc.setValue("bytefield", ByteFieldValue::make(-2)); doc.setValue("rawfield", std::make_unique("RAW DATA", 8)); - Document docInDoc(*docInDocType, DocumentId("id:ns:docindoc::http://doc.in.doc/")); + Document docInDoc(repo, *docInDocType, DocumentId("id:ns:docindoc::http://doc.in.doc/")); docInDoc.setValue("stringindocfield", StringFieldValue::make("Elvis is dead")); doc.setValue("docfield", docInDoc); ArrayFieldValue floatArray(*arrayOfFloatDataType); @@ -828,7 +828,7 @@ TEST(DocumentTest, testGenerateSerializedFile) { const std::string file_name = TEST_PATH("data/crossplatform-java-cpp-doctypes.cfg"); DocumentTypeRepo repo(readDocumenttypesConfig(file_name)); - Document doc(*repo.getDocumentType("serializetest"), DocumentId("id:ns:serializetest::http://test.doc.id/")); + Document doc(repo, *repo.getDocumentType("serializetest"), DocumentId("id:ns:serializetest::http://test.doc.id/")); doc.setValue("intfield", IntFieldValue::make(5)); doc.setValue("floatfield", FloatFieldValue::make(-9.23)); @@ -841,7 +841,7 @@ TEST(DocumentTest, testGenerateSerializedFile) const DocumentType *docindoc_type = repo.getDocumentType("docindoc"); EXPECT_TRUE(docindoc_type); - Document embedDoc(*docindoc_type, DocumentId("id:ns:docindoc::http://embedded")); + Document embedDoc(repo, *docindoc_type, DocumentId("id:ns:docindoc::http://embedded")); doc.setValue("docfield", embedDoc); @@ -949,7 +949,7 @@ TEST(DocumentTest, testUnknownEntries) DocumentTypeRepo repo(type2); - Document doc1(type1, DocumentId("id:ns:test::1")); + Document doc1(repo, type1, DocumentId("id:ns:test::1")); doc1.setValue(field1, IntFieldValue(1)); doc1.setValue(field2, IntFieldValue(2)); doc1.setValue(field3, IntFieldValue(3)); diff --git a/document/src/tests/documenttypetestcase.cpp b/document/src/tests/documenttypetestcase.cpp index 95ee3f4deed..df6d8aa900f 100644 --- a/document/src/tests/documenttypetestcase.cpp +++ b/document/src/tests/documenttypetestcase.cpp @@ -108,7 +108,7 @@ TEST(DocumentTypeTest, testMultipleInheritance) EXPECT_TRUE(docType3->hasField("tmp")); EXPECT_TRUE(docType3->hasField("tall")); - Document doc(*docType3, DocumentId("id:ns:test3::1")); + Document doc(repo, *docType3, DocumentId("id:ns:test3::1")); IntFieldValue intVal(3); doc.setValue(doc.getField("nalle"), intVal); diff --git a/document/src/tests/documentupdatetestcase.cpp b/document/src/tests/documentupdatetestcase.cpp index 7a5d88d1013..3fbccaa155f 100644 --- a/document/src/tests/documentupdatetestcase.cpp +++ b/document/src/tests/documentupdatetestcase.cpp @@ -141,7 +141,7 @@ TEST(DocumentUpdateTest, testSimpleUsage) auto docUpdateCopy(DocumentUpdate::createHEAD(repo, docBuf)); // Create a test document - Document doc(*docType, DocumentId("id:ns:test::1")); + Document doc(repo, *docType, DocumentId("id:ns:test::1")); doc.setValue("bytef", ByteFieldValue::make(0)); doc.setValue("intf", IntFieldValue::make(5)); ArrayFieldValue array(*arrayType); @@ -417,7 +417,7 @@ WeightedSetAutoCreateFixture::~WeightedSetAutoCreateFixture() = default; WeightedSetAutoCreateFixture::WeightedSetAutoCreateFixture() : repo(makeConfig()), docType(repo.getDocumentType("test")), - doc(*docType, DocumentId("id:ns:test::1")), + doc(repo, *docType, DocumentId("id:ns:test::1")), field(docType->getField("strwset")), update(repo, *docType, DocumentId("id:ns:test::1")) { @@ -1355,7 +1355,7 @@ struct UpdateToEmptyDocumentFixture { Document::UP make_empty_doc() { vespalib::nbostream stream; { - Document doc(doc_type, DocumentId("id:test:test::0")); + Document doc(*repo, doc_type, DocumentId("id:test:test::0")); VespaDocumentSerializer serializer(stream); serializer.write(doc); } diff --git a/document/src/tests/fieldpathupdatetestcase.cpp b/document/src/tests/fieldpathupdatetestcase.cpp index a32face5e55..e9f984c9586 100644 --- a/document/src/tests/fieldpathupdatetestcase.cpp +++ b/document/src/tests/fieldpathupdatetestcase.cpp @@ -133,8 +133,7 @@ FieldPathUpdateTestCase::TearDown() TEST_F(FieldPathUpdateTestCase, testRemoveField) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::things:thangs")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::things:thangs")); EXPECT_TRUE(doc->hasValue("strfoo") == false); doc->setValue("strfoo", StringFieldValue("cocacola")); EXPECT_EQ(vespalib::string("cocacola"), doc->getValue("strfoo")->getAsString()); @@ -146,8 +145,7 @@ TEST_F(FieldPathUpdateTestCase, testRemoveField) TEST_F(FieldPathUpdateTestCase, testApplyRemoveMultiList) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::things:thangs")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::things:thangs")); EXPECT_TRUE(doc->hasValue("strarray") == false); { ArrayFieldValue strArray(doc->getType().getField("strarray").getDataType()); @@ -171,8 +169,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyRemoveMultiList) TEST_F(FieldPathUpdateTestCase, testApplyRemoveMultiList2) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::things:thangs")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::things:thangs")); EXPECT_TRUE(doc->hasValue("strarray") == false); { ArrayFieldValue strArray(doc->getType().getField("strarray").getDataType()); @@ -195,8 +192,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyRemoveMultiList2) TEST_F(FieldPathUpdateTestCase, testApplyRemoveEntireListField) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::things:thangs")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::things:thangs")); EXPECT_TRUE(doc->hasValue("strarray") == false); { ArrayFieldValue strArray(doc->getType().getField("strarray").getDataType()); @@ -214,8 +210,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyRemoveEntireListField) TEST_F(FieldPathUpdateTestCase, testApplyRemoveMultiWset) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::helan:halvan")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::helan:halvan")); EXPECT_TRUE(doc->hasValue("strwset") == false); { WeightedSetFieldValue strWset(doc->getType().getField("strwset").getDataType()); @@ -237,8 +232,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyRemoveMultiWset) TEST_F(FieldPathUpdateTestCase, testApplyAssignSingle) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::drekka:karsk")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::drekka:karsk")); EXPECT_TRUE(doc->hasValue("strfoo") == false); // Test assignment of non-existing DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -255,8 +249,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignSingle) TEST_F(FieldPathUpdateTestCase, testApplyAssignMath) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); doc->setValue("num", IntFieldValue(34)); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -267,8 +260,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMath) TEST_F(FieldPathUpdateTestCase, testApplyAssignMathByteToZero) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); doc->setValue("byteval", ByteFieldValue(3)); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -280,8 +272,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMathByteToZero) TEST_F(FieldPathUpdateTestCase, testApplyAssignMathNotModifiedOnUnderflow) { int low_value = -126; - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); doc->setValue("byteval", ByteFieldValue(low_value)); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -293,8 +284,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMathNotModifiedOnUnderflow) TEST_F(FieldPathUpdateTestCase, testApplyAssignMathNotModifiedOnOverflow) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); doc->setValue("byteval", ByteFieldValue(127)); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -306,8 +296,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMathNotModifiedOnOverflow) TEST_F(FieldPathUpdateTestCase, testApplyAssignMathDivZero) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); EXPECT_TRUE(doc->hasValue("num") == false); doc->setValue("num", IntFieldValue(10)); @@ -319,8 +308,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMathDivZero) TEST_F(FieldPathUpdateTestCase, testApplyAssignFieldNotExistingInExpression) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); EXPECT_TRUE(doc->hasValue("num") == false); doc->setValue("num", IntFieldValue(10)); @@ -332,8 +320,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignFieldNotExistingInExpression) TEST_F(FieldPathUpdateTestCase, testApplyAssignFieldNotExistingInPath) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); try { @@ -346,8 +333,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignFieldNotExistingInPath) TEST_F(FieldPathUpdateTestCase, testApplyAssignTargetNotExisting) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); EXPECT_TRUE(doc->hasValue("num") == false); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -358,8 +344,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignTargetNotExisting) TEST_F(FieldPathUpdateTestCase, testAssignSimpleMapValueWithVariable) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bug:hunter")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bug:hunter")); MapFieldValue mfv(doc->getType().getField("strmap").getDataType()); mfv.put(StringFieldValue("foo"), StringFieldValue("bar")); @@ -385,8 +370,7 @@ TEST_F(FieldPathUpdateTestCase, testAssignSimpleMapValueWithVariable) TEST_F(FieldPathUpdateTestCase, testApplyAssignMathRemoveIfZero) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); EXPECT_TRUE(doc->hasValue("num") == false); doc->setValue("num", IntFieldValue(34)); EXPECT_TRUE(doc->hasValue("num") == true); @@ -402,8 +386,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMathRemoveIfZero) TEST_F(FieldPathUpdateTestCase, testApplyAssignMultiList) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::fest:skinnvest")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::fest:skinnvest")); EXPECT_TRUE(doc->hasValue("strarray") == false); { @@ -432,8 +415,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMultiList) TEST_F(FieldPathUpdateTestCase, testApplyAssignMultiWset) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::fest:skinnvest")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::fest:skinnvest")); EXPECT_TRUE(doc->hasValue("strarray") == false); { @@ -463,8 +445,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAssignMultiWset) TEST_F(FieldPathUpdateTestCase, testAssignWsetRemoveIfZero) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::tronder:bataljon")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::tronder:bataljon")); EXPECT_TRUE(doc->hasValue("strarray") == false); { @@ -493,8 +474,7 @@ TEST_F(FieldPathUpdateTestCase, testAssignWsetRemoveIfZero) TEST_F(FieldPathUpdateTestCase, testApplyAddMultiList) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::george:costanza")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::george:costanza")); EXPECT_TRUE(doc->hasValue("strarray") == false); auto adds = std::make_unique(doc->getType().getField("strarray").getDataType()); @@ -512,8 +492,7 @@ TEST_F(FieldPathUpdateTestCase, testApplyAddMultiList) TEST_F(FieldPathUpdateTestCase, testAddAndAssignList) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::fancy:pants")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::fancy:pants")); EXPECT_TRUE(doc->hasValue("strarray") == false); { @@ -580,14 +559,12 @@ struct Fixture { Fixture::~Fixture() = default; Fixture::Fixture(const DocumentTypeRepo &repo, const DocumentType &doc_type, const Keys &k) : _doc_type(&doc_type), - doc(new Document(doc_type, DocumentId("id:ns:" + doc_type.getName() + "::planet:express"))), + doc(new Document(repo, doc_type, DocumentId("id:ns:" + doc_type.getName() + "::planet:express"))), mfv(getMapType(doc_type)), fv1(getMapType(doc_type).getValueType()), fv2(getMapType(doc_type).getValueType()), fv3(getMapType(doc_type).getValueType()) { - doc->setRepo(repo); - fv1.setValue("title", StringFieldValue("fry")); fv1.setValue("rating", IntFieldValue(30)); mfv.put(StringFieldValue(k.key1), fv1); @@ -646,7 +623,6 @@ TEST_F(FieldPathUpdateTestCase, testAssignMapStructVariable) DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); docUp.addFieldPathUpdate(std::make_unique(*f.doc->getDataType(), "structmap{$x}.rating", "foobar.structmap{$x}.title == \"farnsworth\"", IntFieldValue::make(48))); - f.doc->setRepo(*_repo); docUp.applyTo(*f.doc); std::unique_ptr valueNow = f.doc->getAs(f.doc->getField("structmap")); @@ -665,8 +641,7 @@ createFry(const DataType & type) { } TEST_F(FieldPathUpdateTestCase, testAssignMapNoExist) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::planet:express")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::planet:express")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -683,8 +658,7 @@ TEST_F(FieldPathUpdateTestCase, testAssignMapNoExist) TEST_F(FieldPathUpdateTestCase, testAssignMapNoExistNoCreate) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::planet:express")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::planet:express")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -730,8 +704,7 @@ createTastyCake(const DataType &type) { } TEST_F(FieldPathUpdateTestCase, testEqualityComparison) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::foo:zoo")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::foo:zoo")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); { @@ -772,8 +745,7 @@ TEST_F(FieldPathUpdateTestCase, testEqualityComparison) TEST_F(FieldPathUpdateTestCase, testAffectsDocumentBody) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::things:stuff")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::things:stuff")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); auto fv4 = std::make_unique(dynamic_cast(*mfv.getDataType()).getValueType()); @@ -801,8 +773,7 @@ TEST_F(FieldPathUpdateTestCase, testAffectsDocumentBody) TEST_F(FieldPathUpdateTestCase, testIncompatibleDataTypeFails) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::things:stuff")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::things:stuff")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -817,8 +788,7 @@ TEST_F(FieldPathUpdateTestCase, testIncompatibleDataTypeFails) TEST_F(FieldPathUpdateTestCase, testSerializeAssign) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::weloveto:serializestuff")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::weloveto:serializestuff")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); auto val = std::make_unique(dynamic_cast(*mfv.getDataType()).getValueType()); @@ -836,8 +806,7 @@ TEST_F(FieldPathUpdateTestCase, testSerializeAssign) TEST_F(FieldPathUpdateTestCase, testSerializeAdd) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::george:costanza")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::george:costanza")); EXPECT_TRUE(doc->hasValue("strarray") == false); auto adds = std::make_unique(doc->getType().getField("strarray").getDataType()); @@ -854,8 +823,7 @@ TEST_F(FieldPathUpdateTestCase, testSerializeAdd) TEST_F(FieldPathUpdateTestCase, testSerializeRemove) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::weloveto:serializestuff")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::weloveto:serializestuff")); MapFieldValue mfv(doc->getType().getField("structmap").getDataType()); DocumentUpdate docUp(*_repo, *_foobar_type, DocumentId("id:ns:foobar::barbar:foofoo")); @@ -867,8 +835,7 @@ TEST_F(FieldPathUpdateTestCase, testSerializeRemove) TEST_F(FieldPathUpdateTestCase, testSerializeAssignMath) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id:ns:foobar::bat:man")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id:ns:foobar::bat:man")); EXPECT_TRUE(doc->hasValue("num") == false); doc->setValue("num", IntFieldValue(34)); @@ -940,8 +907,7 @@ TEST_F(FieldPathUpdateTestCase, testGenerateSerializedFile) TEST_F(FieldPathUpdateTestCase, array_element_update_for_invalid_index_is_ignored) { - auto doc = std::make_unique(*_foobar_type, DocumentId("id::foobar::1")); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, DocumentId("id::foobar::1")); auto& field = doc->getType().getField("strarray"); ArrayFieldValue str_array(field.getDataType()); @@ -959,8 +925,7 @@ TEST_F(FieldPathUpdateTestCase, array_element_update_for_invalid_index_is_ignore TEST_F(FieldPathUpdateTestCase, update_can_have_removes_for_both_existent_and_nonexistent_keys) { DocumentId doc_id("id:ns:foobar::george:costanza"); - auto doc = std::make_unique(*_foobar_type, doc_id); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_foobar_type, doc_id); auto& map_type = dynamic_cast(doc->getType().getField("structmap").getDataType()); auto& struct_type = map_type.getValueType(); MapFieldValue mfv(map_type); diff --git a/document/src/tests/fieldsettest.cpp b/document/src/tests/fieldsettest.cpp index 4ce8e53ae3c..1664ad8e0ff 100644 --- a/document/src/tests/fieldsettest.cpp +++ b/document/src/tests/fieldsettest.cpp @@ -144,7 +144,7 @@ FieldSetTest::doCopyFields(const Document& src, const std::string& fieldSetStr, Document* dest) { - Document destDoc(src.getType(), DocumentId("id:ns:" + src.getType().getName() + "::fieldset")); + Document destDoc(docRepo, src.getType(), DocumentId("id:ns:" + src.getType().getName() + "::fieldset")); if (!dest) { dest = &destDoc; } @@ -196,7 +196,7 @@ TEST_F(FieldSetTest, testCopyDocumentFields) doCopyFields(*src, repo, "testdoctype1:hstringval,content")); // Test that we overwrite already set fields in destination document { - Document dest(src->getType(), DocumentId("id:ns:" + src->getType().getName() + "::bar")); + Document dest(repo, src->getType(), DocumentId("id:ns:" + src->getType().getName() + "::bar")); dest.setValue(dest.getField("content"), StringFieldValue("overwriteme")); EXPECT_EQ(std::string("content: megafoo megabar\n"), doCopyFields(*src, repo, src->getType().getName() + ":content", &dest)); @@ -209,7 +209,7 @@ FieldSetTest::doCopyDocument(const Document& src, const std::string& fieldSetStr) { auto fset = FieldSetRepo::parse(docRepo, fieldSetStr); - Document::UP doc(FieldSet::createDocumentSubsetCopy(src, *fset)); + Document::UP doc(FieldSet::createDocumentSubsetCopy(docRepo, src, *fset)); return stringifyFields(*doc); } @@ -221,7 +221,7 @@ TEST_F(FieldSetTest, testDocumentSubsetCopy) Document::UP src(createTestDocument(testDocMan)); { - Document::UP doc(FieldSet::createDocumentSubsetCopy(*src, AllFields())); + Document::UP doc(FieldSet::createDocumentSubsetCopy(repo, *src, AllFields())); // Test that document id and type are copied correctly. EXPECT_TRUE(doc.get()); EXPECT_EQ(src->getId(), doc->getId()); @@ -230,7 +230,7 @@ TEST_F(FieldSetTest, testDocumentSubsetCopy) stringifyFields(*doc)); } { - Document::UP doc(FieldSet::createDocumentSubsetCopy(*src, DocumentOnly())); + Document::UP doc(FieldSet::createDocumentSubsetCopy(repo, *src, DocumentOnly())); // Test that document id and type are copied correctly. EXPECT_TRUE(doc.get()); EXPECT_EQ(src->getId(), doc->getId()); diff --git a/document/src/tests/fieldvalue/document_test.cpp b/document/src/tests/fieldvalue/document_test.cpp index fd277bc2eb4..3efaabb1c2e 100644 --- a/document/src/tests/fieldvalue/document_test.cpp +++ b/document/src/tests/fieldvalue/document_test.cpp @@ -16,9 +16,9 @@ TEST("require that document with id schema 'id' checks type") { const DataType *type = repo.getDocumentType("testdoctype1"); ASSERT_TRUE(type); - Document(*type, DocumentId("id:ns:testdoctype1::")); // Should not throw + Document(repo.getTypeRepo(), *type, DocumentId("id:ns:testdoctype1::")); // Should not throw - EXPECT_EXCEPTION(Document(*type, DocumentId("id:ns:type::")), + EXPECT_EXCEPTION(Document(repo.getTypeRepo(), *type, DocumentId("id:ns:type::")), vespalib::IllegalArgumentException, "testdoctype1 that don't match the id (type type)"); } diff --git a/document/src/tests/select/select_test.cpp b/document/src/tests/select/select_test.cpp index 03bd17d47b5..30128fbea0a 100644 --- a/document/src/tests/select/select_test.cpp +++ b/document/src/tests/select/select_test.cpp @@ -85,7 +85,7 @@ DocumentSelectTest::check_select(const Document& doc, const vespalib::string& ex TEST_F(DocumentSelectTest, check_existing_reference_field) { - auto document = std::make_unique(*_child_document_type, DocumentId("id::child::0")); + auto document = std::make_unique(*_repo, *_child_document_type, DocumentId("id::child::0")); document->setFieldValue(_child_ref_field, std::make_unique(_child_ref_field_type, DocumentId("id::parent::1"))); EXPECT_TRUE(document->hasValue(_child_ref_field)); check_select(*document, "child.ref == null", Result::False); @@ -102,7 +102,7 @@ TEST_F(DocumentSelectTest, check_existing_reference_field) TEST_F(DocumentSelectTest, check_missing_reference_field) { - auto document = std::make_unique(*_child_document_type, DocumentId("id::child::0")); + auto document = std::make_unique(*_repo, *_child_document_type, DocumentId("id::child::0")); EXPECT_FALSE(document->hasValue(_child_ref_field)); check_select(*document, "child.ref == null", Result::True); check_select(*document, "child.ref != null", Result::False); diff --git a/document/src/tests/serialization/vespadocumentserializer_test.cpp b/document/src/tests/serialization/vespadocumentserializer_test.cpp index 7528878bfb5..e91e38e0fe4 100644 --- a/document/src/tests/serialization/vespadocumentserializer_test.cpp +++ b/document/src/tests/serialization/vespadocumentserializer_test.cpp @@ -515,7 +515,7 @@ TEST("requireThatDocumentCanBeSerialized") { const DocumentType &type = repo.getDocumentType(); DocumentId doc_id("id:ns:" + type.getName() + "::"); - Document value(type, doc_id); + Document value(repo.getDocumentTypeRepo(), type, doc_id); value.setValue(type.getField("header field"), IntFieldValue(42)); value.setValue(type.getField("body field"), StringFieldValue("foobar")); @@ -580,7 +580,7 @@ TEST("requireThatUnmodifiedDocumentRetainsUnknownFieldOnSerialization") { DocumentTypeRepo repo2Fields(builder2.config()); DocumentId doc_id("id:ns:my_doctype::"); - Document value(*repo2Fields.getDocumentType(doc_type_id), doc_id); + Document value(repo2Fields, *repo2Fields.getDocumentType(doc_type_id), doc_id); value.setValue("field1", IntFieldValue(42)); value.setValue("field2", StringFieldValue("megafoo")); @@ -632,12 +632,12 @@ TEST("requireThatDocumentWithDocumentCanBeSerialized") { setSpanTree(str, *tree); const Field str_field("str", *DataType::STRING); - Document inner(*inner_type, DocumentId("id:ns:" + inner_type->getName() + "::")); + Document inner(my_repo, *inner_type, DocumentId("id:ns:" + inner_type->getName() + "::")); inner.setValue(str_field, str); const DocumentType *type = my_repo.getDocumentType(outer_type_id); ASSERT_TRUE(type); DocumentId doc_id("id:ns:" + type->getName() + "::"); - Document value(*type, doc_id); + Document value(my_repo, *type, doc_id); const Field doc_field(inner_name, *inner_type); value.setValue(doc_field, inner); @@ -659,9 +659,10 @@ TEST("requireThatReadDocumentTypeThrowsIfUnknownType") { template void serializeToFile(FieldValueT &value, const string &file_name, + const DocumentTypeRepo& my_repo, const DocumentType *type, const string &field_name) { DocumentId doc_id("id:test:" + type->getName() + "::foo"); - Document doc(*type, doc_id); + Document doc(my_repo, *type, doc_id); doc.setValue(type->getField(field_name), value); nbostream stream; @@ -675,7 +676,7 @@ void serializeToFile(FieldValueT &value, const string &file_name, void serializeToFile(PredicateFieldValue &value, const string &file_name) { const DocumentType *type = doc_repo.getDocumentType(predicate_doc_type_id); - serializeToFile(value, file_name, type, predicate_field_name); + serializeToFile(value, file_name, doc_repo, type, predicate_field_name); } template @@ -819,7 +820,7 @@ const DocumentTypeRepo tensor_doc_repo1(getTensorDocTypesConfig("tensor(dimX{})" void serializeToFile(TensorFieldValue &value, const string &file_name) { const DocumentType *type = tensor_doc_repo.getDocumentType(tensor_doc_type_id); - serializeToFile(value, file_name, type, tensor_field_name); + serializeToFile(value, file_name, tensor_doc_repo, type, tensor_field_name); } void deserializeAndCheck(const string &file_name, TensorFieldValue &value) { @@ -870,7 +871,7 @@ TensorDocFixture::TensorDocFixture(const DocumentTypeRepo &docTypeRepo, : _docTypeRepo(docTypeRepo), _docType(_docTypeRepo.getDocumentType(tensor_doc_type_id)), _tensor(std::move(tensor)), - _doc(*_docType, DocumentId("id:test:my_type::foo")), + _doc(_docTypeRepo, *_docType, DocumentId("id:test:my_type::foo")), _blob() { auto fv = _doc.getField(tensor_field_name).createValue(); @@ -963,7 +964,7 @@ struct RefFixture { const string data_dir = TEST_PATH("../../test/resources/reference/"); const string field_name = "ref_field"; serializeToFile(value, data_dir + file_base_name + "__cpp.new", - ref_doc_type, field_name); + fixed_repo.getDocumentTypeRepo(), ref_doc_type, field_name); vespalib::rename(data_dir + file_base_name + "__cpp.new", data_dir + file_base_name + "__cpp"); @@ -999,7 +1000,7 @@ TEST_F("ReferenceFieldValue with ID serialization matches Java", RefFixture) { struct AssociatedDocumentRepoFixture { const DocumentType& doc_type{repo.getDocumentType()}; DocumentId doc_id{"id:ns:" + doc_type.getName() + "::"}; - Document source_doc{doc_type, doc_id}; + Document source_doc{doc_repo, doc_type, doc_id}; std::unique_ptr roundtrip_serialize_source_document() { nbostream stream; diff --git a/document/src/tests/testxml.cpp b/document/src/tests/testxml.cpp index 5f194661fe5..13024ddb005 100644 --- a/document/src/tests/testxml.cpp +++ b/document/src/tests/testxml.cpp @@ -22,8 +22,7 @@ namespace { Document::UP createTestDocument(const DocumentTypeRepo& repo) { const DocumentType* type(repo.getDocumentType("testdoc")); - auto doc = std::make_unique(*type,DocumentId("id:ns:testdoc::crawler/http://www.ntnu.no/")); - doc->setRepo(repo); + auto doc = std::make_unique(repo, *type, DocumentId("id:ns:testdoc::crawler/http://www.ntnu.no/")); std::string s("humlepungens buffer"); ByteBuffer bb(s.c_str(), s.size()); @@ -45,7 +44,7 @@ Document::UP createTestDocument(const DocumentTypeRepo& repo) val.add(rawVal3); doc->setValue(doc->getField("rawarrayattr"), val); - auto doc2 = std::make_unique(*type, DocumentId("id:ns:testdoc::crawler/http://www.ntnu.no/2")); + auto doc2 = std::make_unique(repo, *type, DocumentId("id:ns:testdoc::crawler/http://www.ntnu.no/2")); doc2->setValue(doc2->getField("stringattr"), StringFieldValue("tjo hei paa du")); doc->setValue(doc->getField("docfield"), *doc2); diff --git a/document/src/vespa/document/base/forcelink.cpp b/document/src/vespa/document/base/forcelink.cpp index cfa3354f5f2..975fca5aa2c 100644 --- a/document/src/vespa/document/base/forcelink.cpp +++ b/document/src/vespa/document/base/forcelink.cpp @@ -1,9 +1,10 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "forcelink.h" -#include -#include #include +#include +#include +#include namespace document { @@ -12,7 +13,8 @@ ForceLink::ForceLink(void) { if (time(NULL) == 0) { DocumentType type("foo", 1); - Document document(type, DocumentId("doc:ns:bar")); + DocumentTypeRepo repo(type); + Document document(repo, *repo.getDocumentType("foo"), DocumentId("doc:ns:bar")); DocumentUpdate documentUpdate; MapValueUpdate mapValueUpdate(std::make_unique(3), std::make_unique()); AddValueUpdate addValueUpdate(std::make_unique(3)); diff --git a/document/src/vespa/document/base/testdocman.cpp b/document/src/vespa/document/base/testdocman.cpp index 59e4d4d8386..471a2f8c196 100644 --- a/document/src/vespa/document/base/testdocman.cpp +++ b/document/src/vespa/document/base/testdocman.cpp @@ -79,7 +79,7 @@ TestDocMan::createDocument( { const DocumentType *type_ptr = _repo->getDocumentType(type); assert(type_ptr); - Document::UP doc(new Document(*type_ptr, DocumentId(id))); + Document::UP doc(new Document(*_repo, *type_ptr, DocumentId(id))); doc->setValue(doc->getField("content"), StringFieldValue(content.c_str())); return doc; } diff --git a/document/src/vespa/document/datatype/documenttype.cpp b/document/src/vespa/document/datatype/documenttype.cpp index 0d38ce1f623..80181a7ad35 100644 --- a/document/src/vespa/document/datatype/documenttype.cpp +++ b/document/src/vespa/document/datatype/documenttype.cpp @@ -175,7 +175,7 @@ DocumentType::isA(const DataType& other) const FieldValue::UP DocumentType::createFieldValue() const { - return std::make_unique(*this, DocumentId("id::" + getName() + "::")); + return Document::make_without_repo(*this, DocumentId("id::" + getName() + "::")); } void diff --git a/document/src/vespa/document/fieldset/fieldset.h b/document/src/vespa/document/fieldset/fieldset.h index 1f53f7a3456..5b67701e395 100644 --- a/document/src/vespa/document/fieldset/fieldset.h +++ b/document/src/vespa/document/fieldset/fieldset.h @@ -6,6 +6,7 @@ namespace document { class Document; +class DocumentTypeRepo; /** * FieldSet class. Represents a subset of fields in a document type. @@ -57,7 +58,7 @@ public: * See comment for copyFields() for performance notes. * @return The new, (partially) copied document instance. */ - static std::unique_ptr createDocumentSubsetCopy(const Document& src, const FieldSet& fields); + static std::unique_ptr createDocumentSubsetCopy(const DocumentTypeRepo& type_repo, const Document& src, const FieldSet& fields); /** * Strip all fields _except_ the ones that are contained within the diff --git a/document/src/vespa/document/fieldset/fieldsets.cpp b/document/src/vespa/document/fieldset/fieldsets.cpp index 0ed9ace7467..0ab959d6815 100644 --- a/document/src/vespa/document/fieldset/fieldsets.cpp +++ b/document/src/vespa/document/fieldset/fieldsets.cpp @@ -80,9 +80,9 @@ FieldSet::copyFields(Document& dest, const Document& src, const FieldSet& fields } Document::UP -FieldSet::createDocumentSubsetCopy(const Document& src, const FieldSet& fields) +FieldSet::createDocumentSubsetCopy(const DocumentTypeRepo& type_repo, const Document& src, const FieldSet& fields) { - auto ret = std::make_unique(src.getType(), src.getId()); + auto ret = std::make_unique(type_repo, src.getType(), src.getId()); copyFields(*ret, src, fields); return ret; } diff --git a/document/src/vespa/document/fieldvalue/document.cpp b/document/src/vespa/document/fieldvalue/document.cpp index 33b1bbe8d2c..2fb1611f6ff 100644 --- a/document/src/vespa/document/fieldvalue/document.cpp +++ b/document/src/vespa/document/fieldvalue/document.cpp @@ -95,6 +95,26 @@ Document::Document(const DataType &type, DocumentId documentId) } } +Document::UP +Document::make_without_repo(const DataType& type, DocumentId id) +{ + // Must use new as the constructor is private. + return Document::UP(new Document(type, id)); +} + +Document::Document(const DocumentTypeRepo& repo, const DataType &type, DocumentId documentId) + : StructuredFieldValue(Type::DOCUMENT, verifyDocumentType(&type)), + _id(std::move(documentId)), + _fields(repo, getType().getFieldsType()), + _backingBuffer(), + _lastModified(0) +{ + _fields.setDocumentType(getType()); + if (_id.hasDocType() && (_id.getDocType() != type.getName())) { + throwTypeMismatch(type.getName(), _id.getDocType()); + } +} + void Document::setRepo(const DocumentTypeRepo& repo) { _fields.setRepo(repo); diff --git a/document/src/vespa/document/fieldvalue/document.h b/document/src/vespa/document/fieldvalue/document.h index c871e324f05..ac3963a4cc0 100644 --- a/document/src/vespa/document/fieldvalue/document.h +++ b/document/src/vespa/document/fieldvalue/document.h @@ -50,7 +50,13 @@ public: Document(Document &&) noexcept; Document & operator =(const Document &); Document & operator =(Document &&) noexcept; +private: Document(const DataType &, DocumentId id); +public: + // Should preferably only be used by unit tests. + // TODO: Remove all usage of this outside of unit tests. + static Document::UP make_without_repo(const DataType& type, DocumentId id); + Document(const DocumentTypeRepo& repo, const DataType&, DocumentId id); Document(const DocumentTypeRepo& repo, vespalib::nbostream& stream); Document(const DocumentTypeRepo& repo, vespalib::DataBuffer && buffer); ~Document() noexcept override; diff --git a/document/src/vespa/document/fieldvalue/structfieldvalue.cpp b/document/src/vespa/document/fieldvalue/structfieldvalue.cpp index 444e763c52b..083012a213c 100644 --- a/document/src/vespa/document/fieldvalue/structfieldvalue.cpp +++ b/document/src/vespa/document/fieldvalue/structfieldvalue.cpp @@ -36,6 +36,16 @@ StructFieldValue::StructFieldValue(const DataType &type) { } +StructFieldValue::StructFieldValue(const DocumentTypeRepo& repo, const DataType& type) + : StructuredFieldValue(Type::STRUCT, type), + _fields(), + _repo(&repo), + _doc_type(nullptr), + _version(Document::getNewestSerializationVersion()), + _hasChanged(true) +{ +} + StructFieldValue::StructFieldValue(const StructFieldValue & rhs) = default; StructFieldValue & StructFieldValue::operator = (const StructFieldValue & rhs) = default; diff --git a/document/src/vespa/document/fieldvalue/structfieldvalue.h b/document/src/vespa/document/fieldvalue/structfieldvalue.h index 360aa6dca63..e888847fdfe 100644 --- a/document/src/vespa/document/fieldvalue/structfieldvalue.h +++ b/document/src/vespa/document/fieldvalue/structfieldvalue.h @@ -36,6 +36,7 @@ public: using UP = std::unique_ptr; explicit StructFieldValue(const DataType &type); + explicit StructFieldValue(const DocumentTypeRepo& repo, const DataType& type); StructFieldValue(const StructFieldValue & rhs); StructFieldValue & operator = (const StructFieldValue & rhs); StructFieldValue(StructFieldValue && rhs) noexcept = default; diff --git a/documentapi/src/tests/messages/messages60test.cpp b/documentapi/src/tests/messages/messages60test.cpp index ab300794307..258e8821e0c 100644 --- a/documentapi/src/tests/messages/messages60test.cpp +++ b/documentapi/src/tests/messages/messages60test.cpp @@ -79,9 +79,9 @@ namespace { document::Document::SP createDoc(const DocumentTypeRepo &repo, const string &type_name, const string &id) { - return document::Document::SP(new document::Document( + return std::make_shared(repo, *repo.getDocumentType(type_name), - document::DocumentId(id))); + document::DocumentId(id)); } } // namespace diff --git a/documentapi/src/tests/policies/policies_test.cpp b/documentapi/src/tests/policies/policies_test.cpp index 33823681765..ada3e9154f2 100644 --- a/documentapi/src/tests/policies/policies_test.cpp +++ b/documentapi/src/tests/policies/policies_test.cpp @@ -58,6 +58,9 @@ private: static void assertMirrorReady(const IMirrorAPI &mirror); static void assertMirrorContains(const IMirrorAPI &mirror, const string &pattern, uint32_t numEntries); mbus::Message::UP newPutDocumentMessage(const string &documentId); + std::shared_ptr make_doc(DocumentId docid) { + return std::make_shared(*_repo, *_docType, docid); + } public: Test(); @@ -169,7 +172,7 @@ void Test::testAND() { TestFrame frame(_repo); - frame.setMessage(make_unique(make_shared(*_docType, DocumentId("id:ns:testdoc::")))); + frame.setMessage(make_unique(make_doc(DocumentId("id:ns:testdoc::")))); frame.setHop(mbus::HopSpec("test", "[AND]") .addRecipient("foo") .addRecipient("bar")); @@ -255,7 +258,7 @@ Test::requireThatExternPolicyMergesOneReplyAsProtocol() mbus::Message::UP Test::newPutDocumentMessage(const string &documentId) { - return make_unique(std::make_shared(*_docType, DocumentId(documentId))); + return make_unique(make_doc(DocumentId(documentId))); } void @@ -389,7 +392,7 @@ Test::testLocalService() { // Prepare message. TestFrame frame(_repo, "docproc/cluster.default"); - frame.setMessage(make_unique(make_shared(*_docType, DocumentId("id:ns:testdoc::")))); + frame.setMessage(make_unique(make_doc(DocumentId("id:ns:testdoc::")))); // Test select with proper address. for (uint32_t i = 0; i < 10; ++i) { @@ -470,7 +473,7 @@ Test::testRoundRobin() { // Prepare message. TestFrame frame(_repo, "docproc/cluster.default"); - frame.setMessage(make_unique(make_shared(*_docType, DocumentId("id:ns:testdoc::")))); + frame.setMessage(make_unique(make_doc(DocumentId("id:ns:testdoc::")))); // Test select with proper address. for (uint32_t i = 0; i < 10; ++i) { @@ -562,7 +565,7 @@ Test::multipleGetRepliesAreMergedToFoundDocument() for (uint32_t i = 0, len = selected.size(); i < len; ++i) { Document::SP doc; if (i == 0) { - doc = std::make_shared(*_docType, DocumentId("id:ns:testdoc::yarn")); + doc = make_doc(DocumentId("id:ns:testdoc::yarn")); doc->setLastModified(123456ULL); } auto reply = std::make_unique(std::move(doc)); @@ -611,7 +614,7 @@ Test::testDocumentRouteSelector() frame.setMessage(make_unique(DocumentId("id:ns:testdoc::"))); EXPECT_TRUE(frame.testSelect(StringList().add("foo"))); - mbus::Message::UP put = make_unique(make_shared(*_docType, DocumentId("id:ns:testdoc::"))); + mbus::Message::UP put = make_unique(make_doc(DocumentId("id:ns:testdoc::"))); frame.setMessage(std::move(put)); EXPECT_TRUE(frame.testSelect( StringList().add("foo"))); @@ -622,7 +625,7 @@ Test::testDocumentRouteSelector() make_shared(*_repo, *_docType, DocumentId("id:ns:testdoc::")))); EXPECT_TRUE(frame.testSelect(StringList().add("foo"))); - put = make_unique(make_shared(*_docType, DocumentId("id:ns:testdoc::"))); + put = make_unique(make_doc(DocumentId("id:ns:testdoc::"))); frame.setMessage(std::move(put)); EXPECT_TRUE(frame.testMergeOneReply("foo")); } @@ -639,7 +642,7 @@ Test::testDocumentRouteSelectorIgnore() .addRecipient("docproc/cluster.foo")); frame.setMessage(make_unique( - make_shared(*_docType, DocumentId("id:yarn:testdoc:n=1234:fluff")))); + make_doc(DocumentId("id:yarn:testdoc:n=1234:fluff")))); std::vector leaf; ASSERT_TRUE(frame.select(leaf, 0)); mbus::Reply::UP reply = frame.getReceptor().getReply(TIMEOUT); @@ -912,7 +915,7 @@ Test::testSubsetService() { // Prepare message. TestFrame frame(_repo, "docproc/cluster.default"); - frame.setMessage(make_unique(make_shared(*_docType, DocumentId("id:ns:testdoc::")))); + frame.setMessage(make_unique(make_doc(DocumentId("id:ns:testdoc::")))); // Test requerying for adding nodes. frame.setHop(mbus::HopSpec("test", "docproc/cluster.default/[SubsetService:2]/chain.default")); diff --git a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp index 0c0086861b2..993a8baec09 100644 --- a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp +++ b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp @@ -477,7 +477,7 @@ DummyPersistence::updateAsync(const Bucket& bucket, Timestamp ts, DocumentUpdate onComplete->onComplete(std::make_unique()); return; } else { - docToUpdate = std::make_shared(upd->getType(), upd->getId()); + docToUpdate = std::make_shared(*upd->getRepoPtr(), upd->getType(), upd->getId()); updatedTs = ts; } } @@ -680,7 +680,7 @@ DummyPersistence::iterate(IteratorId id, uint64_t maxByteSize) const { assert(entry->getDocument()); // Create new document with only wanted fields. - Document::UP filtered(FieldSet::createDocumentSubsetCopy(*entry->getDocument(), *it->_fieldSet)); + auto filtered = FieldSet::createDocumentSubsetCopy(*_repo, *entry->getDocument(), *it->_fieldSet); auto ret = DocEntry::create(entry->getTimestamp(), std::move(filtered), entry->getSize()); entries.push_back(std::move(ret)); } else { diff --git a/searchcore/src/tests/proton/attribute/attribute_populator/attribute_populator_test.cpp b/searchcore/src/tests/proton/attribute/attribute_populator/attribute_populator_test.cpp index 19b8348fb7a..b4d3eb13ac7 100644 --- a/searchcore/src/tests/proton/attribute/attribute_populator/attribute_populator_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_populator/attribute_populator_test.cpp @@ -60,7 +60,7 @@ struct DocContext std::shared_ptr create(uint32_t id, int64_t fieldValue) { vespalib::string docId = vespalib::make_string("id:searchdocument:searchdocument::%u", id); - auto doc = std::make_shared(*_repo->getDocumentType("searchdocument"), DocumentId(docId)); + auto doc = std::make_shared(*_repo, *_repo->getDocumentType("searchdocument"), DocumentId(docId)); doc->setValue("a1", IntFieldValue(fieldValue)); return doc; } diff --git a/searchcore/src/tests/proton/attribute/attribute_test.cpp b/searchcore/src/tests/proton/attribute/attribute_test.cpp index 75d9c78d07e..4458cd66ad6 100644 --- a/searchcore/src/tests/proton/attribute/attribute_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_test.cpp @@ -1050,7 +1050,7 @@ public: } std::unique_ptr makeDoc() { - return std::make_unique(_type, DocumentId("id::test::1")); + return Document::make_without_repo(_type, DocumentId("id::test::1")); } }; diff --git a/searchcore/src/tests/proton/attribute/document_field_extractor/document_field_extractor_test.cpp b/searchcore/src/tests/proton/attribute/document_field_extractor/document_field_extractor_test.cpp index 903b4d89696..42dad54394f 100644 --- a/searchcore/src/tests/proton/attribute/document_field_extractor/document_field_extractor_test.cpp +++ b/searchcore/src/tests/proton/attribute/document_field_extractor/document_field_extractor_test.cpp @@ -109,7 +109,7 @@ struct FixtureBase Document * makeDoc() { - doc = std::make_unique(type, DocumentId("id::test::1")); + doc = Document::make_without_repo(type, DocumentId("id::test::1")); extractor = std::make_unique(*doc); return doc.get(); } diff --git a/searchcore/src/tests/proton/common/cachedselect_test.cpp b/searchcore/src/tests/proton/common/cachedselect_test.cpp index 6565ec601e6..93a7e46285e 100644 --- a/searchcore/src/tests/proton/common/cachedselect_test.cpp +++ b/searchcore/src/tests/proton/common/cachedselect_test.cpp @@ -123,7 +123,7 @@ makeDoc(const DocumentTypeRepo &repo, int32_t ab) { const DocumentType *docType = repo.getDocumentType("test"); - Document::UP doc(new Document(*docType, DocumentId(docId))); + auto doc = std::make_unique(repo, *docType, DocumentId(docId)); if (ia != "null") doc->setValue("ia", StringFieldValue(ia)); if (ib != "null") @@ -348,7 +348,7 @@ TestFixture::testParse(const string &selection, const DocumentType *docType = repo.getDocumentType(docTypeName); ASSERT_TRUE(docType != nullptr); - Document::UP emptyDoc(new Document(*docType, DocumentId())); + auto emptyDoc = std::make_unique(repo, *docType, DocumentId()); res->set(selection, docTypeName, diff --git a/searchcore/src/tests/proton/common/selectpruner_test.cpp b/searchcore/src/tests/proton/common/selectpruner_test.cpp index 4bc7ef53d94..80d6314c392 100644 --- a/searchcore/src/tests/proton/common/selectpruner_test.cpp +++ b/searchcore/src/tests/proton/common/selectpruner_test.cpp @@ -222,8 +222,7 @@ TestFixture::testPrune(const string &selection, const string &exp, const string LOG(info, "ParseTree: '%s'", os.str().c_str()); const DocumentType *docType = repo.getDocumentType(docTypeName); ASSERT_TRUE(docType != nullptr); - auto emptyDoc = std::make_unique(*docType, document::DocumentId("id:ns:" + docTypeName + "::1")); - emptyDoc->setRepo(repo); + auto emptyDoc = std::make_unique(repo, *docType, document::DocumentId("id:ns:" + docTypeName + "::1")); SelectPruner pruner(docTypeName, &_amgr, *emptyDoc, repo, _hasFields, _hasDocuments); pruner.process(*select); std::ostringstream pos; diff --git a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp index f89af9a11a6..ff55d3cca7c 100644 --- a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp +++ b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp @@ -156,8 +156,12 @@ struct UnitDR : DocumentRetrieverBaseForTest { static void reset() { _docidCnt = 2; } }; +Document::UP make_doc(DocumentId docid) { + return Document::make_without_repo(*DataType::DOCUMENT, docid); +} + UnitDR::UnitDR() - : repo(), document(std::make_unique(*DataType::DOCUMENT, DocumentId())), timestamp(0), + : repo(), document(make_doc(DocumentId())), timestamp(0), bucket(), removed(false), docid(0), docIdLimit(std::numeric_limits::max()) {} UnitDR::UnitDR(document::Document::UP d, Timestamp t, Bucket b, bool r) @@ -242,7 +246,7 @@ struct AttrUnitDR : public UnitDR CachedSelect::SP parseSelect(const vespalib::string &selection) const override { auto res = std::make_shared(); - res->set(selection, "foo", Document(document->getType(), DocumentId()), repo, &_amgr, true); + res->set(selection, "foo", Document(repo, document->getType(), DocumentId()), repo, &_amgr, true); return res; } }; @@ -291,7 +295,7 @@ IDocumentRetriever::SP nil() { return std::make_unique(); } IDocumentRetriever::SP doc(const DocumentId &id, Timestamp t, Bucket b) { - return std::make_shared(std::make_unique(*DataType::DOCUMENT, id), t, b, false); + return std::make_shared(make_doc(id), t, b, false); } IDocumentRetriever::SP @@ -301,7 +305,7 @@ doc(const std::string &id, Timestamp t, Bucket b) { IDocumentRetriever::SP rem(const DocumentId &id, Timestamp t, Bucket b) { - return std::make_shared(std::make_unique(*DataType::DOCUMENT, id), t, b, true); + return std::make_shared(make_doc(id), t, b, true); } IDocumentRetriever::SP @@ -338,14 +342,14 @@ const DocumentType &getAttrDocType() { } IDocumentRetriever::SP doc_with_fields(const std::string &id, Timestamp t, Bucket b) { - auto d = std::make_unique(getDocType(), DocumentId(id)); + auto d = Document::make_without_repo(getDocType(), DocumentId(id)); d->setValue("header", StringFieldValue::make("foo")); d->setValue("body", StringFieldValue::make("bar")); return std::make_shared(getDocType(), std::move(d), t, b, false); } IDocumentRetriever::SP doc_with_null_fields(const std::string &id, Timestamp t, Bucket b) { - return std::make_unique(std::make_unique(getAttrDocType(), DocumentId(id)), t, b, false); + return std::make_unique(Document::make_without_repo(getAttrDocType(), DocumentId(id)), t, b, false); } IDocumentRetriever::SP doc_with_attr_fields(const vespalib::string &id, @@ -355,7 +359,7 @@ IDocumentRetriever::SP doc_with_attr_fields(const vespalib::string &id, const vespalib::string &ss, const vespalib::string &attr_ss) { - auto d = std::make_unique(getAttrDocType(), DocumentId(id)); + auto d = Document::make_without_repo(getAttrDocType(), DocumentId(id)); d->setValue("header", StringFieldValue::make("foo")); d->setValue("body", StringFieldValue::make("bar")); d->setValue("aa", IntFieldValue::make(aa)); @@ -367,7 +371,7 @@ IDocumentRetriever::SP doc_with_attr_fields(const vespalib::string &id, auto doc_rec(VisitRecordingUnitDR::VisitedLIDs& visited_lids, const std::string &id, Timestamp t, Bucket b) { - return std::make_shared(visited_lids, std::make_unique(getAttrDocType(), DocumentId(id)), t, b, false); + return std::make_shared(visited_lids, Document::make_without_repo(getAttrDocType(), DocumentId(id)), t, b, false); } void checkDoc(const IDocumentRetriever &dr, const std::string &id, @@ -462,9 +466,9 @@ TEST("require that normal documents can be iterated") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(3u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::1")), Timestamp(2))); - TEST_DO(checkEntry(res, 1, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::2")), Timestamp(3))); - TEST_DO(checkEntry(res, 2, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::3")), Timestamp(4))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::1")), Timestamp(2))); + TEST_DO(checkEntry(res, 1, *make_doc(DocumentId("id:ns:document::2")), Timestamp(3))); + TEST_DO(checkEntry(res, 2, *make_doc(DocumentId("id:ns:document::3")), Timestamp(4))); } void verifyIterateIgnoringStopSignal(DocumentIterator & itr) { @@ -495,7 +499,7 @@ void verifyReadConsistency(DocumentIterator & itr, ILidCommitState & lidCommitSt IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(1u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::1")), Timestamp(2))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::1")), Timestamp(2))); } class ILidCommitStateProxy : public ILidCommitState { @@ -552,7 +556,7 @@ TEST("require that docid limit is honoured") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(1u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::1")), Timestamp(2))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::1")), Timestamp(2))); udr.setDocIdLimit(7); DocumentIterator limited(bucket(5), std::make_shared(), selectAll(), newestV(), -1, false); @@ -583,7 +587,7 @@ TEST("require that remove entries can be ignored") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(1u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::2")), Timestamp(3))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::2")), Timestamp(3))); } TEST("require that iterating all versions returns both documents and removes") { @@ -595,7 +599,7 @@ TEST("require that iterating all versions returns both documents and removes") { EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(3u, res.getEntries().size()); TEST_DO(checkEntry(res, 0, DocumentId("id:ns:document::1"), Timestamp(2))); - TEST_DO(checkEntry(res, 1, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::2")), Timestamp(3))); + TEST_DO(checkEntry(res, 1, *make_doc(DocumentId("id:ns:document::2")), Timestamp(3))); TEST_DO(checkEntry(res, 2, DocumentId("id:ns:document::3"), Timestamp(4))); } @@ -620,7 +624,7 @@ TEST("require that entries in other buckets are skipped") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(1u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::2")), Timestamp(3))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::2")), Timestamp(3))); } TEST("require that maxBytes splits iteration results") { @@ -628,16 +632,16 @@ TEST("require that maxBytes splits iteration results") { itr.add(doc("id:ns:document::1", Timestamp(2), bucket(5))); itr.add(cat(rem("id:ns:document::2", Timestamp(3), bucket(5)), doc("id:ns:document::3", Timestamp(4), bucket(5)))); - IterateResult res1 = itr.iterate(getSize(Document(*DataType::DOCUMENT, DocumentId("id:ns:document::1"))) + + IterateResult res1 = itr.iterate(getSize(*make_doc(DocumentId("id:ns:document::1"))) + getSize(DocumentId("id:ns:document::2"))); EXPECT_TRUE(!res1.isCompleted()); EXPECT_EQUAL(2u, res1.getEntries().size()); - TEST_DO(checkEntry(res1, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::1")), Timestamp(2))); + TEST_DO(checkEntry(res1, 0, *make_doc(DocumentId("id:ns:document::1")), Timestamp(2))); TEST_DO(checkEntry(res1, 1, DocumentId("id:ns:document::2"), Timestamp(3))); IterateResult res2 = itr.iterate(largeNum); EXPECT_TRUE(res2.isCompleted()); - TEST_DO(checkEntry(res2, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::3")), Timestamp(4))); + TEST_DO(checkEntry(res2, 0, *make_doc(DocumentId("id:ns:document::3")), Timestamp(4))); IterateResult res3 = itr.iterate(largeNum); EXPECT_TRUE(res3.isCompleted()); @@ -671,7 +675,7 @@ TEST("require that at least one document is returned by visit") { doc("id:ns:document::3", Timestamp(4), bucket(5)))); IterateResult res1 = itr.iterate(0); EXPECT_TRUE( ! res1.getEntries().empty()); - TEST_DO(checkEntry(res1, 0, Document(*DataType::DOCUMENT,DocumentId("id:ns:document::1")), Timestamp(2))); + TEST_DO(checkEntry(res1, 0, *make_doc(DocumentId("id:ns:document::1")), Timestamp(2))); } TEST("require that documents outside the timestamp limits are ignored") { @@ -687,8 +691,8 @@ TEST("require that documents outside the timestamp limits are ignored") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(4u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::2")), Timestamp(100))); - TEST_DO(checkEntry(res, 1, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::3")), Timestamp(200))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::2")), Timestamp(100))); + TEST_DO(checkEntry(res, 1, *make_doc(DocumentId("id:ns:document::3")), Timestamp(200))); TEST_DO(checkEntry(res, 2, DocumentId("id:ns:document::6"), Timestamp(100))); TEST_DO(checkEntry(res, 3, DocumentId("id:ns:document::7"), Timestamp(200))); } @@ -706,8 +710,8 @@ TEST("require that timestamp subset returns the appropriate documents") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(3u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::2")), Timestamp(400))); - TEST_DO(checkEntry(res, 1, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::4")), Timestamp(200))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::2")), Timestamp(400))); + TEST_DO(checkEntry(res, 1, *make_doc(DocumentId("id:ns:document::4")), Timestamp(200))); TEST_DO(checkEntry(res, 2, DocumentId("id:ns:document::6"), Timestamp(350))); } @@ -724,8 +728,8 @@ TEST("require that document selection will filter results") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(4u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::xxx1")), Timestamp(99))); - TEST_DO(checkEntry(res, 1, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::xxx2")), Timestamp(200))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::xxx1")), Timestamp(99))); + TEST_DO(checkEntry(res, 1, *make_doc(DocumentId("id:ns:document::xxx2")), Timestamp(200))); TEST_DO(checkEntry(res, 2, DocumentId("id:ns:document::xxx3"), Timestamp(99))); TEST_DO(checkEntry(res, 3, DocumentId("id:ns:document::xxx4"), Timestamp(200))); } @@ -737,10 +741,10 @@ TEST("require that document selection handles 'field == null'") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); ASSERT_EQUAL(2u, res.getEntries().size()); - Document expected1(getAttrDocType(), DocumentId("id:ns:foo::xxx1")); - TEST_DO(checkEntry(res, 0, expected1, Timestamp(99))); - Document expected2(getAttrDocType(), DocumentId("id:ns:foo::xxx2")); - TEST_DO(checkEntry(res, 1, expected2, Timestamp(100))); + auto expected1 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xxx1")); + TEST_DO(checkEntry(res, 0, *expected1, Timestamp(99))); + auto expected2 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xxx2")); + TEST_DO(checkEntry(res, 1, *expected2, Timestamp(100))); } TEST("require that invalid document selection returns no documents") { @@ -771,7 +775,7 @@ TEST("require that document selection and timestamp range works together") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(2u, res.getEntries().size()); - TEST_DO(checkEntry(res, 0, Document(*DataType::DOCUMENT, DocumentId("id:ns:document::xxx2")), Timestamp(200))); + TEST_DO(checkEntry(res, 0, *make_doc(DocumentId("id:ns:document::xxx2")), Timestamp(200))); TEST_DO(checkEntry(res, 1, DocumentId("id:ns:document::xxx4"), Timestamp(200))); } @@ -782,9 +786,9 @@ TEST("require that fieldset limits fields returned") { IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(1u, res.getEntries().size()); - Document expected(getDocType(), DocumentId("id:ns:foo::xxx1")); - expected.setValue("header", StringFieldValue::make("foo")); - TEST_DO(checkEntry(res, 0, expected, Timestamp(1))); + auto expected = Document::make_without_repo(getDocType(), DocumentId("id:ns:foo::xxx1")); + expected->setValue("header", StringFieldValue::make("foo")); + TEST_DO(checkEntry(res, 0, *expected, Timestamp(1))); } namespace { @@ -838,22 +842,22 @@ TEST("require that attributes are used") IterateResult res = itr.iterate(largeNum); EXPECT_TRUE(res.isCompleted()); EXPECT_EQUAL(2u, res.getEntries().size()); - Document expected1(getAttrDocType(), DocumentId("id:ns:foo::xx2")); - expected1.setValue("header", StringFieldValue::make("foo")); - expected1.setValue("body", StringFieldValue::make("bar")); - expected1.setValue("aa", IntFieldValue::make(27)); - expected1.setValue("ab", IntFieldValue::make(28)); - expected1.setValue("dd", DoubleFieldValue::make(2.7)); - expected1.setValue("ss", StringFieldValue::make("x27")); - Document expected2(getAttrDocType(), DocumentId("id:ns:foo::xx4")); - expected2.setValue("header", StringFieldValue::make("foo")); - expected2.setValue("body", StringFieldValue::make("bar")); - expected2.setValue("aa", IntFieldValue::make(45)); - expected2.setValue("ab", IntFieldValue::make(46)); - expected2.setValue("dd", DoubleFieldValue::make(4.5)); - expected2.setValue("ss", StringFieldValue::make("x45")); - TEST_DO(checkEntry(res, 0, expected1, Timestamp(2))); - TEST_DO(checkEntry(res, 1, expected2, Timestamp(4))); + auto expected1 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xx2")); + expected1->setValue("header", StringFieldValue::make("foo")); + expected1->setValue("body", StringFieldValue::make("bar")); + expected1->setValue("aa", IntFieldValue::make(27)); + expected1->setValue("ab", IntFieldValue::make(28)); + expected1->setValue("dd", DoubleFieldValue::make(2.7)); + expected1->setValue("ss", StringFieldValue::make("x27")); + auto expected2 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xx4")); + expected2->setValue("header", StringFieldValue::make("foo")); + expected2->setValue("body", StringFieldValue::make("bar")); + expected2->setValue("aa", IntFieldValue::make(45)); + expected2->setValue("ab", IntFieldValue::make(46)); + expected2->setValue("dd", DoubleFieldValue::make(4.5)); + expected2->setValue("ss", StringFieldValue::make("x45")); + TEST_DO(checkEntry(res, 0, *expected1, Timestamp(2))); + TEST_DO(checkEntry(res, 1, *expected2, Timestamp(4))); DocumentIterator itr2(bucket(5), std::make_shared(), selectDocs("foo.dd == 4.5"), docV(), -1, false); itr2.add(doc_with_attr_fields("id:ns:foo::xx5", Timestamp(5), bucket(5), @@ -868,22 +872,22 @@ TEST("require that attributes are used") IterateResult res2 = itr2.iterate(largeNum); EXPECT_TRUE(res2.isCompleted()); EXPECT_EQUAL(2u, res2.getEntries().size()); - Document expected3(getAttrDocType(), DocumentId("id:ns:foo::xx6")); - expected3.setValue("header", StringFieldValue::make("foo")); - expected3.setValue("body", StringFieldValue::make("bar")); - expected3.setValue("aa", IntFieldValue::make(27)); - expected3.setValue("ab", IntFieldValue::make(28)); - expected3.setValue("dd", DoubleFieldValue::make(2.7)); - expected3.setValue("ss", StringFieldValue::make("x27")); - Document expected4(getAttrDocType(), DocumentId("id:ns:foo::xx8")); - expected4.setValue("header", StringFieldValue::make("foo")); - expected4.setValue("body", StringFieldValue::make("bar")); - expected4.setValue("aa", IntFieldValue::make(45)); - expected4.setValue("ab", IntFieldValue::make(46)); - expected4.setValue("dd", DoubleFieldValue::make(4.5)); - expected4.setValue("ss", StringFieldValue::make("x45")); - TEST_DO(checkEntry(res2, 0, expected3, Timestamp(6))); - TEST_DO(checkEntry(res2, 1, expected4, Timestamp(8))); + auto expected3 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xx6")); + expected3->setValue("header", StringFieldValue::make("foo")); + expected3->setValue("body", StringFieldValue::make("bar")); + expected3->setValue("aa", IntFieldValue::make(27)); + expected3->setValue("ab", IntFieldValue::make(28)); + expected3->setValue("dd", DoubleFieldValue::make(2.7)); + expected3->setValue("ss", StringFieldValue::make("x27")); + auto expected4 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xx8")); + expected4->setValue("header", StringFieldValue::make("foo")); + expected4->setValue("body", StringFieldValue::make("bar")); + expected4->setValue("aa", IntFieldValue::make(45)); + expected4->setValue("ab", IntFieldValue::make(46)); + expected4->setValue("dd", DoubleFieldValue::make(4.5)); + expected4->setValue("ss", StringFieldValue::make("x45")); + TEST_DO(checkEntry(res2, 0, *expected3, Timestamp(6))); + TEST_DO(checkEntry(res2, 1, *expected4, Timestamp(8))); DocumentIterator itr3(bucket(5), std::make_shared(), selectDocs("foo.ss == \"x45\""), docV(), -1, false); itr3.add(doc_with_attr_fields("id:ns:foo::xx9", Timestamp(9), bucket(5), @@ -898,22 +902,22 @@ TEST("require that attributes are used") IterateResult res3 = itr3.iterate(largeNum); EXPECT_TRUE(res3.isCompleted()); EXPECT_EQUAL(2u, res3.getEntries().size()); - Document expected5(getAttrDocType(), DocumentId("id:ns:foo::xx10")); - expected5.setValue("header", StringFieldValue::make("foo")); - expected5.setValue("body", StringFieldValue::make("bar")); - expected5.setValue("aa", IntFieldValue::make(27)); - expected5.setValue("ab", IntFieldValue::make(28)); - expected5.setValue("dd", DoubleFieldValue::make(2.7)); - expected5.setValue("ss", StringFieldValue::make("x27")); - Document expected6(getAttrDocType(), DocumentId("id:ns:foo::xx12")); - expected6.setValue("header", StringFieldValue::make("foo")); - expected6.setValue("body", StringFieldValue::make("bar")); - expected6.setValue("aa", IntFieldValue::make(45)); - expected6.setValue("ab", IntFieldValue::make(46)); - expected6.setValue("dd", DoubleFieldValue::make(4.5)); - expected6.setValue("ss", StringFieldValue::make("x45")); - TEST_DO(checkEntry(res3, 0, expected5, Timestamp(10))); - TEST_DO(checkEntry(res3, 1, expected6, Timestamp(12))); + auto expected5 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xx10")); + expected5->setValue("header", StringFieldValue::make("foo")); + expected5->setValue("body", StringFieldValue::make("bar")); + expected5->setValue("aa", IntFieldValue::make(27)); + expected5->setValue("ab", IntFieldValue::make(28)); + expected5->setValue("dd", DoubleFieldValue::make(2.7)); + expected5->setValue("ss", StringFieldValue::make("x27")); + auto expected6 = Document::make_without_repo(getAttrDocType(), DocumentId("id:ns:foo::xx12")); + expected6->setValue("header", StringFieldValue::make("foo")); + expected6->setValue("body", StringFieldValue::make("bar")); + expected6->setValue("aa", IntFieldValue::make(45)); + expected6->setValue("ab", IntFieldValue::make(46)); + expected6->setValue("dd", DoubleFieldValue::make(4.5)); + expected6->setValue("ss", StringFieldValue::make("x45")); + TEST_DO(checkEntry(res3, 0, *expected5, Timestamp(10))); + TEST_DO(checkEntry(res3, 1, *expected6, Timestamp(12))); } TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp index 5afe0a0c5a2..bf960768c89 100644 --- a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp +++ b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp @@ -516,8 +516,7 @@ MyDocumentSubDB::handleRemove(RemoveOperationWithDocId &op) assert(op.getLid() == putRes._lid); const document::DocumentType *docType = _repo->getDocumentType(_docTypeName.getName()); - auto doc = std::make_unique(*docType, docId); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *docType, docId); _docs[op.getLid()] = std::move(doc); needCommit = true; } diff --git a/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp b/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp index 87947788bdf..0479fa61e2b 100644 --- a/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp +++ b/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp @@ -126,7 +126,7 @@ public: return upd; } auto makeDoc() { - auto doc(std::make_shared(_docType, docId)); + auto doc(std::make_shared(*_repo, _docType, docId)); doc->setValue("string", StringFieldValue("stringval")); return doc; } diff --git a/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp b/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp index e9fd4fa9d37..996d9846934 100644 --- a/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp +++ b/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp @@ -61,7 +61,7 @@ createDocType(const vespalib::string &name, int32_t id) Document::SP createDoc(const DocumentType &docType, const DocumentId &docId) { - return std::make_shared(docType, docId); + return Document::SP(Document::make_without_repo(docType, docId).release()); } diff --git a/searchcore/src/tests/proton/server/documentretriever_test.cpp b/searchcore/src/tests/proton/server/documentretriever_test.cpp index 6cc2ca22531..f99c3ab0f67 100644 --- a/searchcore/src/tests/proton/server/documentretriever_test.cpp +++ b/searchcore/src/tests/proton/server/documentretriever_test.cpp @@ -161,7 +161,7 @@ struct MyDocumentStore : proton::test::DummyDocumentStore { return std::move(_testDoc); } const DocumentType *doc_type = r.getDocumentType(doc_type_name); - auto doc = std::make_unique(*doc_type, doc_id); + auto doc = std::make_unique(r, *doc_type, doc_id); ASSERT_TRUE(doc); doc->setValue(static_field, IntFieldValue::make(static_value)); doc->setValue(dyn_field_i, IntFieldValue::make(static_value)); diff --git a/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp b/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp index 0856bad0035..b257f85acdc 100644 --- a/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp +++ b/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp @@ -60,8 +60,7 @@ std::unique_ptr BmFeed::make_document(uint32_t n, uint32_t i) const { auto id = make_document_id(n, i); - auto document = std::make_unique(*_document_type, id); - document->setRepo(*_repo); + auto document = std::make_unique(*_repo, *_document_type, id); document->setFieldValue(_field, IntFieldValue::make(i)); return document; } diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp index ee2af5b606c..b8240b33b6c 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp @@ -244,7 +244,7 @@ DocumentRetriever::getPartialDocument(search::DocumentIdT lid, const document::D FieldSet::stripFields(*doc, fieldSet); } } else { - doc = std::make_unique(getDocumentType(), docId); + doc = std::make_unique(getDocumentTypeRepo(), getDocumentType(), docId); switch (fieldSet.getType()) { case FieldSet::Type::ALL: populate(lid, *doc); @@ -271,7 +271,6 @@ DocumentRetriever::getPartialDocument(search::DocumentIdT lid, const document::D case FieldSet::Type::DOCID: break; } - doc->setRepo(getDocumentTypeRepo()); } return doc; } diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp b/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp index 914f3d8bcfd..bb7d80c5ebc 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentretrieverbase.cpp @@ -26,8 +26,7 @@ DocumentRetrieverBase::DocumentRetrieverBase( _hasFields(hasFields) { const document::DocumentType * docType(_repo.getDocumentType(_docTypeName.getName())); - _emptyDoc = std::make_unique(*docType, DocumentId("id:empty:" + _docTypeName.getName() + "::empty")); - _emptyDoc->setRepo(_repo); + _emptyDoc = std::make_unique(_repo, *docType, DocumentId("id:empty:" + _docTypeName.getName() + "::empty")); } DocumentRetrieverBase::~DocumentRetrieverBase() = default; diff --git a/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp b/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp index 6bbedcdb18e..e9a14385c6a 100644 --- a/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp @@ -217,8 +217,8 @@ FeedHandler::performInternalUpdate(FeedToken token, UpdateOperation &op) void FeedHandler::createNonExistingDocument(FeedToken token, const UpdateOperation &op) { - auto doc = make_shared(op.getUpdate()->getType(), op.getUpdate()->getId()); - doc->setRepo(*_activeFeedView->getDocumentTypeRepo()); + auto doc = make_shared(*_activeFeedView->getDocumentTypeRepo(), + op.getUpdate()->getType(), op.getUpdate()->getId()); op.getUpdate()->applyTo(*doc); PutOperation putOp(op.getBucketId(), op.getTimestamp(), std::move(doc)); putOp.set_prepare_serial_num(op.get_prepare_serial_num()); diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp index 533b270c20a..c2b4c0507db 100644 --- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp @@ -586,8 +586,7 @@ StoreOnlyFeedView::internalRemove(FeedToken token, const RemoveOperationWithDocI adjustMetaStore(rmOp, docId.getGlobalId(), docId); if (rmOp.getValidDbdId(_params._subDbId)) { - auto clearDoc = std::make_unique(*_docType, docId); - clearDoc->setRepo(*_repo); + auto clearDoc = std::make_unique(*_repo, *_docType, docId); putSummary(serialNum, rmOp.getLid(), std::move(clearDoc), std::make_shared(std::move(token), get_pending_lid_token(rmOp))); } diff --git a/searchlib/src/apps/tests/memoryindexstress_test.cpp b/searchlib/src/apps/tests/memoryindexstress_test.cpp index fb743ad93ac..fdb132d9a36 100644 --- a/searchlib/src/apps/tests/memoryindexstress_test.cpp +++ b/searchlib/src/apps/tests/memoryindexstress_test.cpp @@ -153,8 +153,7 @@ makeDoc(const DocumentTypeRepo &repo, uint32_t i, idstr << "id:test:test:: " << i; DocumentId id(idstr.str()); const DocumentType *docType = repo.getDocumentType(doc_type_name); - auto doc(std::make_unique(*docType, id)); - doc->setRepo(repo); + auto doc(std::make_unique(repo, *docType, id)); if (!titleString.empty()) { setFieldValue(*doc, title, titleString); } diff --git a/searchlib/src/tests/docstore/document_store_visitor/document_store_visitor_test.cpp b/searchlib/src/tests/docstore/document_store_visitor/document_store_visitor_test.cpp index efe858c016a..e841e334215 100644 --- a/searchlib/src/tests/docstore/document_store_visitor/document_store_visitor_test.cpp +++ b/searchlib/src/tests/docstore/document_store_visitor/document_store_visitor_test.cpp @@ -60,7 +60,7 @@ makeDoc(const DocumentTypeRepo &repo, uint32_t i, bool before) idstr << "id:test:test:: " << i; DocumentId id(idstr.str()); const DocumentType *docType = repo.getDocumentType(doc_type_name); - Document::UP doc(new Document(*docType, id)); + Document::UP doc(new Document(repo, *docType, id)); ASSERT_TRUE(doc.get()); asciistream mainstr; mainstr << "static text" << i << " body something"; diff --git a/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp b/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp index 414e06bd464..580fd199806 100644 --- a/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp +++ b/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp @@ -426,7 +426,7 @@ makeDoc(const DocumentTypeRepo &repo, uint32_t i, bool extra_field, size_t numRe idstr << "id:test:test:: " << i; DocumentId id(idstr.str()); const DocumentType *docType = repo.getDocumentType(doc_type_name); - Document::UP doc(new Document(*docType, id)); + Document::UP doc(new Document(repo, *docType, id)); ASSERT_TRUE(doc.get()); asciistream mainstr; mainstr << "static text" << i << " body something"; diff --git a/searchlib/src/vespa/searchlib/test/doc_builder.cpp b/searchlib/src/vespa/searchlib/test/doc_builder.cpp index 2097cd53b2c..3950a28bea7 100644 --- a/searchlib/src/vespa/searchlib/test/doc_builder.cpp +++ b/searchlib/src/vespa/searchlib/test/doc_builder.cpp @@ -59,8 +59,7 @@ DocBuilder::~DocBuilder() = default; std::unique_ptr DocBuilder::make_document(vespalib::string document_id) { - auto doc = std::make_unique(get_document_type(), DocumentId(document_id)); - doc->setRepo(get_repo()); + auto doc = std::make_unique(get_repo(), get_document_type(), DocumentId(document_id)); return doc; } diff --git a/searchsummary/src/tests/docsummary/document_id_dfw/document_id_dfw_test.cpp b/searchsummary/src/tests/docsummary/document_id_dfw/document_id_dfw_test.cpp index 7e54f35ff38..8dfdd1877f1 100644 --- a/searchsummary/src/tests/docsummary/document_id_dfw/document_id_dfw_test.cpp +++ b/searchsummary/src/tests/docsummary/document_id_dfw/document_id_dfw_test.cpp @@ -95,8 +95,7 @@ DocumentIdDFWTest::~DocumentIdDFWTest() = default; std::unique_ptr DocumentIdDFWTest::make_docsum_store_document(const vespalib::string& id) { - auto doc = std::make_unique(*_document_type, DocumentId(id)); - doc->setRepo(*_repo); + auto doc = std::make_unique(*_repo, *_document_type, DocumentId(id)); return std::make_unique(std::move(doc)); } diff --git a/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp b/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp index 7eb634f5609..7b83dbe2c4e 100644 --- a/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp +++ b/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp @@ -102,7 +102,7 @@ public: } ~DocsumStore(); std::unique_ptr getMappedDocsum() { - auto doc = std::make_unique(_doc_type, DocumentId("id:test:test::0")); + auto doc = Document::make_without_repo(_doc_type, DocumentId("id:test:test::0")); { ArrayFieldValue array_value(_array_type); if (!_empty_values) { diff --git a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp index 93f87d9c5be..7077f707247 100644 --- a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp +++ b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp @@ -68,7 +68,7 @@ struct SlimeSummaryTest : testing::Test, IDocsumStore, GetDocsumsStateCallback { if (empty_get_mapped_docsum) { return std::make_unique(std::unique_ptr()); } - auto doc = std::make_unique(doc_type, DocumentId("id:test:test::0")); + auto doc = Document::make_without_repo(doc_type, DocumentId("id:test:test::0")); doc->setValue("int_field", IntFieldValue(4)); doc->setValue("short_field", ShortFieldValue(2)); doc->setValue("byte_field", ByteFieldValue(1)); diff --git a/storage/src/tests/bucketdb/bucketmanagertest.cpp b/storage/src/tests/bucketdb/bucketmanagertest.cpp index dc33bfd04e2..ea3a782d432 100644 --- a/storage/src/tests/bucketdb/bucketmanagertest.cpp +++ b/storage/src/tests/bucketdb/bucketmanagertest.cpp @@ -171,7 +171,7 @@ void BucketManagerTest::setupTestEnvironment(bool fakePersistenceLayer, } // Generate a doc to use for testing.. const DocumentType &type(*_node->getTypeRepo()->getDocumentType("text/html")); - _document = std::make_shared(type, document::DocumentId("id:ns:text/html::ntnu")); + _document = std::make_shared(*_node->getTypeRepo(), type, document::DocumentId("id:ns:text/html::ntnu")); } void BucketManagerTest::addBucketsToDB(uint32_t count) diff --git a/storage/src/tests/distributor/getoperationtest.cpp b/storage/src/tests/distributor/getoperationtest.cpp index 8d188f6c005..36a1495579f 100644 --- a/storage/src/tests/distributor/getoperationtest.cpp +++ b/storage/src/tests/distributor/getoperationtest.cpp @@ -85,7 +85,7 @@ struct GetOperationTest : Test, DistributorStripeTestUtil { if (!authorVal.empty()) { const document::DocumentType* type(_repo->getDocumentType("text/html")); - doc = std::make_unique(*type, docId); + doc = std::make_unique(*_repo, *type, docId); doc->setValue(doc->getField("author"), document::StringFieldValue(authorVal)); diff --git a/storage/src/tests/distributor/putoperationtest.cpp b/storage/src/tests/distributor/putoperationtest.cpp index 735666e5c89..2a3f06b1e8c 100644 --- a/storage/src/tests/distributor/putoperationtest.cpp +++ b/storage/src/tests/distributor/putoperationtest.cpp @@ -83,8 +83,12 @@ public: return *_testDocMan.getTypeRepo().getDocumentType("testdoctype1"); } + const document::DocumentTypeRepo& type_repo() const { + return _testDocMan.getTypeRepo(); + } + Document::SP createDummyDocument(const char* ns, const char* id) const { - return std::make_shared(doc_type(), DocumentId(vespalib::make_string("id:%s:testdoctype1::%s", ns, id))); + return std::make_shared(type_repo(), doc_type(), DocumentId(vespalib::make_string("id:%s:testdoctype1::%s", ns, id))); } static std::shared_ptr createPut(Document::SP doc) { @@ -98,7 +102,7 @@ PutOperationTest::~PutOperationTest() = default; document::BucketId PutOperationTest::createAndSendSampleDocument(vespalib::duration timeout) { - auto doc = std::make_shared(doc_type(), DocumentId("id:test:testdoctype1::")); + auto doc = std::make_shared(type_repo(), doc_type(), DocumentId("id:test:testdoctype1::")); document::BucketId id = operation_context().make_split_bit_constrained_bucket_id(doc->getId()); addIdealNodes(id); @@ -453,7 +457,7 @@ TEST_F(PutOperationTest, no_storage_nodes) { TEST_F(PutOperationTest, update_correct_bucket_on_remapped_put) { setup_stripe(2, 2, "storage:2 distributor:1"); - auto doc = std::make_shared(doc_type(), DocumentId("id:test:testdoctype1:n=13:uri")); + auto doc = std::make_shared(type_repo(), doc_type(), DocumentId("id:test:testdoctype1:n=13:uri")); addNodesToBucketDB(document::BucketId(16,13), "0=0,1=0"); sendPut(createPut(doc)); diff --git a/storage/src/tests/distributor/twophaseupdateoperationtest.cpp b/storage/src/tests/distributor/twophaseupdateoperationtest.cpp index 579fd156962..da32225cde3 100644 --- a/storage/src/tests/distributor/twophaseupdateoperationtest.cpp +++ b/storage/src/tests/distributor/twophaseupdateoperationtest.cpp @@ -237,7 +237,7 @@ TwoPhaseUpdateOperationTest::replyToGet( std::shared_ptr reply; if (haveDocument) { - auto doc(std::make_shared(*_doc_type, DocumentId("id:ns:" + _doc_type->getName() + "::1"))); + auto doc(std::make_shared(*_repo, *_doc_type, DocumentId("id:ns:" + _doc_type->getName() + "::1"))); doc->setValue("headerval", IntFieldValue(oldTimestamp)); reply = std::make_shared(get, doc, oldTimestamp); diff --git a/storage/src/tests/persistence/filestorage/filestormanagertest.cpp b/storage/src/tests/persistence/filestorage/filestormanagertest.cpp index 7f3fe06fc29..4227f3dbe13 100644 --- a/storage/src/tests/persistence/filestorage/filestormanagertest.cpp +++ b/storage/src/tests/persistence/filestorage/filestormanagertest.cpp @@ -485,7 +485,7 @@ TEST_F(FileStorManagerTest, flush) { // Creating a document to test with document::DocumentId docId("id:ns:testdoctype1::crawler:http://www.ntnu.no/"); - auto doc = std::make_shared(*_testdoctype1, docId); + auto doc = std::make_shared(*_node->getTypeRepo(), *_testdoctype1, docId); document::BucketId bid(4000); static const uint32_t msgCount = 10; @@ -1032,7 +1032,7 @@ FileStorTestBase::putDoc(DummyStorageLink& top, document::BucketId bucket(16, factory.getBucketId(docId).getRawId()); //std::cerr << "doc bucket is " << bucket << " vs source " << source << "\n"; _node->getPersistenceProvider().createBucket(makeSpiBucket(target)); - Document::SP doc(new Document(*_testdoctype1, docId)); + auto doc = std::make_shared(*_node->getTypeRepo(), *_testdoctype1, docId); auto cmd = std::make_shared(makeDocumentBucket(target), doc, docNum+1); cmd->setAddress(_Storage3); cmd->setPriority(120); @@ -1073,7 +1073,7 @@ TEST_F(FileStorManagerTest, split_empty_target_with_remapped_ops) { document::DocumentId docId( vespalib::make_string("id:ns:testdoctype1:n=%d:1234", 0x100001)); - auto doc = std::make_shared(*_testdoctype1, docId); + auto doc = std::make_shared(*_node->getTypeRepo(), *_testdoctype1, docId); auto putCmd = std::make_shared(makeDocumentBucket(source), doc, 1001); putCmd->setAddress(_Storage3); putCmd->setPriority(120); @@ -1399,7 +1399,7 @@ TEST_F(FileStorManagerTest, delete_bucket) { auto& top = c.top; // Creating a document to test with document::DocumentId docId("id:crawler:testdoctype1:n=4000:http://www.ntnu.no/"); - auto doc = std::make_shared(*_testdoctype1, docId); + auto doc = std::make_shared(*_node->getTypeRepo(), *_testdoctype1, docId); document::BucketId bid(16, 4000); createBucket(bid); @@ -1440,7 +1440,7 @@ TEST_F(FileStorManagerTest, delete_bucket_rejects_outdated_bucket_info) { auto& top = c.top; // Creating a document to test with document::DocumentId docId("id:crawler:testdoctype1:n=4000:http://www.ntnu.no/"); - Document::SP doc(new Document(*_testdoctype1, docId)); + auto doc = std::make_shared(*_node->getTypeRepo(), *_testdoctype1, docId); document::BucketId bid(16, 4000); createBucket(bid); @@ -1487,7 +1487,7 @@ TEST_F(FileStorManagerTest, delete_bucket_with_invalid_bucket_info){ auto& top = c.top; // Creating a document to test with document::DocumentId docId("id:crawler:testdoctype1:n=4000:http://www.ntnu.no/"); - auto doc = std::make_shared(*_testdoctype1, docId); + auto doc = std::make_shared(*_node->getTypeRepo(), *_testdoctype1, docId); document::BucketId bid(16, 4000); createBucket(bid); diff --git a/storage/src/tests/storageserver/documentapiconvertertest.cpp b/storage/src/tests/storageserver/documentapiconvertertest.cpp index c375443b265..42944c81f13 100644 --- a/storage/src/tests/storageserver/documentapiconvertertest.cpp +++ b/storage/src/tests/storageserver/documentapiconvertertest.cpp @@ -106,7 +106,7 @@ struct DocumentApiConverterTest : Test { }; TEST_F(DocumentApiConverterTest, put) { - auto doc = std::make_shared(_html_type, defaultDocId); + auto doc = std::make_shared(*_repo, _html_type, defaultDocId); documentapi::PutDocumentMessage putmsg(doc); putmsg.setTimestamp(1234); @@ -126,7 +126,7 @@ TEST_F(DocumentApiConverterTest, put) { } TEST_F(DocumentApiConverterTest, forwarded_put) { - auto doc = std::make_shared(_html_type, DocumentId("id:ns:" + _html_type.getName() + "::test")); + auto doc = std::make_shared(*_repo, _html_type, DocumentId("id:ns:" + _html_type.getName() + "::test")); auto putmsg = std::make_unique(doc); auto* putmsg_raw = putmsg.get(); diff --git a/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp b/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp index bfc22b9f1ea..26c5b8df5a5 100644 --- a/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp +++ b/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp @@ -161,7 +161,7 @@ public: std::shared_ptr create_dummy_put_command() const { auto doc_type = _doc_type_repo->getDocumentType("testdoctype1"); - auto doc = std::make_shared(*doc_type, document::DocumentId("id:foo:testdoctype1::bar")); + auto doc = std::make_shared(*_doc_type_repo, *doc_type, document::DocumentId("id:foo:testdoctype1::bar")); doc->setFieldValue(doc->getField("hstringval"), std::make_unique("hello world")); return std::make_shared(makeDocumentBucket(document::BucketId(0)), std::move(doc), 100); } diff --git a/storage/src/vespa/storage/distributor/operations/external/twophaseupdateoperation.cpp b/storage/src/vespa/storage/distributor/operations/external/twophaseupdateoperation.cpp index bdf4fa2ba72..515b72520ec 100644 --- a/storage/src/vespa/storage/distributor/operations/external/twophaseupdateoperation.cpp +++ b/storage/src/vespa/storage/distributor/operations/external/twophaseupdateoperation.cpp @@ -672,8 +672,7 @@ std::shared_ptr TwoPhaseUpdateOperation::createBlankDocument() const { const document::DocumentUpdate& up(*_updateCmd->getUpdate()); - auto doc = std::make_shared(up.getType(), up.getId()); - doc->setRepo(*up.getRepoPtr()); + auto doc = std::make_shared(*up.getRepoPtr(), up.getType(), up.getId()); return doc; } diff --git a/streamingvisitors/src/tests/document/document.cpp b/streamingvisitors/src/tests/document/document.cpp index 1e97d232a64..acebd9ed4a4 100644 --- a/streamingvisitors/src/tests/document/document.cpp +++ b/streamingvisitors/src/tests/document/document.cpp @@ -29,7 +29,7 @@ DocumentTest::testStorageDocument() dt.addField(fa); dt.addField(fb); - document::Document::UP doc(new document::Document(dt, DocumentId())); + auto doc = document::Document::make_without_repo(dt, DocumentId()); doc->setValue(fa, StringFieldValue("foo")); doc->setValue(fb, StringFieldValue("bar")); diff --git a/streamingvisitors/src/tests/hitcollector/hitcollector_test.cpp b/streamingvisitors/src/tests/hitcollector/hitcollector_test.cpp index 9715b44b27b..6950c90f097 100644 --- a/streamingvisitors/src/tests/hitcollector/hitcollector_test.cpp +++ b/streamingvisitors/src/tests/hitcollector/hitcollector_test.cpp @@ -77,8 +77,8 @@ HitCollectorTest::assertHit(SearchResult::RankType expRank, uint32_t expDocId, u void HitCollectorTest::addHit(HitCollector &hc, uint32_t docId, double score, const char *sortData, size_t sortDataSize) { - document::Document::UP doc(new document::Document(_docType, DocumentId("id:ns:testdoc::"))); - StorageDocument::UP sdoc(new StorageDocument(std::move(doc), SharedFieldPathMap(), 0)); + auto doc = document::Document::make_without_repo(_docType, DocumentId("id:ns:testdoc::")); + auto sdoc = std::make_unique(std::move(doc), SharedFieldPathMap(), 0); ASSERT_TRUE(sdoc->valid()); MatchData md(MatchData::params()); hc.addHit(sdoc.get(), docId, md, score, sortData, sortDataSize); diff --git a/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp b/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp index 59e84b7d08c..458031b5f01 100644 --- a/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp +++ b/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp @@ -211,7 +211,7 @@ MyDocType::make_field_path(vespalib::string path) const std::unique_ptr MyDocType::make_test_doc() const { - auto doc = std::make_unique(_document_type, DocumentId("id::test::1")); + auto doc = document::Document::make_without_repo(_document_type, DocumentId("id::test::1")); doc->setValue("elem_array", *make_elem_array({{"foo", 10},{"bar", 20},{"baz", 30},{"foo", 40}, {"zap", 20}, {"zap", 20}})); // the elements in maps are ordered on the key doc->setValue("elem_map", *make_elem_map({{"@foo", {"foo", 10}}, {"@bar", {"bar", 20}},{"@baz", {"baz", 30}},{"@foo@", {"foo", 40}},{"@zap", {"zap", 20}}, {"@zap@", {"zap", 20}}})); -- cgit v1.2.3