You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2017/01/19 18:36:06 UTC

[1/2] calcite git commit: [CALCITE-1592] SqlToRelConverter throws UnsupportedOperationException if query has NOT ... NOT IN

Repository: calcite
Updated Branches:
  refs/heads/master 010f7abb9 -> aadc62d4c


[CALCITE-1592] SqlToRelConverter throws UnsupportedOperationException if query has NOT ... NOT IN


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/aadc62d4
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/aadc62d4
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/aadc62d4

Branch: refs/heads/master
Commit: aadc62d4c283e31b7004c98bee55c1df4128fb9e
Parents: f10810a
Author: Julian Hyde <jh...@apache.org>
Authored: Wed Jan 18 23:57:41 2017 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Jan 19 03:58:51 2017 -0800

----------------------------------------------------------------------
 .../calcite/sql2rel/SqlToRelConverter.java      | 63 +++++++++++---------
 .../calcite/test/SqlToRelConverterTest.java     |  5 ++
 .../calcite/test/SqlToRelConverterTest.xml      | 12 ++++
 core/src/test/resources/sql/misc.iq             | 20 +++++++
 4 files changed, 72 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/aadc62d4/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 857eb7c..3f3fe34 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -864,19 +864,21 @@ public class SqlToRelConverter {
   /**
    * Push down all the NOT logical operators into any IN/NOT IN operators.
    *
+   * @param scope Scope where {@code sqlNode} occurs
    * @param sqlNode the root node from which to look for NOT operators
    * @return the transformed SqlNode representation with NOT pushed down.
    */
-  private static SqlNode pushDownNotForIn(SqlNode sqlNode) {
+  private static SqlNode pushDownNotForIn(SqlValidatorScope scope,
+      SqlNode sqlNode) {
     if ((sqlNode instanceof SqlCall) && containsInOperator(sqlNode)) {
       SqlCall sqlCall = (SqlCall) sqlNode;
       if ((sqlCall.getOperator() == SqlStdOperatorTable.AND)
           || (sqlCall.getOperator() == SqlStdOperatorTable.OR)) {
         SqlNode[] sqlOperands = ((SqlBasicCall) sqlCall).operands;
         for (int i = 0; i < sqlOperands.length; i++) {
-          sqlOperands[i] = pushDownNotForIn(sqlOperands[i]);
+          sqlOperands[i] = pushDownNotForIn(scope, sqlOperands[i]);
         }
-        return sqlNode;
+        return reg(scope, sqlNode);
       } else if (sqlCall.getOperator() == SqlStdOperatorTable.NOT) {
         SqlNode childNode = sqlCall.operand(0);
         assert childNode instanceof SqlCall;
@@ -885,48 +887,46 @@ public class SqlToRelConverter {
           SqlNode[] andOperands = childSqlCall.getOperands();
           SqlNode[] orOperands = new SqlNode[andOperands.length];
           for (int i = 0; i < orOperands.length; i++) {
-            orOperands[i] =
-                SqlStdOperatorTable.NOT.createCall(
-                    SqlParserPos.ZERO,
-                    andOperands[i]);
+            orOperands[i] = reg(scope,
+                SqlStdOperatorTable.NOT.createCall(SqlParserPos.ZERO,
+                    andOperands[i]));
           }
           for (int i = 0; i < orOperands.length; i++) {
-            orOperands[i] = pushDownNotForIn(orOperands[i]);
+            orOperands[i] = pushDownNotForIn(scope, orOperands[i]);
           }
-          return SqlStdOperatorTable.OR.createCall(SqlParserPos.ZERO,
-              orOperands[0], orOperands[1]);
+          return reg(scope,
+              SqlStdOperatorTable.OR.createCall(SqlParserPos.ZERO,
+                  orOperands[0], orOperands[1]));
         } else if (childSqlCall.getOperator() == SqlStdOperatorTable.OR) {
           SqlNode[] orOperands = childSqlCall.getOperands();
           SqlNode[] andOperands = new SqlNode[orOperands.length];
           for (int i = 0; i < andOperands.length; i++) {
-            andOperands[i] =
-                SqlStdOperatorTable.NOT.createCall(
-                    SqlParserPos.ZERO,
-                    orOperands[i]);
+            andOperands[i] = reg(scope,
+                SqlStdOperatorTable.NOT.createCall(SqlParserPos.ZERO,
+                    orOperands[i]));
           }
           for (int i = 0; i < andOperands.length; i++) {
-            andOperands[i] = pushDownNotForIn(andOperands[i]);
+            andOperands[i] = pushDownNotForIn(scope, andOperands[i]);
           }
-          return SqlStdOperatorTable.AND.createCall(SqlParserPos.ZERO,
-              andOperands[0], andOperands[1]);
+          return reg(scope,
+              SqlStdOperatorTable.AND.createCall(SqlParserPos.ZERO,
+                  andOperands[0], andOperands[1]));
         } else if (childSqlCall.getOperator() == SqlStdOperatorTable.NOT) {
           SqlNode[] notOperands = childSqlCall.getOperands();
           assert notOperands.length == 1;
-          return pushDownNotForIn(notOperands[0]);
+          return pushDownNotForIn(scope, notOperands[0]);
         } else if (childSqlCall.getOperator() instanceof SqlInOperator) {
           SqlNode[] inOperands = childSqlCall.getOperands();
           SqlInOperator inOp =
               (SqlInOperator) childSqlCall.getOperator();
           if (inOp.isNotIn()) {
-            return SqlStdOperatorTable.IN.createCall(
-                SqlParserPos.ZERO,
-                inOperands[0],
-                inOperands[1]);
+            return reg(scope,
+                SqlStdOperatorTable.IN.createCall(SqlParserPos.ZERO,
+                    inOperands[0], inOperands[1]));
           } else {
-            return SqlStdOperatorTable.NOT_IN.createCall(
-                SqlParserPos.ZERO,
-                inOperands[0],
-                inOperands[1]);
+            return reg(scope,
+                SqlStdOperatorTable.NOT_IN.createCall(SqlParserPos.ZERO,
+                    inOperands[0], inOperands[1]));
           }
         } else {
           // childSqlCall is "leaf" node in a logical expression tree
@@ -944,6 +944,13 @@ public class SqlToRelConverter {
     }
   }
 
+  /** Registers with the validator a {@link SqlNode} that has been created
+   * during the Sql-to-Rel process. */
+  private static SqlNode reg(SqlValidatorScope scope, SqlNode e) {
+    scope.getValidator().deriveType(scope, e);
+    return e;
+  }
+
   /**
    * Converts a WHERE clause.
    *
@@ -956,7 +963,7 @@ public class SqlToRelConverter {
     if (where == null) {
       return;
     }
-    SqlNode newWhere = pushDownNotForIn(where);
+    SqlNode newWhere = pushDownNotForIn(bb.scope, where);
     replaceSubQueries(bb, newWhere, RelOptUtil.Logic.UNKNOWN_AS_FALSE);
     final RexNode convertedWhere = bb.convertExpression(newWhere);
 
@@ -2599,7 +2606,7 @@ public class SqlToRelConverter {
       // Replace sub-queries in having here and modify having to use
       // the replaced expressions
       if (having != null) {
-        SqlNode newHaving = pushDownNotForIn(having);
+        SqlNode newHaving = pushDownNotForIn(bb.scope, having);
         replaceSubQueries(bb, newHaving, RelOptUtil.Logic.UNKNOWN_AS_FALSE);
         havingExpr = bb.convertExpression(newHaving);
         if (havingExpr.isAlwaysTrue()) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/aadc62d4/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index ef3840d..375e7c5 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1213,6 +1213,11 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql).ok();
   }
 
+  @Test public void testNotNotIn() {
+    final String sql = "select * from EMP where not (ename not in ('Fred') )";
+    sql(sql).ok();
+  }
+
   @Test public void testOverMultiple() {
     final String sql = "select sum(sal) over w1,\n"
         + "  sum(deptno) over w1,\n"

http://git-wip-us.apache.org/repos/asf/calcite/blob/aadc62d4/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index cfbfa8f..10c1650 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -2257,6 +2257,18 @@ LogicalProject(DEPTNO=[$1], EXPR$1=[CASE($3, 1, 0)], EXPR$2=[$4], EXPR$3=[CASE($
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testNotNotIn">
+        <Resource name="sql">
+            <![CDATA[select * from EMP where not (ename not in ('Fred') )]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
+  LogicalFilter(condition=[=($1, 'Fred')])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testTableExtend">
         <Resource name="sql">
             <![CDATA[select * from dept extend (x varchar(5) not null)]]>

http://git-wip-us.apache.org/repos/asf/calcite/blob/aadc62d4/core/src/test/resources/sql/misc.iq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.iq b/core/src/test/resources/sql/misc.iq
index cc3a4af..9d856ba 100644
--- a/core/src/test/resources/sql/misc.iq
+++ b/core/src/test/resources/sql/misc.iq
@@ -1807,4 +1807,24 @@ values (degrees(pi), degrees(-pi / 2));
 
 !ok
 
+# [CALCITE-1592] SqlToRelConverter throws UnsupportedOperationException if query has NOT ... NOT IN
+select * from "scott".emp where not (ename not in ('Fred'));
++-------+-------+-----+-----+----------+-----+------+--------+
+| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
++-------+-------+-----+-----+----------+-----+------+--------+
++-------+-------+-----+-----+----------+-----+------+--------+
+(0 rows)
+
+!ok
+
+select count(*) as c from "scott".emp where not (ename in ('Fred'));
++----+
+| C  |
++----+
+| 14 |
++----+
+(1 row)
+
+!ok
+
 # End misc.iq


[2/2] calcite git commit: [CALCITE-1590] Support Guava version 21.0

Posted by jh...@apache.org.
[CALCITE-1590] Support Guava version 21.0

The default Guava version is now 20.0, but you can override to any
version between 14.0.1 and 21.0. Version 21.0 requires JDK8 and higher.


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/f10810a2
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/f10810a2
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/f10810a2

Branch: refs/heads/master
Commit: f10810a2e17cc945eec2d0eb2b8343cdd82e49bd
Parents: 010f7ab
Author: Julian Hyde <jh...@apache.org>
Authored: Wed Jan 18 13:48:47 2017 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Jan 19 03:58:51 2017 -0800

----------------------------------------------------------------------
 .../adapter/cassandra/CassandraRules.java       | 13 +++---
 .../calcite/plan/AbstractRelOptPlanner.java     |  6 +--
 .../org/apache/calcite/plan/RelOptUtil.java     | 13 +++---
 .../calcite/plan/SubstitutionVisitor.java       |  5 ++-
 .../calcite/prepare/CalciteCatalogReader.java   | 13 +++---
 .../org/apache/calcite/rel/core/Aggregate.java  |  9 ++--
 .../org/apache/calcite/rel/core/Values.java     |  9 ++--
 .../calcite/rel/logical/LogicalWindow.java      |  6 +--
 .../rel/metadata/RelMdColumnUniqueness.java     |  5 ++-
 .../calcite/rel/rules/DateRangeRules.java       |  5 ++-
 .../calcite/rel/rules/FilterTableScanRule.java  |  5 ++-
 .../calcite/rel/rules/ProjectRemoveRule.java    |  5 ++-
 .../calcite/rel/rules/ProjectTableScanRule.java |  5 ++-
 .../calcite/rel/rules/ProjectToWindowRule.java  |  9 ++--
 .../apache/calcite/rel/rules/SemiJoinRule.java  |  5 ++-
 .../java/org/apache/calcite/rex/RexUtil.java    | 27 ++++++------
 .../apache/calcite/runtime/PredicateImpl.java   | 43 ++++++++++++++++++++
 .../java/org/apache/calcite/sql/SqlUtil.java    | 21 +++++-----
 .../apache/calcite/sql/advise/SqlAdvisor.java   | 11 +++--
 .../calcite/sql/parser/SqlParserUtil.java       |  5 ++-
 .../calcite/adapter/druid/DruidRules.java       |  5 ++-
 pom.xml                                         |  4 +-
 site/_docs/history.md                           | 10 +++++
 23 files changed, 154 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
index d67532d..ec29bd6 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
@@ -37,6 +37,7 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexVisitorImpl;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
 import org.apache.calcite.util.Pair;
@@ -121,8 +122,8 @@ public class CassandraRules {
    */
   private static class CassandraFilterRule extends RelOptRule {
     private static final Predicate<LogicalFilter> PREDICATE =
-        new Predicate<LogicalFilter>() {
-          public boolean apply(LogicalFilter input) {
+        new PredicateImpl<LogicalFilter>() {
+          public boolean test(LogicalFilter input) {
             // TODO: Check for an equality predicate on the partition key
             // Right now this just checks if we have a single top-level AND
             return RelOptUtil.disjunctions(input.getCondition()).size() == 1;
@@ -277,15 +278,15 @@ public class CassandraRules {
    */
   private static class CassandraSortRule extends RelOptRule {
     private static final Predicate<Sort> SORT_PREDICATE =
-        new Predicate<Sort>() {
-          public boolean apply(Sort input) {
+        new PredicateImpl<Sort>() {
+          public boolean test(Sort input) {
             // Limits are handled by CassandraLimit
             return input.offset == null && input.fetch == null;
           }
         };
     private static final Predicate<CassandraFilter> FILTER_PREDICATE =
-        new Predicate<CassandraFilter>() {
-          public boolean apply(CassandraFilter input) {
+        new PredicateImpl<CassandraFilter>() {
+          public boolean test(CassandraFilter input) {
             // We can only use implicit sorting within a single partition
             return input.isSinglePartition();
           }

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
index 875ecd7..eaed2ef 100644
--- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
@@ -20,9 +20,9 @@ import org.apache.calcite.plan.volcano.RelSubset;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.util.CancelFlag;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
@@ -415,8 +415,8 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner {
   public Iterable<Class<? extends RelNode>> subClasses(
       final Class<? extends RelNode> clazz) {
     return Iterables.filter(classes,
-        new Predicate<Class<? extends RelNode>>() {
-          public boolean apply(Class<? extends RelNode> input) {
+        new PredicateImpl<Class<? extends RelNode>>() {
+          public boolean test(Class<? extends RelNode> input) {
             return clazz.isAssignableFrom(input);
           }
         });

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
index f51c625..3239419 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
@@ -75,6 +75,7 @@ import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexSubQuery;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.rex.RexVisitorImpl;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlExplainFormat;
 import org.apache.calcite.sql.SqlExplainLevel;
 import org.apache.calcite.sql.SqlKind;
@@ -126,8 +127,8 @@ public abstract class RelOptUtil {
   /** Predicate for whether a filter contains multisets or windowed
    * aggregates. */
   public static final Predicate<Filter> FILTER_PREDICATE =
-      new Predicate<Filter>() {
-        public boolean apply(Filter filter) {
+      new PredicateImpl<Filter>() {
+        public boolean test(Filter filter) {
           return !(B
               && RexMultisetUtil.containsMultiset(filter.getCondition(), true)
               || RexOver.containsOver(filter.getCondition()));
@@ -137,8 +138,8 @@ public abstract class RelOptUtil {
   /** Predicate for whether a project contains multisets or windowed
    * aggregates. */
   public static final Predicate<Project> PROJECT_PREDICATE =
-      new Predicate<Project>() {
-        public boolean apply(Project project) {
+      new PredicateImpl<Project>() {
+        public boolean test(Project project) {
           return !(B
               && RexMultisetUtil.containsMultiset(project.getProjects(), true)
               || RexOver.containsOver(project.getProjects(), null));
@@ -148,8 +149,8 @@ public abstract class RelOptUtil {
   /** Predicate for whether a calc contains multisets or windowed
    * aggregates. */
   public static final Predicate<Calc> CALC_PREDICATE =
-      new Predicate<Calc>() {
-        public boolean apply(Calc calc) {
+      new PredicateImpl<Calc>() {
+        public boolean test(Calc calc) {
           return !(B
               && RexMultisetUtil.containsMultiset(calc.getProgram())
               || calc.getProgram().containsAggs());

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index dd60c22..edba57f 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -48,6 +48,7 @@ import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
@@ -2392,8 +2393,8 @@ public class SubstitutionVisitor {
    */
   public static class FilterOnProjectRule extends RelOptRule {
     private static final Predicate<LogicalFilter> PREDICATE =
-        new Predicate<LogicalFilter>() {
-          public boolean apply(LogicalFilter input) {
+        new PredicateImpl<LogicalFilter>() {
+          public boolean test(LogicalFilter input) {
             return input.getCondition() instanceof RexInputRef;
           }
         };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java b/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java
index 7f0823c..277a6f9 100644
--- a/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java
+++ b/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java
@@ -23,6 +23,7 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeFactoryImpl;
 import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.schema.AggregateFunction;
 import org.apache.calcite.schema.Function;
 import org.apache.calcite.schema.FunctionParameter;
@@ -275,15 +276,15 @@ public class CalciteCatalogReader implements Prepare.CatalogReader {
     if (category == null) {
       predicate = Predicates.alwaysTrue();
     } else if (category.isTableFunction()) {
-      predicate = new Predicate<Function>() {
-        public boolean apply(Function function) {
+      predicate = new PredicateImpl<Function>() {
+        public boolean test(Function function) {
           return function instanceof TableMacro
               || function instanceof TableFunction;
         }
       };
     } else {
-      predicate = new Predicate<Function>() {
-        public boolean apply(Function function) {
+      predicate = new PredicateImpl<Function>() {
+        public boolean test(Function function) {
           return !(function instanceof TableMacro
               || function instanceof TableFunction);
         }
@@ -313,8 +314,8 @@ public class CalciteCatalogReader implements Prepare.CatalogReader {
           Util.first(type.getSqlTypeName().getFamily(), SqlTypeFamily.ANY));
     }
     final Predicate<Integer> optional =
-        new Predicate<Integer>() {
-          public boolean apply(Integer input) {
+        new PredicateImpl<Integer>() {
+          public boolean test(Integer input) {
             return function.getParameters().get(input).isOptional();
           }
         };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
index cd4243a..f22b405 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
@@ -31,6 +31,7 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.runtime.CalciteException;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.runtime.Resources;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.SqlOperatorBinding;
@@ -73,15 +74,15 @@ public abstract class Aggregate extends SingleRel {
    * @see org.apache.calcite.util.Bug#CALCITE_461_FIXED
    */
   public static final Predicate<Aggregate> IS_SIMPLE =
-      new Predicate<Aggregate>() {
-        public boolean apply(Aggregate input) {
+      new PredicateImpl<Aggregate>() {
+        public boolean test(Aggregate input) {
           return input.getGroupType() == Group.SIMPLE;
         }
       };
 
   public static final Predicate<Aggregate> IS_NOT_GRAND_TOTAL =
-      new Predicate<Aggregate>() {
-        public boolean apply(Aggregate input) {
+      new PredicateImpl<Aggregate>() {
+        public boolean test(Aggregate input) {
           return input.getGroupCount() > 0;
         }
       };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/core/Values.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Values.java b/core/src/main/java/org/apache/calcite/rel/core/Values.java
index f9c9880..30d366d 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Values.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Values.java
@@ -28,6 +28,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlExplainLevel;
 import org.apache.calcite.sql.type.SqlTypeUtil;
 import org.apache.calcite.util.Pair;
@@ -65,8 +66,8 @@ public abstract class Values extends AbstractRelNode {
    * expressions and prune away that section of the tree.
    */
   public static final Predicate<? super Values> IS_EMPTY =
-      new Predicate<Values>() {
-        public boolean apply(Values values) {
+      new PredicateImpl<Values>() {
+        public boolean test(Values values) {
           return values.getTuples().isEmpty();
         }
       };
@@ -79,8 +80,8 @@ public abstract class Values extends AbstractRelNode {
    * expressions and prune away that section of the tree.
    */
   public static final Predicate<? super Values> IS_NOT_EMPTY =
-      new Predicate<Values>() {
-        public boolean apply(Values values) {
+      new PredicateImpl<Values>() {
+        public boolean test(Values values) {
           return !values.getTuples().isEmpty();
         }
       };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
index 9053ce2..abd703a 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
@@ -34,12 +34,12 @@ import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexWindow;
 import org.apache.calcite.rex.RexWindowBound;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Litmus;
 import org.apache.calcite.util.Pair;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Lists;
@@ -348,8 +348,8 @@ public final class LogicalWindow extends Window {
     RelCollation orderKeys = getCollation(
       Lists.newArrayList(
         Iterables.filter(aggWindow.orderKeys,
-          new Predicate<RexFieldCollation>() {
-            public boolean apply(RexFieldCollation rexFieldCollation) {
+          new PredicateImpl<RexFieldCollation>() {
+            public boolean test(RexFieldCollation rexFieldCollation) {
               // If ORDER BY references constant (i.e. RexInputRef),
               // then we can ignore such ORDER BY key.
               return rexFieldCollation.left instanceof RexLocalRef;

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
index 67ef377..48c626e 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
@@ -40,6 +40,7 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
@@ -65,8 +66,8 @@ public class RelMdColumnUniqueness
 
   /** Aggregate and Calc are "safe" children of a RelSubset to delve into. */
   private static final Predicate<RelNode> SAFE_REL =
-      new Predicate<RelNode>() {
-        public boolean apply(RelNode r) {
+      new PredicateImpl<RelNode>() {
+        public boolean test(RelNode r) {
           return r instanceof Aggregate || r instanceof Project;
         }
       };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
index 8819c22..cd59787 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
@@ -28,6 +28,7 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.rex.RexVisitorImpl;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlBinaryOperator;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
@@ -77,8 +78,8 @@ public abstract class DateRangeRules {
   private DateRangeRules() {}
 
   private static final Predicate<Filter> FILTER_PREDICATE =
-      new Predicate<Filter>() {
-        @Override public boolean apply(Filter filter) {
+      new PredicateImpl<Filter>() {
+        @Override public boolean test(Filter filter) {
           final ExtractFinder finder = ExtractFinder.THREAD_INSTANCES.get();
           assert finder.timeUnits.isEmpty() : "previous user did not clean up";
           try {

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
index b16d6b7..d090d79 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
@@ -26,6 +26,7 @@ import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.schema.FilterableTable;
 import org.apache.calcite.schema.ProjectableFilterableTable;
 import org.apache.calcite.util.ImmutableIntList;
@@ -50,8 +51,8 @@ import com.google.common.collect.ImmutableList;
  */
 public abstract class FilterTableScanRule extends RelOptRule {
   public static final Predicate<TableScan> PREDICATE =
-      new Predicate<TableScan>() {
-        public boolean apply(TableScan scan) {
+      new PredicateImpl<TableScan>() {
+        public boolean test(TableScan scan) {
           // We can only push filters into a FilterableTable or
           // ProjectableFilterableTable.
           final RelOptTable table = scan.getTable();

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
index 8cbbd74..7a92ccb 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
@@ -23,6 +23,7 @@ import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.runtime.PredicateImpl;
 
 import com.google.common.base.Predicate;
 
@@ -42,8 +43,8 @@ import java.util.List;
 public class ProjectRemoveRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
   private static final Predicate<Project> PREDICATE =
-      new Predicate<Project>() {
-        public boolean apply(Project input) {
+      new PredicateImpl<Project>() {
+        public boolean test(Project input) {
           return isTrivial(input);
         }
       };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
index 25cbe83..eff4e52 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
@@ -25,6 +25,7 @@ import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.schema.ProjectableFilterableTable;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.mapping.Mapping;
@@ -48,8 +49,8 @@ import java.util.List;
  */
 public abstract class ProjectTableScanRule extends RelOptRule {
   public static final Predicate<TableScan> PREDICATE =
-      new Predicate<TableScan>() {
-        public boolean apply(TableScan scan) {
+      new PredicateImpl<TableScan>() {
+        public boolean test(TableScan scan) {
           // We can only push projects into a ProjectableFilterableTable.
           final RelOptTable table = scan.getTable();
           return table.unwrap(ProjectableFilterableTable.class) != null;

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
index ed4f610..a2856f5 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
@@ -37,6 +37,7 @@ import org.apache.calcite.rex.RexOver;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexVisitorImpl;
 import org.apache.calcite.rex.RexWindow;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.Pair;
@@ -76,15 +77,15 @@ public abstract class ProjectToWindowRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
   private static final Predicate<Calc> PREDICATE =
-      new Predicate<Calc>() {
-        public boolean apply(Calc calc) {
+      new PredicateImpl<Calc>() {
+        public boolean test(Calc calc) {
           return RexOver.containsOver(calc.getProgram());
         }
       };
 
   private static final Predicate<Project> PREDICATE2 =
-      new Predicate<Project>() {
-        public boolean apply(Project project) {
+      new PredicateImpl<Project>() {
+        public boolean test(Project project) {
           return RexOver.containsOver(project.getProjects(), null);
         }
       };

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
index 13ad991..d8d56b4 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
@@ -28,6 +28,7 @@ import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableBitSet;
@@ -45,8 +46,8 @@ import java.util.List;
  */
 public class SemiJoinRule extends RelOptRule {
   private static final Predicate<Join> IS_LEFT_OR_INNER =
-      new Predicate<Join>() {
-        public boolean apply(Join input) {
+      new PredicateImpl<Join>() {
+        public boolean test(Join input) {
           switch (input.getJoinType()) {
           case LEFT:
           case INNER:

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 093a5d1..bf99d2c 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -31,6 +31,7 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeFamily;
 import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.schema.Schemas;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.SqlKind;
@@ -2295,9 +2296,9 @@ public class RexUtil {
     case EQUALS:
       final RexCall call = (RexCall) e;
       if (call.getOperands().get(1) instanceof RexLiteral) {
-        notTerms = Iterables.filter(
-            notTerms, new Predicate<RexNode>() {
-              public boolean apply(RexNode input) {
+        notTerms = Iterables.filter(notTerms,
+            new PredicateImpl<RexNode>() {
+              public boolean test(RexNode input) {
                 switch (input.getKind()) {
                 case EQUALS:
                   RexCall call2 = (RexCall) input;
@@ -2312,10 +2313,10 @@ public class RexUtil {
             });
       }
     }
-    return composeConjunction(
-        rexBuilder, Iterables.concat(
-            ImmutableList.of(e), Iterables.transform(
-                notTerms, notFn(rexBuilder))), false);
+    return composeConjunction(rexBuilder,
+        Iterables.concat(ImmutableList.of(e),
+            Iterables.transform(notTerms, notFn(rexBuilder))),
+        false);
   }
 
   /** Returns whether a given operand of a CASE expression is a predicate.
@@ -2854,8 +2855,8 @@ public class RexUtil {
 
     /** Returns whether a {@link Project} contains a sub-query. */
     public static final Predicate<Project> PROJECT_PREDICATE =
-        new Predicate<Project>() {
-          public boolean apply(Project project) {
+        new PredicateImpl<Project>() {
+          public boolean test(Project project) {
             for (RexNode node : project.getProjects()) {
               try {
                 node.accept(INSTANCE);
@@ -2869,8 +2870,8 @@ public class RexUtil {
 
     /** Returns whether a {@link Filter} contains a sub-query. */
     public static final Predicate<Filter> FILTER_PREDICATE =
-        new Predicate<Filter>() {
-          public boolean apply(Filter filter) {
+        new PredicateImpl<Filter>() {
+          public boolean test(Filter filter) {
             try {
               filter.getCondition().accept(INSTANCE);
               return false;
@@ -2882,8 +2883,8 @@ public class RexUtil {
 
     /** Returns whether a {@link Join} contains a sub-query. */
     public static final Predicate<Join> JOIN_PREDICATE =
-        new Predicate<Join>() {
-          public boolean apply(Join join) {
+        new PredicateImpl<Join>() {
+          public boolean test(Join join) {
             try {
               join.getCondition().accept(INSTANCE);
               return false;

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java b/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java
new file mode 100644
index 0000000..c958b74
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you 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 org.apache.calcite.runtime;
+
+import com.google.common.base.Predicate;
+
+import javax.annotation.Nullable;
+
+/**
+ * Abstract implementation of {@link com.google.common.base.Predicate}.
+ *
+ * <p>Derived class needs to implement the {@link #test} method.
+ *
+ * <p>Helps with the transition to {@code java.util.function.Predicate},
+ * which was introduced in JDK 1.8, and is required in Guava 21.0 and higer,
+ * but still works on JDK 1.7.
+ *
+ * @param <T> the type of the input to the predicate
+ */
+public abstract class PredicateImpl<T> implements Predicate<T> {
+  public final boolean apply(@Nullable T input) {
+    return test(input);
+  }
+
+  /** Overrides {@code java.util.function.Predicate#test} in JDK8 and higher. */
+  public abstract boolean test(@Nullable T t);
+}
+
+// End PredicateImpl.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
index bb76cd7..71e79c7 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
@@ -24,6 +24,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypePrecedenceList;
 import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.runtime.CalciteException;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.runtime.Resources;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
@@ -385,8 +386,8 @@ public abstract class SqlUtil {
   filterOperatorRoutinesByKind(Iterator<SqlOperator> routines,
       final SqlKind sqlKind) {
     return Iterators.filter(routines,
-        new Predicate<SqlOperator>() {
-          public boolean apply(SqlOperator input) {
+        new PredicateImpl<SqlOperator>() {
+          public boolean test(SqlOperator input) {
             return input.getKind() == sqlKind;
           }
         });
@@ -488,8 +489,8 @@ public abstract class SqlUtil {
           Predicates.instanceOf(SqlFunction.class));
     default:
       return Iterators.filter(sqlOperators.iterator(),
-          new Predicate<SqlOperator>() {
-            public boolean apply(SqlOperator operator) {
+          new PredicateImpl<SqlOperator>() {
+            public boolean test(SqlOperator operator) {
               return operator.getSyntax() == syntax;
             }
           });
@@ -500,8 +501,8 @@ public abstract class SqlUtil {
       Iterator<SqlOperator> routines,
       final List<RelDataType> argTypes) {
     return Iterators.filter(routines,
-        new Predicate<SqlOperator>() {
-          public boolean apply(SqlOperator operator) {
+        new PredicateImpl<SqlOperator>() {
+          public boolean test(SqlOperator operator) {
             SqlOperandCountRange od = operator.getOperandCountRange();
             return od.isValidCount(argTypes.size());
           }
@@ -522,8 +523,8 @@ public abstract class SqlUtil {
     //noinspection unchecked
     return (Iterator) Iterators.filter(
         Iterators.filter(routines, SqlFunction.class),
-        new Predicate<SqlFunction>() {
-          public boolean apply(SqlFunction function) {
+        new PredicateImpl<SqlFunction>() {
+          public boolean test(SqlFunction function) {
             List<RelDataType> paramTypes = function.getParamTypes();
             if (paramTypes == null) {
               // no parameter information for builtins; keep for now
@@ -593,8 +594,8 @@ public abstract class SqlUtil {
         sqlFunctions =
             Lists.newArrayList(
                 Iterables.filter(sqlFunctions,
-                    new Predicate<SqlFunction>() {
-                      public boolean apply(SqlFunction function) {
+                    new PredicateImpl<SqlFunction>() {
+                      public boolean test(SqlFunction function) {
                         final List<RelDataType> paramTypes = function.getParamTypes();
                         if (paramTypes == null) {
                           return false;

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
index 73a3401..1b2481e 100644
--- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
+++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
@@ -18,6 +18,7 @@ package org.apache.calcite.sql.advise;
 
 import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.runtime.CalciteException;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlSelect;
@@ -33,7 +34,6 @@ import org.apache.calcite.sql.validate.SqlValidatorWithHints;
 import org.apache.calcite.util.Util;
 import org.apache.calcite.util.trace.CalciteTrace;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
@@ -238,16 +238,15 @@ public class SqlAdvisor {
   private static boolean isSelectListItem(SqlNode root,
       final SqlParserPos pos) {
     List<SqlNode> nodes = SqlUtil.getAncestry(root,
-        new Predicate<SqlNode>() {
-
-          public boolean apply(SqlNode input) {
+        new PredicateImpl<SqlNode>() {
+          public boolean test(SqlNode input) {
             return input instanceof SqlIdentifier
                 && Util.last(((SqlIdentifier) input).names)
                     .equals(UPPER_HINT_TOKEN);
           }
         },
-        new Predicate<SqlNode>() {
-          public boolean apply(SqlNode input) {
+        new PredicateImpl<SqlNode>() {
+          public boolean test(SqlNode input) {
             return input.getParserPosition().startsAt(pos);
           }
         });

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
index 4813a91..c9e1ad7 100644
--- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
@@ -19,6 +19,7 @@ package org.apache.calcite.sql.parser;
 import org.apache.calcite.avatica.util.Casing;
 import org.apache.calcite.rel.type.RelDataTypeSystem;
 import org.apache.calcite.runtime.CalciteContextException;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.sql.SqlBinaryOperator;
 import org.apache.calcite.sql.SqlIntervalLiteral;
 import org.apache.calcite.sql.SqlIntervalQualifier;
@@ -585,8 +586,8 @@ public final class SqlParserUtil {
   public static SqlNode toTreeEx(SqlSpecialOperator.TokenSequence list,
       int start, final int minPrec, final SqlKind stopperKind) {
     final Predicate<PrecedenceClimbingParser.Token> predicate =
-        new Predicate<PrecedenceClimbingParser.Token>() {
-          public boolean apply(PrecedenceClimbingParser.Token t) {
+        new PredicateImpl<PrecedenceClimbingParser.Token>() {
+          public boolean test(PrecedenceClimbingParser.Token t) {
             if (t instanceof PrecedenceClimbingParser.Op) {
               final SqlOperator op = ((ToTreeListItem) t.o).op;
               return stopperKind != SqlKind.OTHER

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
index 7f6eee4..769e728 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
@@ -38,6 +38,7 @@ import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
@@ -75,8 +76,8 @@ public class DruidRules {
 
   /** Predicate that returns whether Druid can not handle an aggregate. */
   private static final Predicate<AggregateCall> BAD_AGG =
-      new Predicate<AggregateCall>() {
-        public boolean apply(AggregateCall aggregateCall) {
+      new PredicateImpl<AggregateCall>() {
+        public boolean test(AggregateCall aggregateCall) {
           switch (aggregateCall.getAggregation().getKind()) {
           case COUNT:
           case SUM:

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f196350..853698e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,9 +69,9 @@ limitations under the License.
     <git-commit-id-plugin.version>2.1.9</git-commit-id-plugin.version>
 
     <!-- We support (and test against) Guava versions between
-         14.0.1 (Hive) and 19.0 (most recent).
+         14.0.1 (Hive) and 21.0 (most recent; supports only JDK8 and up).
          Override with your preferred version and it should work. -->
-    <guava.version>18.0</guava.version>
+    <guava.version>20.0</guava.version>
     <joda.version>2.8.1</joda.version>
     <h2.version>1.4.185</h2.version>
     <hadoop.version>2.6.0</hadoop.version>

http://git-wip-us.apache.org/repos/asf/calcite/blob/f10810a2/site/_docs/history.md
----------------------------------------------------------------------
diff --git a/site/_docs/history.md b/site/_docs/history.md
index 51767b2..a85db90 100644
--- a/site/_docs/history.md
+++ b/site/_docs/history.md
@@ -28,6 +28,16 @@ For a full list of releases, see
 Downloads are available on the
 [downloads page]({{ site.baseurl }}/downloads/).
 
+## <a href="https://github.com/apache/calcite/releases/tag/calcite-1.12.0">1.12.0</a> / under development
+{: #v1-12-0}
+
+Compatibility: This release is tested
+on Linux, macOS, Microsoft Windows;
+using Oracle JDK 1.7, 1.8, 9;
+Guava versions 14.0 to 21.0;
+Druid version 0.9.1.1;
+other software versions as specified in `pom.xml`.
+
 ## <a href="https://github.com/apache/calcite/releases/tag/calcite-1.11.0">1.11.0</a> / 2017-01-09
 {: #v1-11-0}