diff options
author | Tor Egge <Tor.Egge@oath.com> | 2018-08-15 14:17:07 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@oath.com> | 2018-08-15 14:17:07 +0000 |
commit | 35996c0c1f9c19d144ae4ddffbeb6a965f2be200 (patch) | |
tree | a76dec1166e85b4f6fa9322fcaf5827472d33047 /document | |
parent | ce18b860f1a7802fde6230e615a259fccbc34c3d (diff) |
Iterate over result list in reverse order to avoid stale
array indexes when removing array elements.
Diffstat (limited to 'document')
-rw-r--r-- | document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java | 6 | ||||
-rwxr-xr-x | document/src/test/java/com/yahoo/document/DocumentPathUpdateTestCase.java | 18 |
2 files changed, 22 insertions, 2 deletions
diff --git a/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java b/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java index 82dea23bb85..29c876b85fe 100644 --- a/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java +++ b/document/src/main/java/com/yahoo/document/fieldpathupdate/FieldPathUpdate.java @@ -12,6 +12,7 @@ import com.yahoo.document.select.ResultList; import com.yahoo.document.select.parser.ParseException; import com.yahoo.document.serialization.DocumentUpdateReader; import com.yahoo.document.serialization.VespaDocumentSerializerHead; +import java.util.ListIterator; /** * @author Thomas Gundersen @@ -115,8 +116,9 @@ public abstract class FieldPathUpdate { doc.iterateNested(fieldPath, 0, handler); } else { ResultList results = selector.getMatchingResultList(new DocumentPut(doc)); - - for (ResultList.ResultPair rp : results.getResults()) { + ListIterator<ResultList.ResultPair> resultIter = results.getResults().listIterator(results.getResults().size()); + while (resultIter.hasPrevious()) { + ResultList.ResultPair rp = resultIter.previous(); if (rp.getResult() == Result.TRUE) { FieldPathIteratorHandler handler = getIteratorHandler(doc); handler.getVariables().clear(); diff --git a/document/src/test/java/com/yahoo/document/DocumentPathUpdateTestCase.java b/document/src/test/java/com/yahoo/document/DocumentPathUpdateTestCase.java index a0c891a3f30..ce55a5a501c 100755 --- a/document/src/test/java/com/yahoo/document/DocumentPathUpdateTestCase.java +++ b/document/src/test/java/com/yahoo/document/DocumentPathUpdateTestCase.java @@ -103,6 +103,24 @@ public class DocumentPathUpdateTestCase { } @Test + public void testApplyRemoveMultiList2() { + Document doc = new Document(docMan.getDocumentType("foobar"), new DocumentId("doc:something:foooo")); + assertNull(doc.getFieldValue("strarray")); + Array<StringFieldValue> strArray = new Array<>(doc.getField("strarray").getDataType()); + strArray.add(new StringFieldValue("remove val 0 and 1")); + strArray.add(new StringFieldValue("remove val 0 and 1")); + strArray.add(new StringFieldValue("hello hello")); + doc.setFieldValue("strarray", strArray); + assertNotNull(doc.getFieldValue("strarray")); + DocumentUpdate docUp = new DocumentUpdate(docType, new DocumentId("doc:foo:bar")); + docUp.addFieldPathUpdate(new RemoveFieldPathUpdate(doc.getDataType(), "strarray[$x]", "foobar.strarray[$x] == \"remove val 0 and 1\"")); + docUp.applyTo(doc); + assertEquals(1, ((List) doc.getFieldValue("strarray")).size()); + List docList = (List) doc.getFieldValue("strarray"); + assertEquals(new StringFieldValue("hello hello"), docList.get(0)); + } + + @Test public void testApplyRemoveEntireListField() { Document doc = new Document(docMan.getDocumentType("foobar"), new DocumentId("doc:something:foooo")); assertNull(doc.getFieldValue("strarray")); |