From eb1359241f3479661b4b317c05b3b2f96e8b6717 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 23 Oct 2020 21:19:20 +0200 Subject: [PATCH] Update QueryResult design A query needs to result in a set of path/object tuples, as we really need to discern matches. Having a concrete path of matches helps getting identifiers of parent objects for subquent queries. DOMQueryResult already contains this capability, we just need to propagate it. JIRA: MDSAL-604 Change-Id: Iec9ad34aac105eeb45c26a31a24611c9e0f2bb82 Signed-off-by: Robert Varga --- .../binding/api/query/QueryExecutor.java | 2 + .../mdsal/binding/api/query/QueryResult.java | 40 +++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryExecutor.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryExecutor.java index 490aed31f5..77fbf348a2 100644 --- a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryExecutor.java +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryExecutor.java @@ -9,9 +9,11 @@ package org.opendaylight.mdsal.binding.api.query; import com.google.common.annotations.Beta; import com.google.common.util.concurrent.ListenableFuture; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.binding.DataObject; @Beta +@NonNullByDefault public interface QueryExecutor { ListenableFuture> executeQuery(QueryExpression query); diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryResult.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryResult.java index 55b3703d5f..9d6e68e9c9 100644 --- a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryResult.java +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/QueryResult.java @@ -7,14 +7,15 @@ */ package org.opendaylight.mdsal.binding.api.query; -import com.google.common.annotations.Beta; import java.util.List; import java.util.Spliterator; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** * Result of executing a {@link QueryExpression}. It is composed of one or more result values, which can be accessed via @@ -22,8 +23,29 @@ import org.opendaylight.yangtools.yang.binding.DataObject; * * @param Result object type */ -@Beta +@NonNullByDefault public interface QueryResult { + /** + * A single item in the result set. It is identified by its path and the corresponding object.. + * + * @param Result object type + */ + interface Item extends Immutable { + /** + * Return the result object. + * + * @return Result object + */ + T object(); + + /** + * Return the {@link InstanceIdentifier} of the result object. This is guaranteed to be non-wildcard. + * + * @return InstanceIdentifier of the result object + */ + InstanceIdentifier path(); + } + /** * Returns a spliterator over values of the result. * @@ -31,14 +53,14 @@ public interface QueryResult { */ // 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 - @NonNull Spliterator spliterator(); + Spliterator> spliterator(); /** * Returns a sequential {@link Stream} of values from the result. * * @return A stream of non-null values. */ - default @NonNull Stream stream() { + default Stream> stream() { return StreamSupport.stream(spliterator(), false); } @@ -47,11 +69,15 @@ public interface QueryResult { * * @return A stream of non-null values. */ - default @NonNull Stream parallelStream() { + default Stream> parallelStream() { return StreamSupport.stream(spliterator(), true); } - default @NonNull List getValues() { + default List getValues() { + return stream().map(Item::object).collect(Collectors.toUnmodifiableList()); + } + + default List> getItems() { return stream().collect(Collectors.toUnmodifiableList()); } } -- 2.36.6