diff options
author | Håvard Pettersen <havardpe@yahooinc.com> | 2023-04-28 13:07:55 +0200 |
---|---|---|
committer | Håvard Pettersen <havardpe@yahooinc.com> | 2023-04-28 13:07:55 +0200 |
commit | ec495469099fc26c64736fd103facc25f8370a26 (patch) | |
tree | b79057f3f3baa05d4ba65968598563867a7464f2 | |
parent | 8cf2f720a10e3d06c69fd43a6fdfab1a59274036 (diff) |
pick up create flag for put operations
6 files changed, 31 insertions, 14 deletions
diff --git a/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java b/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java index c406bcdb2b3..663c8f47b43 100644 --- a/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java +++ b/document/src/main/java/com/yahoo/document/json/readers/VespaJsonDocumentReader.java @@ -73,10 +73,13 @@ public class VespaJsonDocumentReader { throw JsonReaderException.addDocId(e, documentParseInfo.documentId); } if (documentParseInfo.create.isPresent()) { - if (! (documentOperation instanceof DocumentUpdate update)) { - throw new IllegalArgumentException("Could not set create flag on non update operation."); + if (documentOperation instanceof DocumentUpdate update) { + update.setCreateIfNonExistent(documentParseInfo.create.get()); + } else if (documentOperation instanceof DocumentPut put) { + put.setCreateIfNonExistent(documentParseInfo.create.get()); + } else { + throw new IllegalArgumentException("Could not set create flag on operation."); } - update.setCreateIfNonExistent(documentParseInfo.create.get()); } return new ParsedDocumentOperation(documentOperation, fullyApplied); } diff --git a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java index a761a9adfb6..96b5d2c1fb5 100644 --- a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java +++ b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java @@ -893,7 +893,7 @@ public class JsonReaderTestCase { } - @Test(expected=RuntimeException.class) + @Test public void testCreateIfNonExistentInPut() { JsonReader r = createReader(inputJson("[{", " 'create':true,", @@ -902,7 +902,9 @@ public class JsonReaderTestCase { " 'nalle': 'bamse' },", " 'put': 'id:unittest:smoke::whee'", "}]")); - r.next(); + var op = r.next(); + var put = (DocumentPut) op; + assertTrue(put.getCreateIfNonExistent()); } @Test diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java index 45c93ec0755..1281bece66e 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java @@ -460,15 +460,17 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler { return new ForwardingContentChannel(in -> { enqueueAndDispatch(request, handler, () -> { - ParsedDocumentOperation put = parser.parsePut(in, path.id().toString()); - getProperty(request, CONDITION).map(TestAndSetCondition::new).ifPresent(c -> put.operation().setCondition(c)); + ParsedDocumentOperation parsed = parser.parsePut(in, path.id().toString()); + DocumentPut put = (DocumentPut)parsed.operation(); + getProperty(request, CONDITION).map(TestAndSetCondition::new).ifPresent(c -> put.setCondition(c)); + getProperty(request, CREATE, booleanParser).ifPresent(put::setCreateIfNonExistent); DocumentOperationParameters parameters = parametersFromRequest(request, ROUTE) .withResponseHandler(response -> { outstanding.decrementAndGet(); - updatePutMetrics(response.outcome(), latencyOf(request)); - handleFeedOperation(path, put.fullyApplied(), handler, response); + updatePutMetrics(response.outcome(), latencyOf(request), put.getCreateIfNonExistent()); + handleFeedOperation(path, parsed.fullyApplied(), handler, response); }); - return () -> dispatchOperation(() -> asyncSession.put((DocumentPut)put.operation(), parameters)); + return () -> dispatchOperation(() -> asyncSession.put(put, parameters)); }); }); } @@ -1091,7 +1093,8 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler { private static double latencyOf(HttpRequest r) { return (System.nanoTime() - r.relativeCreatedAtNanoTime()) / 1e+9d; } - private void updatePutMetrics(Outcome outcome, double latency) { + private void updatePutMetrics(Outcome outcome, double latency, boolean create) { + if (create && outcome == Outcome.NOT_FOUND) outcome = Outcome.SUCCESS; // >_< incrementMetricNumOperations(); incrementMetricNumPuts(); sampleLatency(latency); switch (outcome) { case SUCCESS -> incrementMetricSucceeded(); diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java index 1d81c45daf1..8f3fc27488f 100644 --- a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java +++ b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/DocumentV1ApiTest.java @@ -687,6 +687,7 @@ public class DocumentV1ApiTest { access.session.expect((put, parameters) -> { DocumentPut expectedPut = new DocumentPut(doc2); expectedPut.setCondition(new TestAndSetCondition("test it")); + expectedPut.setCreateIfNonExistent(true); assertEquals(expectedPut, put); assertEquals(parameters().withTraceLevel(9), parameters); Trace trace = new Trace(9); @@ -697,7 +698,7 @@ public class DocumentV1ApiTest { parameters.responseHandler().get().handleResponse(new DocumentResponse(0, doc2, trace)); return new Result(); }); - response = driver.sendRequest("http://localhost/document/v1/space/music/number/1/two?condition=test%20it&tracelevel=9", POST, + response = driver.sendRequest("http://localhost/document/v1/space/music/number/1/two?create=true&condition=test%20it&tracelevel=9", POST, "{" + " \"fields\": {" + " \"artist\": \"Asa-Chan & Jun-Ray\"," + diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java index d8b69bd4a85..2b67df00e12 100644 --- a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java +++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java @@ -80,8 +80,13 @@ public abstract class Feeder { while (!sender.isAborted()) { try { FeedOperation op = reader.read(); - if (createIfNonExistent && op.getDocumentUpdate() != null) { - op.getDocumentUpdate().setCreateIfNonExistent(true); + if (createIfNonExistent) { + if (op.getDocumentUpdate() != null) { + op.getDocumentUpdate().setCreateIfNonExistent(true); + } + if (op.getDocumentPut() != null) { + op.getDocumentPut().setCreateIfNonExistent(true); + } } if (op.getType() == FeedOperation.Type.INVALID) break; // Done feeding sender.sendOperation(op); diff --git a/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java b/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java index 80782a82c4c..60616759bea 100644 --- a/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java +++ b/vespaclient-java/src/test/java/com/yahoo/vespafeeder/VespaFeederTestCase.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Arrays; import com.yahoo.clientmetrics.RouteMetricSet; +import com.yahoo.document.DocumentPut; import com.yahoo.document.DocumentTypeManager; import com.yahoo.document.DocumentTypeManagerConfigurer; import com.yahoo.document.DocumentUpdate; @@ -190,6 +191,8 @@ public class VespaFeederTestCase { new VespaFeeder(arguments, f.typeManager).parseFiles(System.in, f.printStream); assertEquals(3, f.sessionFactory.messages.size()); + DocumentPut put = ((PutDocumentMessage) f.sessionFactory.messages.get(0)).getDocumentPut(); + assertTrue(put.getCreateIfNonExistent()); DocumentUpdate update = ((UpdateDocumentMessage) f.sessionFactory.messages.get(1)).getDocumentUpdate(); assertTrue(update.getCreateIfNonExistent()); } |