Create YangInstanceIdentifier only for a match 53/93353/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 19:19:48 +0000 (20:19 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 22:10:31 +0000 (23:10 +0100)
This is a classic performance tune up: do not create
YangInstanceIdentifier until we need it.

JIRA: MDSAL-605
Change-Id: Idf9f391d5e7d8080795ce3f6d9b943b5240fe21e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java

index 80cc9e249cb393bc80a3b08777b6b199aa64985c..7e20375a62a2ea59befdcffbb115f1b900df5a43 100644 (file)
@@ -12,6 +12,7 @@ import static com.google.common.base.Preconditions.checkArgument;
 import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.Deque;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Optional;
@@ -73,17 +74,17 @@ public final class DOMQueryEvaluator {
     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);
+        evalPath(result, new ArrayDeque<>(query.getRoot().getPathArguments()), remaining, data, query);
         return DOMQueryResult.of(result);
     }
 
     private static void evalPath(final List<Entry<YangInstanceIdentifier, NormalizedNode<?,?>>> result,
-            final YangInstanceIdentifier path, final ArrayDeque<PathArgument> remaining,
+            final Deque<PathArgument> path, final ArrayDeque<PathArgument> remaining,
             final NormalizedNode<?, ?> data, final DOMQuery query) {
         final PathArgument next = remaining.poll();
         if (next == null) {
             if (matches(data, query)) {
-                result.add(new SimpleImmutableEntry<>(path, data));
+                result.add(new SimpleImmutableEntry<>(YangInstanceIdentifier.create(path), data));
             }
             return;
         }
@@ -91,15 +92,23 @@ public final class DOMQueryEvaluator {
         if (data instanceof MapNode && next instanceof NodeIdentifier) {
             checkArgument(data.getIdentifier().equals(next), "Unexpected step %s", next);
             for (MapEntryNode child : ((MapNode) data).getValue()) {
-                evalPath(result, path.node(child.getIdentifier()), remaining, child, query);
+                evalChild(result, path, remaining, query, child);
             }
         } else {
             NormalizedNodes.getDirectChild(data, next).ifPresent(
-                child -> evalPath(result, path.node(next), remaining, child, query));
+                child -> evalChild(result, path, remaining, query, child));
         }
         remaining.push(next);
     }
 
+    private static void evalChild(final List<Entry<YangInstanceIdentifier, NormalizedNode<?,?>>> result,
+            final Deque<PathArgument> path, final ArrayDeque<PathArgument> remaining, final DOMQuery query,
+            final NormalizedNode<?, ?> child) {
+        path.addLast(child.getIdentifier());
+        evalPath(result, path, remaining, child, query);
+        path.removeLast();
+    }
+
     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)));