Use graphless query when possible.

Next step is to explore whether we can change the default of --order_output.

RELNOTES: None
PiperOrigin-RevId: 277465149
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/QueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/QueryOptions.java
index fd4e726..902e5bc 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/QueryOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/QueryOptions.java
@@ -19,6 +19,7 @@
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionEffectTag;
+import com.google.devtools.common.options.TriState;
 import java.util.Set;
 
 /** Command-line options for the Blaze query language, revision 2. */
@@ -198,14 +199,14 @@
 
   @Option(
       name = "experimental_graphless_query",
-      defaultValue = "false",
+      defaultValue = "auto",
       documentationCategory = OptionDocumentationCategory.QUERY,
       effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS, OptionEffectTag.EAGERNESS_TO_EXIT},
       help =
           "If true, uses a Query implementation that does not make a copy of the graph. The new"
               + " implementation only supports --order_output=no, as well as only a subset of"
               + " output formatters.")
-  public boolean useGraphlessQuery;
+  public TriState useGraphlessQuery;
 
   /** Ugly workaround since line terminator option default has to be constant expression. */
   public String getLineTerminator() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
index 59de946..29b05d8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java
@@ -92,6 +92,7 @@
 import com.google.devtools.build.skyframe.ValueOrException;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
+import com.google.devtools.common.options.TriState;
 import com.google.protobuf.ByteString;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -163,11 +164,11 @@
     }
     if (ruleContext.getConfiguration().getOptions().get(CoreOptions.class).useGraphlessQuery) {
       queryOptions.orderOutput = OrderOutput.NO;
-      queryOptions.useGraphlessQuery = true;
+      queryOptions.useGraphlessQuery = TriState.YES;
     } else {
       // Force results to be deterministic.
       queryOptions.orderOutput = OrderOutput.FULL;
-      queryOptions.useGraphlessQuery = false;
+      queryOptions.useGraphlessQuery = TriState.NO;
     }
 
     // force relative_locations to true so it has a deterministic output across machines.
@@ -362,7 +363,7 @@
               /*extraFunctions=*/ ImmutableList.of(),
               /*packagePath=*/ null,
               /*blockUniverseEvaluationErrors=*/ false,
-              /*useGraphlessQuery=*/ queryOptions.useGraphlessQuery);
+              /*useGraphlessQuery=*/ queryOptions.useGraphlessQuery == TriState.YES);
       QueryExpression expr = QueryExpression.parse(query, queryEnvironment);
       formatter.verifyCompatible(queryEnvironment, expr);
       targets = QueryUtil.newOrderedAggregateAllOutputFormatterCallback(queryEnvironment);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java
index 073c00c..f4f1f2c 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java
@@ -48,6 +48,7 @@
 import com.google.devtools.build.skyframe.WalkableGraph;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingResult;
+import com.google.devtools.common.options.TriState;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
@@ -143,7 +144,10 @@
 
     Set<Setting> settings = queryOptions.toSettings();
     boolean streamResults = QueryOutputUtils.shouldStreamResults(queryOptions, formatter);
-    if (queryOptions.useGraphlessQuery && !streamResults) {
+    boolean useGraphlessQuery =
+        queryOptions.useGraphlessQuery == TriState.YES
+            || (queryOptions.useGraphlessQuery == TriState.AUTO && streamResults);
+    if (useGraphlessQuery && !streamResults) {
       env.getReporter()
           .handle(
               Event.error(
@@ -165,7 +169,7 @@
               queryOptions.universeScope,
               options.getOptions(LoadingPhaseThreadsOption.class).threads,
               settings,
-              queryOptions.useGraphlessQuery)) {
+              useGraphlessQuery)) {
         result =
             doQuery(
                 query, env, queryOptions, streamResults, formatter, queryEnv, queryRuntimeHelper);