From 235b6e5b687a5b5fd9ca084f4e10758bbe400bb1 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 25 Oct 2020 23:03:48 +0100 Subject: [PATCH] Peel predicate identifiers Most of the time we will be treated with simple predicates, peel them off, so we do not end up iterating. JIRA: MDSAL-605 Change-Id: I1864c33c5aa34cd3a58171f8cfbe729dd325fb35 Signed-off-by: Robert Varga --- .../mdsal/dom/spi/query/DOMQueryEvaluator.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java index 7e20375a62..12df752e9d 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/query/DOMQueryEvaluator.java @@ -116,7 +116,17 @@ public final class DOMQueryEvaluator { private static boolean matches(final NormalizedNode data, final DOMQuery query) { for (DOMQueryPredicate pred : query.getPredicates()) { - if (!pred.test(NormalizedNodes.findNode(data, pred.getPath()).orElse(null))) { + // Okay, now we need to deal with predicates, but do it in a smart fashion, so we do not end up iterating + // all over the place. Typically we will be matching just a leaf. + final YangInstanceIdentifier path = pred.getPath(); + final Optional> node; + if (path.coerceParent().isEmpty()) { + node = NormalizedNodes.getDirectChild(data, path.getLastPathArgument()); + } else { + node = NormalizedNodes.findNode(data, path); + } + + if (!pred.test(node.orElse(null))) { return false; } } -- 2.36.6