Add support for selecting exact items from lists 42/93442/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 27 Oct 2020 19:53:23 +0000 (20:53 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 28 Oct 2020 11:02:34 +0000 (12:02 +0100)
The query language prototype was centered around wildcard matches,
while it ignored exact matches in building up the query. Add support
for specifying a list key, as one would in normal InstanceIdentifier.

JIRA: MDSAL-612
Change-Id: I0c63d6d4990a31888f33a86c9d798b09bb10c734
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 702435f43074c05a197975e6b15c4188e4981841)

binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/DescendantQueryBuilder.java
binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/query/MatchBuilderPath.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/DefaultDescendantQueryBuilder.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/DefaultMatchBuilderPath.java

index a42ad169802c65ef245e4931a51c735e8eeb3cb0..189510c38cda866f180ab9c04e2a2e9b09ebb15f 100644 (file)
@@ -12,6 +12,8 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
+import org.opendaylight.yangtools.yang.binding.Identifier;
 
 /**
  * Intermediate Query builder stage, which allows the specification of the query result type to be built up via
@@ -33,6 +35,20 @@ public interface DescendantQueryBuilder<T extends DataObject> extends Structural
      */
     <N extends ChildOf<? super T>> @NonNull DescendantQueryBuilder<N> extractChild(Class<N> childClass);
 
+    /**
+     * Add a child path component to the specification of what needs to be extracted, specifying an exact match in
+     * a keyed list. This method, along with its alternatives, can be used to specify which object type to select from
+     * the root path.
+     *
+     * @param <N> List type
+     * @param <K> Key type
+     * @param listKey List key
+     * @return This builder
+     * @throws NullPointerException if childClass is null
+     */
+    <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
+        @NonNull DescendantQueryBuilder<N> extractChild(Class<@NonNull N> listItem, K listKey);
+
     /**
      * Add a child path component to the specification of what needs to be extracted. This method, along with its
      * alternatives, can be used to specify which object type to select from the root path.
index e753d58bc98d16aca3cf6de1aee2c6c5b1dcaf10..abace24cea3d0f722756933e7a0cd453c383ebd4 100644 (file)
@@ -15,6 +15,8 @@ import org.opendaylight.yangtools.yang.binding.BaseIdentity;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
+import org.opendaylight.yangtools.yang.binding.Identifier;
 import org.opendaylight.yangtools.yang.binding.TypeObject;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.Uint16;
@@ -46,6 +48,20 @@ public interface MatchBuilderPath<O extends DataObject, T extends DataObject> ex
     <C extends ChoiceIn<? super T> & DataObject, N extends ChildOf<? super C>>
         @NonNull MatchBuilderPath<O, N> extractChild(Class<C> caseClass, Class<N> childClass);
 
+    /**
+     * Add a child path component to the specification of what needs to be extracted, specifying an exact match in
+     * a keyed list. This method, along with its alternatives, can be used to specify which object type to select from
+     * the root path.
+     *
+     * @param <N> List type
+     * @param <K> Key type
+     * @param listKey List key
+     * @return This builder
+     * @throws NullPointerException if childClass is null
+     */
+    <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
+        @NonNull MatchBuilderPath<O, N> extractChild(Class<@NonNull N> listItem, K listKey);
+
     /**
      * Match an {@code empty} leaf's value.
      *
index c99ab47ee5395aed5c52e48109deea8acf2bdf66..40041c64252245519138a3d8c5e64da34f14f357 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter.query;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.query.DescendantQueryBuilder;
 import org.opendaylight.mdsal.binding.api.query.MatchBuilderPath;
 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
@@ -15,6 +16,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
+import org.opendaylight.yangtools.yang.binding.Identifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 
@@ -43,6 +46,14 @@ final class DefaultDescendantQueryBuilder<R extends DataObject, T extends DataOb
         return (DefaultDescendantQueryBuilder<R, N>) this;
     }
 
+    @Override
+    @SuppressWarnings("unchecked")
+    public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
+            DescendantQueryBuilder<N> extractChild(final Class<@NonNull N> listItem, final K listKey) {
+        childPath.child(listItem, listKey);
+        return (DefaultDescendantQueryBuilder<R, N>) this;
+    }
+
     @Override
     public MatchBuilderPath<T, T> matching() {
         final InstanceIdentifier<T> selectPath = childPath.build();
index e5e1034adb3006b24f29679f1643d79e15ca87d8..226e1df337982de15afd2a95bf4b5e93bb534deb 100644 (file)
@@ -18,6 +18,8 @@ import org.opendaylight.yangtools.yang.binding.BaseIdentity;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
+import org.opendaylight.yangtools.yang.binding.Identifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.opendaylight.yangtools.yang.binding.TypeObject;
@@ -54,6 +56,14 @@ final class DefaultMatchBuilderPath<O extends DataObject, T extends DataObject>
         return (MatchBuilderPath<O, N>) this;
     }
 
+    @Override
+    @SuppressWarnings("unchecked")
+    public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
+            MatchBuilderPath<O, N> extractChild(final Class<@NonNull N> listItem, final K listKey) {
+        target.child(listItem, listKey);
+        return (MatchBuilderPath<O, N>) this;
+    }
+
     @Override
     public ValueMatchBuilder<O, Empty> leaf(final EmptyLeafReference<T> methodRef) {
         return defaultFor(methodRef);