Add DOMQueryResult 47/93347/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 16:35:02 +0000 (17:35 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 22:10:31 +0000 (23:10 +0100)
Working with DOMQueryEvaluator is clunky, introduce a DOMQueryResult,
which reigns it in a bit.

JIRA: MDSAL-605
Change-Id: I83c29c56d184ff880c22154bbb8a3b2bc4f9ec3d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/DefaultQuery.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/query/DOMQueryResult.java [new file with mode: 0644]
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java

index 615cc61d2e7600934f735d52c384c0317f0ee75f..d0f73440e5845d737565a18b31933a8fcd9de3ab 100644 (file)
@@ -11,17 +11,14 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
-import java.util.List;
-import java.util.Map.Entry;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
 import org.opendaylight.mdsal.binding.api.query.QueryResult;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.dom.api.query.DOMQuery;
 import org.opendaylight.mdsal.dom.api.query.DOMQueryLike;
+import org.opendaylight.mdsal.dom.api.query.DOMQueryResult;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 @Beta
 @NonNullByDefault
@@ -39,9 +36,8 @@ public final class DefaultQuery<T extends DataObject> implements QueryExpression
         return domQuery;
     }
 
-    public QueryResult<T> toQueryResult(
-            final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> domResult) {
-        return new DefaultQueryResult<>(codec, domResult);
+    public QueryResult<T> toQueryResult(final DOMQueryResult domResult) {
+        return new DefaultQueryResult<>(codec, domResult.items());
     }
 
     @Override
diff --git a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/query/DOMQueryResult.java b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/query/DOMQueryResult.java
new file mode 100644 (file)
index 0000000..7138662
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.dom.api.query;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.Map.Entry;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+/**
+ * An object holding the results of a {@link DOMQuery} execution.
+ */
+@Beta
+@NonNullByDefault
+public final class DOMQueryResult implements Immutable {
+    private static final DOMQueryResult EMPTY_INSTANCE = new DOMQueryResult(ImmutableList.of());
+
+    private final ImmutableList<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items;
+
+    private DOMQueryResult(final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
+        this.items = ImmutableList.copyOf(items);
+    }
+
+    public static DOMQueryResult of() {
+        return EMPTY_INSTANCE;
+    }
+
+    public static DOMQueryResult of(final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
+        return items.isEmpty() ? of() : new DOMQueryResult(items);
+    }
+
+    public List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items() {
+        return items;
+    }
+}
index 0a38354c508506e52f5b8b370cbd862b01e54ddc..80cc9e249cb393bc80a3b08777b6b199aa64985c 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.mdsal.dom.spi.query;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.collect.ImmutableList;
 import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
@@ -19,6 +18,7 @@ import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.mdsal.dom.api.query.DOMQuery;
 import org.opendaylight.mdsal.dom.api.query.DOMQueryPredicate;
+import org.opendaylight.mdsal.dom.api.query.DOMQueryResult;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
@@ -42,8 +42,7 @@ public final class DOMQueryEvaluator {
      * @return Result of evaluation
      * @throws NullPointerException if any argument is null
      */
-    public static List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> evaluateOn(final DOMQuery query,
-            final NormalizedNode<?, ?> queryRoot) {
+    public static DOMQueryResult evaluateOn(final DOMQuery query, final NormalizedNode<?, ?> queryRoot) {
         final YangInstanceIdentifier path = query.getSelect();
         return path.isEmpty() ? evalSingle(queryRoot, query)
             : evalPath(new ArrayDeque<>(path.getPathArguments()), queryRoot, query);
@@ -59,24 +58,23 @@ public final class DOMQueryEvaluator {
      * @return Result of evaluation
      * @throws NullPointerException if any argument is null
      */
-    public static List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> evaluateOnRoot(
-            final DOMQuery query, final NormalizedNode<?, ?> root) {
+    public static DOMQueryResult evaluateOnRoot(final DOMQuery query, final NormalizedNode<?, ?> root) {
         NormalizedNode<?, ?> evalRoot = root;
         for (PathArgument arg : query.getRoot().getPathArguments()) {
             final Optional<NormalizedNode<?, ?>> next = NormalizedNodes.findNode(root, arg);
             if (next.isEmpty()) {
-                return ImmutableList.of();
+                return DOMQueryResult.of();
             }
             evalRoot = next.orElseThrow();
         }
         return evaluateOn(query, evalRoot);
     }
 
-    private static List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> evalPath(
-            final ArrayDeque<PathArgument> remaining, final NormalizedNode<?,?> data, final DOMQuery query) {
+    private static DOMQueryResult evalPath(final ArrayDeque<PathArgument> remaining, final NormalizedNode<?, ?> data,
+            final DOMQuery query) {
         final List<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> result = new ArrayList<>();
         evalPath(result, query.getRoot(), remaining, data, query);
-        return result;
+        return DOMQueryResult.of(result);
     }
 
     private static void evalPath(final List<Entry<YangInstanceIdentifier, NormalizedNode<?,?>>> result,
@@ -102,10 +100,9 @@ public final class DOMQueryEvaluator {
         remaining.push(next);
     }
 
-    private static List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> evalSingle(
-            final NormalizedNode<?, ?> data, final DOMQuery query) {
-        return matches(data, query) ? ImmutableList.of()
-                : ImmutableList.of(new SimpleImmutableEntry<>(query.getRoot(), data));
+    private static DOMQueryResult evalSingle(final NormalizedNode<?, ?> data, final DOMQuery query) {
+        return matches(data, query) ? DOMQueryResult.of()
+                : DOMQueryResult.of(List.of(new SimpleImmutableEntry<>(query.getRoot(), data)));
     }
 
     private static boolean matches(final NormalizedNode<?, ?> data, final DOMQuery query) {