Expose DefaultQuery class 44/93344/5
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 14:43:54 +0000 (15:43 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Oct 2020 22:09:57 +0000 (23:09 +0100)
DefaultQuery captures the codec context, hence it is useful for
intra-implementation transforms. This includes the ability to
transform the result set from DOM.

JIRA: MDSAL-605
Change-Id: I565d1ec5070653d45bb6340e79799612fc06d61c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/DefaultQuery.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/QueryBuilderState.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/query/SimpleQueryExecutor.java

index e5858b4913dc48a203f1b7e002c302dd514bf7d4..615cc61d2e7600934f735d52c384c0317f0ee75f 100644 (file)
@@ -9,17 +9,28 @@ package org.opendaylight.mdsal.binding.dom.adapter.query;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
-import org.eclipse.jdt.annotation.NonNull;
+import java.util.List;
+import java.util.Map.Entry;
+import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
+import org.opendaylight.mdsal.binding.api.query.QueryResult;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.dom.api.query.DOMQuery;
 import org.opendaylight.mdsal.dom.api.query.DOMQueryLike;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-final class DefaultQuery<T extends DataObject> implements QueryExpression<T>, DOMQueryLike {
-    private final @NonNull DOMQuery domQuery;
+@Beta
+@NonNullByDefault
+public final class DefaultQuery<T extends DataObject> implements QueryExpression<T>, DOMQueryLike {
+    private final BindingCodecTree codec;
+    private final DOMQuery domQuery;
 
-    DefaultQuery(final DOMQuery domQuery) {
+    DefaultQuery(final BindingCodecTree codec, final DOMQuery domQuery) {
+        this.codec = requireNonNull(codec);
         this.domQuery = requireNonNull(domQuery);
     }
 
@@ -28,6 +39,11 @@ final class DefaultQuery<T extends DataObject> implements QueryExpression<T>, DO
         return domQuery;
     }
 
+    public QueryResult<T> toQueryResult(
+            final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> domResult) {
+        return new DefaultQueryResult<>(codec, domResult);
+    }
+
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this).add("dom", domQuery).toString();
index 887a894d7d9c382e5dbfcaf25ca11a352ba67532..e6cb12181d79ba597fbd0e4796f349d1420e68e1 100644 (file)
@@ -82,7 +82,7 @@ final class QueryBuilderState {
         final YangInstanceIdentifier relTarget = absTarget.relativeTo(absoluteSelect)
                 .orElseThrow(() -> new IllegalStateException(absoluteSelect + " is not an ancestor of " + absTarget));
 
-        return new BoundMethod(relTarget, targetCodec.yangPathArgumentChild(new NodeIdentifier(child.getQName())));
+        return new BoundMethod(relTarget, targetCodec.yangPathArgumentChild(NodeIdentifier.create(child.getQName())));
     }
 
     void addPredicate(final DOMQueryPredicate predicate) {
@@ -90,7 +90,7 @@ final class QueryBuilderState {
     }
 
     <T extends DataObject> @NonNull QueryExpression<T> buildQuery() {
-        return new DefaultQuery<>(new DOMQuery(root, relativeSelect, predicates));
+        return new DefaultQuery<>(codec, new DOMQuery(root, relativeSelect, predicates));
     }
 
     private @NonNull YangInstanceIdentifier fromBinding(final InstanceIdentifier<?> bindingId) {
index 776301d7b7162986c1821965e2ea07f6a95bde32..31cd85c101b3035a13e162b3db55324a7b47d816 100644 (file)
@@ -18,8 +18,6 @@ import org.opendaylight.mdsal.binding.api.query.QueryExpression;
 import org.opendaylight.mdsal.binding.api.query.QueryResult;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
-import org.opendaylight.mdsal.dom.api.query.DOMQuery;
-import org.opendaylight.mdsal.dom.api.query.DOMQueryLike;
 import org.opendaylight.mdsal.dom.spi.query.DOMQueryEvaluator;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -35,19 +33,17 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 @Beta
 public final class SimpleQueryExecutor implements QueryExecutor {
-    private final BindingCodecTree codec;
     private final NormalizedNode<?, ?> root;
 
-    public SimpleQueryExecutor(final BindingCodecTree codec, final NormalizedNode<?, ?> root) {
-        this.codec = requireNonNull(codec);
+    public SimpleQueryExecutor(final NormalizedNode<?, ?> root) {
         this.root = requireNonNull(root);
     }
 
     @Override
     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.evaluateOnRoot(domQuery, root));
+        checkArgument(query instanceof DefaultQuery, "Unsupported expression %s", query);
+        final DefaultQuery<T> defaultQuery = (DefaultQuery<T>) query;
+        return defaultQuery.toQueryResult(DOMQueryEvaluator.evaluateOnRoot(defaultQuery.asDOMQuery(), root));
     }
 
     public static @NonNull Builder builder(final BindingCodecTree codec) {
@@ -73,7 +69,7 @@ public final class SimpleQueryExecutor implements QueryExecutor {
 
         @Override
         public SimpleQueryExecutor build() {
-            return new SimpleQueryExecutor(codec, rootBuilder.build());
+            return new SimpleQueryExecutor(rootBuilder.build());
         }
     }
 }