Update DOMStoreThreePhaseCommitCohort design
[mdsal.git] / dom / mdsal-dom-spi / src / main / java / org / opendaylight / mdsal / dom / spi / store / DOMStoreReadTransaction.java
index 8509cb403033a001a079e1d2656b26a26b472a59..2f79aa909ed6e2afa16ad411a3b88d7e1efa7638 100644 (file)
@@ -7,38 +7,41 @@
  */
 package org.opendaylight.mdsal.dom.spi.store;
 
+import com.google.common.util.concurrent.FluentFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.common.api.ReadFailedException;
-
+import org.opendaylight.mdsal.dom.api.query.DOMQuery;
+import org.opendaylight.mdsal.dom.api.query.DOMQueryResult;
+import org.opendaylight.mdsal.dom.spi.query.DOMQueryEvaluator;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
 
 public interface DOMStoreReadTransaction extends DOMStoreTransaction {
-
     /**
-     * Reads data from provided logical data store located at provided path
+     * Reads data from provided logical data store located at provided path.
      *
      * @param path
      *            Path which uniquely identifies subtree which client want to
      *            read
-     * @return a CheckFuture containing the result of the read. The Future blocks until the
+     * @return a FluentFuture containing the result of the read. The Future blocks until the
      *         commit operation is complete. Once complete:
      *         <ul>
      *         <li>If the data at the supplied path exists, the Future returns an Optional object
      *         containing the data.</li>
      *         <li>If the data at the supplied path does not exist, the Future returns
-     *         Optional#absent().</li>
+     *         Optional.empty().</li>
      *         <li>If the read of the data fails, the Future will fail with a
      *         {@link ReadFailedException} or an exception derived from ReadFailedException.</li>
      *         </ul>
      */
-    CheckedFuture<Optional<NormalizedNode<?,?>>, ReadFailedException> read(YangInstanceIdentifier path);
+    FluentFuture<Optional<NormalizedNode>> read(YangInstanceIdentifier path);
 
     /**
      * Checks if data is available in the logical data store located at provided path.
-     * <p>
      *
+     * <p>
      * Note: a successful result from this method makes no guarantee that a subsequent call to {@link #read}
      * will succeed. It is possible that the data resides in a data store on a remote node and, if that
      * node goes down or a network failure occurs, a subsequent read would fail. Another scenario is if
@@ -47,7 +50,7 @@ public interface DOMStoreReadTransaction extends DOMStoreTransaction {
      * @param path
      *            Path which uniquely identifies subtree which client want to
      *            check existence of
-     * @return a CheckFuture containing the result of the check.
+     * @return a FluentFuture containing the result of the check.
      *         <ul>
      *         <li>If the data at the supplied path exists, the Future returns a Boolean
      *         whose value is true, false otherwise</li>
@@ -55,5 +58,31 @@ public interface DOMStoreReadTransaction extends DOMStoreTransaction {
      *         {@link ReadFailedException} or an exception derived from ReadFailedException.</li>
      *         </ul>
      */
-    CheckedFuture<Boolean, ReadFailedException> exists(YangInstanceIdentifier path);
+    FluentFuture<Boolean> exists(YangInstanceIdentifier path);
+
+    /**
+     * Executes a query on the provided logical data store.
+     *
+     * <p>
+     * Default operation invokes {@code read(query.getRoot())} and then executes the result with
+     * {@link DOMQueryEvaluator}. Implementations are encouraged to provide a more efficient implementation as
+     * appropriate.
+     *
+     * @param query DOMQuery to execute
+     * @return a FluentFuture containing the result of the query. The Future blocks until the operation is complete.
+     *         Once complete:
+     *         <ul>
+     *           <li>The Future returns the result of the query</li>
+     *           <li>If the query execution fails, the Future will fail with a {@link ReadFailedException} or
+     *               an exception derived from ReadFailedException.
+     *            </li>
+     *         </ul>
+     * @throws NullPointerException if any of the arguments is null
+     * @throws IllegalArgumentException if the query is not supported
+     */
+    default @NonNull FluentFuture<DOMQueryResult> execute(final DOMQuery query) {
+        return read(query.getRoot()).transform(
+            node -> node.map(data -> DOMQueryEvaluator.evaluateOn(query, data)).orElse(DOMQueryResult.of()),
+            MoreExecutors.directExecutor());
+    }
 }