Pass down predicates instead of the entire predicate node 10/75810/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 5 Sep 2018 22:15:47 +0000 (00:15 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Sep 2018 09:28:27 +0000 (11:28 +0200)
Since we are not using the rest of the data, it is much simpler
to just pass down predicates. It also reduces confusion as to
what state we are propagating.

Change-Id: If790fcc2a8d023cb863d09162b25d644b0dd4638
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit e8ecfb6f906dfd7e7bff791abf0b601eb71766a8)

yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefValidatation.java

index 3f32ca7b02f0b1a5f7eea2cca995ca1b53a120e9..5c4e8ce0d7c0012d45a9a967f7085e8b0d4145f2 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.leafref;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import java.util.ArrayList;
@@ -381,13 +382,13 @@ public final class LeafRefValidatation {
     private Set<Object> computeValues(final NormalizedNode<?, ?> node, final Iterable<QNameWithPredicate> path,
             final YangInstanceIdentifier current) {
         final HashSet<Object> values = new HashSet<>();
-        addValues(values, node, path, current, QNameWithPredicate.ROOT);
+        addValues(values, node, ImmutableList.of(), path, current);
         return values;
     }
 
     private void addValues(final Set<Object> values, final NormalizedNode<?, ?> node,
-            final Iterable<QNameWithPredicate> path, final YangInstanceIdentifier current,
-            final QNameWithPredicate previousQName) {
+            final List<QNamePredicate> nodePredicates, final Iterable<QNameWithPredicate> path,
+            final YangInstanceIdentifier current) {
         if (node instanceof ValueNode) {
             values.add(node.getValue());
             return;
@@ -403,46 +404,42 @@ public final class LeafRefValidatation {
         if (!iterator.hasNext()) {
             return;
         }
-        final QNameWithPredicate qnameWithPredicate = iterator.next();
-        final QName qName = qnameWithPredicate.getQName();
-        final PathArgument pathArgument = new NodeIdentifier(qName);
 
+        final QNameWithPredicate next = iterator.next();
+        final QName qname = next.getQName();
+        final PathArgument pathArgument = new NodeIdentifier(qname);
         if (node instanceof DataContainerNode) {
             final DataContainerNode<?> dataContainerNode = (DataContainerNode<?>) node;
             final Optional<DataContainerChild<? extends PathArgument, ?>> child = dataContainerNode
                     .getChild(pathArgument);
 
             if (child.isPresent()) {
-                addValues(values, child.get(), nextLevel(path), current, qnameWithPredicate);
+                addValues(values, child.get(), next.getQNamePredicates(), nextLevel(path), current);
             } else {
                 for (final ChoiceNode choiceNode : getChoiceNodes(dataContainerNode)) {
-                    addValues(values, choiceNode, path, current, qnameWithPredicate);
+                    addValues(values, choiceNode, next.getQNamePredicates(), path, current);
                 }
             }
 
         } else if (node instanceof MapNode) {
             final MapNode map = (MapNode) node;
-            final List<QNamePredicate> qNamePredicates = previousQName.getQNamePredicates();
-            if (qNamePredicates.isEmpty() || current == null) {
+            if (nodePredicates.isEmpty() || current == null) {
                 final Iterable<MapEntryNode> value = map.getValue();
                 for (final MapEntryNode mapEntryNode : value) {
                     final Optional<DataContainerChild<? extends PathArgument, ?>> child = mapEntryNode
                             .getChild(pathArgument);
 
                     if (child.isPresent()) {
-                        addValues(values, child.get(), nextLevel(path), current, qnameWithPredicate);
+                        addValues(values, child.get(), next.getQNamePredicates(), nextLevel(path), current);
                     } else {
                         for (final ChoiceNode choiceNode : getChoiceNodes(mapEntryNode)) {
-                            addValues(values, choiceNode, path, current, qnameWithPredicate);
+                            addValues(values, choiceNode, next.getQNamePredicates(), path, current);
                         }
                     }
                 }
             } else {
                 final Map<QName, Set<?>> keyValues = new HashMap<>();
-
-                final Iterator<QNamePredicate> predicates = qNamePredicates.iterator();
-                while (predicates.hasNext()) {
-                    final QNamePredicate predicate = predicates.next();
+                for (QNamePredicate predicate : nodePredicates) {
                     final QName identifier = predicate.getIdentifier();
                     final LeafRefPath predicatePathKeyExpression = predicate.getPathKeyExpression();
                     final Set<?> pathKeyExprValues = getPathKeyExpressionValues(predicatePathKeyExpression, current);
@@ -456,10 +453,10 @@ public final class LeafRefValidatation {
                                 .getChild(pathArgument);
 
                         if (child.isPresent()) {
-                            addValues(values, child.get(), nextLevel(path), current, qnameWithPredicate);
+                            addValues(values, child.get(), next.getQNamePredicates(), nextLevel(path), current);
                         } else {
                             for (final ChoiceNode choiceNode : getChoiceNodes(mapEntryNode)) {
-                                addValues(values, choiceNode,  path, current, qnameWithPredicate);
+                                addValues(values, choiceNode,  next.getQNamePredicates(), path, current);
                             }
                         }
                     }