Add flag to toggle genquery result compression, on by default

Follow-up change to toggle the optimization added in https://github.com/bazelbuild/bazel/commit/6d63f8a1ad33490b97e60955277c4ebca40a4f48.

RELNOTES: None
PiperOrigin-RevId: 259388251
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java
index 107faf5..0af7d9a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/GenericRules.java
@@ -44,7 +44,7 @@
     builder.addRuleDefinition(new AliasRule());
     builder.addRuleDefinition(new BazelFilegroupRule());
     builder.addRuleDefinition(new TestSuiteRule());
-    builder.addRuleDefinition(new GenQueryRule());
+    GenQueryRule.register(builder);
     builder.addRuleDefinition(new LabelBuildSettingRule());
     builder.addRuleDefinition(new LabelBuildFlagRule());
 
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 190aa39..dcfd3ba 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
@@ -378,8 +378,10 @@
       throw new RuntimeException(e);
     }
 
-    // TODO(b/137379942): Enable compression.
-    GenQueryOutputStream outputStream = new GenQueryOutputStream(/*compressionEnabled=*/ false);
+    GenQueryConfiguration genQueryConfig =
+        ruleContext.getConfiguration().getFragment(GenQueryConfiguration.class);
+    GenQueryOutputStream outputStream =
+        new GenQueryOutputStream(genQueryConfig.inMemoryCompressionEnabled());
     try {
       QueryOutputUtils
           .output(queryOptions, queryResult, targets.getResult(), formatter, outputStream,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
new file mode 100644
index 0000000..335842e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryConfiguration.java
@@ -0,0 +1,71 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.genquery;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
+import com.google.devtools.common.options.OptionEffectTag;
+
+class GenQueryConfiguration extends BuildConfiguration.Fragment {
+
+  /** GenQuery-specific options. */
+  public static class GenQueryOptions extends FragmentOptions {
+    @Option(
+        name = "compress_in_memory_genquery_results",
+        defaultValue = "true",
+        documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+        effectTags = {OptionEffectTag.BAZEL_INTERNAL_CONFIGURATION},
+        help =
+            "If true, the in-memory representation of genquery results may be compressed as "
+                + "is necessary. Can save sufficient memory at the expense of more CPU usage.")
+    public boolean compressInMemoryResults;
+  }
+
+  static class Loader implements ConfigurationFragmentFactory {
+    @Override
+    public Fragment create(BuildOptions buildOptions) throws InvalidConfigurationException {
+      return new GenQueryConfiguration(
+          buildOptions.get(GenQueryOptions.class).compressInMemoryResults);
+    }
+
+    @Override
+    public Class<? extends Fragment> creates() {
+      return GenQueryConfiguration.class;
+    }
+
+    @Override
+    public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() {
+      return ImmutableSet.of(GenQueryOptions.class);
+    }
+  }
+
+  private final boolean inMemoryCompressionEnabled;
+
+  GenQueryConfiguration(boolean inMemoryCompressionEnabled) {
+    this.inMemoryCompressionEnabled = inMemoryCompressionEnabled;
+  }
+
+  /** Returns whether or not genquery stored in memory can be stored in compressed form. */
+  boolean inMemoryCompressionEnabled() {
+    return inMemoryCompressionEnabled;
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
index f32016b..5e6ca8d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryRule.java
@@ -21,6 +21,7 @@
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
 
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.packages.RuleClass;
@@ -29,9 +30,17 @@
  * Rule definition for genquery the rule.
  */
 public final class GenQueryRule implements RuleDefinition {
+
+  /** Adds {@link GenQueryRule} and its dependencies to the provided builder. */
+  public static void register(ConfiguredRuleClassProvider.Builder builder) {
+    builder.addConfigurationFragment(new GenQueryConfiguration.Loader());
+    builder.addRuleDefinition(new GenQueryRule());
+  }
+
   @Override
   public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
     return builder
+        .requiresConfigurationFragments(GenQueryConfiguration.class)
         /* <!-- #BLAZE_RULE(genquery).ATTRIBUTE(scope) -->
         The scope of the query. The query is not allowed to touch targets outside the transitive
         closure of these targets.