diff options
2 files changed, 62 insertions, 2 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java index 40a3f832592..f38c3af05b8 100644 --- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java +++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/FieldUpdateHelper.java @@ -91,10 +91,8 @@ public abstract class FieldUpdateHelper { throw new IllegalArgumentException("Expected multi-value data type, got " + val.getDataType().getName() + "."); } } else if (upd instanceof TensorModifyUpdate) { - // TODO: apply update to field value when supported in TensorModifyUpdate in Java? return val; } else if (upd instanceof TensorAddUpdate) { - // TODO: apply update to field value when supported in TensorAddUpdate in Java? return val; } throw new UnsupportedOperationException("Value update type " + upd.getClass().getName() + " not supported."); diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/DocumentToValueUpdateTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/DocumentToValueUpdateTestCase.java index 83947b5f64d..b9e9e54bc22 100644 --- a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/DocumentToValueUpdateTestCase.java +++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/DocumentToValueUpdateTestCase.java @@ -4,6 +4,8 @@ package com.yahoo.vespa.indexinglanguage; import com.yahoo.document.*; import com.yahoo.document.datatypes.*; import com.yahoo.document.update.*; +import com.yahoo.tensor.Tensor; +import com.yahoo.tensor.TensorType; import org.junit.Test; import static org.junit.Assert.*; @@ -337,4 +339,64 @@ public class DocumentToValueUpdateTestCase { assertTrue(valueUpd instanceof RemoveValueUpdate); assertEquals(new StringFieldValue("bar"), valueUpd.getValue()); } + + private static class TensorFixture { + + private DocumentType docType = new DocumentType("test"); + private String tensorField; + + public TensorFixture() { + this("sparse_tensor", "tensor(x{})"); + } + + public TensorFixture(String tensorField, String typeSpec) { + this.tensorField = tensorField; + docType.addField(new Field(tensorField, DataType.getTensor(TensorType.fromSpec(typeSpec)))); + } + + Document assertTensorUpdateNotApplied(ValueUpdate tensorUpdate) { + Document result = FieldUpdateHelper.newPartialDocument(docType, null, docType.getField(tensorField), tensorUpdate); + assertNotNull(result); + + TensorFieldValue tensor = (TensorFieldValue) result.getFieldValue(tensorField); + assertTrue(tensor.getTensor().isEmpty()); + + return result; + } + + public <T extends ValueUpdate> void assertTensorUpdatePassesThrough(T tensorUpdate, Document doc) { + UpdateAdapter adapter = FieldUpdateAdapter.fromPartialUpdate(new SimpleDocumentAdapter(null, doc), tensorUpdate); + + DocumentUpdate docUpdate = adapter.getOutput(); + assertNotNull(docUpdate); + assertEquals(1, docUpdate.fieldUpdates().size()); + + FieldUpdate fieldUpdate = docUpdate.fieldUpdates().iterator().next(); + assertNotNull(fieldUpdate); + assertEquals(1, fieldUpdate.getValueUpdates().size()); + ValueUpdate valueUpdate = fieldUpdate.getValueUpdate(0); + T actValueUpdate = (T) valueUpdate; + assertEquals(tensorUpdate, actValueUpdate); + } + } + + @Test + public void tensor_modify_update_passes_through_unmodified() { + TensorFixture f = new TensorFixture(); + TensorModifyUpdate modifyUpdate = new TensorModifyUpdate(TensorModifyUpdate.Operation.REPLACE, + new TensorFieldValue(Tensor.from("tensor(x{})", "{{x:a}:3}"))); + + Document doc = f.assertTensorUpdateNotApplied(modifyUpdate); + f.assertTensorUpdatePassesThrough(modifyUpdate, doc); + } + + @Test + public void tensor_add_update_passes_through_unmodified() { + TensorFixture f = new TensorFixture(); + TensorAddUpdate addUpdate = new TensorAddUpdate(new TensorFieldValue(Tensor.from("tensor(x{})", "{{x:a}:3}"))); + + Document doc = f.assertTensorUpdateNotApplied(addUpdate); + f.assertTensorUpdatePassesThrough(addUpdate, doc); + } + } |