summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@verizonmedia.com>2020-05-13 13:23:54 +0200
committerValerij Fredriksen <valerijf@verizonmedia.com>2020-05-13 13:23:54 +0200
commitbc9ef59674aba48a793c3efc18983cccf21bb651 (patch)
treef18e1b805f8736d99ca074b63fbe00f5e93defaa /vespajlib
parent41d4cea790f4779b2b64565b98664c18a13032f1 (diff)
Add method to convert Slime array to Stream
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java21
-rw-r--r--vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java13
2 files changed, 34 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java b/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java
index 2ed7331a60c..5084e6554cb 100644
--- a/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java
+++ b/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java
@@ -4,7 +4,12 @@ package com.yahoo.slime;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.util.Iterator;
import java.util.Optional;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
/**
* Extra utilities/operations on slime trees.
@@ -118,4 +123,20 @@ public class SlimeUtils {
public static Optional<String> optionalString(Inspector inspector) {
return Optional.of(inspector.asString()).filter(s -> !s.isEmpty());
}
+
+ public static Iterator<Inspector> entriesIterator(Inspector inspector) {
+ return new Iterator<>() {
+ private int current = 0;
+ @Override public boolean hasNext() { return current < inspector.entries(); }
+ @Override public Inspector next() { return inspector.entry(current++); }
+ };
+ }
+
+ /** Returns stream of entries for given inspector. If the inspector is not an array, empty stream is returned */
+ public static Stream<Inspector> entriesStream(Inspector inspector) {
+ int characteristics = Spliterator.NONNULL | Spliterator.SIZED | Spliterator.ORDERED;
+ return StreamSupport.stream(
+ Spliterators.spliteratorUnknownSize(entriesIterator(inspector), characteristics),
+ false);
+ }
}
diff --git a/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java b/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java
index 237b1575bfb..5757202aaf1 100644
--- a/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java
+++ b/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java
@@ -5,6 +5,8 @@ import com.yahoo.text.Utf8;
import org.junit.Test;
import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
@@ -97,4 +99,15 @@ public class SlimeUtilsTest {
}
}
+ @Test
+ public void test_stream() {
+ String json = "{\"constant\":0,\"list\":[1,2,4,3,0],\"object\":{\"a\":1,\"c\":3,\"b\":2}}";
+ Inspector inspector = SlimeUtils.jsonToSlimeOrThrow(json).get();
+ assertEquals(0, SlimeUtils.entriesStream(inspector.field("constant")).count());
+ assertEquals(0, SlimeUtils.entriesStream(inspector.field("object")).count());
+
+ assertEquals(List.of(1L, 2L, 4L, 3L, 0L),
+ SlimeUtils.entriesStream(inspector.field("list")).map(Inspector::asLong).collect(Collectors.toList()));
+ }
+
}