Clarify DOMQueryEvaluator API 61/93361/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 15:17:08 +0000 (16:17 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 22:30:26 +0000 (23:30 +0100)
DOMQueryEvaluator has two modes of operation, each useful on its
own. Separate the two and document them.

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

binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/SimpleQueryExecutor.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java

index 608dcb326564fb975173349237d51f8f743c5e03..776301d7b7162986c1821965e2ea07f6a95bde32 100644 (file)
@@ -47,7 +47,7 @@ public final class SimpleQueryExecutor implements QueryExecutor {
     public <T extends @NonNull DataObject> QueryResult<T> executeQuery(final QueryExpression<T> query) {
         checkArgument(query instanceof DOMQueryLike, "Unsupported expression %s", query);
         final DOMQuery domQuery = ((DOMQueryLike) query).asDOMQuery();
-        return new DefaultQueryResult<>(codec, DOMQueryEvaluator.evaluate(domQuery, root));
+        return new DefaultQueryResult<>(codec, DOMQueryEvaluator.evaluateOnRoot(domQuery, root));
     }
 
     public static @NonNull Builder builder(final BindingCodecTree codec) {
index 09b2a8a032ab80ae98c2c99d466e274f70140b47..0a38354c508506e52f5b8b370cbd862b01e54ddc 100644 (file)
@@ -33,26 +33,49 @@ public final class DOMQueryEvaluator {
 
     }
 
-    public static List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> evaluate(final DOMQuery query,
-            final NormalizedNode<?, ?> root) {
+    /**
+     * Evaluate {@link DOMQuery} on its data element. The element is expected to correspond to
+     * {@link DOMQuery#getRoot()}.
+     *
+     * @param query Query to execute
+     * @param queryRoot Query root object
+     * @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) {
         final YangInstanceIdentifier path = query.getSelect();
-        return path.isEmpty() ? evalSingle(root, query)
-                : evalPath(new ArrayDeque<>(path.getPathArguments()), root, query);
+        return path.isEmpty() ? evalSingle(queryRoot, query)
+            : evalPath(new ArrayDeque<>(path.getPathArguments()), queryRoot, query);
     }
 
-    private static List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> evalPath(
-            final ArrayDeque<PathArgument> remaining, final NormalizedNode<?,?> data, final DOMQuery query) {
-        NormalizedNode<?, ?> evalRoot = data;
+    /**
+     * Evaluate {@link DOMQuery} on a conceptual root. The element is expected to correspond to the conceptual data tree
+     * root. This method will first find the {@link DOMQuery#getRoot()} and then defer to
+     * {@link #evaluateOn(DOMQuery, NormalizedNode)}.
+     *
+     * @param query Query to execute
+     * @param root Conceptual root object
+     * @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) {
+        NormalizedNode<?, ?> evalRoot = root;
         for (PathArgument arg : query.getRoot().getPathArguments()) {
-            final Optional<NormalizedNode<?, ?>> next = NormalizedNodes.findNode(data, arg);
+            final Optional<NormalizedNode<?, ?>> next = NormalizedNodes.findNode(root, arg);
             if (next.isEmpty()) {
                 return ImmutableList.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) {
         final List<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> result = new ArrayList<>();
-        evalPath(result, query.getRoot(), remaining, evalRoot, query);
+        evalPath(result, query.getRoot(), remaining, data, query);
         return result;
     }