summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-02-01 14:23:10 +0000
committerGeir Storli <geirst@verizonmedia.com>2019-02-01 14:23:10 +0000
commit12cf8c1a86fe0d796de358d63691ce211edf25ce (patch)
treeb4bcf83e8cadae050d49002e6b0fb80f2fee29f9 /searchcore
parent9df35eda38ec64c3e3ee5935eee65899d1e15840 (diff)
Apply TensorModifyUpdate to the associated tensor attribute in searchcore.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp40
1 files changed, 29 insertions, 11 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp b/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp
index 6d17b22ca19..060f991d9ac 100644
--- a/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp
+++ b/searchcore/src/vespa/searchcore/proton/common/attribute_updater.cpp
@@ -1,25 +1,27 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "attribute_updater.h"
+#include <vespa/eval/tensor/tensor.h>
+#include <vespa/document/base/forcelink.h>
#include <vespa/document/fieldvalue/arrayfieldvalue.h>
-#include <vespa/document/fieldvalue/predicatefieldvalue.h>
-#include <vespa/document/fieldvalue/weightedsetfieldvalue.h>
#include <vespa/document/fieldvalue/literalfieldvalue.h>
-#include <vespa/document/fieldvalue/tensorfieldvalue.h>
+#include <vespa/document/fieldvalue/predicatefieldvalue.h>
#include <vespa/document/fieldvalue/referencefieldvalue.h>
-#include <vespa/document/update/assignvalueupdate.h>
+#include <vespa/document/fieldvalue/tensorfieldvalue.h>
+#include <vespa/document/fieldvalue/weightedsetfieldvalue.h>
#include <vespa/document/update/addvalueupdate.h>
-#include <vespa/document/update/removevalueupdate.h>
-#include <vespa/document/update/mapvalueupdate.h>
#include <vespa/document/update/arithmeticvalueupdate.h>
+#include <vespa/document/update/assignvalueupdate.h>
#include <vespa/document/update/clearvalueupdate.h>
-#include <vespa/document/base/forcelink.h>
-#include <vespa/searchlib/common/base.h>
-#include <vespa/searchlib/tensor/tensor_attribute.h>
-#include <vespa/searchlib/attribute/reference_attribute.h>
-#include <vespa/searchlib/attribute/predicate_attribute.h>
+#include <vespa/document/update/mapvalueupdate.h>
+#include <vespa/document/update/removevalueupdate.h>
+#include <vespa/document/update/tensormodifyupdate.h>
#include <vespa/searchlib/attribute/attributevector.hpp>
#include <vespa/searchlib/attribute/changevector.hpp>
+#include <vespa/searchlib/attribute/predicate_attribute.h>
+#include <vespa/searchlib/attribute/reference_attribute.h>
+#include <vespa/searchlib/common/base.h>
+#include <vespa/searchlib/tensor/tensor_attribute.h>
#include <vespa/vespalib/util/stringfmt.h>
#include <sstream>
@@ -201,6 +203,20 @@ AttributeUpdater::handleUpdate(PredicateAttribute &vec, uint32_t lid, const Valu
}
}
+namespace {
+
+void
+applyTensorModifyUpdate(TensorAttribute &vec, uint32_t lid, const TensorModifyUpdate &update)
+{
+ auto oldTensor = vec.getTensor(lid);
+ auto newTensor = update.applyTo(*oldTensor);
+ if (newTensor) {
+ vec.setTensor(lid, *newTensor);
+ }
+}
+
+}
+
template <>
void
AttributeUpdater::handleUpdate(TensorAttribute &vec, uint32_t lid, const ValueUpdate &upd)
@@ -214,6 +230,8 @@ AttributeUpdater::handleUpdate(TensorAttribute &vec, uint32_t lid, const ValueUp
vec.clearDoc(lid);
updateValue(vec, lid, assign.getValue());
}
+ } else if (op == ValueUpdate::TensorModifyUpdate) {
+ applyTensorModifyUpdate(vec, lid, static_cast<const TensorModifyUpdate &>(upd));
} else if (op == ValueUpdate::Clear) {
vec.clearDoc(lid);
} else {