Similar to TargetMarkerValue, have TargetPatternValue *not* embed Targets.

[]TESTED: See

--
MOS_MIGRATED_REVID=91816612
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 7a29564..ebc2c96 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.cmdline.TargetPattern;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.graph.Digraph;
 import com.google.devtools.build.lib.packages.NoSuchThingException;
 import com.google.devtools.build.lib.packages.Package;
@@ -149,6 +150,7 @@
     return allowedLabels;
   }
 
+  @Override
   public Collection<Target> getFwdDeps(Target target) {
     Collection<Target> unfilteredDeps = getRawFwdDeps(target);
     if (!(target instanceof Rule)) {
@@ -164,6 +166,7 @@
         });
   }
 
+  @Override
   public Collection<Target> getReverseDeps(final Target target) {
     return Collections2.filter(getRawReverseDeps(target), new Predicate<Target>() {
       @Override
@@ -314,8 +317,21 @@
     }
   }
 
+  private static Target getExistingTarget(Label label,
+      GraphBackedRecursivePackageProvider provider) {
+    StoredEventHandler handler = new StoredEventHandler();
+    try {
+      return provider.getTarget(handler, label);
+    } catch (NoSuchThingException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  @Override
   protected Map<String, ResolvedTargets<Target>> preloadOrThrow(QueryExpression caller,
       Collection<String> patterns) throws QueryException, TargetParsingException {
+    GraphBackedRecursivePackageProvider provider =
+        new GraphBackedRecursivePackageProvider(graph);
     Map<String, ResolvedTargets<Target>> result = Maps.newHashMapWithExpectedSize(patterns.size());
     for (String pattern : patterns) {
       SkyKey patternKey = TargetPatternValue.key(pattern,
@@ -326,10 +342,17 @@
 
       TargetParsingException targetParsingException = null;
       if (graph.exists(patternKey)) {
-        // If the graph already contains a value for this target pattern, use it.
+        // The graph already contains a value or exception for this target pattern, so we use it.
         TargetPatternValue value = (TargetPatternValue) graph.getValue(patternKey);
         if (value != null) {
-          result.put(pattern, value.getTargets());
+          ResolvedTargets.Builder<Target> targetsBuilder = ResolvedTargets.builder();
+          for (Label label : value.getTargets().getTargets()) {
+            targetsBuilder.add(getExistingTarget(label, provider));
+          }
+          for (Label label : value.getTargets().getFilteredTargets()) {
+            targetsBuilder.remove(getExistingTarget(label, provider));
+          }
+          result.put(pattern, targetsBuilder.build());
         } else {
           targetParsingException =
               (TargetParsingException)
@@ -339,8 +362,6 @@
         // If the graph doesn't contain a value for this target pattern, try to directly evaluate
         // it, by making use of packages already present in the graph.
         TargetPattern.Parser parser = new TargetPattern.Parser(targetPattern.getOffset());
-        GraphBackedRecursivePackageProvider provider =
-            new GraphBackedRecursivePackageProvider(graph);
         RecursivePackageProviderBackedTargetPatternResolver resolver =
             new RecursivePackageProviderBackedTargetPatternResolver(provider, eventHandler,
                 targetPattern.getPolicy(), pkgPath);