summaryrefslogtreecommitdiffstats
path: root/vespa-feed-client
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-06-23 19:07:46 +0200
committerJon Marius Venstad <venstad@gmail.com>2021-06-23 19:07:46 +0200
commitc9770112336d353dc5e69357ffbd0f830d08068e (patch)
tree2a476842751511ded7b1702efb4264a6631697f6 /vespa-feed-client
parentf8b5458406a0bc6f9d39afcfa61d266823ec46fd (diff)
Support concatenated JSON objects as feed format
Diffstat (limited to 'vespa-feed-client')
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java12
-rw-r--r--vespa-feed-client/src/test/java/ai/vespa/feed/client/JsonFeederTest.java44
2 files changed, 49 insertions, 7 deletions
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java
index 0ba373eef18..aa4cd40f952 100644
--- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java
+++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/JsonFeeder.java
@@ -359,16 +359,14 @@ public class JsonFeeder implements Closeable {
abstract String getDocumentJson(long start, long end);
CompletableFuture<Result> next() throws IOException {
- if (multipleOperations && !arrayPrefixParsed){
- expect(START_ARRAY);
+ JsonToken token = parser.nextToken();
+ if (multipleOperations && ! arrayPrefixParsed && token == START_ARRAY) {
arrayPrefixParsed = true;
+ token = parser.nextToken();
}
-
- JsonToken token = parser.nextToken();
if (token == END_ARRAY && multipleOperations) return null;
- else if (token == null && !multipleOperations) return null;
- else if (token == START_OBJECT);
- else throw new OperationParseException("Unexpected token '" + parser.currentToken() + "' at offset " + parser.getTokenLocation().getByteOffset());
+ else if (token == null && ! arrayPrefixParsed) return null;
+ else if (token != START_OBJECT) throw new OperationParseException("Unexpected token '" + parser.currentToken() + "' at offset " + parser.getTokenLocation().getByteOffset());
long start = 0, end = -1;
OperationType type = null;
DocumentId id = null;
diff --git a/vespa-feed-client/src/test/java/ai/vespa/feed/client/JsonFeederTest.java b/vespa-feed-client/src/test/java/ai/vespa/feed/client/JsonFeederTest.java
index 3e0f886a40a..6c26e1d8ae8 100644
--- a/vespa-feed-client/src/test/java/ai/vespa/feed/client/JsonFeederTest.java
+++ b/vespa-feed-client/src/test/java/ai/vespa/feed/client/JsonFeederTest.java
@@ -3,11 +3,13 @@ package ai.vespa.feed.client;
import org.junit.jupiter.api.Test;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
@@ -77,6 +79,48 @@ class JsonFeederTest {
}
@Test
+ public void multipleJsonArrayOperationsAreDispatchedToFeedClient() throws IOException, ExecutionException, InterruptedException {
+ SimpleClient client = new SimpleClient();
+ try (JsonFeeder feeder = JsonFeeder.builder(client).build()) {
+ String json = "[{" +
+ " \"put\": \"id:ns:type::abc1\",\n" +
+ " \"fields\": {\n" +
+ " \"lul\":\"lal\"\n" +
+ " }\n" +
+ "},\n" +
+ "{" +
+ " \"put\": \"id:ns:type::abc2\",\n" +
+ " \"fields\": {\n" +
+ " \"lul\":\"lal\"\n" +
+ " }\n" +
+ "}]\n";
+ feeder.feedMany(new ByteArrayInputStream(json.getBytes(UTF_8))).get();
+ assertEquals(new HashSet<>(Arrays.asList("abc1", "abc2")), client.ids);
+ }
+ }
+
+ @Test
+ public void multipleJsonLOperationsAreDispatchedToFeedClient() throws IOException, ExecutionException, InterruptedException {
+ SimpleClient client = new SimpleClient();
+ try (JsonFeeder feeder = JsonFeeder.builder(client).build()) {
+ String json = "{" +
+ " \"put\": \"id:ns:type::abc1\",\n" +
+ " \"fields\": {\n" +
+ " \"lul\":\"lal\"\n" +
+ " }\n" +
+ "}\n" +
+ "{" +
+ " \"put\": \"id:ns:type::abc2\",\n" +
+ " \"fields\": {\n" +
+ " \"lul\":\"lal\"\n" +
+ " }\n" +
+ "}\n";
+ feeder.feedMany(new ByteArrayInputStream(json.getBytes(UTF_8))).get();
+ assertEquals(new HashSet<>(Arrays.asList("abc1", "abc2")), client.ids);
+ }
+ }
+
+ @Test
public void singleJsonOperationIsDispatchedToFeedClient() throws IOException, ExecutionException, InterruptedException {
try (JsonFeeder feeder = JsonFeeder.builder(new SimpleClient()).build()) {
String json = "{\"put\": \"id:ns:type::abc1\",\n" +