QueryResults should be Iterable, Immutable 00/93400/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 26 Oct 2020 01:51:43 +0000 (02:51 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 27 Oct 2020 00:39:29 +0000 (01:39 +0100)
Each query result really is a holder of result items, in some
iteration order. Expose this by implementing Iterable, so that
we end up correctly implementing stream() et al.

JIRA: MDSAL-605
Change-Id: I4cf1cd29e74e8c640ee62126e4f1cb9efa956cce
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 74bf22cda1905fee5ab6d539a8a725a81c9ff826)

binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryResult.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/DefaultQueryResult.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/query/DOMQueryResult.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/EagerDOMQueryResult.java

index 9d6e68e9c9136fd16208ced0ab88d54921c851f7..5cbe15154a79f756d2b6ad71353e9d2a225a96f6 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.mdsal.binding.api.query;
 
 import java.util.List;
-import java.util.Spliterator;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
@@ -24,7 +23,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  * @param <T> Result object type
  */
 @NonNullByDefault
-public interface QueryResult<T extends DataObject> {
+public interface QueryResult<T extends DataObject> extends Iterable<QueryResult.Item<T>>, Immutable {
     /**
      * A single item in the result set. It is identified by its path and the corresponding object..
      *
@@ -46,21 +45,12 @@ public interface QueryResult<T extends DataObject> {
         InstanceIdentifier<T> path();
     }
 
-    /**
-     * Returns a spliterator over values of the result.
-     *
-     * @return Returns the a spliterator which visits query results.
-     */
-    // TODO: @throws IllegalStateException if values have been already been consumed?
-    // FIXME: we really may want to wrap each entry in a CheckedValue, so that we can communicate fetch problems
-    Spliterator<? extends Item<T>> spliterator();
-
     /**
      * Returns a sequential {@link Stream} of values from the result.
      *
      * @return A stream of non-null values.
      */
-    default Stream<? extends Item<T>> stream() {
+    default Stream<Item<T>> stream() {
         return StreamSupport.stream(spliterator(), false);
     }
 
@@ -69,7 +59,7 @@ public interface QueryResult<T extends DataObject> {
      *
      * @return A stream of non-null values.
      */
-    default Stream<? extends Item<T>> parallelStream() {
+    default Stream<Item<T>> parallelStream() {
         return StreamSupport.stream(spliterator(), true);
     }
 
index 8281101cfa6ab729df17dbff2da2de2e8728b57e..d02435ad4bc3b52768d8ef8d05cac067955b1389 100644 (file)
@@ -10,16 +10,19 @@ package org.opendaylight.mdsal.binding.dom.adapter.query;
 import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.base.Function;
 import com.google.common.base.VerifyException;
+import com.google.common.collect.Iterators;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
+import java.util.Iterator;
 import java.util.Map.Entry;
 import java.util.Spliterator;
-import java.util.function.Function;
 import java.util.stream.Stream;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.gaul.modernizer_maven_annotations.SuppressModernizer;
 import org.opendaylight.mdsal.binding.api.query.QueryResult;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
@@ -31,6 +34,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 @NonNullByDefault
+@SuppressModernizer
 final class DefaultQueryResult<T extends DataObject>
         implements QueryResult<T>, Function<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>, QueryResult.Item<T>> {
     private static final VarHandle ITEM_CODEC;
@@ -57,17 +61,22 @@ final class DefaultQueryResult<T extends DataObject>
     }
 
     @Override
-    public Spliterator<? extends Item<T>> spliterator() {
+    public Iterator<Item<T>> iterator() {
+        return Iterators.transform(domResult.iterator(), this);
+    }
+
+    @Override
+    public Spliterator<Item<T>> spliterator() {
         return new DefaultQueryResultSpliterator<>(this, domResult.spliterator());
     }
 
     @Override
-    public Stream<? extends Item<T>> stream() {
+    public Stream<Item<T>> stream() {
         return domResult.stream().map(this);
     }
 
     @Override
-    public Stream<? extends Item<T>> parallelStream() {
+    public Stream<Item<T>> parallelStream() {
         return domResult.parallelStream().map(this);
     }
 
index 14025c8ad2125ffbe4ce9ae9fd8a3b746c8861c2..d6a567eb66bc48f1503d123bf32137cb2cf105ef 100644 (file)
@@ -10,9 +10,9 @@ package org.opendaylight.mdsal.dom.api.query;
 import com.google.common.annotations.Beta;
 import java.util.List;
 import java.util.Map.Entry;
-import java.util.Spliterator;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -23,13 +23,15 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  */
 @Beta
 @NonNullByDefault
-public interface DOMQueryResult extends Immutable {
+public interface DOMQueryResult extends Iterable<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>>, Immutable {
 
-    Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> spliterator();
-
-    Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> stream();
+    default Stream<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> stream() {
+        return StreamSupport.stream(spliterator(), false);
+    }
 
-    Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> parallelStream();
+    default Stream<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> parallelStream() {
+        return StreamSupport.stream(spliterator(), true);
+    }
 
     default List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items() {
         return stream().collect(Collectors.toUnmodifiableList());
index 33d6a47c984aefa895ba159132211041b6fa7c2a..b562526c96783b3c61e50044001d946e667fdb29 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.mdsal.dom.spi.query;
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Spliterator;
-import java.util.stream.Stream;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.mdsal.dom.api.query.DOMQueryResult;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -23,7 +23,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 public final class EagerDOMQueryResult implements DOMQueryResult {
     private static final EagerDOMQueryResult EMPTY_INSTANCE = new EagerDOMQueryResult(ImmutableList.of());
 
-    private final ImmutableList<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items;
+    private final ImmutableList<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items;
 
     private EagerDOMQueryResult(final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
         this.items = ImmutableList.copyOf(items);
@@ -43,18 +43,13 @@ public final class EagerDOMQueryResult implements DOMQueryResult {
     }
 
     @Override
-    public Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> spliterator() {
-        return items.spliterator();
+    public Iterator<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> iterator() {
+        return items.iterator();
     }
 
     @Override
-    public Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> stream() {
-        return items.stream();
-    }
-
-    @Override
-    public Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> parallelStream() {
-        return items.parallelStream();
+    public Spliterator<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> spliterator() {
+        return items.spliterator();
     }
 
     @Override