[CALCITE-4789] Build is broken on Guava versions < 21

Fix build for Guava 19.0.

In Travis, test oldest and newest supported Guava versions.
(Previously we were only testing against the default Guava
version, 29.0-jre, and that's why we didn't notice the build
breakage.) Enable ErrorProne only on the newest Guava
version (because sometimes we use APIs that are marked Beta
in early versions and the Beta is removed in later versions).

Allow Guava version up to 30.1.1-jre. Lowest Guava version
is still 19.0. Default version is still 29.0-jre.
diff --git a/.travis.yml b/.travis.yml
index 0b7f641..0d99356 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,22 +24,26 @@
     - jdk: openjdk8
       env:
         - TZ=America/New_York # flips between −05:00 and −04:00
+        - GUAVA=19.0 # oldest supported Guava version
     - jdk: openjdk11
       env:
         - CHECKERFRAMEWORK=Y
       script:
         - export _JAVA_OPTIONS="-XX:GCTimeLimit=90 -XX:GCHeapFreeLimit=35"
-        - ./gradlew --no-parallel --no-daemon --scan -PenableCheckerframework :linq4j:classes :core:classes
+        - ./gradlew --no-parallel --no-daemon --scan -Pguava.version=${GUAVA:-29.0-jre} -PenableCheckerframework :linq4j:classes :core:classes
     - jdk: openjdk11
       env:
         - ERRORPRONE=Y
+        - GUAVA=30.1.1-jre # ErrorProne checks for Beta APIs, so use newest supported Guava version
       script:
         - export _JAVA_OPTIONS="-XX:GCTimeLimit=90 -XX:GCHeapFreeLimit=35"
-        - ./gradlew --no-parallel --no-daemon --scan -PenableErrorprone classes
+        - ./gradlew --no-parallel --no-daemon --scan -Pguava.version=${GUAVA:-29.0-jre} -PenableErrorprone classes
     - jdk: openjdk11
       env:
         - TZ=Pacific/Chatham # flips between +12:45 and +13:45
     - jdk: openjdk15
+      env:
+        - GUAVA=30.1.1-jre # newest supported Guava version
 branches:
   only:
     - master
@@ -52,7 +56,7 @@
   # Throw OutOfMemoryError in case less than 35% is free after full GC
   # This avoids never-ending GC trashing if memory gets too low in case of a memory leak
   - export _JAVA_OPTIONS="-XX:GCTimeLimit=90 -XX:GCHeapFreeLimit=35"
-  - ./gradlew --no-daemon build
+  - ./gradlew --no-daemon -Pguava.version=${GUAVA:-29.0-jre} build
 git:
   depth: 100
 cache:
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java
index 7b2e99a..2139b12 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java
@@ -80,7 +80,7 @@
     implements TranslatableTable, ScannableTable, ModifiableTable {
   @SuppressWarnings("methodref.receiver.bound.invalid")
   private final Supplier<RelProtoDataType> protoRowTypeSupplier =
-      Suppliers.memoize(this::supplyProto);
+      Suppliers.memoize(this::supplyProto)::get;
   public final JdbcSchema jdbcSchema;
   public final String jdbcCatalogName;
   public final String jdbcSchemaName;
diff --git a/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java b/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java
index d2ee6be..f68134e 100644
--- a/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java
+++ b/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java
@@ -40,5 +40,10 @@
   }
 
   /** Overrides {@code java.util.function.Predicate#test} in JDK8 and higher. */
-  @Override public abstract boolean test(@Nullable T t);
+  // Suppress ErrorProne's MissingOverride warning. The @Override annotation
+  // would be incorrect on Guava < 21 because Guava's interface Predicate does
+  // not implement Java's interface Predicate until Guava 21, and we need the
+  // code to compile on all versions.
+  @SuppressWarnings("MissingOverride")
+  public abstract boolean test(@Nullable T t);
 }
diff --git a/core/src/main/java/org/apache/calcite/tools/Frameworks.java b/core/src/main/java/org/apache/calcite/tools/Frameworks.java
index 8ffba39..92e0e5c 100644
--- a/core/src/main/java/org/apache/calcite/tools/Frameworks.java
+++ b/core/src/main/java/org/apache/calcite/tools/Frameworks.java
@@ -62,7 +62,7 @@
 
   /** Caches an instance of the JDBC driver. */
   private static final Supplier<Driver> DRIVER_SUPPLIER =
-      Suppliers.memoize(Driver::new);
+      Suppliers.memoize(Driver::new)::get;
 
   private Frameworks() {
   }
diff --git a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
index f348772..8b9c52f 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
@@ -2859,20 +2859,26 @@
         is(2), is("Sarg[(-\u221E..1), (1..+\u221E); NULL AS TRUE]"));
     checkSarg("complexity of 'x < 10 or x >= 20'",
         Sarg.of(RexUnknownAs.UNKNOWN,
-            ImmutableRangeSet.copyOf(
-                ImmutableList.of(Range.lessThan(10), Range.atLeast(20)))),
+            ImmutableRangeSet.<Integer>builder()
+                .add(Range.lessThan(10))
+                .add(Range.atLeast(20))
+                .build()),
         is(2), is("Sarg[(-\u221E..10), [20..+\u221E)]"));
     checkSarg("complexity of 'x in (2, 4, 6) or x > 20'",
         Sarg.of(RexUnknownAs.UNKNOWN,
-            ImmutableRangeSet.copyOf(
-                Arrays.asList(Range.singleton(2), Range.singleton(4),
-                    Range.singleton(6), Range.greaterThan(20)))),
+            ImmutableRangeSet.<Integer>builder()
+                .add(Range.singleton(2))
+                .add(Range.singleton(4))
+                .add(Range.singleton(6))
+                .add(Range.greaterThan(20))
+                .build()),
         is(4), is("Sarg[2, 4, 6, (20..+\u221E)]"));
     checkSarg("complexity of 'x between 3 and 8 or x between 10 and 20'",
         Sarg.of(RexUnknownAs.UNKNOWN,
-            ImmutableRangeSet.copyOf(
-                Arrays.asList(Range.closed(3, 8),
-                    Range.closed(10, 20)))),
+            ImmutableRangeSet.<Integer>builder()
+                .add(Range.closed(3, 8))
+                .add(Range.closed(10, 20))
+                .build()),
         is(2), is("Sarg[[3..8], [10..20]]"));
   }
 
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java b/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
index 6492619..5f9a0ad 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
@@ -102,8 +102,10 @@
   //~ Static fields/initializers ---------------------------------------------
 
   protected static final String NL = System.getProperty("line.separator");
+
   protected static final Supplier<RelDataTypeFactory> DEFAULT_TYPE_FACTORY_SUPPLIER =
-      Suppliers.memoize(() -> new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT));
+      Suppliers.memoize(() ->
+          new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT))::get;
 
   //~ Instance fields --------------------------------------------------------
 
diff --git a/gradle.properties b/gradle.properties
index ac11bbc..63e03d6 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -71,8 +71,7 @@
 # The property is used in https://github.com/wildfly/jandex regression testing, so avoid renaming
 jandex.version=2.2.3.Final
 
-# We support Guava versions as old as 14.0.1 (the version used by Hive)
-# but prefer more recent versions.
+# We support Guava versions as old as 19.0 but prefer more recent versions.
 # elasticsearch does not like asm:6.2.1+
 aggdesigner-algorithm.version=6.0
 apiguardian-api.version=1.1.0
diff --git a/site/_docs/history.md b/site/_docs/history.md
index c095549..858d40b 100644
--- a/site/_docs/history.md
+++ b/site/_docs/history.md
@@ -27,11 +27,21 @@
 <a href="https://github.com/apache/calcite/releases">github</a>.
 Downloads are available on the
 [downloads page]({{ site.baseurl }}/downloads/).
+
+## <a href="https://github.com/apache/calcite/releases/tag/calcite-1.28.0">1.28.0</a> / under development
+{: #v1-28-0}
+
+Compatibility: This release is tested on Linux, macOS, Microsoft Windows;
+using JDK/OpenJDK versions 8 to 15;
+Guava versions 19.0 to 30.1.1-jre;
+other software versions as specified in gradle.properties.
+
 ## <a href="https://github.com/apache/calcite/releases/tag/calcite-1.27.0">1.27.0</a> / 2021-06-03
 {: #v1-27-0}
+
 This release comes eight months after [1.26.0](#v1-26-0). It includes more than 150 resolved
 issues, comprising a few new features, three minor breaking changes, many bug-fixes and small
-improvements, as well as code quality enhancements and better test coverage. 
+improvements, as well as code quality enhancements and better test coverage.
 
 Among others, it is worth highlighting the following:
 
@@ -54,7 +64,7 @@
   assertions are enabled
 * [<a href="https://issues.apache.org/jira/browse/CALCITE-4427">CALCITE-4427</a>]
   Make `SUBSTRING` operator comply with ISO standard SQL
-  
+
 #### New features
 * [<a href="https://issues.apache.org/jira/browse/CALCITE-4564">CALCITE-4564</a>]
   Initialization context for non-static user-defined functions (UDFs)
@@ -100,11 +110,11 @@
   Allow BigQuery to parse and validate niladic functions (Mr. Swett)
 * [<a href="https://issues.apache.org/jira/browse/CALCITE-4034">CALCITE-4034</a>]
   `InnoDB` adapter (neoremind)
-  
+
 #### Bug fixes, API changes and minor enhancements
 * [<a href="https://issues.apache.org/jira/browse/CALCITE-4497">CALCITE-4497</a>]
   In `RelBuilder`, support windowed aggregate functions (OVER)
-* [<a href="https://issues.apache.org/jira/browse/CALCITE-4620">CALCITE-4620</a>] 
+* [<a href="https://issues.apache.org/jira/browse/CALCITE-4620">CALCITE-4620</a>]
   Join on `CASE` causes `AssertionError` in `RelToSqlConverter`
 * [<a href="https://issues.apache.org/jira/browse/CALCITE-4446">CALCITE-4446</a>]
   Implement three-valued logic for SEARCH operator