@Override
 public Map<SkyKey, SkyValue> getSuccessfulValues(Iterable<SkyKey> keys) {
   return Maps.filterValues(
       Maps.transformValues(
           graph.getBatch(null, Reason.WALKABLE_GRAPH_VALUE, keys), GET_SKY_VALUE_FUNCTION),
       Predicates.notNull());
 }
 private NodeEntry getEntryForValue(SkyKey key) {
   NodeEntry entry =
       Preconditions.checkNotNull(
           graph.getBatch(null, Reason.WALKABLE_GRAPH_VALUE, ImmutableList.of(key)).get(key), key);
   Preconditions.checkState(entry.isDone(), "%s %s", key, entry);
   return entry;
 }
 @Override
 public Map<SkyKey, Iterable<SkyKey>> getDirectDeps(Iterable<SkyKey> keys) {
   Map<SkyKey, NodeEntry> entries = graph.getBatch(null, Reason.WALKABLE_GRAPH_DEPS, keys);
   Map<SkyKey, Iterable<SkyKey>> result = new HashMap<>(entries.size());
   for (Entry<SkyKey, NodeEntry> entry : entries.entrySet()) {
     Preconditions.checkState(entry.getValue().isDone(), entry);
     result.put(entry.getKey(), entry.getValue().getDirectDeps());
   }
   return result;
 }
 @Override
 public Map<SkyKey, Exception> getMissingAndExceptions(Iterable<SkyKey> keys) {
   Map<SkyKey, Exception> result = new HashMap<>();
   Map<SkyKey, NodeEntry> graphResult = graph.getBatch(null, Reason.WALKABLE_GRAPH_VALUE, keys);
   for (SkyKey key : keys) {
     NodeEntry nodeEntry = graphResult.get(key);
     if (nodeEntry == null || !nodeEntry.isDone()) {
       result.put(key, null);
     } else {
       ErrorInfo errorInfo = nodeEntry.getErrorInfo();
       if (errorInfo != null) {
         result.put(key, errorInfo.getException());
       }
     }
   }
   return result;
 }
 @Override
 public boolean exists(SkyKey key) {
   NodeEntry entry =
       graph.getBatch(null, Reason.EXISTENCE_CHECKING, ImmutableList.of(key)).get(key);
   return entry != null && entry.isDone();
 }