diff options
42 files changed, 440 insertions, 627 deletions
diff --git a/document/src/tests/documentselectparsertest.cpp b/document/src/tests/documentselectparsertest.cpp index a447df1044e..6644fec2da0 100644 --- a/document/src/tests/documentselectparsertest.cpp +++ b/document/src/tests/documentselectparsertest.cpp @@ -139,9 +139,9 @@ DocumentUpdate::SP DocumentSelectParserTest::createUpdate( const DocumentType* type = _repo->getDocumentType(doctype); auto doc = std::make_shared<DocumentUpdate>(*_repo, *type, DocumentId(id)); doc->addUpdate(FieldUpdate(doc->getType().getField("headerval")) - .addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(hint)))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(hint)))); doc->addUpdate(FieldUpdate(doc->getType().getField("hstringval")) - .addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue(hstr)))); + .addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue::make(hstr)))); return doc; } diff --git a/document/src/tests/documentupdatetestcase.cpp b/document/src/tests/documentupdatetestcase.cpp index beb94959e73..40f398ee93e 100644 --- a/document/src/tests/documentupdatetestcase.cpp +++ b/document/src/tests/documentupdatetestcase.cpp @@ -120,13 +120,13 @@ TEST(DocumentUpdateTest, testSimpleUsage) // Test that primitive value updates can be serialized testRoundtripSerialize(ClearValueUpdate(), *DataType::INT); - testRoundtripSerialize(AssignValueUpdate(IntFieldValue(1)), *DataType::INT); + testRoundtripSerialize(AssignValueUpdate(std::make_unique<IntFieldValue>(1)), *DataType::INT); testRoundtripSerialize(ArithmeticValueUpdate(ArithmeticValueUpdate::Div, 4.3), *DataType::FLOAT); - testRoundtripSerialize(AddValueUpdate(IntFieldValue(1), 4), *arrayType); - testRoundtripSerialize(RemoveValueUpdate(IntFieldValue(1)), *arrayType); + testRoundtripSerialize(AddValueUpdate(std::make_unique<IntFieldValue>(1), 4), *arrayType); + testRoundtripSerialize(RemoveValueUpdate(std::make_unique<IntFieldValue>(1)), *arrayType); FieldUpdate fieldUpdate(docType->getField("intf")); - fieldUpdate.addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(1))); + fieldUpdate.addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(1))); nbostream stream = serialize(fieldUpdate); FieldUpdate fieldUpdateCopy(repo, *docType, stream); EXPECT_EQ(fieldUpdate, fieldUpdateCopy); @@ -158,7 +158,7 @@ TEST(DocumentUpdateTest, testSimpleUsage) { Document updated(doc); DocumentUpdate upd(repo, *docType, DocumentId("id:ns:test::1")); - upd.addUpdate(FieldUpdate(docType->getField("intf")).addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(15)))); + upd.addUpdate(FieldUpdate(docType->getField("intf")).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(15)))); upd.applyTo(updated); EXPECT_NE(doc, updated); EXPECT_EQ(15, updated.getValue("intf")->getAsInt()); @@ -174,7 +174,7 @@ TEST(DocumentUpdateTest, testSimpleUsage) { Document updated(doc); DocumentUpdate upd(repo, *docType, DocumentId("id:ns:test::1")); - upd.addUpdate(FieldUpdate(docType->getField("intarr")).addUpdate(std::make_unique<AddValueUpdate>(IntFieldValue(4)))); + upd.addUpdate(FieldUpdate(docType->getField("intarr")).addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<IntFieldValue>(4)))); upd.applyTo(updated); EXPECT_NE(doc, updated); std::unique_ptr<ArrayFieldValue> val(dynamic_cast<ArrayFieldValue*>(updated.getValue("intarr").release())); @@ -184,7 +184,7 @@ TEST(DocumentUpdateTest, testSimpleUsage) { Document updated(doc); DocumentUpdate upd(repo, *docType, DocumentId("id:ns:test::1")); - upd.addUpdate(FieldUpdate(docType->getField("intarr")).addUpdate(std::make_unique<RemoveValueUpdate>(IntFieldValue(3)))); + upd.addUpdate(FieldUpdate(docType->getField("intarr")).addUpdate(std::make_unique<RemoveValueUpdate>(std::make_unique<IntFieldValue>(3)))); upd.applyTo(updated); EXPECT_NE(doc, updated); std::unique_ptr<ArrayFieldValue> val(dynamic_cast<ArrayFieldValue*>(updated.getValue("intarr").release())); @@ -227,7 +227,7 @@ TEST(DocumentUpdateTest, testUpdateApplySingleValue) // Apply an update. DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) - .addUpdate(FieldUpdate(doc->getField("headerval")).addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(9)))) + .addUpdate(FieldUpdate(doc->getField("headerval")).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(9)))) .applyTo(*doc); EXPECT_EQ(9, doc->getValue("headerval")->getAsInt()); } @@ -240,12 +240,12 @@ TEST(DocumentUpdateTest, testUpdateArray) EXPECT_EQ((document::FieldValue*)nullptr, doc->getValue(doc->getField("tags")).get()); // Assign array field. - ArrayFieldValue myarray(doc->getType().getField("tags").getDataType()); - myarray.add(StringFieldValue("foo")); - myarray.add(StringFieldValue("bar")); + auto myarray = std::make_unique<ArrayFieldValue>(doc->getType().getField("tags").getDataType()); + myarray->add(StringFieldValue("foo")); + myarray->add(StringFieldValue("bar")); DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) - .addUpdate(FieldUpdate(doc->getField("tags")).addUpdate(std::make_unique<AssignValueUpdate>(myarray))) + .addUpdate(FieldUpdate(doc->getField("tags")).addUpdate(std::make_unique<AssignValueUpdate>(std::move(myarray)))) .applyTo(*doc); auto fval1(doc->getAs<ArrayFieldValue>(doc->getField("tags"))); ASSERT_EQ((size_t) 2, fval1->size()); @@ -255,8 +255,8 @@ TEST(DocumentUpdateTest, testUpdateArray) // Append array field DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(doc->getField("tags")) - .addUpdate(std::make_unique<AddValueUpdate>(StringFieldValue("another"))) - .addUpdate(std::make_unique<AddValueUpdate>(StringFieldValue("tag")))) + .addUpdate(std::make_unique<AddValueUpdate>(StringFieldValue::make("another"))) + .addUpdate(std::make_unique<AddValueUpdate>(StringFieldValue::make("tag")))) .applyTo(*doc); std::unique_ptr<ArrayFieldValue> fval2(doc->getAs<ArrayFieldValue>(doc->getField("tags"))); @@ -270,15 +270,15 @@ TEST(DocumentUpdateTest, testUpdateArray) ASSERT_THROW( DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(doc->getField("tags")) - .addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue("THROW MEH!")))) + .addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue::make("THROW MEH!")))) .applyTo(*doc), std::exception) << "Expected exception when assigning a string value to an array field."; // Remove array field. DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(doc->getField("tags")) - .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue("foo"))) - .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue("tag")))) + .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue::make("foo"))) + .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue::make("tag")))) .applyTo(*doc); auto fval3(doc->getAs<ArrayFieldValue>(doc->getField("tags"))); ASSERT_EQ((size_t) 2, fval3->size()); @@ -286,27 +286,27 @@ TEST(DocumentUpdateTest, testUpdateArray) EXPECT_EQ(std::string("another"), std::string((*fval3)[1].getAsString())); // Remove array from array. - ArrayFieldValue myarray2(doc->getType().getField("tags").getDataType()); - myarray2.add(StringFieldValue("foo")); - myarray2.add(StringFieldValue("bar")); + auto myarray2 = std::make_unique<ArrayFieldValue>(doc->getType().getField("tags").getDataType()); + myarray2->add(StringFieldValue("foo")); + myarray2->add(StringFieldValue("bar")); ASSERT_THROW( DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(doc->getField("tags")) - .addUpdate(std::make_unique<RemoveValueUpdate>(myarray2))) + .addUpdate(std::make_unique<RemoveValueUpdate>(std::move(myarray2)))) .applyTo(*doc), std::exception) << "Expected exception when removing an array from a string array."; } std::unique_ptr<ValueUpdate> createAddUpdate(vespalib::stringref key, int weight) { - auto upd = std::make_unique<AddValueUpdate>(StringFieldValue(key)); + auto upd = std::make_unique<AddValueUpdate>(StringFieldValue::make(key)); upd->setWeight(weight); return upd; } std::unique_ptr<ValueUpdate> createAddUpdate(int key, int weight) { - auto upd = std::make_unique<AddValueUpdate>(IntFieldValue(key)); + auto upd = std::make_unique<AddValueUpdate>(std::make_unique<IntFieldValue>(key)); upd->setWeight(weight); return upd; } @@ -320,11 +320,11 @@ TEST(DocumentUpdateTest, testUpdateWeightedSet) EXPECT_EQ((FieldValue*) 0, doc->getValue(field).get()); // Assign weightedset field - WeightedSetFieldValue wset(field.getDataType()); - wset.add(StringFieldValue("foo"), 3); - wset.add(StringFieldValue("bar"), 14); + auto wset =std::make_unique<WeightedSetFieldValue>(field.getDataType()); + wset->add(StringFieldValue("foo"), 3); + wset->add(StringFieldValue("bar"), 14); DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) - .addUpdate(FieldUpdate(field).addUpdate(std::make_unique<AssignValueUpdate>(wset))) + .addUpdate(FieldUpdate(field).addUpdate(std::make_unique<AssignValueUpdate>(std::move(wset)))) .applyTo(*doc); auto fval1(doc->getAs<WeightedSetFieldValue>(field)); ASSERT_EQ((size_t) 2, fval1->size()); @@ -336,12 +336,12 @@ TEST(DocumentUpdateTest, testUpdateWeightedSet) EXPECT_EQ(14, fval1->get(StringFieldValue("bar"), 0)); // Do a second assign - WeightedSetFieldValue wset2(field.getDataType()); - wset2.add(StringFieldValue("foo"), 16); - wset2.add(StringFieldValue("bar"), 24); + auto wset2 = std::make_unique<WeightedSetFieldValue>(field.getDataType()); + wset2->add(StringFieldValue("foo"), 16); + wset2->add(StringFieldValue("bar"), 24); DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(field) - .addUpdate(std::make_unique<AssignValueUpdate>(wset2))) + .addUpdate(std::make_unique<AssignValueUpdate>(std::move(wset2)))) .applyTo(*doc); auto fval2(doc->getAs<WeightedSetFieldValue>(field)); ASSERT_EQ((size_t) 2, fval2->size()); @@ -371,8 +371,8 @@ TEST(DocumentUpdateTest, testUpdateWeightedSet) // Remove weighted field DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(field) - .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue("foo"))) - .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue("too")))) + .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue::make("foo"))) + .addUpdate(std::make_unique<RemoveValueUpdate>(StringFieldValue::make("too")))) .applyTo(*doc); auto fval4(doc->getAs<WeightedSetFieldValue>(field)); ASSERT_EQ((size_t) 1, fval4->size()); @@ -419,7 +419,7 @@ WeightedSetAutoCreateFixture::WeightedSetAutoCreateFixture() update(repo, *docType, DocumentId("id:ns:test::1")) { update.addUpdate(FieldUpdate(field) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("foo"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("foo"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 1)))); } } // anon ns @@ -457,7 +457,7 @@ TEST(DocumentUpdateTest, testIncrementWithZeroResultWeightIsRemoved) { WeightedSetAutoCreateFixture fixture; fixture.update.addUpdate(FieldUpdate(fixture.field) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("baz"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("baz"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 0)))); fixture.applyUpdateToDocument(); @@ -498,7 +498,7 @@ TEST(DocumentUpdateTest, testReadSerializedFile) serValue = &serField2[0]; EXPECT_EQ(serValue->getType(), ValueUpdate::Clear); - EXPECT_TRUE(serValue->inherits(ClearValueUpdate::classId)); + EXPECT_EQ(ValueUpdate::Clear, serValue->getType()); // Verify add value update. const FieldUpdate & serField3 = upd.getUpdates()[0]; @@ -539,19 +539,19 @@ TEST(DocumentUpdateTest, testGenerateSerializedFile) const DocumentType *type(repo.getDocumentType("serializetest")); DocumentUpdate upd(repo, *type, DocumentId("id:ns:serializetest::update")); upd.addUpdate(FieldUpdate(type->getField("intfield")) - .addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(4)))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(4)))); upd.addUpdate(FieldUpdate(type->getField("floatfield")) - .addUpdate(std::make_unique<AssignValueUpdate>(FloatFieldValue(1.00f)))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<FloatFieldValue>(1.00f)))); upd.addUpdate(FieldUpdate(type->getField("arrayoffloatfield")) - .addUpdate(std::make_unique<AddValueUpdate>(FloatFieldValue(5.00f))) - .addUpdate(std::make_unique<AddValueUpdate>(FloatFieldValue(4.23f))) - .addUpdate(std::make_unique<AddValueUpdate>(FloatFieldValue(-1.00f)))); + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<FloatFieldValue>(5.00f))) + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<FloatFieldValue>(4.23f))) + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<FloatFieldValue>(-1.00f)))); upd.addUpdate(FieldUpdate(type->getField("intfield")) .addUpdate(std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 3))); upd.addUpdate(FieldUpdate(type->getField("wsfield")) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("foo"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("foo"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 2))) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("foo"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("foo"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Mul, 2)))); nbostream buf(serializeHEAD(upd)); writeBufferToFile(buf, "data/serializeupdatecpp.dat"); @@ -569,7 +569,7 @@ TEST(DocumentUpdateTest, testSetBadFieldTypes) DocumentUpdate update(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()); ASSERT_THROW( update.addUpdate(FieldUpdate(doc->getField("headerval")) - .addUpdate(std::make_unique<AssignValueUpdate>(FloatFieldValue(4.00f)))), + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<FloatFieldValue>(4.00f)))), std::exception) << "Expected exception when adding a float to an int field."; update.applyTo(*doc); @@ -604,7 +604,7 @@ TEST(DocumentUpdateTest, testUpdateApplyNoArrayValues) // Assign array field with no array values = empty array DocumentUpdate update(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()); update.addUpdate(FieldUpdate(field) - .addUpdate(std::make_unique<AssignValueUpdate>(ArrayFieldValue(field.getDataType())))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<ArrayFieldValue>(field.getDataType())))); update.applyTo(*doc); @@ -624,7 +624,7 @@ TEST(DocumentUpdateTest, testUpdateArrayEmptyParamValue) // Assign array field with no array values = empty array. DocumentUpdate update(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()); - update.addUpdate(FieldUpdate(field).addUpdate(std::make_unique<AssignValueUpdate>(ArrayFieldValue(field.getDataType())))); + update.addUpdate(FieldUpdate(field).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<ArrayFieldValue>(field.getDataType())))); update.applyTo(*doc); // Verify that the field was set in the document. @@ -652,7 +652,7 @@ TEST(DocumentUpdateTest, testUpdateWeightedSetEmptyParamValue) // Assign weighted set with no items = empty set. DocumentUpdate update(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()); - update.addUpdate(FieldUpdate(field).addUpdate(std::make_unique<AssignValueUpdate>(WeightedSetFieldValue(field.getDataType())))); + update.addUpdate(FieldUpdate(field).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<WeightedSetFieldValue>(field.getDataType())))); update.applyTo(*doc); // Verify that the field was set in the document. @@ -682,8 +682,8 @@ TEST(DocumentUpdateTest, testUpdateArrayWrongSubtype) DocumentUpdate update(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()); ASSERT_THROW( update.addUpdate(FieldUpdate(field) - .addUpdate(std::make_unique<AddValueUpdate>(IntFieldValue(123))) - .addUpdate(std::make_unique<AddValueUpdate>(IntFieldValue(456)))), + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<IntFieldValue>(123))) + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<IntFieldValue>(456)))), std::exception) << "Expected exception when adding wrong type."; // Apply update @@ -732,7 +732,7 @@ TEST(DocumentUpdateTest, testMapValueUpdate) DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(field1) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("banana"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("banana"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 1.0)))) .applyTo(*doc); std::unique_ptr<WeightedSetFieldValue> fv1 = @@ -741,7 +741,7 @@ TEST(DocumentUpdateTest, testMapValueUpdate) DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(field2) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("banana"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("banana"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 1.0)))) .applyTo(*doc); auto fv2 = doc->getAs<WeightedSetFieldValue>(field2); @@ -770,7 +770,7 @@ TEST(DocumentUpdateTest, testMapValueUpdate) DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(field1) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("apple"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("apple"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Sub, 1.0)))) .applyTo(*doc); @@ -780,7 +780,7 @@ TEST(DocumentUpdateTest, testMapValueUpdate) DocumentUpdate(docMan.getTypeRepo(), *doc->getDataType(), doc->getId()) .addUpdate(FieldUpdate(field2) - .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue("apple"), + .addUpdate(std::make_unique<MapValueUpdate>(StringFieldValue::make("apple"), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Sub, 1.0)))) .applyTo(*doc); @@ -940,10 +940,9 @@ struct TensorUpdateFixture { TEST(DocumentUpdateTest, tensor_assign_update_can_be_applied) { TensorUpdateFixture f; - auto newTensor = f.makeBaselineTensor(); - f.applyUpdate(std::make_unique<AssignValueUpdate>(*newTensor)); + f.applyUpdate(std::make_unique<AssignValueUpdate>(f.makeBaselineTensor())); f.assertDocumentUpdated(); - f.assertTensor(*newTensor); + f.assertTensor(*f.makeBaselineTensor()); } TEST(DocumentUpdateTest, tensor_clear_update_can_be_applied) @@ -1032,7 +1031,7 @@ TEST(DocumentUpdateTest, tensor_modify_update_can_be_applied_to_nonexisting_tens TEST(DocumentUpdateTest, tensor_assign_update_can_be_roundtrip_serialized) { TensorUpdateFixture f; - f.assertRoundtripSerialize(AssignValueUpdate(*f.makeBaselineTensor())); + f.assertRoundtripSerialize(AssignValueUpdate(f.makeBaselineTensor())); } TEST(DocumentUpdateTest, tensor_add_update_can_be_roundtrip_serialized) @@ -1162,7 +1161,7 @@ struct TensorUpdateSerializeFixture { (*repo, docType, DocumentId("id:test:test::0")); result->addUpdate(FieldUpdate(getField("sparse_tensor")) - .addUpdate(std::make_unique<AssignValueUpdate>(*makeTensor())) + .addUpdate(std::make_unique<AssignValueUpdate>(makeTensor())) .addUpdate(std::make_unique<TensorAddUpdate>(makeTensor())) .addUpdate(std::make_unique<TensorRemoveUpdate>(makeTensor()))); result->addUpdate(FieldUpdate(getField("dense_tensor")) @@ -1250,7 +1249,7 @@ CreateIfNonExistentFixture::CreateIfNonExistentFixture() update(std::make_unique<DocumentUpdate>(docMan.getTypeRepo(), *document->getDataType(), document->getId())) { update->addUpdate(FieldUpdate(document->getField("headerval")) - .addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(1)))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(1)))); update->setCreateIfNonExistent(true); } @@ -1282,8 +1281,8 @@ ArrayUpdateFixture::ArrayUpdateFixture() { update = std::make_unique<DocumentUpdate>(doc_man.getTypeRepo(), *doc->getDataType(), doc->getId()); update->addUpdate(FieldUpdate(array_field) - .addUpdate(std::make_unique<MapValueUpdate>(IntFieldValue(1), - std::make_unique<AssignValueUpdate>(StringFieldValue("bar"))))); + .addUpdate(std::make_unique<MapValueUpdate>(std::make_unique<IntFieldValue>(1), + std::make_unique<AssignValueUpdate>(StringFieldValue::make("bar"))))); } ArrayUpdateFixture::~ArrayUpdateFixture() = default; diff --git a/document/src/tests/feed_reject_helper_test.cpp b/document/src/tests/feed_reject_helper_test.cpp index 6649c9c0208..fd217601b6c 100644 --- a/document/src/tests/feed_reject_helper_test.cpp +++ b/document/src/tests/feed_reject_helper_test.cpp @@ -53,22 +53,22 @@ TEST(DocumentRejectTest, requireThatFixedSizeFieldValuesAreDetected) { TEST(DocumentRejectTest, requireThatClearRemoveTensorRemoveAndArtithmeticUpdatesIgnoreFeedRejection) { EXPECT_FALSE(FeedRejectHelper::mustReject(ClearValueUpdate())); - EXPECT_FALSE(FeedRejectHelper::mustReject(RemoveValueUpdate(StringFieldValue()))); + EXPECT_FALSE(FeedRejectHelper::mustReject(RemoveValueUpdate(StringFieldValue::make()))); EXPECT_FALSE(FeedRejectHelper::mustReject(ArithmeticValueUpdate(ArithmeticValueUpdate::Add, 5.0))); EXPECT_FALSE(FeedRejectHelper::mustReject(TensorRemoveUpdate(std::make_unique<TensorFieldValue>()))); } TEST(DocumentRejectTest, requireThatAddMapTensorModifyAndTensorAddUpdatesWillBeRejected) { - EXPECT_TRUE(FeedRejectHelper::mustReject(AddValueUpdate(IntFieldValue()))); - EXPECT_TRUE(FeedRejectHelper::mustReject(MapValueUpdate(IntFieldValue(), std::make_unique<ClearValueUpdate>()))); + EXPECT_TRUE(FeedRejectHelper::mustReject(AddValueUpdate(std::make_unique<IntFieldValue>()))); + EXPECT_TRUE(FeedRejectHelper::mustReject(MapValueUpdate(std::make_unique<IntFieldValue>(), std::make_unique<ClearValueUpdate>()))); EXPECT_TRUE(FeedRejectHelper::mustReject(TensorModifyUpdate(TensorModifyUpdate::Operation::REPLACE, std::make_unique<TensorFieldValue>()))); EXPECT_TRUE(FeedRejectHelper::mustReject(TensorAddUpdate(std::make_unique<TensorFieldValue>()))); } TEST(DocumentRejectTest, requireThatAssignUpdatesWillBeRejectedBasedOnTheirContent) { - EXPECT_FALSE(FeedRejectHelper::mustReject(AssignValueUpdate(IntFieldValue()))); - EXPECT_TRUE(FeedRejectHelper::mustReject(AssignValueUpdate(StringFieldValue()))); + EXPECT_FALSE(FeedRejectHelper::mustReject(AssignValueUpdate(std::make_unique<IntFieldValue>()))); + EXPECT_TRUE(FeedRejectHelper::mustReject(AssignValueUpdate(StringFieldValue::make()))); } } diff --git a/document/src/tests/testxml.cpp b/document/src/tests/testxml.cpp index 978ab572214..5f194661fe5 100644 --- a/document/src/tests/testxml.cpp +++ b/document/src/tests/testxml.cpp @@ -60,16 +60,16 @@ createTestDocumentUpdate(const DocumentTypeRepo& repo) auto up = std::make_unique<DocumentUpdate>(repo, *type, id); up->addUpdate(FieldUpdate(type->getField("intattr")) - .addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(7)))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(7)))); up->addUpdate(FieldUpdate(type->getField("stringattr")) - .addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue("New value")))); + .addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue::make("New value")))); up->addUpdate(FieldUpdate(type->getField("arrayattr")) - .addUpdate(std::make_unique<AddValueUpdate>(IntFieldValue(123))) - .addUpdate(std::make_unique<AddValueUpdate>(IntFieldValue(456)))); + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<IntFieldValue>(123))) + .addUpdate(std::make_unique<AddValueUpdate>(std::make_unique<IntFieldValue>(456)))); up->addUpdate(FieldUpdate(type->getField("arrayattr")) - .addUpdate(std::make_unique<RemoveValueUpdate>(IntFieldValue(123))) - .addUpdate(std::make_unique<RemoveValueUpdate>(IntFieldValue(456))) - .addUpdate(std::make_unique<RemoveValueUpdate>(IntFieldValue(789)))); + .addUpdate(std::make_unique<RemoveValueUpdate>(std::make_unique<IntFieldValue>(123))) + .addUpdate(std::make_unique<RemoveValueUpdate>(std::make_unique<IntFieldValue>(456))) + .addUpdate(std::make_unique<RemoveValueUpdate>(std::make_unique<IntFieldValue>(789)))); return up; } diff --git a/document/src/vespa/document/base/forcelink.cpp b/document/src/vespa/document/base/forcelink.cpp index 500b5cf7fa5..cfa3354f5f2 100644 --- a/document/src/vespa/document/base/forcelink.cpp +++ b/document/src/vespa/document/base/forcelink.cpp @@ -14,10 +14,10 @@ ForceLink::ForceLink(void) DocumentType type("foo", 1); Document document(type, DocumentId("doc:ns:bar")); DocumentUpdate documentUpdate; - MapValueUpdate mapValueUpdate(IntFieldValue(3), std::make_unique<ClearValueUpdate>()); - AddValueUpdate addValueUpdate(IntFieldValue(3)); - RemoveValueUpdate removeValueUpdate(IntFieldValue(3)); - AssignValueUpdate assignValueUpdate(IntFieldValue(3)); + MapValueUpdate mapValueUpdate(std::make_unique<IntFieldValue>(3), std::make_unique<ClearValueUpdate>()); + AddValueUpdate addValueUpdate(std::make_unique<IntFieldValue>(3)); + RemoveValueUpdate removeValueUpdate(std::make_unique<IntFieldValue>(3)); + AssignValueUpdate assignValueUpdate(std::make_unique<IntFieldValue>(3)); ClearValueUpdate clearValueUpdate; ArithmeticValueUpdate arithmeticValueUpdate(ArithmeticValueUpdate::Add, 3); } diff --git a/document/src/vespa/document/serialization/vespadocumentserializer.cpp b/document/src/vespa/document/serialization/vespadocumentserializer.cpp index b6a7dabd87d..2a2b642dd48 100644 --- a/document/src/vespa/document/serialization/vespadocumentserializer.cpp +++ b/document/src/vespa/document/serialization/vespadocumentserializer.cpp @@ -377,7 +377,7 @@ VespaDocumentSerializer::write(const FieldUpdate &value) void VespaDocumentSerializer::write(const RemoveValueUpdate &value) { - _stream << RemoveValueUpdate::classId; + _stream << uint32_t(ValueUpdate::Remove); write(value.getKey()); } @@ -385,7 +385,7 @@ VespaDocumentSerializer::write(const RemoveValueUpdate &value) void VespaDocumentSerializer::write(const AddValueUpdate &value) { - _stream << AddValueUpdate::classId; + _stream << uint32_t(ValueUpdate::Add); write(value.getValue()); _stream << static_cast<int32_t>(value.getWeight()); } @@ -393,7 +393,7 @@ VespaDocumentSerializer::write(const AddValueUpdate &value) void VespaDocumentSerializer::write(const ArithmeticValueUpdate &value) { - _stream << ArithmeticValueUpdate::classId; + _stream << uint32_t(ValueUpdate::Arithmetic); _stream << static_cast<uint32_t>(value.getOperator()); _stream << static_cast<double>(value.getOperand()); } @@ -401,7 +401,7 @@ VespaDocumentSerializer::write(const ArithmeticValueUpdate &value) void VespaDocumentSerializer::write(const AssignValueUpdate &value) { - _stream << AssignValueUpdate::classId; + _stream << uint32_t(ValueUpdate::Assign); if (value.hasValue()) { _stream << static_cast<uint8_t>(CONTENT_HASVALUE); write(value.getValue()); @@ -414,12 +414,12 @@ void VespaDocumentSerializer::write(const ClearValueUpdate &value) { (void) value; - _stream << ClearValueUpdate::classId; + _stream << uint32_t(ValueUpdate::Clear); } void VespaDocumentSerializer::write(const MapValueUpdate &value) { - _stream << MapValueUpdate::classId; + _stream << uint32_t(ValueUpdate::Map); write(value.getKey()); write(value.getUpdate()); } @@ -479,7 +479,7 @@ VespaDocumentSerializer::write(const RemoveFieldPathUpdate &value) void VespaDocumentSerializer::write(const TensorModifyUpdate &value) { - _stream << TensorModifyUpdate::classId; + _stream << uint32_t(ValueUpdate::TensorModify); _stream << static_cast<uint8_t>(value.getOperation()); write(value.getTensor()); } @@ -493,7 +493,7 @@ VespaDocumentSerializer::visit(const TensorModifyUpdate &value) void VespaDocumentSerializer::write(const TensorAddUpdate &value) { - _stream << TensorAddUpdate::classId; + _stream << uint32_t(ValueUpdate::TensorAdd); write(value.getTensor()); } @@ -506,7 +506,7 @@ VespaDocumentSerializer::visit(const TensorAddUpdate &value) void VespaDocumentSerializer::write(const TensorRemoveUpdate &value) { - _stream << TensorRemoveUpdate::classId; + _stream << uint32_t(ValueUpdate::TensorRemove); write(value.getTensor()); } diff --git a/document/src/vespa/document/update/addvalueupdate.cpp b/document/src/vespa/document/update/addvalueupdate.cpp index 6f6c9a93738..102f8ceebbe 100644 --- a/document/src/vespa/document/update/addvalueupdate.cpp +++ b/document/src/vespa/document/update/addvalueupdate.cpp @@ -17,19 +17,19 @@ using namespace vespalib::xml; namespace document { -IMPLEMENT_IDENTIFIABLE(AddValueUpdate, ValueUpdate); -AddValueUpdate:: AddValueUpdate(const FieldValue& value, int weight) - : ValueUpdate(), - _value(value.clone()), +AddValueUpdate:: AddValueUpdate(std::unique_ptr<FieldValue> value, int weight) + : ValueUpdate(Add), + _value(std::move(value)), _weight(weight) {} AddValueUpdate::~AddValueUpdate() = default; + bool AddValueUpdate::operator==(const ValueUpdate& other) const { - if (other.getClass().id() != AddValueUpdate::classId) return false; + if (other.getType() != Add) return false; const AddValueUpdate& o(static_cast<const AddValueUpdate&>(other)); if (*_value != *o._value) return false; if (_weight != o._weight) return false; diff --git a/document/src/vespa/document/update/addvalueupdate.h b/document/src/vespa/document/update/addvalueupdate.h index ee7f6fbcdf2..f891c368f96 100644 --- a/document/src/vespa/document/update/addvalueupdate.h +++ b/document/src/vespa/document/update/addvalueupdate.h @@ -12,25 +12,25 @@ namespace document { -class AddValueUpdate : public ValueUpdate { - FieldValue::CP _value; // The field value to add by this update. +class AddValueUpdate final : public ValueUpdate { + std::unique_ptr<FieldValue> _value; // The field value to add by this update. int _weight; // The weight to assign to the contained value. // Used by ValueUpdate's static factory function // Private because it generates an invalid object. friend class ValueUpdate; - AddValueUpdate() : ValueUpdate(), _value(0), _weight(1) {} + AddValueUpdate() : ValueUpdate(Add), _value(), _weight(1) {} ACCEPT_UPDATE_VISITOR; public: - typedef std::unique_ptr<AddValueUpdate> UP; - /** * The default constructor requires initial values for all member variables. * * @param value The field value to add. * @param weight The weight for the field value. */ - AddValueUpdate(const FieldValue& value, int weight = 1); + AddValueUpdate(std::unique_ptr<FieldValue> value, int weight = 1); + AddValueUpdate(const AddValueUpdate &) = delete; + AddValueUpdate & operator =(const AddValueUpdate &) = delete; ~AddValueUpdate(); bool operator==(const ValueUpdate& other) const override; @@ -42,17 +42,6 @@ public: int getWeight() const { return _weight; } /** - * Sets the field value to add during this update. - * - * @param value The new field value. - * @return A reference to this object so you can chain calls. - */ - AddValueUpdate& setValue(const FieldValue& value) { - _value.reset(value.clone()); - return *this; - } - - /** * Sets the weight to assign to the value of this. * * @return A reference to this object so you can chain calls. @@ -67,8 +56,6 @@ public: void printXml(XmlOutputStream& xos) const override; void print(std::ostream& out, bool verbose, const std::string& indent) const override; void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream & buffer) override; - - DECLARE_IDENTIFIABLE(AddValueUpdate); }; } // document diff --git a/document/src/vespa/document/update/arithmeticvalueupdate.cpp b/document/src/vespa/document/update/arithmeticvalueupdate.cpp index e5fb5aee8af..06f90d59d85 100644 --- a/document/src/vespa/document/update/arithmeticvalueupdate.cpp +++ b/document/src/vespa/document/update/arithmeticvalueupdate.cpp @@ -12,8 +12,6 @@ using namespace vespalib::xml; namespace document { -IMPLEMENT_IDENTIFIABLE(ArithmeticValueUpdate, ValueUpdate); - // Declare string representations for operator names. static const char * operatorName[] = { "add", "div", "mul", "sub" }; static const char * operatorNameC[] = { "Add", "Div", "Mul", "Sub" }; @@ -21,7 +19,7 @@ static const char * operatorNameC[] = { "Add", "Div", "Mul", "Sub" }; bool ArithmeticValueUpdate::operator==(const ValueUpdate& other) const { - if (other.getClass().id() != ArithmeticValueUpdate::classId) return false; + if (other.getType() != Arithmetic) return false; const ArithmeticValueUpdate& o(static_cast<const ArithmeticValueUpdate&>(other)); if (_operator != o._operator) return false; if (_operand != o._operand) return false; diff --git a/document/src/vespa/document/update/arithmeticvalueupdate.h b/document/src/vespa/document/update/arithmeticvalueupdate.h index cb86528fce5..7651c838458 100644 --- a/document/src/vespa/document/update/arithmeticvalueupdate.h +++ b/document/src/vespa/document/update/arithmeticvalueupdate.h @@ -12,7 +12,7 @@ namespace document { -class ArithmeticValueUpdate : public ValueUpdate { +class ArithmeticValueUpdate final : public ValueUpdate { public: /** Declare all types of arithmetic value updates. */ enum Operator { @@ -25,13 +25,13 @@ public: private: Operator _operator; // The operator of the arithmetic operation. - double _operand; // The operand of the arithmetic operation. + double _operand; // The operand of the arithmetic operation. // Used by ValueUpdate's static factory function // Private because it generates an invalid object. friend class ValueUpdate; ArithmeticValueUpdate() - : ValueUpdate(), + : ValueUpdate(Arithmetic), _operator(MAX_NUM_OPERATORS), _operand(0.0) {} @@ -46,16 +46,12 @@ public: * @param opn The operand for the operation. */ ArithmeticValueUpdate(Operator opt, double opn) - : ValueUpdate(), + : ValueUpdate(Arithmetic), _operator(opt), _operand(opn) {} - ArithmeticValueUpdate(const ArithmeticValueUpdate& update) - : ValueUpdate(update), - _operator(update._operator), - _operand(update._operand) {} - - ArithmeticValueUpdate &operator=(const ArithmeticValueUpdate &rhs) = default; + ArithmeticValueUpdate(const ArithmeticValueUpdate& update) = delete; + ArithmeticValueUpdate &operator=(const ArithmeticValueUpdate &rhs) = delete; bool operator==(const ValueUpdate& other) const override; @@ -91,8 +87,6 @@ public: void printXml(XmlOutputStream& xos) const override; void print(std::ostream& out, bool verbose, const std::string& indent) const override; void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream & buffer) override; - - DECLARE_IDENTIFIABLE(ArithmeticValueUpdate); }; } // document diff --git a/document/src/vespa/document/update/assignvalueupdate.cpp b/document/src/vespa/document/update/assignvalueupdate.cpp index cf2321dbf56..32bded8cfd7 100644 --- a/document/src/vespa/document/update/assignvalueupdate.cpp +++ b/document/src/vespa/document/update/assignvalueupdate.cpp @@ -16,13 +16,14 @@ using namespace vespalib::xml; namespace document { -IMPLEMENT_IDENTIFIABLE(AssignValueUpdate, ValueUpdate); +AssignValueUpdate::AssignValueUpdate() + : ValueUpdate(Assign), + _value() +{} -AssignValueUpdate::AssignValueUpdate() = default; - -AssignValueUpdate::AssignValueUpdate(const FieldValue& value) - : ValueUpdate(), - _value(value.clone()) +AssignValueUpdate::AssignValueUpdate(std::unique_ptr<FieldValue> value) + : ValueUpdate(Assign), + _value(std::move(value)) { } AssignValueUpdate::~AssignValueUpdate() = default; @@ -33,9 +34,13 @@ static const unsigned char CONTENT_HASVALUE = 0x01; bool AssignValueUpdate::operator==(const ValueUpdate& other) const { - if (other.getClass().id() != AssignValueUpdate::classId) return false; + if (other.getType() != Assign) return false; const AssignValueUpdate& o(static_cast<const AssignValueUpdate&>(other)); - return _value == o._value; + if (_value && o._value) { + return *_value == *o._value; + } else { + return bool(_value) == bool(o._value); + } } // Ensure that this update is compatible with given field. diff --git a/document/src/vespa/document/update/assignvalueupdate.h b/document/src/vespa/document/update/assignvalueupdate.h index e829e80da45..071dcc2236d 100644 --- a/document/src/vespa/document/update/assignvalueupdate.h +++ b/document/src/vespa/document/update/assignvalueupdate.h @@ -16,16 +16,15 @@ namespace document { -class AssignValueUpdate : public ValueUpdate { - FieldValue::CP _value; +class AssignValueUpdate final : public ValueUpdate { + std::unique_ptr<FieldValue> _value; ACCEPT_UPDATE_VISITOR; public: - typedef std::unique_ptr<AssignValueUpdate> UP; - AssignValueUpdate(); - - AssignValueUpdate(const FieldValue& value); + explicit AssignValueUpdate(std::unique_ptr<FieldValue> value); + AssignValueUpdate(const AssignValueUpdate& value) = delete; + AssignValueUpdate & operator=(const AssignValueUpdate& value) = delete; ~AssignValueUpdate() override; bool operator==(const ValueUpdate& other) const override; @@ -43,8 +42,6 @@ public: void printXml(XmlOutputStream& xos) const override; void print(std::ostream& out, bool verbose, const std::string& indent) const override; void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream & buffer) override; - - DECLARE_IDENTIFIABLE(AssignValueUpdate); }; } diff --git a/document/src/vespa/document/update/clearvalueupdate.cpp b/document/src/vespa/document/update/clearvalueupdate.cpp index 17d7660219b..357ca8162c6 100644 --- a/document/src/vespa/document/update/clearvalueupdate.cpp +++ b/document/src/vespa/document/update/clearvalueupdate.cpp @@ -8,12 +8,10 @@ using namespace vespalib::xml; namespace document { -IMPLEMENT_IDENTIFIABLE(ClearValueUpdate, ValueUpdate); - bool ClearValueUpdate::operator==(const ValueUpdate& other) const { - return (other.getClass().id() == ClearValueUpdate::classId); + return (other.getType() == Clear); } // Ensure that this update is compatible with given field. diff --git a/document/src/vespa/document/update/clearvalueupdate.h b/document/src/vespa/document/update/clearvalueupdate.h index 6e0d800dd73..770f0a91d07 100644 --- a/document/src/vespa/document/update/clearvalueupdate.h +++ b/document/src/vespa/document/update/clearvalueupdate.h @@ -11,13 +11,12 @@ namespace document { -class ClearValueUpdate : public ValueUpdate { +class ClearValueUpdate final : public ValueUpdate { ACCEPT_UPDATE_VISITOR; public: - typedef std::unique_ptr<ClearValueUpdate> UP; - ClearValueUpdate() : ValueUpdate() {} - ClearValueUpdate(const ClearValueUpdate& update) : ValueUpdate(update) {} - ClearValueUpdate &operator=(const ClearValueUpdate &rhs) = default; + ClearValueUpdate(const ClearValueUpdate& update) = delete; + ClearValueUpdate &operator=(const ClearValueUpdate &rhs) = delete; + ClearValueUpdate() : ValueUpdate(Clear) {} bool operator==(const ValueUpdate& other) const override; void checkCompatibility(const Field& field) const override; @@ -25,8 +24,6 @@ public: void printXml(XmlOutputStream& xos) const override; void print(std::ostream& out, bool verbose, const std::string& indent) const override; void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream& buffer) override; - - DECLARE_IDENTIFIABLE(ClearValueUpdate); }; } diff --git a/document/src/vespa/document/update/mapvalueupdate.cpp b/document/src/vespa/document/update/mapvalueupdate.cpp index c3d9cff571b..47346133e17 100644 --- a/document/src/vespa/document/update/mapvalueupdate.cpp +++ b/document/src/vespa/document/update/mapvalueupdate.cpp @@ -16,32 +16,18 @@ using namespace vespalib::xml; namespace document { -IMPLEMENT_IDENTIFIABLE(MapValueUpdate, ValueUpdate); - -MapValueUpdate::MapValueUpdate(const FieldValue& key, std::unique_ptr<ValueUpdate> update) - : ValueUpdate(), - _key(key.clone()), +MapValueUpdate::MapValueUpdate(std::unique_ptr<FieldValue> key, std::unique_ptr<ValueUpdate> update) + : ValueUpdate(Map), + _key(std::move(key)), _update(std::move(update)) {} -MapValueUpdate::MapValueUpdate(const MapValueUpdate &) - : ValueUpdate(), - _key(), - _update() -{ - abort(); // TODO Will never be called, remove -} -MapValueUpdate & -MapValueUpdate::operator = (const MapValueUpdate &) { - abort(); // TODO Will never be called, remove - return *this; -} MapValueUpdate::~MapValueUpdate() = default; bool MapValueUpdate::operator==(const ValueUpdate& other) const { - if (other.getClass().id() != MapValueUpdate::classId) return false; + if (other.getType() != Map) return false; const MapValueUpdate& o(static_cast<const MapValueUpdate&>(other)); if (*_key != *o._key) return false; if (*_update != *o._update) return false; diff --git a/document/src/vespa/document/update/mapvalueupdate.h b/document/src/vespa/document/update/mapvalueupdate.h index 722255dd8d6..dfbb880f422 100644 --- a/document/src/vespa/document/update/mapvalueupdate.h +++ b/document/src/vespa/document/update/mapvalueupdate.h @@ -16,7 +16,7 @@ namespace document { -class MapValueUpdate : public ValueUpdate { +class MapValueUpdate final : public ValueUpdate { public: /** @@ -26,9 +26,9 @@ public: * @param key The identifier of the field value to be updated. * @param update The update to map to apply to the field value of this. */ - MapValueUpdate(const FieldValue& key, std::unique_ptr<ValueUpdate> update); - MapValueUpdate(const MapValueUpdate &); - MapValueUpdate & operator = (const MapValueUpdate &); + MapValueUpdate(std::unique_ptr<FieldValue> key, std::unique_ptr<ValueUpdate> update); + MapValueUpdate(const MapValueUpdate &) = delete; + MapValueUpdate & operator = (const MapValueUpdate &) = delete; MapValueUpdate(MapValueUpdate &&) = default; MapValueUpdate & operator = (MapValueUpdate &&) = default; @@ -59,7 +59,6 @@ public: void print(std::ostream& out, bool verbose, const std::string& indent) const override; void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream& buffer) override; - DECLARE_IDENTIFIABLE(MapValueUpdate); private: std::unique_ptr<FieldValue> _key; // The field value this update is mapping to. std::unique_ptr<ValueUpdate> _update; //The update to apply to the value member of this. @@ -67,7 +66,7 @@ private: // Used by ValueUpdate's static factory function // Private because it generates an invalid object. friend class ValueUpdate; - MapValueUpdate() : ValueUpdate(), _key(), _update() {} + MapValueUpdate() : ValueUpdate(Map), _key(), _update() {} ACCEPT_UPDATE_VISITOR; }; diff --git a/document/src/vespa/document/update/removevalueupdate.cpp b/document/src/vespa/document/update/removevalueupdate.cpp index a61553da4d1..3c381148e94 100644 --- a/document/src/vespa/document/update/removevalueupdate.cpp +++ b/document/src/vespa/document/update/removevalueupdate.cpp @@ -16,11 +16,9 @@ using namespace vespalib::xml; namespace document { -IMPLEMENT_IDENTIFIABLE(RemoveValueUpdate, ValueUpdate); - -RemoveValueUpdate::RemoveValueUpdate(const FieldValue& key) - : ValueUpdate(), - _key(key.clone()) +RemoveValueUpdate::RemoveValueUpdate(std::unique_ptr<FieldValue> key) + : ValueUpdate(Remove), + _key(std::move(key)) {} RemoveValueUpdate::~RemoveValueUpdate() = default; @@ -28,7 +26,7 @@ RemoveValueUpdate::~RemoveValueUpdate() = default; bool RemoveValueUpdate::operator==(const ValueUpdate& other) const { - if (other.getClass().id() != RemoveValueUpdate::classId) return false; + if (other.getType() != Remove) return false; const RemoveValueUpdate& o(static_cast<const RemoveValueUpdate&>(other)); if (*_key != *o._key) return false; return true; diff --git a/document/src/vespa/document/update/removevalueupdate.h b/document/src/vespa/document/update/removevalueupdate.h index 0eea8f69da7..02f8204de23 100644 --- a/document/src/vespa/document/update/removevalueupdate.h +++ b/document/src/vespa/document/update/removevalueupdate.h @@ -10,22 +10,22 @@ namespace document { -class RemoveValueUpdate : public ValueUpdate { - FieldValue::CP _key; // The field value to remove by this update. +class RemoveValueUpdate final : public ValueUpdate { + std::unique_ptr<FieldValue> _key; // The field value to remove by this update. - RemoveValueUpdate() : ValueUpdate(), _key() {} ACCEPT_UPDATE_VISITOR; - + friend ValueUpdate; + RemoveValueUpdate() : ValueUpdate(Remove), _key() {} public: - typedef std::unique_ptr<RemoveValueUpdate> UP; - /** * The default constructor requires initial values for all member variables. * * @param value The identifier of the field value to update. */ - RemoveValueUpdate(const FieldValue& key); - ~RemoveValueUpdate(); + explicit RemoveValueUpdate(std::unique_ptr<FieldValue> key); + RemoveValueUpdate(const RemoveValueUpdate &) = delete; + RemoveValueUpdate & operator=(const RemoveValueUpdate &) = delete; + ~RemoveValueUpdate() override; bool operator==(const ValueUpdate& other) const override; @@ -40,9 +40,6 @@ public: void printXml(XmlOutputStream& xos) const override; void print(std::ostream& out, bool verbose, const std::string& indent) const override; void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream& buffer) override; - - DECLARE_IDENTIFIABLE(RemoveValueUpdate); - }; } diff --git a/document/src/vespa/document/update/tensor_add_update.cpp b/document/src/vespa/document/update/tensor_add_update.cpp index 2d6b6e1d658..4110a94693f 100644 --- a/document/src/vespa/document/update/tensor_add_update.cpp +++ b/document/src/vespa/document/update/tensor_add_update.cpp @@ -22,43 +22,26 @@ using vespalib::eval::FastValueBuilderFactory; namespace document { -IMPLEMENT_IDENTIFIABLE(TensorAddUpdate, ValueUpdate); - TensorAddUpdate::TensorAddUpdate() - : _tensor() + : ValueUpdate(TensorAdd), + TensorUpdate(), + _tensor() { } -TensorAddUpdate::TensorAddUpdate(const TensorAddUpdate &rhs) - : _tensor(rhs._tensor->clone()) -{ -} - -TensorAddUpdate::TensorAddUpdate(std::unique_ptr<TensorFieldValue> &&tensor) - : _tensor(std::move(tensor)) +TensorAddUpdate::TensorAddUpdate(std::unique_ptr<TensorFieldValue> tensor) + : ValueUpdate(TensorAdd), + TensorUpdate(), + _tensor(std::move(tensor)) { } TensorAddUpdate::~TensorAddUpdate() = default; -TensorAddUpdate & -TensorAddUpdate::operator=(const TensorAddUpdate &rhs) -{ - _tensor.reset(rhs._tensor->clone()); - return *this; -} - -TensorAddUpdate & -TensorAddUpdate::operator=(TensorAddUpdate &&rhs) -{ - _tensor = std::move(rhs._tensor); - return *this; -} - bool TensorAddUpdate::operator==(const ValueUpdate &other) const { - if (other.getClass().id() != TensorAddUpdate::classId) { + if (other.getType() != TensorAdd) { return false; } const TensorAddUpdate& o(static_cast<const TensorAddUpdate&>(other)); diff --git a/document/src/vespa/document/update/tensor_add_update.h b/document/src/vespa/document/update/tensor_add_update.h index 7f2228bff41..20e231b4294 100644 --- a/document/src/vespa/document/update/tensor_add_update.h +++ b/document/src/vespa/document/update/tensor_add_update.h @@ -14,17 +14,17 @@ class TensorFieldValue; * * The cells to add are contained in a tensor of the same type. */ -class TensorAddUpdate : public ValueUpdate, public TensorUpdate { +class TensorAddUpdate final : public ValueUpdate, public TensorUpdate { std::unique_ptr<TensorFieldValue> _tensor; + friend ValueUpdate; TensorAddUpdate(); - TensorAddUpdate(const TensorAddUpdate &rhs); ACCEPT_UPDATE_VISITOR; public: - TensorAddUpdate(std::unique_ptr<TensorFieldValue> &&tensor); + explicit TensorAddUpdate(std::unique_ptr<TensorFieldValue> tensor); + TensorAddUpdate(const TensorAddUpdate &rhs) = delete; + TensorAddUpdate &operator=(const TensorAddUpdate &rhs) = delete; ~TensorAddUpdate() override; - TensorAddUpdate &operator=(const TensorAddUpdate &rhs); - TensorAddUpdate &operator=(TensorAddUpdate &&rhs); bool operator==(const ValueUpdate &other) const override; const TensorFieldValue &getTensor() const { return *_tensor; } void checkCompatibility(const Field &field) const override; @@ -35,8 +35,6 @@ public: void printXml(XmlOutputStream &xos) const override; void print(std::ostream &out, bool verbose, const std::string &indent) const override; void deserialize(const DocumentTypeRepo &repo, const DataType &type, nbostream &stream) override; - - DECLARE_IDENTIFIABLE(TensorAddUpdate); }; } diff --git a/document/src/vespa/document/update/tensor_modify_update.cpp b/document/src/vespa/document/update/tensor_modify_update.cpp index 77fd5059b0c..92b2a8672c3 100644 --- a/document/src/vespa/document/update/tensor_modify_update.cpp +++ b/document/src/vespa/document/update/tensor_modify_update.cpp @@ -82,25 +82,19 @@ convertToCompatibleType(const TensorDataType &tensorType) } -IMPLEMENT_IDENTIFIABLE(TensorModifyUpdate, ValueUpdate); - TensorModifyUpdate::TensorModifyUpdate() - : _operation(Operation::MAX_NUM_OPERATIONS), + : ValueUpdate(TensorModify), + TensorUpdate(), + _operation(Operation::MAX_NUM_OPERATIONS), _tensorType(), _tensor() { } -TensorModifyUpdate::TensorModifyUpdate(const TensorModifyUpdate &rhs) - : _operation(rhs._operation), - _tensorType(std::make_unique<TensorDataType>(*rhs._tensorType)), - _tensor(static_cast<TensorFieldValue *>(_tensorType->createFieldValue().release())) -{ - *_tensor = *rhs._tensor; -} - TensorModifyUpdate::TensorModifyUpdate(Operation operation, std::unique_ptr<TensorFieldValue> tensor) - : _operation(operation), + : ValueUpdate(TensorModify), + TensorUpdate(), + _operation(operation), _tensorType(std::make_unique<TensorDataType>(dynamic_cast<const TensorDataType &>(*tensor->getDataType()))), _tensor(static_cast<TensorFieldValue *>(_tensorType->createFieldValue().release())) { @@ -109,32 +103,10 @@ TensorModifyUpdate::TensorModifyUpdate(Operation operation, std::unique_ptr<Tens TensorModifyUpdate::~TensorModifyUpdate() = default; -TensorModifyUpdate & -TensorModifyUpdate::operator=(const TensorModifyUpdate &rhs) -{ - if (&rhs != this) { - _operation = rhs._operation; - _tensor.reset(); - _tensorType = std::make_unique<TensorDataType>(*rhs._tensorType); - _tensor.reset(dynamic_cast<TensorFieldValue *>(_tensorType->createFieldValue().release())); - *_tensor = *rhs._tensor; - } - return *this; -} - -TensorModifyUpdate & -TensorModifyUpdate::operator=(TensorModifyUpdate &&rhs) -{ - _operation = rhs._operation; - _tensorType = std::move(rhs._tensorType); - _tensor = std::move(rhs._tensor); - return *this; -} - bool TensorModifyUpdate::operator==(const ValueUpdate &other) const { - if (other.getClass().id() != TensorModifyUpdate::classId) { + if (other.getType() != TensorModify) { return false; } const TensorModifyUpdate& o(static_cast<const TensorModifyUpdate&>(other)); diff --git a/document/src/vespa/document/update/tensor_modify_update.h b/document/src/vespa/document/update/tensor_modify_update.h index b6d339a36cf..9386b4f8a1b 100644 --- a/document/src/vespa/document/update/tensor_modify_update.h +++ b/document/src/vespa/document/update/tensor_modify_update.h @@ -16,7 +16,7 @@ class TensorFieldValue; * The operand is represented as a tensor field value containing a * mapped (aka sparse) tensor. */ -class TensorModifyUpdate : public ValueUpdate, public TensorUpdate { +class TensorModifyUpdate final : public ValueUpdate, public TensorUpdate { public: /** Declare all types of tensor modify updates. */ enum class Operation { // Operation to be applied to matching tensor cells @@ -30,14 +30,15 @@ private: std::unique_ptr<const TensorDataType> _tensorType; std::unique_ptr<TensorFieldValue> _tensor; + friend ValueUpdate; TensorModifyUpdate(); - TensorModifyUpdate(const TensorModifyUpdate &rhs); ACCEPT_UPDATE_VISITOR; public: TensorModifyUpdate(Operation operation, std::unique_ptr<TensorFieldValue> tensor); + TensorModifyUpdate(const TensorModifyUpdate &rhs) = delete; + TensorModifyUpdate &operator=(const TensorModifyUpdate &rhs) = delete; ~TensorModifyUpdate() override; - TensorModifyUpdate &operator=(const TensorModifyUpdate &rhs); - TensorModifyUpdate &operator=(TensorModifyUpdate &&rhs); + bool operator==(const ValueUpdate &other) const override; Operation getOperation() const { return _operation; } const TensorFieldValue &getTensor() const { return *_tensor; } @@ -49,8 +50,6 @@ public: void printXml(XmlOutputStream &xos) const override; void print(std::ostream &out, bool verbose, const std::string &indent) const override; void deserialize(const DocumentTypeRepo &repo, const DataType &type, nbostream &stream) override; - - DECLARE_IDENTIFIABLE(TensorModifyUpdate); }; } diff --git a/document/src/vespa/document/update/tensor_remove_update.cpp b/document/src/vespa/document/update/tensor_remove_update.cpp index 69b8b898ec5..25af29ce6b8 100644 --- a/document/src/vespa/document/update/tensor_remove_update.cpp +++ b/document/src/vespa/document/update/tensor_remove_update.cpp @@ -38,53 +38,28 @@ convertToCompatibleType(const TensorDataType &tensorType) } -IMPLEMENT_IDENTIFIABLE(TensorRemoveUpdate, ValueUpdate); - TensorRemoveUpdate::TensorRemoveUpdate() - : _tensorType(), + : ValueUpdate(TensorRemove), + TensorUpdate(), + _tensorType(), _tensor() { } -TensorRemoveUpdate::TensorRemoveUpdate(const TensorRemoveUpdate &rhs) - : _tensorType(std::make_unique<TensorDataType>(*rhs._tensorType)), - _tensor(rhs._tensor->clone()) -{ -} - TensorRemoveUpdate::TensorRemoveUpdate(std::unique_ptr<TensorFieldValue> tensor) - : _tensorType(std::make_unique<TensorDataType>(dynamic_cast<const TensorDataType &>(*tensor->getDataType()))), - _tensor(static_cast<TensorFieldValue *>(_tensorType->createFieldValue().release())) + : ValueUpdate(TensorRemove), + TensorUpdate(), + _tensorType(std::make_unique<TensorDataType>(dynamic_cast<const TensorDataType &>(*tensor->getDataType()))), + _tensor(std::move(tensor)) { - *_tensor = *tensor; } TensorRemoveUpdate::~TensorRemoveUpdate() = default; -TensorRemoveUpdate & -TensorRemoveUpdate::operator=(const TensorRemoveUpdate &rhs) -{ - if (&rhs != this) { - _tensor.reset(); - _tensorType = std::make_unique<TensorDataType>(*rhs._tensorType); - _tensor.reset(static_cast<TensorFieldValue *>(_tensorType->createFieldValue().release())); - *_tensor = *rhs._tensor; - } - return *this; -} - -TensorRemoveUpdate & -TensorRemoveUpdate::operator=(TensorRemoveUpdate &&rhs) -{ - _tensorType = std::move(rhs._tensorType); - _tensor = std::move(rhs._tensor); - return *this; -} - bool TensorRemoveUpdate::operator==(const ValueUpdate &other) const { - if (other.getClass().id() != TensorRemoveUpdate::classId) { + if (other.getType() != TensorRemove) { return false; } const TensorRemoveUpdate& o(static_cast<const TensorRemoveUpdate&>(other)); diff --git a/document/src/vespa/document/update/tensor_remove_update.h b/document/src/vespa/document/update/tensor_remove_update.h index 9b4ea17c4d9..ca908fc75fc 100644 --- a/document/src/vespa/document/update/tensor_remove_update.h +++ b/document/src/vespa/document/update/tensor_remove_update.h @@ -16,20 +16,20 @@ class TensorFieldValue; * The cells to remove are contained in a sparse tensor (with all mapped dimensions) where cell values are set to 1.0. * When used on a mixed tensor the entire dense sub-space (pointed to by a cell in the sparse tensor) is removed. */ -class TensorRemoveUpdate : public ValueUpdate, public TensorUpdate { +class TensorRemoveUpdate final : public ValueUpdate, public TensorUpdate { private: std::unique_ptr<const TensorDataType> _tensorType; std::unique_ptr<TensorFieldValue> _tensor; + friend ValueUpdate; TensorRemoveUpdate(); - TensorRemoveUpdate(const TensorRemoveUpdate &rhs); ACCEPT_UPDATE_VISITOR; public: - TensorRemoveUpdate(std::unique_ptr<TensorFieldValue> tensor); + explicit TensorRemoveUpdate(std::unique_ptr<TensorFieldValue> tensor); + TensorRemoveUpdate(const TensorRemoveUpdate &rhs) = delete; + TensorRemoveUpdate &operator=(const TensorRemoveUpdate &rhs) = delete; ~TensorRemoveUpdate() override; - TensorRemoveUpdate &operator=(const TensorRemoveUpdate &rhs); - TensorRemoveUpdate &operator=(TensorRemoveUpdate &&rhs); const TensorFieldValue &getTensor() const { return *_tensor; } std::unique_ptr<vespalib::eval::Value> applyTo(const vespalib::eval::Value &tensor) const; std::unique_ptr<Value> apply_to(const Value &tensor, @@ -40,8 +40,6 @@ public: void printXml(XmlOutputStream &xos) const override; void print(std::ostream &out, bool verbose, const std::string &indent) const override; void deserialize(const DocumentTypeRepo &repo, const DataType &type, nbostream &stream) override; - - DECLARE_IDENTIFIABLE(TensorRemoveUpdate); }; } diff --git a/document/src/vespa/document/update/valueupdate.cpp b/document/src/vespa/document/update/valueupdate.cpp index 8fc85e8858a..50866311518 100644 --- a/document/src/vespa/document/update/valueupdate.cpp +++ b/document/src/vespa/document/update/valueupdate.cpp @@ -1,12 +1,71 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "valueupdate.h" +#include "addvalueupdate.h" +#include "assignvalueupdate.h" +#include "arithmeticvalueupdate.h" +#include "clearvalueupdate.h" +#include "removevalueupdate.h" +#include "mapvalueupdate.h" +#include "tensor_add_update.h" +#include "tensor_modify_update.h" +#include "tensor_remove_update.h" #include <vespa/vespalib/util/stringfmt.h> #include <stdexcept> namespace document { -IMPLEMENT_IDENTIFIABLE_ABSTRACT(ValueUpdate, Identifiable); +const char * +ValueUpdate::className() const noexcept { + switch (getType()) { + case Add: + return "AddValueUpdate"; + case Assign: + return "AssignValueUpdate"; + case Arithmetic: + return "ArithmeticValueUpdate"; + case Clear: + return "ClearValueUpdate"; + case Remove: + return "RemoveValueUpdate"; + case Map: + return "MapValueUpdate"; + case TensorAdd: + return "TensorAddUpdate"; + case TensorModify: + return "TensorModifyUpdate"; + case TensorRemove: + return "TensorRemoveUpdate"; + default: + abort(); + } +} + +std::unique_ptr<ValueUpdate> +ValueUpdate::create(ValueUpdateType type) { + switch (type) { + case Add: + return std::unique_ptr<AddValueUpdate>(new AddValueUpdate()); + case Assign: + return std::make_unique<AssignValueUpdate>(); + case Arithmetic: + return std::unique_ptr<ArithmeticValueUpdate>(new ArithmeticValueUpdate()); + case Clear: + return std::make_unique<ClearValueUpdate>(); + case Remove: + return std::unique_ptr<RemoveValueUpdate>(new RemoveValueUpdate()); + case Map: + return std::unique_ptr<MapValueUpdate>( new MapValueUpdate()); + case TensorAdd: + return std::unique_ptr<TensorAddUpdate>( new TensorAddUpdate()); + case TensorModify: + return std::unique_ptr<TensorModifyUpdate>( new TensorModifyUpdate()); + case TensorRemove: + return std::unique_ptr<TensorRemoveUpdate>( new TensorRemoveUpdate()); + default: + throw std::runtime_error(vespalib::make_string("Could not find a class for classId %d(%x)", type, type)); + } +} std::unique_ptr<ValueUpdate> ValueUpdate::createInstance(const DocumentTypeRepo& repo, const DataType& type, nbostream & stream) @@ -14,16 +73,12 @@ ValueUpdate::createInstance(const DocumentTypeRepo& repo, const DataType& type, int32_t classId = 0; stream >> classId; - const Identifiable::RuntimeClass * rtc(Identifiable::classFromId(classId)); - if (rtc != nullptr) { - std::unique_ptr<ValueUpdate> update(static_cast<ValueUpdate*>(rtc->create())); - /// \todo TODO (was warning): Updates are not versioned in serialization format. Will not work without altering it. - /// Should also use the serializer, not this deserialize into self. - update->deserialize(repo, type, stream); - return update; - } else { - throw std::runtime_error(vespalib::make_string("Could not find a class for classId %d(%x)", classId, classId)); - } + std::unique_ptr<ValueUpdate> update = create(static_cast<ValueUpdateType>(classId)); + + /// \todo TODO (was warning): Updates are not versioned in serialization format. Will not work without altering it. + /// Should also use the serializer, not this deserialize into self. + update->deserialize(repo, type, stream); + return update; } std::ostream& diff --git a/document/src/vespa/document/update/valueupdate.h b/document/src/vespa/document/update/valueupdate.h index 0b52fe46ac9..c97de4d54e1 100644 --- a/document/src/vespa/document/update/valueupdate.h +++ b/document/src/vespa/document/update/valueupdate.h @@ -30,7 +30,7 @@ class Field; class FieldValue; class DataType; -class ValueUpdate : public vespalib::Identifiable +class ValueUpdate { protected: using nbostream = vespalib::nbostream; @@ -53,11 +53,12 @@ public: Clear = IDENTIFIABLE_CLASSID(ClearValueUpdate), Map = IDENTIFIABLE_CLASSID(MapValueUpdate), Remove = IDENTIFIABLE_CLASSID(RemoveValueUpdate), - TensorModifyUpdate = IDENTIFIABLE_CLASSID(TensorModifyUpdate), - TensorAddUpdate = IDENTIFIABLE_CLASSID(TensorAddUpdate), - TensorRemoveUpdate = IDENTIFIABLE_CLASSID(TensorRemoveUpdate) + TensorModify = IDENTIFIABLE_CLASSID(TensorModifyUpdate), + TensorAdd = IDENTIFIABLE_CLASSID(TensorAddUpdate), + TensorRemove = IDENTIFIABLE_CLASSID(TensorRemoveUpdate) }; + virtual ~ValueUpdate() = default; virtual bool operator==(const ValueUpdate&) const = 0; bool operator != (const ValueUpdate & rhs) const { return ! (*this == rhs); } @@ -85,10 +86,8 @@ public: virtual void deserialize(const DocumentTypeRepo& repo, const DataType& type, nbostream & stream) = 0; /** @return The operation type. */ - ValueUpdateType getType() const { - return static_cast<ValueUpdateType>(getClass().id()); - } - + ValueUpdateType getType() const noexcept { return _type; } + const char * className() const noexcept; /** * Visit this fieldvalue for double dispatch. */ @@ -96,8 +95,11 @@ public: virtual void print(std::ostream& out, bool verbose, const std::string& indent) const = 0; virtual void printXml(XmlOutputStream& out) const = 0; - - DECLARE_IDENTIFIABLE_ABSTRACT(ValueUpdate); +protected: + ValueUpdate(ValueUpdateType type) : _type(type) { } +private: + static std::unique_ptr<ValueUpdate> create(ValueUpdateType type); + ValueUpdateType _type; }; std::ostream& operator<<(std::ostream& out, const ValueUpdate & p); diff --git a/document/src/vespa/document/util/feed_reject_helper.cpp b/document/src/vespa/document/util/feed_reject_helper.cpp index a6829ec0c60..3dec889661b 100644 --- a/document/src/vespa/document/util/feed_reject_helper.cpp +++ b/document/src/vespa/document/util/feed_reject_helper.cpp @@ -17,8 +17,8 @@ FeedRejectHelper::mustReject(const document::ValueUpdate & valueUpdate) { using namespace document; switch (valueUpdate.getType()) { case ValueUpdate::Add: - case ValueUpdate::TensorAddUpdate: - case ValueUpdate::TensorModifyUpdate: + case ValueUpdate::TensorAdd: + case ValueUpdate::TensorModify: case ValueUpdate::Map: return true; case ValueUpdate::Assign: { diff --git a/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp b/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp index 2a5b4b48cfa..6f05a1a7b79 100644 --- a/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp +++ b/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp @@ -29,6 +29,9 @@ using document::BucketId; using document::BucketSpace; using document::test::makeBucketSpace; +using document::FieldUpdate; +using document::AssignValueUpdate; +using document::IntFieldValue; using storage::spi::test::makeSpiBucket; using storage::spi::test::cloneDocEntry; @@ -92,11 +95,7 @@ createClusterState(const lib::State& nodeState = lib::State::UP) storage::lib::ClusterState cstate; StorDistributionConfigBuilder dc; - cstate.setNodeState(Node(NodeType::STORAGE, 0), - NodeState(NodeType::STORAGE, - nodeState, - "dummy desc", - 1.0)); + cstate.setNodeState(Node(NodeType::STORAGE, 0), NodeState(NodeType::STORAGE, nodeState, "dummy desc", 1.0)); cstate.setClusterState(State::UP); dc.redundancy = 1; dc.readyCopies = 1; @@ -120,8 +119,7 @@ struct DocAndTimestamp DocAndTimestamp(const Document::SP& docptr, spi::Timestamp ts) : doc(docptr), timestamp(ts) - { - } + { } }; /** @@ -135,9 +133,7 @@ struct Chunk struct DocEntryIndirectTimestampComparator { - bool operator()(const DocEntry::UP& e1, - const DocEntry::UP& e2) const - { + bool operator()(const DocEntry::UP& e1, const DocEntry::UP& e2) const { return e1->getTimestamp() < e2->getTimestamp(); } }; @@ -210,12 +206,7 @@ iterateBucket(PersistenceProvider& spi, Selection sel(docSel); Context context(Priority(0), Trace::TraceLevel(0)); - CreateIteratorResult iter = spi.createIterator( - bucket, - std::make_shared<document::AllFields>(), - sel, - versions, - context); + CreateIteratorResult iter = spi.createIterator(bucket, std::make_shared<document::AllFields>(), sel, versions, context); EXPECT_EQ(Result::ErrorType::NONE, iter.getErrorCode()); @@ -340,17 +331,9 @@ TEST_F(ConformanceTest, testBasics) Document::SP doc1 = testDocMan.createRandomDocumentAtLocation(0x01, 1); Document::SP doc2 = testDocMan.createRandomDocumentAtLocation(0x01, 2); spi->createBucket(bucket, context); - EXPECT_EQ( - Result(), - Result(spi->put(bucket, Timestamp(1), doc1, context))); - - EXPECT_EQ( - Result(), - Result(spi->put(bucket, Timestamp(2), doc2, context))); - - EXPECT_EQ( - Result(), - Result(spi->remove(bucket, Timestamp(3), doc1->getId(), context))); + EXPECT_EQ(Result(), Result(spi->put(bucket, Timestamp(1), doc1, context))); + EXPECT_EQ(Result(), Result(spi->put(bucket, Timestamp(2), doc2, context))); + EXPECT_EQ(Result(), Result(spi->remove(bucket, Timestamp(3), doc1->getId(), context))); // Iterate first without removes, then with. for (int iterPass = 0; iterPass < 2; ++iterPass) { @@ -369,9 +352,7 @@ TEST_F(ConformanceTest, testBasics) EXPECT_EQ(Result(), Result(iter)); - IterateResult result = - spi->iterate(iter.getIteratorId(), - std::numeric_limits<int64_t>().max(), context); + IterateResult result = spi->iterate(iter.getIteratorId(), std::numeric_limits<int64_t>().max(), context); EXPECT_EQ(Result(), Result(result)); EXPECT_TRUE(result.isCompleted()); @@ -614,8 +595,7 @@ TEST_F(ConformanceTest, testPutNewDocumentVersion) EXPECT_TRUE(info.getUsedSize() >= info.getDocumentSize()); } - GetResult gr = spi->get(bucket, document::AllFields(), doc1->getId(), - context); + GetResult gr = spi->get(bucket, document::AllFields(), doc1->getId(), context); EXPECT_EQ(Result::ErrorType::NONE, gr.getErrorCode()); EXPECT_EQ(Timestamp(4), gr.getTimestamp()); @@ -660,8 +640,7 @@ TEST_F(ConformanceTest, testPutOlderDocumentVersion) EXPECT_EQ(1, (int)info2.getDocumentCount()); EXPECT_TRUE(info2.getEntryCount() >= info1.getDocumentCount()); EXPECT_EQ(info1.getChecksum(), info2.getChecksum()); - EXPECT_EQ(info1.getDocumentSize(), - info2.getDocumentSize()); + EXPECT_EQ(info1.getDocumentSize(), info2.getDocumentSize()); EXPECT_TRUE(info2.getUsedSize() >= info1.getDocumentSize()); } @@ -907,10 +886,9 @@ TEST_F(ConformanceTest, testUpdate) Bucket bucket(makeSpiBucket(BucketId(8, 0x01))); spi->createBucket(bucket, context); - const document::DocumentType *docType( - testDocMan.getTypeRepo().getDocumentType("testdoctype1")); + const document::DocumentType *docType(testDocMan.getTypeRepo().getDocumentType("testdoctype1")); document::DocumentUpdate::SP update(new DocumentUpdate(testDocMan.getTypeRepo(), *docType, doc1->getId())); - update->addUpdate(document::FieldUpdate(docType->getField("headerval")).addUpdate(std::make_unique<document::AssignValueUpdate>(document::IntFieldValue(42)))); + update->addUpdate(FieldUpdate(docType->getField("headerval")).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(42)))); { UpdateResult result = spi->update(bucket, Timestamp(3), update, context); @@ -932,9 +910,7 @@ TEST_F(ConformanceTest, testUpdate) EXPECT_EQ(Result::ErrorType::NONE, result.getErrorCode()); EXPECT_EQ(Timestamp(4), result.getTimestamp()); EXPECT_FALSE(result.is_tombstone()); - EXPECT_EQ(document::IntFieldValue(42), - static_cast<document::IntFieldValue&>( - *result.getDocument().getValue("headerval"))); + EXPECT_EQ(IntFieldValue(42), static_cast<IntFieldValue&>(*result.getDocument().getValue("headerval"))); } spi->remove(bucket, Timestamp(5), doc1->getId(), context); @@ -977,9 +953,7 @@ TEST_F(ConformanceTest, testUpdate) EXPECT_EQ(Result::ErrorType::NONE, result.getErrorCode()); EXPECT_EQ(Timestamp(7), result.getTimestamp()); EXPECT_FALSE(result.is_tombstone()); - EXPECT_EQ(document::IntFieldValue(42), - reinterpret_cast<document::IntFieldValue&>( - *result.getDocument().getValue("headerval"))); + EXPECT_EQ(IntFieldValue(42), reinterpret_cast<IntFieldValue&>(*result.getDocument().getValue("headerval"))); } } @@ -995,8 +969,7 @@ TEST_F(ConformanceTest, testGet) spi->createBucket(bucket, context); { - GetResult result = spi->get(bucket, document::AllFields(), - doc1->getId(), context); + GetResult result = spi->get(bucket, document::AllFields(), doc1->getId(), context); EXPECT_EQ(Result::ErrorType::NONE, result.getErrorCode()); EXPECT_EQ(Timestamp(0), result.getTimestamp()); @@ -1006,8 +979,7 @@ TEST_F(ConformanceTest, testGet) spi->put(bucket, Timestamp(3), doc1, context); { - GetResult result = spi->get(bucket, document::AllFields(), - doc1->getId(), context); + GetResult result = spi->get(bucket, document::AllFields(), doc1->getId(), context); EXPECT_EQ(*doc1, result.getDocument()); EXPECT_EQ(Timestamp(3), result.getTimestamp()); EXPECT_FALSE(result.is_tombstone()); @@ -1016,8 +988,7 @@ TEST_F(ConformanceTest, testGet) spi->remove(bucket, Timestamp(4), doc1->getId(), context); { - GetResult result = spi->get(bucket, document::AllFields(), - doc1->getId(), context); + GetResult result = spi->get(bucket, document::AllFields(), doc1->getId(), context); EXPECT_EQ(Result::ErrorType::NONE, result.getErrorCode()); EXPECT_EQ(Timestamp(4), result.getTimestamp()); @@ -1035,8 +1006,7 @@ TEST_F(ConformanceTest, testIterateCreateIterator) Bucket b(makeSpiBucket(BucketId(8, 0x1))); spi->createBucket(b, context); - spi::CreateIteratorResult result( - createIterator(*spi, b, createSelection(""))); + spi::CreateIteratorResult result(createIterator(*spi, b, createSelection(""))); EXPECT_EQ(Result::ErrorType::NONE, result.getErrorCode()); // Iterator ID 0 means invalid iterator, so cannot be returned // from a successful createIterator call. @@ -1075,8 +1045,7 @@ TEST_F(ConformanceTest, testIterateDestroyIterator) } { - Result destroyResult( - spi->destroyIterator(iter.getIteratorId(), context)); + Result destroyResult(spi->destroyIterator(iter.getIteratorId(), context)); EXPECT_TRUE(!destroyResult.hasError()); } // Iteration should now fail @@ -1085,8 +1054,7 @@ TEST_F(ConformanceTest, testIterateDestroyIterator) EXPECT_EQ(Result::ErrorType::PERMANENT_ERROR, result.getErrorCode()); } { - Result destroyResult( - spi->destroyIterator(iter.getIteratorId(), context)); + Result destroyResult(spi->destroyIterator(iter.getIteratorId(), context)); EXPECT_TRUE(!destroyResult.hasError()); } } @@ -1124,7 +1092,7 @@ TEST_F(ConformanceTest, testIterateAllDocsNewestVersionOnly) for (size_t i = 0; i < docs.size(); ++i) { Document::SP newDoc(docs[i].doc->clone()); Timestamp newTimestamp(2000 + i); - newDoc->setValue("headerval", document::IntFieldValue(5678 + i)); + newDoc->setValue("headerval", IntFieldValue(5678 + i)); spi->put(b, newTimestamp, newDoc, context); newDocs.push_back(DocAndTimestamp(newDoc, newTimestamp)); } @@ -1166,8 +1134,7 @@ TEST_F(ConformanceTest, testMaxByteSize) Bucket b(makeSpiBucket(BucketId(8, 0x1))); spi->createBucket(b, context); - std::vector<DocAndTimestamp> docs( - feedDocs(*spi, testDocMan, b, 100, 4_Ki, 4096)); + std::vector<DocAndTimestamp> docs(feedDocs(*spi, testDocMan, b, 100, 4_Ki, 4096)); Selection sel(createSelection("")); CreateIteratorResult iter(createIterator(*spi, b, sel)); @@ -1198,14 +1165,11 @@ TEST_F(ConformanceTest, testIterateMatchTimestampRange) for (uint32_t i = 0; i < 99; i++) { Timestamp timestamp(1000 + i); - document::Document::SP doc( - testDocMan.createRandomDocumentAtLocation( - 1, timestamp, 110, 110)); + document::Document::SP doc(testDocMan.createRandomDocumentAtLocation(1, timestamp, 110, 110)); spi->put(b, timestamp, doc, context); if (timestamp >= fromTimestamp && timestamp <= toTimestamp) { - docsToVisit.push_back( - DocAndTimestamp(doc, Timestamp(1000 + i))); + docsToVisit.push_back(DocAndTimestamp(doc, Timestamp(1000 + i))); } } @@ -1236,14 +1200,11 @@ TEST_F(ConformanceTest, testIterateExplicitTimestampSubset) for (uint32_t i = 0; i < 99; i++) { Timestamp timestamp(1000 + i); - document::Document::SP doc( - testDocMan.createRandomDocumentAtLocation( - 1, timestamp, 110, 110)); + document::Document::SP doc(testDocMan.createRandomDocumentAtLocation(1, timestamp, 110, 110)); spi->put(b, timestamp, doc, context); if (timestamp % 3 == 0) { - docsToVisit.push_back( - DocAndTimestamp(doc, Timestamp(1000 + i))); + docsToVisit.push_back(DocAndTimestamp(doc, Timestamp(1000 + i))); timestampsToVisit.push_back(Timestamp(timestamp)); } } @@ -1332,9 +1293,8 @@ TEST_F(ConformanceTest, testIterateMatchSelection) std::vector<DocAndTimestamp> docsToVisit; for (uint32_t i = 0; i < 99; i++) { - document::Document::SP doc(testDocMan.createRandomDocumentAtLocation( - 1, 1000 + i, 110, 110)); - doc->setValue("headerval", document::IntFieldValue(i)); + document::Document::SP doc(testDocMan.createRandomDocumentAtLocation(1, 1000 + i, 110, 110)); + doc->setValue("headerval", IntFieldValue(i)); spi->put(b, Timestamp(1000 + i), doc, context); if ((i % 3) == 0) { @@ -1503,10 +1463,7 @@ testDeleteBucketPostCondition(const PersistenceProvider &spi, { Context context(Priority(0), Trace::TraceLevel(0)); { - GetResult result = spi.get(bucket, - document::AllFields(), - doc1.getId(), - context); + GetResult result = spi.get(bucket, document::AllFields(), doc1.getId(), context); EXPECT_EQ(Result::ErrorType::NONE, result.getErrorCode()); EXPECT_EQ(Timestamp(0), result.getTimestamp()); @@ -1633,31 +1590,23 @@ testSplitTargetExistsPostCondition(const PersistenceProvider &spi, const Bucket &bucketC, document::TestDocMan &testDocMan) { - EXPECT_EQ(10, (int)spi.getBucketInfo(bucketA).getBucketInfo(). - getDocumentCount()); - EXPECT_EQ(15, (int)spi.getBucketInfo(bucketB).getBucketInfo(). - getDocumentCount()); + EXPECT_EQ(10, (int)spi.getBucketInfo(bucketA).getBucketInfo().getDocumentCount()); + EXPECT_EQ(15, (int)spi.getBucketInfo(bucketB).getBucketInfo().getDocumentCount()); document::AllFields fs; Context context(Priority(0), Trace::TraceLevel(0)); for (uint32_t i = 0; i < 10; ++i) { Document::UP doc1 = testDocMan.createRandomDocumentAtLocation(0x02, i); - EXPECT_TRUE( - spi.get(bucketA, fs, doc1->getId(), context).hasDocument()); - EXPECT_TRUE( - !spi.get(bucketC, fs, doc1->getId(), context).hasDocument()); - EXPECT_TRUE( - !spi.get(bucketB, fs, doc1->getId(), context).hasDocument()); + EXPECT_TRUE(spi.get(bucketA, fs, doc1->getId(), context).hasDocument()); + EXPECT_FALSE(spi.get(bucketC, fs, doc1->getId(), context).hasDocument()); + EXPECT_FALSE(spi.get(bucketB, fs, doc1->getId(), context).hasDocument()); } for (uint32_t i = 10; i < 25; ++i) { Document::UP doc1 = testDocMan.createRandomDocumentAtLocation(0x06, i); - EXPECT_TRUE( - spi.get(bucketB, fs, doc1->getId(), context).hasDocument()); - EXPECT_TRUE( - !spi.get(bucketA, fs, doc1->getId(), context).hasDocument()); - EXPECT_TRUE( - !spi.get(bucketC, fs, doc1->getId(), context).hasDocument()); + EXPECT_TRUE(spi.get(bucketB, fs, doc1->getId(), context).hasDocument()); + EXPECT_FALSE(spi.get(bucketA, fs, doc1->getId(), context).hasDocument()); + EXPECT_FALSE(spi.get(bucketC, fs, doc1->getId(), context).hasDocument()); } } @@ -1722,16 +1671,12 @@ ConformanceTest::createAndPopulateJoinSourceBuckets( spi.createBucket(source2, context); for (uint32_t i = 0; i < 10; ++i) { - Document::SP doc( - testDocMan.createRandomDocumentAtLocation( - source1.getBucketId().getId(), i)); + Document::SP doc(testDocMan.createRandomDocumentAtLocation(source1.getBucketId().getId(), i)); spi.put(source1, Timestamp(i + 1), doc, context); } for (uint32_t i = 10; i < 20; ++i) { - Document::SP doc( - testDocMan.createRandomDocumentAtLocation( - source2.getBucketId().getId(), i)); + Document::SP doc(testDocMan.createRandomDocumentAtLocation(source2.getBucketId().getId(), i)); spi.put(source2, Timestamp(i + 1), doc, context); } } @@ -1788,9 +1733,7 @@ testJoinNormalCasePostCondition(const PersistenceProvider &spi, document::AllFields fs; Context context(Priority(0), Trace::TraceLevel(0)); for (uint32_t i = 0; i < 10; ++i) { - Document::UP doc( - testDocMan.createRandomDocumentAtLocation( - bucketA.getBucketId().getId(), i)); + Document::UP doc(testDocMan.createRandomDocumentAtLocation(bucketA.getBucketId().getId(), i)); EXPECT_TRUE(spi.get(bucketC, fs, doc->getId(), context).hasDocument()); EXPECT_TRUE(!spi.get(bucketA, fs, doc->getId(), context).hasDocument()); } @@ -2017,8 +1960,7 @@ TEST_F(ConformanceTest, testJoinSameSourceBucketsTargetExists) populateBucket(target, *spi, context, 10, 20, testDocMan); spi->join(source, source, target, context); - testJoinSameSourceBucketsTargetExistsPostCondition( - *spi, source, target, testDocMan); + testJoinSameSourceBucketsTargetExistsPostCondition(*spi, source, target, testDocMan); if (_factory->hasPersistence()) { spi.reset(); document::TestDocMan testDocMan2; @@ -2057,12 +1999,8 @@ TEST_F(ConformanceTest, testBucketActivation) // Add and remove a document, so document goes to zero, to check that // active state isn't cleared then. Document::SP doc1 = testDocMan.createRandomDocumentAtLocation(0x01, 1); - EXPECT_EQ( - Result(), - Result(spi->put(bucket, Timestamp(1), doc1, context))); - EXPECT_EQ( - Result(), - Result(spi->remove(bucket, Timestamp(5), doc1->getId(), context))); + EXPECT_EQ(Result(), Result(spi->put(bucket, Timestamp(1), doc1, context))); + EXPECT_EQ(Result(), Result(spi->remove(bucket, Timestamp(5), doc1->getId(), context))); EXPECT_TRUE(spi->getBucketInfo(bucket).getBucketInfo().isActive()); // Setting node down should clear active flag. diff --git a/searchcore/src/tests/proton/attribute/attribute_test.cpp b/searchcore/src/tests/proton/attribute/attribute_test.cpp index 51bc60d3783..de6b923bdc1 100644 --- a/searchcore/src/tests/proton/attribute/attribute_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_test.cpp @@ -526,9 +526,8 @@ TEST_F(AttributeWriterTest, handles_predicate_update) const document::DocumentType &dt(idb.getDocumentType()); DocumentUpdate upd(*idb.getDocumentTypeRepo(), dt, DocumentId("id:ns:searchdocument::1")); - PredicateFieldValue new_value(builder.feature("foo").value("bar").build()); upd.addUpdate(FieldUpdate(upd.getType().getField("a1")) - .addUpdate(std::make_unique<AssignValueUpdate>(new_value))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<PredicateFieldValue>(builder.feature("foo").value("bar").build())))); PredicateIndex &index = static_cast<PredicateAttribute &>(*a1).getIndex(); EXPECT_EQ(1u, index.getZeroConstraintDocs().size()); @@ -726,10 +725,10 @@ TEST_F(AttributeWriterTest, handles_tensor_assign_update) auto new_tensor = make_tensor(TensorSpec(sparse_tensor) .add({{"x", "8"}, {"y", "9"}}, 11)); TensorDataType xySparseTensorDataType(vespalib::eval::ValueType::from_spec(sparse_tensor)); - TensorFieldValue new_value(xySparseTensorDataType); - new_value = SimpleValue::from_value(*new_tensor); + auto new_value = std::make_unique<TensorFieldValue>(xySparseTensorDataType); + *new_value = SimpleValue::from_value(*new_tensor); upd.addUpdate(FieldUpdate(upd.getType().getField("a1")) - .addUpdate(std::make_unique<AssignValueUpdate>(new_value))); + .addUpdate(std::make_unique<AssignValueUpdate>(std::move(new_value)))); DummyFieldUpdateCallback onUpdate; update(2, upd, 1, onUpdate); EXPECT_EQ(2u, a1->getNumDocs()); @@ -936,9 +935,9 @@ public: builder.getDocumentType(), DocumentId(doc_id)); TensorDataType tensor_type(vespalib::eval::ValueType::from_spec(dense_tensor)); - TensorFieldValue tensor_value(tensor_type); - tensor_value= SimpleValue::from_value(*tensor); - upd->addUpdate(FieldUpdate(upd->getType().getField("a1")).addUpdate(std::make_unique<AssignValueUpdate>(tensor_value))); + auto tensor_value = std::make_unique<TensorFieldValue>(tensor_type); + *tensor_value = SimpleValue::from_value(*tensor); + upd->addUpdate(FieldUpdate(upd->getType().getField("a1")).addUpdate(std::make_unique<AssignValueUpdate>(std::move(tensor_value)))); return upd; } void expect_shared_executor_tasks(size_t exp_accepted_tasks) { diff --git a/searchcore/src/tests/proton/common/attribute_updater/attribute_updater_test.cpp b/searchcore/src/tests/proton/common/attribute_updater/attribute_updater_test.cpp index 20584a2a1fb..8fa5c2994b0 100644 --- a/searchcore/src/tests/proton/common/attribute_updater/attribute_updater_test.cpp +++ b/searchcore/src/tests/proton/common/attribute_updater/attribute_updater_test.cpp @@ -104,21 +104,21 @@ struct Fixture { vec.commit(); } - void applyArrayUpdates(AttributeVector & vec, const FieldValue & assign, - const FieldValue & first, const FieldValue & second) { - applyValueUpdate(vec, 0, std::make_unique<AssignValueUpdate>(assign)); - applyValueUpdate(vec, 1, std::make_unique<AddValueUpdate>(second)); - applyValueUpdate(vec, 2, std::make_unique<RemoveValueUpdate>(first)); + void applyArrayUpdates(AttributeVector & vec, std::unique_ptr<FieldValue> assign, + std::unique_ptr<FieldValue> first, std::unique_ptr<FieldValue> second) { + applyValueUpdate(vec, 0, std::make_unique<AssignValueUpdate>(std::move(assign))); + applyValueUpdate(vec, 1, std::make_unique<AddValueUpdate>(std::move(second))); + applyValueUpdate(vec, 2, std::make_unique<RemoveValueUpdate>(std::move(first))); applyValueUpdate(vec, 3, std::make_unique<ClearValueUpdate>()); } - void applyWeightedSetUpdates(AttributeVector & vec, const FieldValue & assign, - const FieldValue & first, const FieldValue & second) { - applyValueUpdate(vec, 0, std::make_unique<AssignValueUpdate>(assign)); - applyValueUpdate(vec, 1, std::make_unique<AddValueUpdate>(second, 20)); - applyValueUpdate(vec, 2, std::make_unique<RemoveValueUpdate>(first)); + void applyWeightedSetUpdates(AttributeVector & vec, std::unique_ptr<FieldValue> assign, + std::unique_ptr<FieldValue> first, std::unique_ptr<FieldValue> copyOfFirst, std::unique_ptr<FieldValue> second) { + applyValueUpdate(vec, 0, std::make_unique<AssignValueUpdate>(std::move(assign))); + applyValueUpdate(vec, 1, std::make_unique<AddValueUpdate>(std::move(second), 20)); + applyValueUpdate(vec, 2, std::make_unique<RemoveValueUpdate>(std::move(first))); applyValueUpdate(vec, 3, std::make_unique<ClearValueUpdate>()); - applyValueUpdate(vec, 4, std::make_unique<MapValueUpdate>(first, std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 10))); + applyValueUpdate(vec, 4, std::make_unique<MapValueUpdate>(std::move(copyOfFirst), std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 10))); } }; @@ -203,10 +203,8 @@ TEST_F("require that single attributes are updated", Fixture) CollectionType ct(CollectionType::SINGLE); { BasicType bt(BasicType::INT32); - AttributePtr vec = create<int32_t, IntegerAttribute>(3, 32, 0, - "in1/int", - Config(bt, ct)); - f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(IntFieldValue(64))); + AttributePtr vec = create<int32_t, IntegerAttribute>(3, 32, 0, "in1/int", Config(bt, ct)); + f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(64))); f.applyValueUpdate(*vec, 1, std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 10)); f.applyValueUpdate(*vec, 2, std::make_unique<ClearValueUpdate>()); EXPECT_EQUAL(3u, vec->getNumDocs()); @@ -216,11 +214,8 @@ TEST_F("require that single attributes are updated", Fixture) } { BasicType bt(BasicType::FLOAT); - AttributePtr vec = create<float, FloatingPointAttribute>(3, 55.5f, 0, - "in1/float", - Config(bt, - ct)); - f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(FloatFieldValue(77.7f))); + AttributePtr vec = create<float, FloatingPointAttribute>(3, 55.5f, 0, "in1/float",Config(bt, ct)); + f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(std::make_unique<FloatFieldValue>(77.7f))); f.applyValueUpdate(*vec, 1, std::make_unique<ArithmeticValueUpdate>(ArithmeticValueUpdate::Add, 10)); f.applyValueUpdate(*vec, 2, std::make_unique<ClearValueUpdate>()); EXPECT_EQUAL(3u, vec->getNumDocs()); @@ -230,11 +225,8 @@ TEST_F("require that single attributes are updated", Fixture) } { BasicType bt(BasicType::STRING); - AttributePtr vec = create<std::string, StringAttribute>(3, "first", 0, - "in1/string", - Config(bt, - ct)); - f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(StringFieldValue("second"))); + AttributePtr vec = create<std::string, StringAttribute>(3, "first", 0, "in1/string",Config(bt, ct)); + f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(StringFieldValue::make("second"))); f.applyValueUpdate(*vec, 2, std::make_unique<ClearValueUpdate>()); EXPECT_EQUAL(3u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedString>{WeightedString("second")})); @@ -254,7 +246,7 @@ TEST_F("require that single attributes are updated", Fixture) asReferenceAttribute(*vec).update(docId, toGid(doc1)); } vec->commit(); - f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(ReferenceFieldValue(dynamic_cast<const ReferenceDataType &>(f.docType->getField("ref").getDataType()), DocumentId(doc2)))); + f.applyValueUpdate(*vec, 0, std::make_unique<AssignValueUpdate>(std::make_unique<ReferenceFieldValue>(dynamic_cast<const ReferenceDataType &>(f.docType->getField("ref").getDataType()), DocumentId(doc2)))); f.applyValueUpdate(*vec, 2, std::make_unique<ClearValueUpdate>()); EXPECT_EQUAL(3u, vec->getNumDocs()); TEST_DO(assertRef(*vec, doc2, 0)); @@ -268,14 +260,12 @@ TEST_F("require that array attributes are updated", Fixture) CollectionType ct(CollectionType::ARRAY); { BasicType bt(BasicType::INT32); - AttributePtr vec = create<int32_t, IntegerAttribute>(5, 32, 1, - "in1/aint", - Config(bt, ct)); - IntFieldValue first(32); - IntFieldValue second(64); - ArrayFieldValue assign(f.docType->getField("aint").getDataType()); - assign.add(second); - f.applyArrayUpdates(*vec, assign, first, second); + AttributePtr vec = create<int32_t, IntegerAttribute>(5, 32, 1, "in1/aint", Config(bt, ct)); + auto first = std::make_unique<IntFieldValue>(32); + auto second = std::make_unique<IntFieldValue>(64); + auto assign = std::make_unique<ArrayFieldValue>(f.docType->getField("aint").getDataType()); + assign->add(*second); + f.applyArrayUpdates(*vec, std::move(assign), std::move(first), std::move(second)); EXPECT_EQUAL(5u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedInt>{WeightedInt(64)})); @@ -286,15 +276,12 @@ TEST_F("require that array attributes are updated", Fixture) } { BasicType bt(BasicType::FLOAT); - AttributePtr vec = create<float, FloatingPointAttribute>(5, 55.5f, 1, - "in1/afloat", - Config(bt, - ct)); - FloatFieldValue first(55.5f); - FloatFieldValue second(77.7f); - ArrayFieldValue assign(f.docType->getField("afloat").getDataType()); - assign.add(second); - f.applyArrayUpdates(*vec, assign, first, second); + AttributePtr vec = create<float, FloatingPointAttribute>(5, 55.5f, 1, "in1/afloat", Config(bt, ct)); + auto first = std::make_unique<FloatFieldValue>(55.5f); + auto second = std::make_unique<FloatFieldValue>(77.7f); + auto assign = std::make_unique<ArrayFieldValue>(f.docType->getField("afloat").getDataType()); + assign->add(*second); + f.applyArrayUpdates(*vec, std::move(assign), std::move(first), std::move(second)); EXPECT_EQUAL(5u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedFloat>{WeightedFloat(77.7f)})); @@ -305,14 +292,12 @@ TEST_F("require that array attributes are updated", Fixture) } { BasicType bt(BasicType::STRING); - AttributePtr vec = create<std::string, StringAttribute>(5, "first", 1, - "in1/astring", - Config(bt, ct)); - StringFieldValue first("first"); - StringFieldValue second("second"); - ArrayFieldValue assign(f.docType->getField("astring").getDataType()); - assign.add(second); - f.applyArrayUpdates(*vec, assign, first, second); + AttributePtr vec = create<std::string, StringAttribute>(5, "first", 1, "in1/astring", Config(bt, ct)); + auto first = StringFieldValue::make("first"); + auto second = StringFieldValue::make("second"); + auto assign = std::make_unique<ArrayFieldValue>(f.docType->getField("astring").getDataType()); + assign->add(*second); + f.applyArrayUpdates(*vec, std::move(assign), std::move(first), std::move(second)); EXPECT_EQUAL(5u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedString>{WeightedString("second")})); @@ -328,15 +313,13 @@ TEST_F("require that weighted set attributes are updated", Fixture) CollectionType ct(CollectionType::WSET); { BasicType bt(BasicType::INT32); - AttributePtr vec = create<int32_t, IntegerAttribute>(5, 32, 100, - "in1/wsint", - Config(bt, ct)); - IntFieldValue first(32); - IntFieldValue second(64); - WeightedSetFieldValue - assign(f.docType->getField("wsint").getDataType()); - assign.add(second, 20); - f.applyWeightedSetUpdates(*vec, assign, first, second); + AttributePtr vec = create<int32_t, IntegerAttribute>(5, 32, 100, "in1/wsint", Config(bt, ct)); + auto first = std::make_unique<IntFieldValue>(32); + auto copyOfFirst = std::make_unique<IntFieldValue>(32); + auto second = std::make_unique<IntFieldValue>(64); + auto assign = std::make_unique<WeightedSetFieldValue>(f.docType->getField("wsint").getDataType()); + assign->add(*second, 20); + f.applyWeightedSetUpdates(*vec, std::move(assign), std::move(first), std::move(copyOfFirst), std::move(second)); EXPECT_EQUAL(5u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedInt>{WeightedInt(64, 20)})); @@ -347,16 +330,13 @@ TEST_F("require that weighted set attributes are updated", Fixture) } { BasicType bt(BasicType::FLOAT); - AttributePtr vec = create<float, FloatingPointAttribute>(5, 55.5f, 100, - "in1/wsfloat", - Config(bt, - ct)); - FloatFieldValue first(55.5f); - FloatFieldValue second(77.7f); - WeightedSetFieldValue - assign(f.docType->getField("wsfloat").getDataType()); - assign.add(second, 20); - f.applyWeightedSetUpdates(*vec, assign, first, second); + AttributePtr vec = create<float, FloatingPointAttribute>(5, 55.5f, 100, "in1/wsfloat", Config(bt, ct)); + auto first = std::make_unique<FloatFieldValue>(55.5f); + auto copyOfFirst = std::make_unique<FloatFieldValue>(55.5f); + auto second = std::make_unique<FloatFieldValue>(77.7f); + auto assign = std::make_unique<WeightedSetFieldValue>(f.docType->getField("wsfloat").getDataType()); + assign->add(*second, 20); + f.applyWeightedSetUpdates(*vec, std::move(assign), std::move(first), std::move(copyOfFirst), std::move(second)); EXPECT_EQUAL(5u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedFloat>{WeightedFloat(77.7f, 20)})); @@ -367,17 +347,13 @@ TEST_F("require that weighted set attributes are updated", Fixture) } { BasicType bt(BasicType::STRING); - AttributePtr vec = create<std::string, StringAttribute>(5, "first", - 100, - "in1/wsstring", - Config(bt, - ct)); - StringFieldValue first("first"); - StringFieldValue second("second"); - WeightedSetFieldValue - assign(f.docType->getField("wsstring").getDataType()); - assign.add(second, 20); - f.applyWeightedSetUpdates(*vec, assign, first, second); + AttributePtr vec = create<std::string, StringAttribute>(5, "first", 100, "in1/wsstring", Config(bt, ct)); + auto first = StringFieldValue::make("first"); + auto copyOfFirst = StringFieldValue::make("first"); + auto second = StringFieldValue::make("second"); + auto assign = std::make_unique<WeightedSetFieldValue>(f.docType->getField("wsstring").getDataType()); + assign->add(*second, 20); + f.applyWeightedSetUpdates(*vec, std::move(assign), std::move(first), std::move(copyOfFirst), std::move(second)); EXPECT_EQUAL(5u, vec->getNumDocs()); EXPECT_TRUE(check(vec, 0, std::vector<WeightedString>{WeightedString("second", 20)})); diff --git a/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp b/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp index 79aa681ab52..8ef2742b6d8 100644 --- a/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp +++ b/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp @@ -345,7 +345,7 @@ struct UpdateContext { } else { fieldValue->assign(document::StringFieldValue("new value")); } - update->addUpdate(document::FieldUpdate(field).addUpdate(std::make_unique<document::AssignValueUpdate>(*fieldValue))); + update->addUpdate(document::FieldUpdate(field).addUpdate(std::make_unique<document::AssignValueUpdate>(std::move(fieldValue)))); } }; @@ -774,7 +774,7 @@ TEST_F("require that all value updates will be inspected before rejected", Schem EXPECT_FALSE(FeedRejectHelper::mustReject(*docUpdate)); docUpdate->addUpdate(std::move(FieldUpdate(docType->getField("i1")).addUpdate(std::make_unique<ClearValueUpdate>()))); EXPECT_FALSE(FeedRejectHelper::mustReject(*docUpdate)); - docUpdate->addUpdate(std::move(FieldUpdate(docType->getField("i1")).addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue())))); + docUpdate->addUpdate(std::move(FieldUpdate(docType->getField("i1")).addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue::make())))); EXPECT_TRUE(FeedRejectHelper::mustReject(*docUpdate)); } diff --git a/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp b/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp index 40332157a8d..039524a237c 100644 --- a/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp +++ b/searchcore/src/tests/proton/feedoperation/feedoperation_test.cpp @@ -122,7 +122,7 @@ public: auto makeUpdate() { auto upd(std::make_shared<DocumentUpdate>(*_repo, _docType, docId)); upd->addUpdate(FieldUpdate(upd->getType().getField("string")). - addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue("newval")))); + addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue::make("newval")))); return upd; } auto makeDoc() { diff --git a/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp b/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp index 7f35e05dfb6..6fb7a35fffe 100644 --- a/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp +++ b/searchcore/src/tests/proton/persistenceengine/persistenceengine_test.cpp @@ -521,7 +521,7 @@ TEST_F("require that update is rejected if resource limit is reached", SimpleFix document::Field field("string", 1, *document::DataType::STRING); type.addField(field); DocumentUpdate::SP upd = createUpd(type, docId1); - upd->addUpdate(std::move(document::FieldUpdate(field).addUpdate(std::make_unique<document::AssignValueUpdate>(document::StringFieldValue("new value"))))); + upd->addUpdate(std::move(document::FieldUpdate(field).addUpdate(std::make_unique<document::AssignValueUpdate>(std::make_unique<document::StringFieldValue>("new value"))))); EXPECT_EQUAL( Result(Result::ErrorType::RESOURCE_EXHAUSTED, diff --git a/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp b/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp index 2dcf18f9da6..0856bad0035 100644 --- a/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp +++ b/searchcore/src/vespa/searchcore/bmcluster/bm_feed.cpp @@ -71,7 +71,7 @@ BmFeed::make_document_update(uint32_t n, uint32_t i) const { auto id = make_document_id(n, i); auto document_update = std::make_unique<DocumentUpdate>(*_repo, *_document_type, id); - document_update->addUpdate(FieldUpdate(_field).addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(15)))); + document_update->addUpdate(FieldUpdate(_field).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(15)))); return document_update; } diff --git a/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp b/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp index 5b134c65e84..fe29a11639b 100644 --- a/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp +++ b/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp @@ -157,12 +157,12 @@ AttributeUpdater::handleUpdateT(V & vec, Accessor, uint32_t lid, const ValueUpda const MapValueUpdate & map(static_cast<const MapValueUpdate &>(upd)); if (!vec.AttributeVector::apply(lid, map)) { throw UpdateException(make_string("attribute map(%s, %s) failed: %s[%u]", - map.getKey().className(), map.getUpdate().getClass().name(), + map.getKey().className(), map.getUpdate().className(), vec.getName().c_str(), lid)); } } else { LOG(warning, "Unsupported value update operation %s on multivalue vector %s", - upd.getClass().name(), vec.getName().c_str()); + upd.className(), vec.getName().c_str()); } } else { if (op == ValueUpdate::Assign) { @@ -178,7 +178,7 @@ AttributeUpdater::handleUpdateT(V & vec, Accessor, uint32_t lid, const ValueUpda } else if (op == ValueUpdate::Clear) { vec.clearDoc(lid); } else { - LOG(warning, "Unsupported value update operation %s on singlevalue vector %s", upd.getClass().name(), vec.getName().c_str()); + LOG(warning, "Unsupported value update operation %s on singlevalue vector %s", upd.className(), vec.getName().c_str()); } } } @@ -200,7 +200,7 @@ AttributeUpdater::handleUpdate(PredicateAttribute &vec, uint32_t lid, const Valu vec.clearDoc(lid); } else { LOG(warning, "Unsupported value update operation %s on singlevalue vector %s", - upd.getClass().name(), vec.getName().c_str()); + upd.className(), vec.getName().c_str()); } } @@ -217,17 +217,17 @@ AttributeUpdater::handleUpdate(TensorAttribute &vec, uint32_t lid, const ValueUp vec.clearDoc(lid); updateValue(vec, lid, assign.getValue()); } - } else if (op == ValueUpdate::TensorModifyUpdate) { + } else if (op == ValueUpdate::TensorModify) { vec.update_tensor(lid, static_cast<const TensorModifyUpdate &>(upd), false); - } else if (op == ValueUpdate::TensorAddUpdate) { + } else if (op == ValueUpdate::TensorAdd) { vec.update_tensor(lid, static_cast<const TensorAddUpdate &>(upd), true); - } else if (op == ValueUpdate::TensorRemoveUpdate) { + } else if (op == ValueUpdate::TensorRemove) { vec.update_tensor(lid, static_cast<const TensorRemoveUpdate &>(upd), false); } else if (op == ValueUpdate::Clear) { vec.clearDoc(lid); } else { LOG(warning, "Unsupported value update operation %s on singlevalue tensor attribute %s", - upd.getClass().name(), vec.getName().c_str()); + upd.className(), vec.getName().c_str()); } } @@ -247,7 +247,7 @@ AttributeUpdater::handleUpdate(ReferenceAttribute &vec, uint32_t lid, const Valu vec.clearDoc(lid); } else { LOG(warning, "Unsupported value update operation %s on singlevalue reference attribute %s", - upd.getClass().name(), vec.getName().c_str()); + upd.className(), vec.getName().c_str()); } } diff --git a/searchlib/src/tests/attribute/attribute_test.cpp b/searchlib/src/tests/attribute/attribute_test.cpp index ea8a1649789..cb51487abdd 100644 --- a/searchlib/src/tests/attribute/attribute_test.cpp +++ b/searchlib/src/tests/attribute/attribute_test.cpp @@ -1514,11 +1514,11 @@ AttributeTest::testMapValueUpdate(const AttributePtr & ptr, BufferType initValue EXPECT_EQUAL(ptr->getStatus().getUpdateCount(), 7u); EXPECT_EQUAL(ptr->getStatus().getNonIdempotentUpdateCount(), 0u); - EXPECT_TRUE(ptr->apply(0, MapVU(initFieldValue, std::make_unique<ArithVU>(ArithVU::Add, 10)))); - EXPECT_TRUE(ptr->apply(1, MapVU(initFieldValue, std::make_unique<ArithVU>(ArithVU::Sub, 10)))); - EXPECT_TRUE(ptr->apply(2, MapVU(initFieldValue, std::make_unique<ArithVU>(ArithVU::Mul, 10)))); - EXPECT_TRUE(ptr->apply(3, MapVU(initFieldValue, std::make_unique<ArithVU>(ArithVU::Div, 10)))); - EXPECT_TRUE(ptr->apply(6, MapVU(initFieldValue, std::make_unique<AssignValueUpdate>(IntFieldValue(70))))); + EXPECT_TRUE(ptr->apply(0, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<ArithVU>(ArithVU::Add, 10)))); + EXPECT_TRUE(ptr->apply(1, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<ArithVU>(ArithVU::Sub, 10)))); + EXPECT_TRUE(ptr->apply(2, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<ArithVU>(ArithVU::Mul, 10)))); + EXPECT_TRUE(ptr->apply(3, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<ArithVU>(ArithVU::Div, 10)))); + EXPECT_TRUE(ptr->apply(6, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(70))))); ptr->commit(); EXPECT_EQUAL(ptr->getStatus().getUpdateCount(), 12u); EXPECT_EQUAL(ptr->getStatus().getNonIdempotentUpdateCount(), 5u); @@ -1536,7 +1536,7 @@ AttributeTest::testMapValueUpdate(const AttributePtr & ptr, BufferType initValue EXPECT_EQUAL(buf[0].getWeight(), 70); // removeifzero - EXPECT_TRUE(ptr->apply(4, MapVU(initFieldValue, std::make_unique<ArithVU>(ArithVU::Sub, 100)))); + EXPECT_TRUE(ptr->apply(4, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<ArithVU>(ArithVU::Sub, 100)))); ptr->commit(); if (removeIfZero) { EXPECT_EQUAL(ptr->get(4, &buf[0], 2), uint32_t(0)); @@ -1548,7 +1548,7 @@ AttributeTest::testMapValueUpdate(const AttributePtr & ptr, BufferType initValue EXPECT_EQUAL(ptr->getStatus().getNonIdempotentUpdateCount(), 6u); // createifnonexistant - EXPECT_TRUE(ptr->apply(5, MapVU(nonExistant, std::make_unique<ArithVU>(ArithVU::Add, 10)))); + EXPECT_TRUE(ptr->apply(5, MapVU(std::unique_ptr<FieldValue>(nonExistant.clone()), std::make_unique<ArithVU>(ArithVU::Add, 10)))); ptr->commit(); if (createIfNonExistant) { EXPECT_EQUAL(ptr->get(5, &buf[0], 2), uint32_t(2)); @@ -1568,7 +1568,7 @@ AttributeTest::testMapValueUpdate(const AttributePtr & ptr, BufferType initValue EXPECT_EQUAL(ptr->getStatus().getUpdateCount(), 15u); ASSERT_TRUE(vec.append(0, initValue.getValue(), 12345)); EXPECT_EQUAL(ptr->getStatus().getUpdateCount(), 16u); - EXPECT_TRUE(ptr->apply(0, MapVU(initFieldValue, std::make_unique<ArithVU>(ArithVU::Div, 0)))); + EXPECT_TRUE(ptr->apply(0, MapVU(std::unique_ptr<FieldValue>(initFieldValue.clone()), std::make_unique<ArithVU>(ArithVU::Div, 0)))); EXPECT_EQUAL(ptr->getStatus().getUpdateCount(), 16u); EXPECT_EQUAL(ptr->getStatus().getNonIdempotentUpdateCount(), 7u); ptr->commit(); @@ -1585,8 +1585,7 @@ AttributeTest::testMapValueUpdate() (ptr, AttributeVector::WeightedInt(64, 1), IntFieldValue(64), IntFieldValue(32), false, false); } { // remove if zero - AttributePtr ptr = createAttribute("wsint32", Config(BasicType::INT32, - CollectionType(CollectionType::WSET, true, false))); + AttributePtr ptr = createAttribute("wsint32", Config(BasicType::INT32, CollectionType(CollectionType::WSET, true, false))); testMapValueUpdate<IntegerAttribute, AttributeVector::WeightedInt> (ptr, AttributeVector::WeightedInt(64, 1), IntFieldValue(64), IntFieldValue(32), true, false); } diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp index ea2379eef58..07563ad369d 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp @@ -493,10 +493,10 @@ AttributeVector::apply(DocId doc, const MapValueUpdate &map) { bool retval(doc < getNumDocs()); if (retval) { const ValueUpdate & vu(map.getUpdate()); - if (vu.inherits(ArithmeticValueUpdate::classId)) { + if (vu.getType() == ValueUpdate::Arithmetic) { const ArithmeticValueUpdate &au(static_cast<const ArithmeticValueUpdate &>(vu)); retval = applyWeight(doc, map.getKey(), au); - } else if (vu.inherits(AssignValueUpdate::classId)) { + } else if (vu.getType() == ValueUpdate::Assign) { const AssignValueUpdate &au(static_cast<const AssignValueUpdate &>(vu)); retval = applyWeight(doc, map.getKey(), au); } else { diff --git a/storage/src/tests/distributor/externaloperationhandlertest.cpp b/storage/src/tests/distributor/externaloperationhandlertest.cpp index 0e5372043ab..fa17d6e1eac 100644 --- a/storage/src/tests/distributor/externaloperationhandlertest.cpp +++ b/storage/src/tests/distributor/externaloperationhandlertest.cpp @@ -32,28 +32,22 @@ struct ExternalOperationHandlerTest : Test, DistributorStripeTestUtil { document::TestDocMan _testDocMan; document::BucketId findNonOwnedUserBucketInState(vespalib::stringref state); - document::BucketId findOwned1stNotOwned2ndInStates( - vespalib::stringref state1, - vespalib::stringref state2); + document::BucketId findOwned1stNotOwned2ndInStates(vespalib::stringref state1, vespalib::stringref state2); std::shared_ptr<api::GetCommand> makeGetCommandForUser(uint64_t id) const; std::shared_ptr<api::GetCommand> makeGetCommand(const vespalib::string& id) const; - std::shared_ptr<api::UpdateCommand> makeUpdateCommand(const vespalib::string& doc_type, - const vespalib::string& id) const; + std::shared_ptr<api::UpdateCommand> makeUpdateCommand(const vespalib::string& doc_type, const vespalib::string& id) const; std::shared_ptr<api::UpdateCommand> makeUpdateCommand() const; std::shared_ptr<api::UpdateCommand> makeUpdateCommandForUser(uint64_t id) const; - std::shared_ptr<api::PutCommand> makePutCommand(const vespalib::string& doc_type, - const vespalib::string& id) const; + std::shared_ptr<api::PutCommand> makePutCommand(const vespalib::string& doc_type, const vespalib::string& id) const; std::shared_ptr<api::RemoveCommand> makeRemoveCommand(const vespalib::string& id) const; void verify_busy_bounced_due_to_no_active_state(std::shared_ptr<api::StorageCommand> cmd); - void start_operation_verify_not_rejected(std::shared_ptr<api::StorageCommand> cmd, - Operation::SP& out_generated); + void start_operation_verify_not_rejected(std::shared_ptr<api::StorageCommand> cmd, Operation::SP& out_generated); void start_operation_verify_rejected(std::shared_ptr<api::StorageCommand> cmd); - int64_t safe_time_not_reached_metric_count( - const PersistenceOperationMetricSet & metrics) const { + int64_t safe_time_not_reached_metric_count(const PersistenceOperationMetricSet & metrics) const { return metrics.failures.safe_time_not_reached.getLongValue("count"); } @@ -61,8 +55,7 @@ struct ExternalOperationHandlerTest : Test, DistributorStripeTestUtil { return metrics.failures.safe_time_not_reached.getLongValue("count"); } - int64_t concurrent_mutatations_metric_count( - const PersistenceOperationMetricSet& metrics) const { + int64_t concurrent_mutatations_metric_count(const PersistenceOperationMetricSet& metrics) const { return metrics.failures.concurrent_mutations.getLongValue("count"); } @@ -597,7 +590,7 @@ TEST_F(ExternalOperationHandlerTest, non_trivial_updates_are_rejected_if_feed_is auto cmd = makeUpdateCommand("testdoctype1", "id:foo:testdoctype1::foo"); const auto* doc_type = _testDocMan.getTypeRepo().getDocumentType("testdoctype1"); - cmd->getUpdate()->addUpdate(FieldUpdate(doc_type->getField("title")).addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue("new value")))); + cmd->getUpdate()->addUpdate(FieldUpdate(doc_type->getField("title")).addUpdate(std::make_unique<AssignValueUpdate>(StringFieldValue::make("new value")))); ASSERT_NO_FATAL_FAILURE(start_operation_verify_rejected(std::move(cmd))); EXPECT_EQ("ReturnCode(NO_SPACE, External feed is blocked due to resource exhaustion: full disk)", diff --git a/storage/src/tests/persistence/persistencetestutils.cpp b/storage/src/tests/persistence/persistencetestutils.cpp index 3812e7b85c9..b0efed07fab 100644 --- a/storage/src/tests/persistence/persistencetestutils.cpp +++ b/storage/src/tests/persistence/persistencetestutils.cpp @@ -221,20 +221,20 @@ PersistenceTestUtils::doGetOnDisk(const document::BucketId& bucketId, const docu } document::DocumentUpdate::SP -PersistenceTestUtils::createBodyUpdate(const document::DocumentId& docId, const document::FieldValue& updateValue) +PersistenceTestUtils::createBodyUpdate(const document::DocumentId& docId, std::unique_ptr<document::FieldValue> updateValue) { const DocumentType* docType(getTypeRepo()->getDocumentType("testdoctype1")); auto update = std::make_shared<document::DocumentUpdate>(*getTypeRepo(), *docType, docId); - update->addUpdate(document::FieldUpdate(docType->getField("content")).addUpdate(std::make_unique<document::AssignValueUpdate>(updateValue))); + update->addUpdate(document::FieldUpdate(docType->getField("content")).addUpdate(std::make_unique<document::AssignValueUpdate>(std::move(updateValue)))); return update; } document::DocumentUpdate::SP -PersistenceTestUtils::createHeaderUpdate(const document::DocumentId& docId, const document::FieldValue& updateValue) +PersistenceTestUtils::createHeaderUpdate(const document::DocumentId& docId, std::unique_ptr<document::FieldValue> updateValue) { const DocumentType* docType(getTypeRepo()->getDocumentType("testdoctype1")); auto update = std::make_shared<document::DocumentUpdate>(*getTypeRepo(), *docType, docId); - update->addUpdate(document::FieldUpdate(docType->getField("headerval")).addUpdate(std::make_unique<document::AssignValueUpdate>(updateValue))); + update->addUpdate(document::FieldUpdate(docType->getField("headerval")).addUpdate(std::make_unique<document::AssignValueUpdate>(std::move(updateValue)))); return update; } diff --git a/storage/src/tests/persistence/persistencetestutils.h b/storage/src/tests/persistence/persistencetestutils.h index 4bbff9bb2ca..94ae7b9fb53 100644 --- a/storage/src/tests/persistence/persistencetestutils.h +++ b/storage/src/tests/persistence/persistencetestutils.h @@ -163,44 +163,23 @@ public: /** Returns the document that was inserted. */ - document::Document::SP doPutOnDisk( - uint32_t location, - spi::Timestamp timestamp, - uint32_t minSize = 0, - uint32_t maxSize = 128); - - document::Document::SP doPut( - uint32_t location, - spi::Timestamp timestamp, - uint32_t minSize = 0, - uint32_t maxSize = 128) - { return doPutOnDisk(location, timestamp, minSize, maxSize); } + document::Document::SP doPutOnDisk(uint32_t location, spi::Timestamp timestamp, uint32_t minSize = 0, uint32_t maxSize = 128); + + document::Document::SP doPut(uint32_t location, spi::Timestamp timestamp, uint32_t minSize = 0, uint32_t maxSize = 128) { + return doPutOnDisk(location, timestamp, minSize, maxSize); + } /** Returns the new doccount if document was removed, or -1 if not found. */ - bool doRemoveOnDisk( - const document::BucketId& bid, - const document::DocumentId& id, - spi::Timestamp timestamp, - bool persistRemove); - - bool doRemove( - const document::BucketId& bid, - const document::DocumentId& id, - spi::Timestamp timestamp, - bool persistRemove) { + bool doRemoveOnDisk(const document::BucketId& bid, const document::DocumentId& id, spi::Timestamp timestamp, bool persistRemove); + bool doRemove(const document::BucketId& bid, const document::DocumentId& id, spi::Timestamp timestamp, bool persistRemove) { return doRemoveOnDisk(bid, id, timestamp, persistRemove); } - bool doUnrevertableRemoveOnDisk(const document::BucketId& bid, - const document::DocumentId& id, - spi::Timestamp timestamp); + bool doUnrevertableRemoveOnDisk(const document::BucketId& bid, const document::DocumentId& id, spi::Timestamp timestamp); - bool doUnrevertableRemove(const document::BucketId& bid, - const document::DocumentId& id, - spi::Timestamp timestamp) - { + bool doUnrevertableRemove(const document::BucketId& bid, const document::DocumentId& id, spi::Timestamp timestamp) { return doUnrevertableRemoveOnDisk(bid, id, timestamp); } @@ -211,25 +190,19 @@ public: * @unrevertableRemove If set, instead of adding put, turn put to remove. * @usedBits Generate bucket to use from docid using this amount of bits. */ - void doRemove(const document::DocumentId& id, spi::Timestamp, - bool unrevertableRemove = false, uint16_t usedBits = 16); + void doRemove(const document::DocumentId& id, spi::Timestamp, bool unrevertableRemove = false, uint16_t usedBits = 16); - spi::GetResult doGetOnDisk( - const document::BucketId& bucketId, - const document::DocumentId& docId); + spi::GetResult doGetOnDisk(const document::BucketId& bucketId, const document::DocumentId& docId); - spi::GetResult doGet( - const document::BucketId& bucketId, - const document::DocumentId& docId) - { return doGetOnDisk(bucketId, docId); } + spi::GetResult doGet(const document::BucketId& bucketId, const document::DocumentId& docId) { + return doGetOnDisk(bucketId, docId); + } - std::shared_ptr<document::DocumentUpdate> createBodyUpdate( - const document::DocumentId& id, - const document::FieldValue& updateValue); + std::shared_ptr<document::DocumentUpdate> + createBodyUpdate(const document::DocumentId& id, std::unique_ptr<document::FieldValue> updateValue); - std::shared_ptr<document::DocumentUpdate> createHeaderUpdate( - const document::DocumentId& id, - const document::FieldValue& updateValue); + std::shared_ptr<document::DocumentUpdate> + createHeaderUpdate(const document::DocumentId& id, std::unique_ptr<document::FieldValue> updateValue); uint16_t getDiskFromBucketDatabaseIfUnset(const document::Bucket &); @@ -241,9 +214,7 @@ public: */ void doPut(const document::Document::SP& doc, spi::Timestamp, uint16_t usedBits = 16); - void doPut(const document::Document::SP& doc, - document::BucketId bid, - spi::Timestamp time); + void doPut(const document::Document::SP& doc, document::BucketId bid, spi::Timestamp time); spi::UpdateResult doUpdate(document::BucketId bid, const std::shared_ptr<document::DocumentUpdate>& update, diff --git a/storage/src/tests/persistence/testandsettest.cpp b/storage/src/tests/persistence/testandsettest.cpp index 6e5fc491941..3245bd78a07 100644 --- a/storage/src/tests/persistence/testandsettest.cpp +++ b/storage/src/tests/persistence/testandsettest.cpp @@ -18,6 +18,7 @@ using std::shared_ptr; using storage::spi::test::makeSpiBucket; using document::test::makeDocumentBucket; +using document::StringFieldValue; using namespace ::testing; namespace storage { @@ -28,10 +29,10 @@ struct TestAndSetTest : PersistenceTestUtils { static constexpr int RANDOM_SEED = 1234; const document::BucketId BUCKET_ID{16, 4}; - const document::StringFieldValue MISMATCHING_HEADER{"Definitely nothing about loud canines"}; - const document::StringFieldValue MATCHING_HEADER{"Some string with woofy dog as a substring"}; - const document::StringFieldValue OLD_CONTENT{"Some old content"}; - const document::StringFieldValue NEW_CONTENT{"Freshly pressed and squeezed content"}; + const StringFieldValue MISMATCHING_HEADER{"Definitely nothing about loud canines"}; + const StringFieldValue MATCHING_HEADER{"Some string with woofy dog as a substring"}; + const StringFieldValue OLD_CONTENT{"Some old content"}; + const StringFieldValue NEW_CONTENT{"Freshly pressed and squeezed content"}; const document::Bucket BUCKET = makeDocumentBucket(BUCKET_ID); unique_ptr<PersistenceHandler> persistenceHandler; @@ -159,7 +160,7 @@ std::shared_ptr<api::UpdateCommand> TestAndSetTest::conditional_update_test(bool createIfMissing, api::Timestamp updateTimestamp) { auto docUpdate = std::make_shared<document::DocumentUpdate>(_env->_testDocMan.getTypeRepo(), testDoc->getType(), testDocId); - docUpdate->addUpdate(document::FieldUpdate(testDoc->getField("content")).addUpdate(std::make_unique<document::AssignValueUpdate>(NEW_CONTENT))); + docUpdate->addUpdate(document::FieldUpdate(testDoc->getField("content")).addUpdate(std::make_unique<document::AssignValueUpdate>(std::make_unique<StringFieldValue>(NEW_CONTENT)))); docUpdate->setCreateIfNonExistent(createIfMissing); auto updateUp = std::make_unique<api::UpdateCommand>(BUCKET, docUpdate, updateTimestamp); diff --git a/storageapi/src/tests/mbusprot/storageprotocoltest.cpp b/storageapi/src/tests/mbusprot/storageprotocoltest.cpp index 1ab5c2398c9..c130e433285 100644 --- a/storageapi/src/tests/mbusprot/storageprotocoltest.cpp +++ b/storageapi/src/tests/mbusprot/storageprotocoltest.cpp @@ -248,9 +248,8 @@ TEST_P(StorageProtocolTest, response_metadata_is_propagated) { } TEST_P(StorageProtocolTest, update) { - auto update = std::make_shared<document::DocumentUpdate>( - _docMan.getTypeRepo(), *_testDoc->getDataType(), _testDoc->getId()); - update->addUpdate(FieldUpdate(_testDoc->getField("headerval")).addUpdate(std::make_unique<AssignValueUpdate>(IntFieldValue(17)))); + auto update = std::make_shared<document::DocumentUpdate>(_docMan.getTypeRepo(), *_testDoc->getDataType(), _testDoc->getId()); + update->addUpdate(FieldUpdate(_testDoc->getField("headerval")).addUpdate(std::make_unique<AssignValueUpdate>(std::make_unique<IntFieldValue>(17)))); update->addFieldPathUpdate(std::make_unique<RemoveFieldPathUpdate>("headerval", "testdoctype1.headerval > 0")); |