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 2018/07/09 07:49:28 UTC

[06/30] calcite git commit: [CALCITE-2259] Allow Java 8 syntax

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java
index bae6a4d..74d9c9c 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java
@@ -26,7 +26,6 @@ import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.type.SqlTypeFamily;
 import org.apache.calcite.sql.type.SqlTypeName;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.BaseEncoding;
@@ -36,8 +35,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.TimeZone;
-
 import javax.annotation.Nullable;
 
 /**
@@ -189,13 +188,15 @@ public class DruidExpressions {
   }
 
   public static String functionCall(final String functionName, final List<String> args) {
-    Preconditions.checkNotNull(functionName, "druid functionName");
-    Preconditions.checkNotNull(args, "args");
+    Objects.requireNonNull(functionName, "druid functionName");
+    Objects.requireNonNull(args, "args");
 
     final StringBuilder builder = new StringBuilder(functionName);
     builder.append("(");
     for (int i = 0; i < args.size(); i++) {
-      final String arg = Preconditions.checkNotNull(args.get(i), "arg #%s", i);
+      int finalI = i;
+      final String arg = Objects.requireNonNull(args.get(i),
+          () -> "arg #" + finalI);
       builder.append(arg);
       if (i < args.size() - 1) {
         builder.append(",");
@@ -206,12 +207,14 @@ public class DruidExpressions {
   }
 
   public static String nAryOperatorCall(final String druidOperator, final List<String> args) {
-    Preconditions.checkNotNull(druidOperator, "druid operator missing");
-    Preconditions.checkNotNull(args, "args");
+    Objects.requireNonNull(druidOperator, "druid operator missing");
+    Objects.requireNonNull(args, "args");
     final StringBuilder builder = new StringBuilder();
     builder.append("(");
     for (int i = 0; i < args.size(); i++) {
-      final String arg = Preconditions.checkNotNull(args.get(i), "arg #%s", i);
+      int finalI = i;
+      final String arg = Objects.requireNonNull(args.get(i),
+          () -> "arg #" + finalI);
       builder.append(arg);
       if (i < args.size() - 1) {
         builder.append(druidOperator);
@@ -250,8 +253,8 @@ public class DruidExpressions {
       final String granularity,
       final String origin,
       final TimeZone timeZone) {
-    Preconditions.checkNotNull(input, "input");
-    Preconditions.checkNotNull(granularity, "granularity");
+    Objects.requireNonNull(input, "input");
+    Objects.requireNonNull(granularity, "granularity");
     return DruidExpressions.functionCall(
         "timestamp_floor",
         ImmutableList.of(input,
@@ -265,8 +268,8 @@ public class DruidExpressions {
       final String granularity,
       final String origin,
       final TimeZone timeZone) {
-    Preconditions.checkNotNull(input, "input");
-    Preconditions.checkNotNull(granularity, "granularity");
+    Objects.requireNonNull(input, "input");
+    Objects.requireNonNull(granularity, "granularity");
     return DruidExpressions.functionCall(
         "timestamp_ceil",
         ImmutableList.of(input,

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
index cca9d6b..678be98 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java
@@ -28,19 +28,17 @@ import org.apache.calcite.util.Pair;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
-
+import java.util.Objects;
 import javax.annotation.Nullable;
 
-
 /**
  * Filter element of a Druid "groupBy" or "topN" query.
  */
@@ -386,7 +384,7 @@ abstract class DruidJsonFilter implements DruidJson {
     case OR:
     case NOT:
       final RexCall call = (RexCall) rexNode;
-      final List<DruidJsonFilter> jsonFilters = Lists.newArrayList();
+      final List<DruidJsonFilter> jsonFilters = new ArrayList<>();
       for (final RexNode e : call.getOperands()) {
         final DruidJsonFilter druidFilter = toDruidFilters(e, rowType, druidQuery);
         if (druidFilter == null) {
@@ -442,7 +440,7 @@ abstract class DruidJsonFilter implements DruidJson {
 
     JsonExpressionFilter(String expression) {
       super(Type.EXPRESSION);
-      this.expression = Preconditions.checkNotNull(expression);
+      this.expression = Objects.requireNonNull(expression);
     }
 
     @Override public void write(JsonGenerator generator) throws IOException {
@@ -609,7 +607,7 @@ abstract class DruidJsonFilter implements DruidJson {
 
   public static DruidJsonFilter getSelectorFilter(String column, String value,
       ExtractionFunction extractionFunction) {
-    Preconditions.checkNotNull(column);
+    Objects.requireNonNull(column);
     return new JsonSelector(column, value, extractionFunction);
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
index 611c722..cb69449 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
@@ -67,9 +67,6 @@ import org.apache.calcite.util.Util;
 
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonGenerator;
-import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -91,6 +88,7 @@ import java.util.Set;
 import java.util.TimeZone;
 import java.util.regex.Pattern;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 /**
@@ -188,8 +186,8 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
     this.druidTable = druidTable;
     this.intervals = ImmutableList.copyOf(intervals);
     this.rels = ImmutableList.copyOf(rels);
-    this.converterOperatorMap = Preconditions.checkNotNull(converterOperatorMap, "Operator map "
-        + "can not be null");
+    this.converterOperatorMap = Objects.requireNonNull(converterOperatorMap,
+        "Operator map can not be null");
     assert isValid(Litmus.THROW, null);
   }
 
@@ -798,7 +796,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
         }
       }
     }
-    return Pair.<List<String>, List<VirtualColumn>>of(projectedColumnsBuilder.build(),
+    return Pair.of(projectedColumnsBuilder.build(),
         virtualColumnsBuilder.build());
   }
 
@@ -1001,9 +999,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
       }
       final ScanQuery scanQuery = new ScanQuery(druidTable.dataSource, intervals, jsonFilter,
           virtualColumnList, scanColumnNames, fetch);
-      return new QuerySpec(QueryType.SCAN,
-          Preconditions.checkNotNull(scanQuery.toQuery(), "Can not plan Scan Druid Query"),
-          scanColumnNames);
+      return new QuerySpec(QueryType.SCAN, scanQuery.toQuery(), scanColumnNames);
     }
 
     // At this Stage we have a valid Aggregate thus Query is one of Timeseries, TopN, or GroupBy
@@ -1053,11 +1049,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
       // this is an index of existing columns coming out aggregate layer. Will use this index to:
       // filter out any project down the road that doesn't change values e.g inputRef/identity cast
       Map<String, String> existingProjects = Maps
-          .uniqueIndex(aggregateStageFieldNames, new Function<String, String>() {
-            @Override public String apply(@Nullable String input) {
-              return DruidExpressions.fromColumn(input);
-            }
-          });
+          .uniqueIndex(aggregateStageFieldNames, DruidExpressions::fromColumn);
       for (Pair<RexNode, String> pair : postProject.getNamedProjects()) {
         final RexNode postProjectRexNode = pair.left;
         String expression = DruidExpressions
@@ -1098,15 +1090,12 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
         // Case we have transformed the group by time to druid timeseries with Granularity.
         // Need to replace the name of the column with druid timestamp field name.
         final List<String> timeseriesFieldNames =
-            Lists.transform(queryOutputFieldNames,
-                new Function<String, String>() {
-                  @Override public String apply(@Nullable String input) {
-                    if (timeExtractColumn.equals(input)) {
-                      return "timestamp";
-                    }
-                    return input;
-                  }
-                });
+            Lists.transform(queryOutputFieldNames, input -> {
+              if (timeExtractColumn.equals(input)) {
+                return "timestamp";
+              }
+              return input;
+            });
         return new QuerySpec(QueryType.TIMESERIES, timeSeriesQueryString, timeseriesFieldNames);
       }
       return new QuerySpec(QueryType.TIMESERIES, timeSeriesQueryString, queryOutputFieldNames);
@@ -1350,7 +1339,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
       this.fetchLimit = fetchLimit;
     }
 
-    public String toQuery() {
+    @Nonnull public String toQuery() {
       final StringWriter sw = new StringWriter();
       try {
         final JsonFactory factory = new JsonFactory();
@@ -1548,8 +1537,8 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
 
     QuerySpec(QueryType queryType, String queryString,
         List<String> fieldNames) {
-      this.queryType = Preconditions.checkNotNull(queryType);
-      this.queryString = Preconditions.checkNotNull(queryString);
+      this.queryType = Objects.requireNonNull(queryType);
+      this.queryString = Objects.requireNonNull(queryString);
       this.fieldNames = ImmutableList.copyOf(fieldNames);
     }
 
@@ -1799,11 +1788,8 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
    * @return index of the timestamp ref or -1 if not present
    */
   protected int getTimestampFieldIndex() {
-    return Iterables.indexOf(this.getRowType().getFieldList(), new Predicate<RelDataTypeField>() {
-      @Override public boolean apply(@Nullable RelDataTypeField input) {
-        return druidTable.timestampFieldName.equals(input.getName());
-      }
-    });
+    return Iterables.indexOf(this.getRowType().getFieldList(),
+        input -> druidTable.timestampFieldName.equals(input.getName()));
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/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 83d4fce..f6b4efe 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
@@ -36,11 +36,9 @@ import org.apache.calcite.rel.rules.FilterAggregateTransposeRule;
 import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
 import org.apache.calcite.rel.rules.ProjectFilterTransposeRule;
 import org.apache.calcite.rel.rules.ProjectSortTransposeRule;
-import org.apache.calcite.rel.rules.PushProjector;
 import org.apache.calcite.rel.rules.SortProjectTransposeRule;
 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.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexExecutor;
@@ -61,9 +59,7 @@ import org.apache.calcite.util.trace.CalciteTrace;
 import org.apache.commons.lang3.tuple.ImmutableTriple;
 import org.apache.commons.lang3.tuple.Triple;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
 import org.joda.time.Interval;
@@ -75,8 +71,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.annotation.Nullable;
-
 /**
  * Rules and relational operators for {@link DruidQuery}.
  */
@@ -176,17 +170,14 @@ public class DruidRules {
       }
 
       // Timestamp
-      int timestampFieldIdx = Iterables
-          .indexOf(query.getRowType().getFieldList(), new Predicate<RelDataTypeField>() {
-            @Override public boolean apply(@Nullable RelDataTypeField input) {
-              return query.druidTable.timestampFieldName.equals(input.getName());
-            }
-          });
+      int timestampFieldIdx =
+          query.getRowType().getFieldNames()
+              .indexOf(query.druidTable.timestampFieldName);
       RelNode newDruidQuery = query;
       final Triple<List<RexNode>, List<RexNode>, List<RexNode>> triple =
           splitFilters(rexBuilder, query, validPreds, nonValidPreds, timestampFieldIdx);
       if (triple.getLeft().isEmpty() && triple.getMiddle().isEmpty()) {
-        //it sucks, nothing to push
+        // it sucks, nothing to push
         return;
       }
       final List<RexNode> residualPreds = new ArrayList<>(triple.getRight());
@@ -815,7 +806,7 @@ public class DruidRules {
           operand(Project.class,
               operand(Filter.class,
                   operand(DruidQuery.class, none()))),
-          PushProjector.ExprCondition.FALSE,
+              expr -> false,
           relBuilderFactory);
     }
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java
index c8b6419..03d8210 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java
@@ -21,7 +21,6 @@ import org.apache.calcite.schema.impl.AbstractSchema;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.Compatible;
 
-import com.google.common.base.Preconditions;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.collect.ImmutableMap;
@@ -32,8 +31,8 @@ import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
-import javax.annotation.Nonnull;
 
 /**
  * Schema mapped onto a Druid instance.
@@ -55,8 +54,8 @@ public class DruidSchema extends AbstractSchema {
    */
   public DruidSchema(String url, String coordinatorUrl,
       boolean discoverTables) {
-    this.url = Preconditions.checkNotNull(url);
-    this.coordinatorUrl = Preconditions.checkNotNull(coordinatorUrl);
+    this.url = Objects.requireNonNull(url);
+    this.coordinatorUrl = Objects.requireNonNull(coordinatorUrl);
     this.discoverTables = discoverTables;
   }
 
@@ -70,26 +69,26 @@ public class DruidSchema extends AbstractSchema {
       Set<String> tableNames = connection.tableNames();
 
       tableMap = Compatible.INSTANCE.asMap(
-              ImmutableSet.copyOf(tableNames),
-              CacheBuilder.newBuilder()
-                .build(new CacheLoader<String, Table>() {
-                  @Override public Table load(@Nonnull String tableName) throws Exception {
-                    final Map<String, SqlTypeName> fieldMap = new LinkedHashMap<>();
-                    final Set<String> metricNameSet = new LinkedHashSet<>();
-                    final Map<String, List<ComplexMetric>> complexMetrics = new HashMap<>();
-
-                    connection.metadata(tableName, DruidTable.DEFAULT_TIMESTAMP_COLUMN,
-                            null, fieldMap, metricNameSet, complexMetrics);
-
-                    return DruidTable.create(DruidSchema.this, tableName, null,
-                            fieldMap, metricNameSet, DruidTable.DEFAULT_TIMESTAMP_COLUMN,
-                            complexMetrics);
-                  }
-                }));
+          ImmutableSet.copyOf(tableNames),
+          CacheBuilder.newBuilder()
+              .build(CacheLoader.from(name -> table(name, connection))));
     }
 
     return tableMap;
   }
+
+  private Table table(String tableName, DruidConnectionImpl connection) {
+    final Map<String, SqlTypeName> fieldMap = new LinkedHashMap<>();
+    final Set<String> metricNameSet = new LinkedHashSet<>();
+    final Map<String, List<ComplexMetric>> complexMetrics = new HashMap<>();
+
+    connection.metadata(tableName, DruidTable.DEFAULT_TIMESTAMP_COLUMN,
+        null, fieldMap, metricNameSet, complexMetrics);
+
+    return DruidTable.create(DruidSchema.this, tableName, null,
+        fieldMap, metricNameSet, DruidTable.DEFAULT_TIMESTAMP_COLUMN,
+        complexMetrics);
+  }
 }
 
 // End DruidSchema.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java
index 10e0466..1c402c0 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java
@@ -49,6 +49,7 @@ import org.joda.time.chrono.ISOChronology;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -84,16 +85,16 @@ public class DruidTable extends AbstractTable implements TranslatableTable {
       RelProtoDataType protoRowType, Set<String> metricFieldNames,
       String timestampFieldName, List<Interval> intervals,
       Map<String, List<ComplexMetric>> complexMetrics, Map<String, SqlTypeName> allFields) {
-    this.timestampFieldName = Preconditions.checkNotNull(timestampFieldName);
-    this.schema = Preconditions.checkNotNull(schema);
-    this.dataSource = Preconditions.checkNotNull(dataSource);
+    this.timestampFieldName = Objects.requireNonNull(timestampFieldName);
+    this.schema = Objects.requireNonNull(schema);
+    this.dataSource = Objects.requireNonNull(dataSource);
     this.protoRowType = protoRowType;
     this.metricFieldNames = ImmutableSet.copyOf(metricFieldNames);
     this.intervals = intervals != null ? ImmutableList.copyOf(intervals)
         : ImmutableList.of(DEFAULT_INTERVAL);
-    this.complexMetrics = complexMetrics == null ? ImmutableMap.<String, List<ComplexMetric>>of()
+    this.complexMetrics = complexMetrics == null ? ImmutableMap.of()
             : ImmutableMap.copyOf(complexMetrics);
-    this.allFields = allFields == null ? ImmutableMap.<String, SqlTypeName>of()
+    this.allFields = allFields == null ? ImmutableMap.of()
             : ImmutableMap.copyOf(allFields);
   }
 
@@ -179,8 +180,7 @@ public class DruidTable extends AbstractTable implements TranslatableTable {
   }
 
   @Override public boolean rolledUpColumnValidInsideAgg(String column, SqlCall call,
-                                                        SqlNode parent,
-                                                        CalciteConnectionConfig config) {
+      SqlNode parent, CalciteConnectionConfig config) {
     assert isRolledUp(column);
     // Our rolled up columns are only allowed in COUNT(DISTINCT ...) aggregate functions.
     // We only allow this when approximate results are acceptable.
@@ -245,7 +245,7 @@ public class DruidTable extends AbstractTable implements TranslatableTable {
     final TableScan scan = LogicalTableScan.create(cluster, relOptTable);
     return DruidQuery.create(cluster,
         cluster.traitSetOf(BindableConvention.INSTANCE), relOptTable, this,
-        ImmutableList.<RelNode>of(scan));
+        ImmutableList.of(scan));
   }
 
   public boolean isMetric(String name) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java b/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java
index 0aece36..8f65a59 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java
@@ -17,9 +17,9 @@
 package org.apache.calcite.adapter.druid;
 
 import com.fasterxml.jackson.core.JsonGenerator;
-import com.google.common.base.Preconditions;
 
 import java.io.IOException;
+import java.util.Objects;
 
 import javax.annotation.Nullable;
 
@@ -45,8 +45,8 @@ public class ExtractionDimensionSpec implements DimensionSpec {
 
   public ExtractionDimensionSpec(String dimension, ExtractionFunction extractionFunction,
       String outputName, DruidType outputType) {
-    this.dimension = Preconditions.checkNotNull(dimension);
-    this.extractionFunction = Preconditions.checkNotNull(extractionFunction);
+    this.dimension = Objects.requireNonNull(dimension);
+    this.extractionFunction = Objects.requireNonNull(extractionFunction);
     this.outputName = outputName;
     this.outputType = outputType == null ? DruidType.STRING : outputType;
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java
index 187fa66..d775535 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java
@@ -28,7 +28,6 @@ import java.util.TimeZone;
 
 import javax.annotation.Nullable;
 
-
 /**
  * DruidSqlOperatorConverter implementation that handles Floor operations conversions
  */

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/Granularities.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/Granularities.java b/druid/src/main/java/org/apache/calcite/adapter/druid/Granularities.java
index 2015075..5bf8b07 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/Granularities.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/Granularities.java
@@ -19,9 +19,9 @@ package org.apache.calcite.adapter.druid;
 import org.apache.calcite.avatica.util.TimeUnitRange;
 
 import com.fasterxml.jackson.core.JsonGenerator;
-import com.google.common.base.Preconditions;
 
 import java.io.IOException;
+import java.util.Objects;
 import javax.annotation.Nonnull;
 
 import static org.apache.calcite.adapter.druid.DruidQuery.writeFieldIf;
@@ -88,9 +88,9 @@ public class Granularities {
     private final String timeZone;
 
     private PeriodGranularity(Type type, String period, String timeZone) {
-      this.type = Preconditions.checkNotNull(type);
-      this.period = Preconditions.checkNotNull(period);
-      this.timeZone = Preconditions.checkNotNull(timeZone);
+      this.type = Objects.requireNonNull(type);
+      this.period = Objects.requireNonNull(period);
+      this.timeZone = Objects.requireNonNull(timeZone);
     }
 
     @Override public void write(JsonGenerator generator) throws IOException {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java
index 961454b..df30920 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java
@@ -21,9 +21,8 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlOperator;
 
-import com.google.common.base.Preconditions;
-
 import java.util.List;
+import java.util.Objects;
 
 import javax.annotation.Nullable;
 
@@ -35,8 +34,8 @@ public class NaryOperatorConverter implements DruidSqlOperatorConverter {
   private final String druidOperatorName;
 
   public NaryOperatorConverter(SqlOperator operator, String druidOperatorName) {
-    this.operator = Preconditions.checkNotNull(operator);
-    this.druidOperatorName = Preconditions.checkNotNull(druidOperatorName);
+    this.operator = Objects.requireNonNull(operator);
+    this.druidOperatorName = Objects.requireNonNull(druidOperatorName);
   }
 
   @Override public SqlOperator calciteOperator() {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java b/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java
index 7348cec..3ac1ace 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java
@@ -17,10 +17,10 @@
 package org.apache.calcite.adapter.druid;
 
 import com.fasterxml.jackson.core.JsonGenerator;
-import com.google.common.base.Preconditions;
 
 import java.io.IOException;
 import java.util.Locale;
+import java.util.Objects;
 
 import static org.apache.calcite.adapter.druid.DruidQuery.writeFieldIf;
 
@@ -36,8 +36,8 @@ public class VirtualColumn implements DruidJson {
   private final DruidType outputType;
 
   public VirtualColumn(String name, String expression, DruidType outputType) {
-    this.name = Preconditions.checkNotNull(name);
-    this.expression = Preconditions.checkNotNull(expression);
+    this.name = Objects.requireNonNull(name);
+    this.expression = Objects.requireNonNull(expression);
     this.outputType = outputType == null ? DruidType.FLOAT : outputType;
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
----------------------------------------------------------------------
diff --git a/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java b/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
index 16e1f59..6b5b520 100644
--- a/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
+++ b/druid/src/test/java/org/apache/calcite/adapter/druid/DruidQueryFilterTest.java
@@ -58,7 +58,7 @@ public class DruidQueryFilterTest {
     Mockito.when(druidQuery.getDruidTable())
         .thenReturn(
             new DruidTable(Mockito.mock(DruidSchema.class), "dataSource", null,
-                ImmutableSet.<String>of(), "timestamp", null, null,
+                ImmutableSet.of(), "timestamp", null, null,
                 null
             ));
   }
@@ -118,7 +118,7 @@ public class DruidQueryFilterTest {
     final RexBuilder rexBuilder = new RexBuilder(typeFactory);
     final DruidTable druidTable =
         new DruidTable(Mockito.mock(DruidSchema.class), "dataSource", null,
-            ImmutableSet.<String>of(), "timestamp", null, null,
+            ImmutableSet.of(), "timestamp", null, null,
                 null);
     final RelDataType varcharType =
         typeFactory.createSqlType(SqlTypeName.VARCHAR);

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
----------------------------------------------------------------------
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
index 817142f..074ad2a 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -20,16 +20,13 @@ import org.apache.calcite.adapter.druid.DruidQuery;
 import org.apache.calcite.adapter.druid.DruidSchema;
 import org.apache.calcite.config.CalciteConnectionConfig;
 import org.apache.calcite.config.CalciteConnectionProperty;
-import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.prepare.CalcitePrepareImpl;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.schema.impl.AbstractSchema;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.Util;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -38,11 +35,11 @@ import com.google.common.collect.Multimap;
 import org.junit.Test;
 
 import java.net.URL;
-import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.List;
+import java.util.function.Consumer;
 
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
@@ -111,18 +108,15 @@ public class DruidAdapterIT {
     return ENABLED;
   }
 
-  /** Returns a function that checks that a particular Druid query is
+  /** Returns a consumer that checks that a particular Druid query is
    * generated to implement a query. */
-  private static Function<List, Void> druidChecker(final String... lines) {
-    return new Function<List, Void>() {
-      public Void apply(List list) {
-        assertThat(list.size(), is(1));
-        DruidQuery.QuerySpec querySpec = (DruidQuery.QuerySpec) list.get(0);
-        for (String line : lines) {
-          final String s = line.replace('\'', '"');
-          assertThat(querySpec.getQueryString(null, -1), containsString(s));
-        }
-        return null;
+  private static Consumer<List> druidChecker(final String... lines) {
+    return list -> {
+      assertThat(list.size(), is(1));
+      DruidQuery.QuerySpec querySpec = (DruidQuery.QuerySpec) list.get(0);
+      for (String line : lines) {
+        final String s = line.replace('\'', '"');
+        assertThat(querySpec.getQueryString(null, -1), containsString(s));
       }
     };
   }
@@ -383,31 +377,29 @@ public class DruidAdapterIT {
 
   @Test public void testMetadataColumns() throws Exception {
     sql("values 1")
-        .withConnection(
-            new Function<Connection, Void>() {
-              public Void apply(Connection c) {
-                try {
-                  final DatabaseMetaData metaData = c.getMetaData();
-                  final ResultSet r =
-                      metaData.getColumns(null, null, "foodmart", null);
-                  Multimap<String, Boolean> map = ArrayListMultimap.create();
-                  while (r.next()) {
-                    map.put(r.getString("TYPE_NAME"), true);
-                  }
-                  System.out.println(map);
-                  // 1 timestamp, 2 float measure, 1 int measure, 88 dimensions
-                  assertThat(map.keySet().size(), is(4));
-                  assertThat(map.values().size(), is(92));
-                  assertThat(map.get("TIMESTAMP_WITH_LOCAL_TIME_ZONE(0) NOT NULL").size(), is(1));
-                  assertThat(map.get("DOUBLE").size(), is(2));
-                  assertThat(map.get("BIGINT").size(), is(1));
-                  assertThat(map.get(VARCHAR_TYPE).size(), is(88));
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-                return null;
-              }
-            });
+        .withConnection(c -> {
+          try {
+            final DatabaseMetaData metaData = c.getMetaData();
+            final ResultSet r =
+                metaData.getColumns(null, null, "foodmart", null);
+            Multimap<String, Boolean> map = ArrayListMultimap.create();
+            while (r.next()) {
+              map.put(r.getString("TYPE_NAME"), true);
+            }
+            if (CalcitePrepareImpl.DEBUG) {
+              System.out.println(map);
+            }
+            // 1 timestamp, 2 float measure, 1 int measure, 88 dimensions
+            assertThat(map.keySet().size(), is(4));
+            assertThat(map.values().size(), is(92));
+            assertThat(map.get("TIMESTAMP_WITH_LOCAL_TIME_ZONE(0) NOT NULL").size(), is(1));
+            assertThat(map.get("DOUBLE").size(), is(2));
+            assertThat(map.get("BIGINT").size(), is(1));
+            assertThat(map.get(VARCHAR_TYPE).size(), is(88));
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        });
   }
 
   @Test public void testSelectDistinct() {
@@ -502,19 +494,16 @@ public class DruidAdapterIT {
   @Test public void testSelectCount() {
     final String sql = "select count(*) as c from \"foodmart\"";
     sql(sql)
-        .returns(new Function<ResultSet, Void>() {
-          public Void apply(ResultSet input) {
-            try {
-              assertThat(input.next(), is(true));
-              assertThat(input.getInt(1), is(86829));
-              assertThat(input.getLong(1), is(86829L));
-              assertThat(input.getString(1), is("86829"));
-              assertThat(input.wasNull(), is(false));
-              assertThat(input.next(), is(false));
-              return null;
-            } catch (SQLException e) {
-              throw new RuntimeException(e);
-            }
+        .returns(input -> {
+          try {
+            assertThat(input.next(), is(true));
+            assertThat(input.getInt(1), is(86829));
+            assertThat(input.getLong(1), is(86829L));
+            assertThat(input.getString(1), is("86829"));
+            assertThat(input.wasNull(), is(false));
+            assertThat(input.next(), is(false));
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
           }
         });
   }
@@ -798,22 +787,18 @@ public class DruidAdapterIT {
         + "'resultFormat':'compactedList'";
     sql(sql)
         .limit(4)
-        .returns(
-            new Function<ResultSet, Void>() {
-              public Void apply(ResultSet resultSet) {
-                try {
-                  for (int i = 0; i < 4; i++) {
-                    assertTrue(resultSet.next());
-                    assertThat(resultSet.getString("product_name"),
-                        is("Fort West Dried Apricots"));
-                  }
-                  assertFalse(resultSet.next());
-                  return null;
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            })
+        .returns(resultSet -> {
+          try {
+            for (int i = 0; i < 4; i++) {
+              assertTrue(resultSet.next());
+              assertThat(resultSet.getString("product_name"),
+                  is("Fort West Dried Apricots"));
+            }
+            assertFalse(resultSet.next());
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        })
         .queryContains(druidChecker(druidQuery));
   }
 
@@ -831,22 +816,18 @@ public class DruidAdapterIT {
         + "'resultFormat':'compactedList'";
     sql(sql)
         .limit(4)
-        .returns(
-            new Function<ResultSet, Void>() {
-              public Void apply(ResultSet resultSet) {
-                try {
-                  for (int i = 0; i < 4; i++) {
-                    assertTrue(resultSet.next());
-                    assertThat(resultSet.getString("product_name"),
-                        is("Fort West Dried Apricots"));
-                  }
-                  assertFalse(resultSet.next());
-                  return null;
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            })
+        .returns(resultSet -> {
+          try {
+            for (int i = 0; i < 4; i++) {
+              assertTrue(resultSet.next());
+              assertThat(resultSet.getString("product_name"),
+                  is("Fort West Dried Apricots"));
+            }
+            assertFalse(resultSet.next());
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        })
         .queryContains(druidChecker(druidQuery));
   }
 
@@ -881,22 +862,18 @@ public class DruidAdapterIT {
 
     sql(sql)
         .limit(4)
-        .returns(
-            new Function<ResultSet, Void>() {
-              public Void apply(ResultSet resultSet) {
-                try {
-                  for (int i = 0; i < 4; i++) {
-                    assertTrue(resultSet.next());
-                    assertThat(resultSet.getString("product_name"),
-                        is("Fort West Dried Apricots"));
-                  }
-                  assertFalse(resultSet.next());
-                  return null;
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            })
+        .returns(resultSet -> {
+          try {
+            for (int i = 0; i < 4; i++) {
+              assertTrue(resultSet.next());
+              assertThat(resultSet.getString("product_name"),
+                  is("Fort West Dried Apricots"));
+            }
+            assertFalse(resultSet.next());
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        })
         .queryContains(druidChecker(druidQuery, druidFilter, druidQuery2));
   }
 
@@ -2001,43 +1978,39 @@ public class DruidAdapterIT {
     String druidQuery = "'filter':{'type':'bound','dimension':'product_id',"
         + "'upper':'10','upperStrict':true,'ordering':'numeric'}";
     sql("?")
-        .withRel(new Function<RelBuilder, RelNode>() {
-          public RelNode apply(RelBuilder b) {
-            // select product_id
-            // from foodmart.foodmart
-            // where product_id < cast(10 as varchar)
-            final RelDataType intType =
-                b.getTypeFactory().createSqlType(SqlTypeName.INTEGER);
-            return b.scan("foodmart", "foodmart")
-                .filter(
-                    b.call(SqlStdOperatorTable.LESS_THAN,
-                        b.getRexBuilder().makeCall(intType,
-                            SqlStdOperatorTable.CAST,
-                            ImmutableList.<RexNode>of(b.field("product_id"))),
-                        b.getRexBuilder().makeCall(intType,
-                            SqlStdOperatorTable.CAST,
-                            ImmutableList.of(b.literal("10")))))
-                .project(b.field("product_id"))
-                .build();
-          }
+        .withRel(b -> {
+          // select product_id
+          // from foodmart.foodmart
+          // where product_id < cast(10 as varchar)
+          final RelDataType intType =
+              b.getTypeFactory().createSqlType(SqlTypeName.INTEGER);
+          return b.scan("foodmart", "foodmart")
+              .filter(
+                  b.call(SqlStdOperatorTable.LESS_THAN,
+                      b.getRexBuilder().makeCall(intType,
+                          SqlStdOperatorTable.CAST,
+                          ImmutableList.of(b.field("product_id"))),
+                      b.getRexBuilder().makeCall(intType,
+                          SqlStdOperatorTable.CAST,
+                          ImmutableList.of(b.literal("10")))))
+              .project(b.field("product_id"))
+              .build();
         })
         .queryContains(druidChecker(druidQuery));
   }
 
   @Test public void testPushFieldEqualsLiteral() {
     sql("?")
-        .withRel(new Function<RelBuilder, RelNode>() {
-          public RelNode apply(RelBuilder b) {
-            // select count(*) as c
-            // from foodmart.foodmart
-            // where product_id = 'id'
-            return b.scan("foodmart", "foodmart")
-                .filter(
-                    b.call(SqlStdOperatorTable.EQUALS, b.field("product_id"),
-                        b.literal("id")))
-                .aggregate(b.groupKey(), b.countStar("c"))
-                .build();
-          }
+        .withRel(b -> {
+          // select count(*) as c
+          // from foodmart.foodmart
+          // where product_id = 'id'
+          return b.scan("foodmart", "foodmart")
+              .filter(
+                  b.call(SqlStdOperatorTable.EQUALS, b.field("product_id"),
+                      b.literal("id")))
+              .aggregate(b.groupKey(), b.countStar("c"))
+              .build();
         })
         // Should return one row, "c=0"; logged
         // [CALCITE-1775] "GROUP BY ()" on empty relation should return 1 row

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
----------------------------------------------------------------------
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
index 97e9cc4..d256d81 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
@@ -20,16 +20,13 @@ import org.apache.calcite.adapter.druid.DruidQuery;
 import org.apache.calcite.adapter.druid.DruidSchema;
 import org.apache.calcite.config.CalciteConnectionConfig;
 import org.apache.calcite.config.CalciteConnectionProperty;
-import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.prepare.CalcitePrepareImpl;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.schema.impl.AbstractSchema;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.Util;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -38,11 +35,11 @@ import com.google.common.collect.Multimap;
 import org.junit.Test;
 
 import java.net.URL;
-import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.List;
+import java.util.function.Consumer;
 
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
@@ -97,16 +94,13 @@ public class DruidAdapterIT2 {
 
   /** Returns a function that checks that a particular Druid query is
    * generated to implement a query. */
-  private static Function<List, Void> druidChecker(final String... lines) {
-    return new Function<List, Void>() {
-      public Void apply(List list) {
-        assertThat(list.size(), is(1));
-        DruidQuery.QuerySpec querySpec = (DruidQuery.QuerySpec) list.get(0);
-        for (String line : lines) {
-          final String s = line.replace('\'', '"');
-          assertThat(querySpec.getQueryString(null, -1), containsString(s));
-        }
-        return null;
+  private static Consumer<List> druidChecker(final String... lines) {
+    return list -> {
+      assertThat(list.size(), is(1));
+      DruidQuery.QuerySpec querySpec = (DruidQuery.QuerySpec) list.get(0);
+      for (String line : lines) {
+        final String s = line.replace('\'', '"');
+        assertThat(querySpec.getQueryString(null, -1), containsString(s));
       }
     };
   }
@@ -143,31 +137,29 @@ public class DruidAdapterIT2 {
 
   @Test public void testMetadataColumns() throws Exception {
     sql("values 1")
-        .withConnection(
-            new Function<Connection, Void>() {
-              public Void apply(Connection c) {
-                try {
-                  final DatabaseMetaData metaData = c.getMetaData();
-                  final ResultSet r =
-                      metaData.getColumns(null, null, "foodmart", null);
-                  Multimap<String, Boolean> map = ArrayListMultimap.create();
-                  while (r.next()) {
-                    map.put(r.getString("TYPE_NAME"), true);
-                  }
-                  System.out.println(map);
-                  // 1 timestamp, 2 float measure, 1 int measure, 88 dimensions
-                  assertThat(map.keySet().size(), is(4));
-                  assertThat(map.values().size(), is(92));
-                  assertThat(map.get("TIMESTAMP(0) NOT NULL").size(), is(1));
-                  assertThat(map.get("DOUBLE").size(), is(2));
-                  assertThat(map.get("BIGINT").size(), is(1));
-                  assertThat(map.get(VARCHAR_TYPE).size(), is(88));
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-                return null;
-              }
-            });
+        .withConnection(c -> {
+          try {
+            final DatabaseMetaData metaData = c.getMetaData();
+            final ResultSet r =
+                metaData.getColumns(null, null, "foodmart", null);
+            Multimap<String, Boolean> map = ArrayListMultimap.create();
+            while (r.next()) {
+              map.put(r.getString("TYPE_NAME"), true);
+            }
+            if (CalcitePrepareImpl.DEBUG) {
+              System.out.println(map);
+            }
+            // 1 timestamp, 2 float measure, 1 int measure, 88 dimensions
+            assertThat(map.keySet().size(), is(4));
+            assertThat(map.values().size(), is(92));
+            assertThat(map.get("TIMESTAMP(0) NOT NULL").size(), is(1));
+            assertThat(map.get("DOUBLE").size(), is(2));
+            assertThat(map.get("BIGINT").size(), is(1));
+            assertThat(map.get(VARCHAR_TYPE).size(), is(88));
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        });
   }
 
   @Test public void testSelectDistinct() {
@@ -262,19 +254,16 @@ public class DruidAdapterIT2 {
   @Test public void testSelectCount() {
     final String sql = "select count(*) as c from \"foodmart\"";
     sql(sql)
-        .returns(new Function<ResultSet, Void>() {
-          public Void apply(ResultSet input) {
-            try {
-              assertThat(input.next(), is(true));
-              assertThat(input.getInt(1), is(86829));
-              assertThat(input.getLong(1), is(86829L));
-              assertThat(input.getString(1), is("86829"));
-              assertThat(input.wasNull(), is(false));
-              assertThat(input.next(), is(false));
-              return null;
-            } catch (SQLException e) {
-              throw new RuntimeException(e);
-            }
+        .returns(input -> {
+          try {
+            assertThat(input.next(), is(true));
+            assertThat(input.getInt(1), is(86829));
+            assertThat(input.getLong(1), is(86829L));
+            assertThat(input.getString(1), is("86829"));
+            assertThat(input.wasNull(), is(false));
+            assertThat(input.next(), is(false));
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
           }
         });
   }
@@ -555,22 +544,18 @@ public class DruidAdapterIT2 {
         + "'resultFormat':'compactedList'";
     sql(sql)
         .limit(4)
-        .returns(
-            new Function<ResultSet, Void>() {
-              public Void apply(ResultSet resultSet) {
-                try {
-                  for (int i = 0; i < 4; i++) {
-                    assertTrue(resultSet.next());
-                    assertThat(resultSet.getString("product_name"),
-                        is("Fort West Dried Apricots"));
-                  }
-                  assertFalse(resultSet.next());
-                  return null;
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            })
+        .returns(resultSet -> {
+          try {
+            for (int i = 0; i < 4; i++) {
+              assertTrue(resultSet.next());
+              assertThat(resultSet.getString("product_name"),
+                  is("Fort West Dried Apricots"));
+            }
+            assertFalse(resultSet.next());
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        })
         .queryContains(druidChecker(druidQuery));
   }
 
@@ -588,22 +573,18 @@ public class DruidAdapterIT2 {
         + "'resultFormat':'compactedList'";
     sql(sql)
         .limit(4)
-        .returns(
-            new Function<ResultSet, Void>() {
-              public Void apply(ResultSet resultSet) {
-                try {
-                  for (int i = 0; i < 4; i++) {
-                    assertTrue(resultSet.next());
-                    assertThat(resultSet.getString("product_name"),
-                        is("Fort West Dried Apricots"));
-                  }
-                  assertFalse(resultSet.next());
-                  return null;
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            })
+        .returns(resultSet -> {
+          try {
+            for (int i = 0; i < 4; i++) {
+              assertTrue(resultSet.next());
+              assertThat(resultSet.getString("product_name"),
+                  is("Fort West Dried Apricots"));
+            }
+            assertFalse(resultSet.next());
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        })
         .queryContains(druidChecker(druidQuery));
   }
 
@@ -638,22 +619,18 @@ public class DruidAdapterIT2 {
 
     sql(sql)
         .limit(4)
-        .returns(
-            new Function<ResultSet, Void>() {
-              public Void apply(ResultSet resultSet) {
-                try {
-                  for (int i = 0; i < 4; i++) {
-                    assertTrue(resultSet.next());
-                    assertThat(resultSet.getString("product_name"),
-                        is("Fort West Dried Apricots"));
-                  }
-                  assertFalse(resultSet.next());
-                  return null;
-                } catch (SQLException e) {
-                  throw new RuntimeException(e);
-                }
-              }
-            })
+        .returns(resultSet -> {
+          try {
+            for (int i = 0; i < 4; i++) {
+              assertTrue(resultSet.next());
+              assertThat(resultSet.getString("product_name"),
+                  is("Fort West Dried Apricots"));
+            }
+            assertFalse(resultSet.next());
+          } catch (SQLException e) {
+            throw new RuntimeException(e);
+          }
+        })
         .queryContains(druidChecker(druidQuery, druidFilter, druidQuery2));
   }
 
@@ -1739,43 +1716,39 @@ public class DruidAdapterIT2 {
     String druidQuery = "'filter':{'type':'bound','dimension':'product_id',"
         + "'upper':'10','upperStrict':true,'ordering':'numeric'}";
     sql("?")
-        .withRel(new Function<RelBuilder, RelNode>() {
-          public RelNode apply(RelBuilder b) {
-            // select product_id
-            // from foodmart.foodmart
-            // where product_id < cast(10 as varchar)
-            final RelDataType intType =
-                b.getTypeFactory().createSqlType(SqlTypeName.INTEGER);
-            return b.scan("foodmart", "foodmart")
-                .filter(
-                    b.call(SqlStdOperatorTable.LESS_THAN,
-                        b.getRexBuilder().makeCall(intType,
-                            SqlStdOperatorTable.CAST,
-                            ImmutableList.<RexNode>of(b.field("product_id"))),
-                        b.getRexBuilder().makeCall(intType,
-                            SqlStdOperatorTable.CAST,
-                            ImmutableList.of(b.literal("10")))))
-                .project(b.field("product_id"))
-                .build();
-          }
+        .withRel(b -> {
+          // select product_id
+          // from foodmart.foodmart
+          // where product_id < cast(10 as varchar)
+          final RelDataType intType =
+              b.getTypeFactory().createSqlType(SqlTypeName.INTEGER);
+          return b.scan("foodmart", "foodmart")
+              .filter(
+                  b.call(SqlStdOperatorTable.LESS_THAN,
+                      b.getRexBuilder().makeCall(intType,
+                          SqlStdOperatorTable.CAST,
+                          ImmutableList.of(b.field("product_id"))),
+                      b.getRexBuilder().makeCall(intType,
+                          SqlStdOperatorTable.CAST,
+                          ImmutableList.of(b.literal("10")))))
+              .project(b.field("product_id"))
+              .build();
         })
         .queryContains(druidChecker(druidQuery));
   }
 
   @Test public void testPushFieldEqualsLiteral() {
     sql("?")
-        .withRel(new Function<RelBuilder, RelNode>() {
-          public RelNode apply(RelBuilder b) {
-            // select count(*) as c
-            // from foodmart.foodmart
-            // where product_id = 'id'
-            return b.scan("foodmart", "foodmart")
-                .filter(
-                    b.call(SqlStdOperatorTable.EQUALS, b.field("product_id"),
-                        b.literal("id")))
-                .aggregate(b.groupKey(), b.countStar("c"))
-                .build();
-          }
+        .withRel(b -> {
+          // select count(*) as c
+          // from foodmart.foodmart
+          // where product_id = 'id'
+          return b.scan("foodmart", "foodmart")
+              .filter(
+                  b.call(SqlStdOperatorTable.EQUALS, b.field("product_id"),
+                      b.literal("id")))
+              .aggregate(b.groupKey(), b.countStar("c"))
+              .build();
         })
         // Should return one row, "c=0"; logged
         // [CALCITE-1775] "GROUP BY ()" on empty relation should return 1 row

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/pom.xml
----------------------------------------------------------------------
diff --git a/elasticsearch2/pom.xml b/elasticsearch2/pom.xml
index 6fbee03..a017f7a 100644
--- a/elasticsearch2/pom.xml
+++ b/elasticsearch2/pom.xml
@@ -84,10 +84,6 @@ limitations under the License.
       <version>${hppc.version}</version>
     </dependency>
     <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Enumerator.java
----------------------------------------------------------------------
diff --git a/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Enumerator.java b/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Enumerator.java
index 62aa197..54e4357 100644
--- a/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Enumerator.java
+++ b/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Enumerator.java
@@ -73,22 +73,16 @@ public class Elasticsearch2Enumerator implements Enumerator<Object> {
   }
 
   private static Function1<SearchHit, Map> mapGetter() {
-    return new Function1<SearchHit, Map>() {
-      public Map apply(SearchHit searchHitFields) {
-        return (Map) searchHitFields.fields();
-      }
-    };
+    return searchHitFields -> (Map) searchHitFields.fields();
   }
 
   private static Function1<SearchHit, Object> singletonGetter(final String fieldName,
       final Class fieldClass) {
-    return new Function1<SearchHit, Object>() {
-      public Object apply(SearchHit searchHitFields) {
-        if (searchHitFields.fields().isEmpty()) {
-          return convert(searchHitFields.getSource(), fieldClass);
-        } else {
-          return convert(searchHitFields.getFields(), fieldClass);
-        }
+    return searchHitFields -> {
+      if (searchHitFields.fields().isEmpty()) {
+        return convert(searchHitFields.getSource(), fieldClass);
+      } else {
+        return convert(searchHitFields.getFields(), fieldClass);
       }
     };
   }
@@ -103,23 +97,21 @@ public class Elasticsearch2Enumerator implements Enumerator<Object> {
    */
   private static Function1<SearchHit, Object[]> listGetter(
       final List<Map.Entry<String, Class>> fields) {
-    return new Function1<SearchHit, Object[]>() {
-      public Object[] apply(SearchHit hit) {
-        Object[] objects = new Object[fields.size()];
-        for (int i = 0; i < fields.size(); i++) {
-          final Map.Entry<String, Class> field = fields.get(i);
-          final String name = field.getKey();
-          if (hit.fields().isEmpty()) {
-            objects[i] = convert(hit.getSource().get(name), field.getValue());
-          } else if (hit.fields().containsKey(name)) {
-            objects[i] = convert(hit.field(name).getValue(), field.getValue());
-          } else {
-            throw new IllegalStateException(
-                String.format(Locale.ROOT, "No result for %s", field));
-          }
+    return hit -> {
+      Object[] objects = new Object[fields.size()];
+      for (int i = 0; i < fields.size(); i++) {
+        final Map.Entry<String, Class> field = fields.get(i);
+        final String name = field.getKey();
+        if (hit.fields().isEmpty()) {
+          objects[i] = convert(hit.getSource().get(name), field.getValue());
+        } else if (hit.fields().containsKey(name)) {
+          objects[i] = convert(hit.field(name).getValue(), field.getValue());
+        } else {
+          throw new IllegalStateException(
+              String.format(Locale.ROOT, "No result for %s", field));
         }
-        return objects;
       }
+      return objects;
     };
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Schema.java
----------------------------------------------------------------------
diff --git a/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Schema.java b/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Schema.java
index f02a668..6d464c8 100644
--- a/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Schema.java
+++ b/elasticsearch2/src/main/java/org/apache/calcite/adapter/elasticsearch2/Elasticsearch2Schema.java
@@ -21,10 +21,7 @@ import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.AbstractSchema;
 
 import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
-
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
@@ -44,6 +41,7 @@ import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * Schema mapped onto an index of ELASTICSEARCH types.
@@ -98,8 +96,8 @@ public class Elasticsearch2Schema extends AbstractSchema
    */
   @VisibleForTesting
   Elasticsearch2Schema(Client client, String index) {
-    this.client = Preconditions.checkNotNull(client, "client");
-    this.index = Preconditions.checkNotNull(index, "index");
+    this.client = Objects.requireNonNull(client, "client");
+    this.index = Objects.requireNonNull(index, "index");
   }
 
   @Override protected Map<String, Table> getTableMap() {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchNode.java
----------------------------------------------------------------------
diff --git a/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchNode.java b/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchNode.java
index d7e3464..de150be 100644
--- a/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchNode.java
+++ b/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchNode.java
@@ -34,6 +34,7 @@ import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Objects;
 
 /**
  * Represents a single Elasticsearch node that can run embedded in a java application.
@@ -45,7 +46,7 @@ class EmbeddedElasticsearchNode implements AutoCloseable {
   private volatile boolean  isStarted;
 
   private EmbeddedElasticsearchNode(LocalNode node) {
-    this.node = Preconditions.checkNotNull(node, "node");
+    this.node = Objects.requireNonNull(node, "node");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchPolicy.java
----------------------------------------------------------------------
diff --git a/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchPolicy.java b/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchPolicy.java
index 6b25ecf..654d693 100644
--- a/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchPolicy.java
+++ b/elasticsearch2/src/test/java/org/apache/calcite/adapter/elasticsearch2/EmbeddedElasticsearchPolicy.java
@@ -16,12 +16,12 @@
  */
 package org.apache.calcite.adapter.elasticsearch2;
 
-import com.google.common.base.Preconditions;
-
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.transport.TransportAddress;
 import org.junit.rules.ExternalResource;
 
+import java.util.Objects;
+
 /**
  * Junit rule that is used to initialize a single Elasticsearch node for tests.
  *
@@ -56,7 +56,7 @@ class EmbeddedElasticsearchPolicy extends ExternalResource {
   private final EmbeddedElasticsearchNode node;
 
   private EmbeddedElasticsearchPolicy(EmbeddedElasticsearchNode resource) {
-    this.node = Preconditions.checkNotNull(resource, "resource");
+    this.node = Objects.requireNonNull(resource, "resource");
   }
 
   @Override protected void before() throws Throwable {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/src/test/java/org/apache/calcite/test/Elasticsearch2AdapterIT.java
----------------------------------------------------------------------
diff --git a/elasticsearch2/src/test/java/org/apache/calcite/test/Elasticsearch2AdapterIT.java b/elasticsearch2/src/test/java/org/apache/calcite/test/Elasticsearch2AdapterIT.java
new file mode 100644
index 0000000..f385d1d
--- /dev/null
+++ b/elasticsearch2/src/test/java/org/apache/calcite/test/Elasticsearch2AdapterIT.java
@@ -0,0 +1,265 @@
+/*
+ * 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.test;
+
+import org.apache.calcite.util.Util;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * Tests for the {@code org.apache.calcite.adapter.elasticsearch2} package.
+ *
+ * <p>Before calling this test, you need to populate Elasticsearch, as follows:
+ *
+ * <blockquote><code>
+ * git clone https://github.com/vlsi/calcite-test-dataset<br>
+ * cd calcite-test-dataset<br>
+ * mvn install
+ * </code></blockquote>
+ *
+ * <p>This will create a virtual machine with Elasticsearch and the "zips" test
+ * dataset.
+ */
+public class Elasticsearch2AdapterIT {
+  /**
+   * Whether to run Elasticsearch tests. Enabled by default, however test is only
+   * included if "it" profile is activated ({@code -Pit}). To disable,
+   * specify {@code -Dcalcite.test.elasticsearch=false} on the Java command line.
+   */
+  private static final boolean ENABLED = Util.getBooleanProperty("calcite.test.elasticsearch",
+      true);
+
+  /** Connection factory based on the "zips-es" model. */
+  private static final ImmutableMap<String, String> ZIPS = ImmutableMap.of("model",
+      Elasticsearch2AdapterIT.class.getResource("/elasticsearch-zips-model.json").getPath());
+
+  /** Whether to run this test. */
+  private boolean enabled() {
+    return ENABLED;
+  }
+
+  /** Returns a function that checks that a particular Elasticsearch pipeline is
+   * generated to implement a query. */
+  private static Consumer<List> elasticsearchChecker(final String... strings) {
+    return actual -> {
+      Object[] actualArray = actual == null || actual.isEmpty() ? null
+          : ((List) actual.get(0)).toArray();
+      CalciteAssert.assertArrayEqual("expected Elasticsearch query not found", strings,
+          actualArray);
+    };
+  }
+
+  @Test public void testSort() {
+    final String explain = "PLAN=ElasticsearchToEnumerableConverter\n"
+        + "  ElasticsearchSort(sort0=[$4], dir0=[ASC])\n"
+        + "    ElasticsearchProject(city=[CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"], longitude=[CAST(ITEM(ITEM($0, 'loc'), 0)):FLOAT], latitude=[CAST(ITEM(ITEM($0, 'loc'), 1)):FLOAT], pop=[CAST(ITEM($0, 'pop')):INTEGER], state=[CAST(ITEM($0, 'state')):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"], id=[CAST(ITEM($0, 'id')):VARCHAR(5) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"])\n"
+        + "      ElasticsearchTableScan(table=[[elasticsearch_raw, zips]])";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select * from zips order by \"state\"")
+        .returnsCount(10)
+        .explainContains(explain);
+  }
+
+  @Test public void testSortLimit() {
+    final String sql = "select \"state\", \"id\" from zips\n"
+        + "order by \"state\", \"id\" offset 2 rows fetch next 3 rows only";
+    CalciteAssert.that()
+        .with(ZIPS)
+        .query(sql)
+        .returnsUnordered("state=AK; id=99503",
+            "state=AK; id=99504",
+            "state=AK; id=99505")
+        .queryContains(
+            elasticsearchChecker(
+                "\"fields\" : [\"state\", \"id\"], \"script_fields\": {}",
+                "\"sort\": [ {\"state\": \"asc\"}, {\"id\": \"asc\"}]",
+                "\"from\": 2",
+                "\"size\": 3"));
+  }
+
+  @Test public void testOffsetLimit() {
+    final String sql = "select \"state\", \"id\" from zips\n"
+        + "offset 2 fetch next 3 rows only";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query(sql)
+        .runs()
+        .queryContains(
+            elasticsearchChecker(
+                "\"from\": 2",
+                "\"size\": 3",
+                "\"fields\" : [\"state\", \"id\"], \"script_fields\": {}"));
+  }
+
+  @Test public void testLimit() {
+    final String sql = "select \"state\", \"id\" from zips\n"
+        + "fetch next 3 rows only";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query(sql)
+        .runs()
+        .queryContains(
+            elasticsearchChecker(
+                "\"size\": 3",
+                "\"fields\" : [\"state\", \"id\"], \"script_fields\": {}"));
+  }
+
+  @Test public void testFilterSort() {
+    final String sql = "select * from zips\n"
+        + "where \"city\" = 'SPRINGFIELD' and \"id\" >= '70000'\n"
+        + "order by \"state\", \"id\"";
+    final String explain = "PLAN=ElasticsearchToEnumerableConverter\n"
+        + "  ElasticsearchSort(sort0=[$4], sort1=[$5], dir0=[ASC], dir1=[ASC])\n"
+        + "    ElasticsearchProject(city=[CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"], longitude=[CAST(ITEM(ITEM($0, 'loc'), 0)):FLOAT], latitude=[CAST(ITEM(ITEM($0, 'loc'), 1)):FLOAT], pop=[CAST(ITEM($0, 'pop')):INTEGER], state=[CAST(ITEM($0, 'state')):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"], id=[CAST(ITEM($0, 'id')):VARCHAR(5) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"])\n"
+        + "      ElasticsearchFilter(condition=[AND(=(CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", 'SPRINGFIELD'), >=(CAST(ITEM($0, 'id')):VARCHAR(5) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", '70000'))])\n"
+        + "        ElasticsearchTableScan(table=[[elasticsearch_raw, zips]])";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query(sql)
+        .returnsOrdered(
+            "city=SPRINGFIELD; longitude=-92.54567; latitude=35.274879; pop=752; state=AR; id=72157",
+            "city=SPRINGFIELD; longitude=-102.617322; latitude=37.406727; pop=1992; state=CO; id=81073",
+            "city=SPRINGFIELD; longitude=-90.577479; latitude=30.415738; pop=5597; state=LA; id=70462",
+            "city=SPRINGFIELD; longitude=-123.015259; latitude=44.06106; pop=32384; state=OR; id=97477",
+            "city=SPRINGFIELD; longitude=-122.917108; latitude=44.056056; pop=27521; state=OR; id=97478")
+        .queryContains(
+            elasticsearchChecker("\"query\" : {\"constant_score\":{\"filter\":{\"bool\":"
+                    + "{\"must\":[{\"term\":{\"city\":\"springfield\"}},{\"range\":{\"id\":{\"gte\":\"70000\"}}}]}}}}",
+                "\"fields\" : [\"city\", \"pop\", \"state\", \"id\"], \"script_fields\": {\"longitude\":{\"script\":\"_source.loc[0]\"}, \"latitude\":{\"script\":\"_source.loc[1]\"}}",
+                "\"sort\": [ {\"state\": \"asc\"}, {\"id\": \"asc\"}]"))
+        .explainContains(explain);
+  }
+
+  @Test public void testFilterSortDesc() {
+    final String sql = "select * from zips\n"
+        + "where \"pop\" BETWEEN 20000 AND 20100\n"
+        + "order by \"state\" desc, \"pop\"";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query(sql)
+        .limit(4)
+        .returnsOrdered(
+            "city=SHERIDAN; longitude=-106.964795; latitude=44.78486; pop=20025; state=WY; id=82801",
+            "city=MOUNTLAKE TERRAC; longitude=-122.304036; latitude=47.793061; pop=20059; state=WA; id=98043",
+            "city=FALMOUTH; longitude=-77.404537; latitude=38.314557; pop=20039; state=VA; id=22405",
+            "city=FORT WORTH; longitude=-97.318409; latitude=32.725551; pop=20012; state=TX; id=76104");
+  }
+
+  @Test public void testFilterRedundant() {
+    final String sql = "select * from zips\n"
+        + "where \"state\" > 'CA' and \"state\" < 'AZ' and \"state\" = 'OK'";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query(sql)
+        .runs()
+        .queryContains(
+            elasticsearchChecker(""
+                + "\"query\" : {\"constant_score\":{\"filter\":{\"bool\":"
+                + "{\"must\":[{\"term\":{\"state\":\"ok\"}}]}}}}",
+                "\"fields\" : [\"city\", \"pop\", \"state\", \"id\"], \"script_fields\": {\"longitude\":{\"script\":\"_source.loc[0]\"}, \"latitude\":{\"script\":\"_source.loc[1]\"}}"));
+  }
+
+  @Test public void testInPlan() {
+    final String[] searches = {
+        "\"query\" : {\"constant_score\":{\"filter\":{\"bool\":{\"should\":"
+          + "[{\"bool\":{\"must\":[{\"term\":{\"pop\":20012}}]}},{\"bool\":{\"must\":[{\"term\":"
+          + "{\"pop\":15590}}]}}]}}}}",
+        "\"fields\" : [\"city\", \"pop\", \"state\", \"id\"], \"script_fields\": {\"longitude\":{\"script\":\"_source.loc[0]\"}, \"latitude\":{\"script\":\"_source.loc[1]\"}}"
+    };
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select * from zips where \"pop\" in (20012, 15590)")
+        .returnsUnordered(
+            "city=COVINA; longitude=-117.884285; latitude=34.08596; pop=15590; state=CA; id=91723",
+            "city=ARLINGTON; longitude=-97.091987; latitude=32.654752; pop=15590; state=TX; id=76018",
+            "city=CROFTON; longitude=-76.680166; latitude=39.011163; pop=15590; state=MD; id=21114",
+            "city=FORT WORTH; longitude=-97.318409; latitude=32.725551; pop=20012; state=TX; id=76104",
+            "city=DINUBA; longitude=-119.39087; latitude=36.534931; pop=20012; state=CA; id=93618")
+        .queryContains(elasticsearchChecker(searches));
+  }
+
+  @Test public void testZips() {
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select \"state\", \"city\" from zips")
+        .returnsCount(10);
+  }
+
+  @Test public void testProject() {
+    final String sql = "select \"state\", \"city\", 0 as \"zero\"\n"
+        + "from zips\n"
+        + "order by \"state\", \"city\"";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query(sql)
+        .limit(2)
+        .returnsUnordered("state=AK; city=ELMENDORF AFB; zero=0",
+            "state=AK; city=EIELSON AFB; zero=0")
+        .queryContains(
+            elasticsearchChecker("\"sort\": [ {\"state\": \"asc\"}, {\"city\": \"asc\"}]",
+                "\"fields\" : [\"state\", \"city\"], \"script_fields\": {\"zero\":{\"script\": \"0\"}}"));
+  }
+
+  @Test public void testFilter() {
+    final String explain = "PLAN=ElasticsearchToEnumerableConverter\n"
+        + "  ElasticsearchProject(state=[CAST(ITEM($0, 'state')):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"], city=[CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"])\n"
+        + "    ElasticsearchFilter(condition=[=(CAST(ITEM($0, 'state')):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", 'CA')])\n"
+        + "      ElasticsearchTableScan(table=[[elasticsearch_raw, zips]])";
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select \"state\", \"city\" from zips where \"state\" = 'CA'")
+        .limit(2)
+        .returnsUnordered("state=CA; city=LOS ANGELES",
+            "state=CA; city=LOS ANGELES")
+        .explainContains(explain);
+  }
+
+  @Test public void testFilterReversed() {
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select \"state\", \"city\" from zips where 'WI' < \"state\"")
+        .limit(2)
+        .returnsUnordered("state=WV; city=WELCH",
+            "state=WV; city=HANOVER");
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(ZIPS)
+        .query("select \"state\", \"city\" from zips where \"state\" > 'WI'")
+        .limit(2)
+        .returnsUnordered("state=WV; city=WELCH",
+            "state=WV; city=HANOVER");
+  }
+}
+
+// End Elasticsearch2AdapterIT.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch2/src/test/java/org/apache/calcite/test/ElasticsearchChecker.java
----------------------------------------------------------------------
diff --git a/elasticsearch2/src/test/java/org/apache/calcite/test/ElasticsearchChecker.java b/elasticsearch2/src/test/java/org/apache/calcite/test/ElasticsearchChecker.java
index d897dfb..be236ed 100644
--- a/elasticsearch2/src/test/java/org/apache/calcite/test/ElasticsearchChecker.java
+++ b/elasticsearch2/src/test/java/org/apache/calcite/test/ElasticsearchChecker.java
@@ -16,11 +16,8 @@
  */
 package org.apache.calcite.test;
 
-import com.google.common.base.Function;
-
 import java.util.List;
-
-import javax.annotation.Nullable;
+import java.util.function.Consumer;
 
 /**
  * Utility methods for Elasticsearch tests.
@@ -29,23 +26,18 @@ public class ElasticsearchChecker {
 
   private ElasticsearchChecker() {}
 
-
   /** Returns a function that checks that a particular Elasticsearch pipeline is
    * generated to implement a query.
    *
    * @param strings list of expected queries
    * @return function to perform the check
    */
-  public static Function<List, Void> elasticsearchChecker(final String... strings) {
-    return new Function<List, Void>() {
-      @Nullable
-      @Override public Void apply(@Nullable List actual) {
-        Object[] actualArray = actual == null || actual.isEmpty() ? null
-            : ((List) actual.get(0)).toArray();
-        CalciteAssert.assertArrayEqual("expected Elasticsearch query not found", strings,
-            actualArray);
-        return null;
-      }
+  public static Consumer<List> elasticsearchChecker(final String... strings) {
+    return actual -> {
+      Object[] actualArray = actual == null || actual.isEmpty() ? null
+          : ((List) actual.get(0)).toArray();
+      CalciteAssert.assertArrayEqual("expected Elasticsearch query not found", strings,
+          actualArray);
     };
   }
 }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch5/pom.xml
----------------------------------------------------------------------
diff --git a/elasticsearch5/pom.xml b/elasticsearch5/pom.xml
index 0fe9df9..9525cd5 100644
--- a/elasticsearch5/pom.xml
+++ b/elasticsearch5/pom.xml
@@ -112,10 +112,6 @@ limitations under the License.
       <version>${hppc.version}</version>
     </dependency>
     <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Enumerator.java
----------------------------------------------------------------------
diff --git a/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Enumerator.java b/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Enumerator.java
index 4ebb626..104840a 100644
--- a/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Enumerator.java
+++ b/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Enumerator.java
@@ -72,22 +72,16 @@ public class Elasticsearch5Enumerator implements Enumerator<Object> {
   }
 
   private static Function1<SearchHit, Map> mapGetter() {
-    return new Function1<SearchHit, Map>() {
-      public Map apply(SearchHit searchHitFields) {
-        return (Map) searchHitFields.getFields();
-      }
-    };
+    return searchHitFields -> (Map) searchHitFields.getFields();
   }
 
   private static Function1<SearchHit, Object> singletonGetter(final String fieldName,
       final Class fieldClass) {
-    return new Function1<SearchHit, Object>() {
-      public Object apply(SearchHit searchHitFields) {
-        if (searchHitFields.getFields().isEmpty()) {
-          return convert(searchHitFields.getSource(), fieldClass);
-        } else {
-          return convert(searchHitFields.getFields(), fieldClass);
-        }
+    return searchHitFields -> {
+      if (searchHitFields.getFields().isEmpty()) {
+        return convert(searchHitFields.getSource(), fieldClass);
+      } else {
+        return convert(searchHitFields.getFields(), fieldClass);
       }
     };
   }
@@ -101,22 +95,20 @@ public class Elasticsearch5Enumerator implements Enumerator<Object> {
    */
   private static Function1<SearchHit, Object[]> listGetter(
       final List<Map.Entry<String, Class>> fields) {
-    return new Function1<SearchHit, Object[]>() {
-      public Object[] apply(SearchHit searchHitFields) {
-        Object[] objects = new Object[fields.size()];
-        for (int i = 0; i < fields.size(); i++) {
-          final Map.Entry<String, Class> field = fields.get(i);
-          final String name = field.getKey();
-          if (searchHitFields.getFields().isEmpty()) {
-            objects[i] = convert(searchHitFields.getSource().get(name),
-                field.getValue());
-          } else {
-            objects[i] = convert(searchHitFields.getField(name).getValue(),
-                field.getValue());
-          }
+    return searchHitFields -> {
+      Object[] objects = new Object[fields.size()];
+      for (int i = 0; i < fields.size(); i++) {
+        final Map.Entry<String, Class> field = fields.get(i);
+        final String name = field.getKey();
+        if (searchHitFields.getFields().isEmpty()) {
+          objects[i] = convert(searchHitFields.getSource().get(name),
+              field.getValue());
+        } else {
+          objects[i] = convert(searchHitFields.getField(name).getValue(),
+              field.getValue());
         }
-        return objects;
       }
+      return objects;
     };
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Schema.java
----------------------------------------------------------------------
diff --git a/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Schema.java b/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Schema.java
index b5e0f34..adf0fa2 100644
--- a/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Schema.java
+++ b/elasticsearch5/src/main/java/org/apache/calcite/adapter/elasticsearch5/Elasticsearch5Schema.java
@@ -21,9 +21,7 @@ import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.AbstractSchema;
 
 import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
-
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
@@ -44,6 +42,7 @@ import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * Schema mapped onto an index of ELASTICSEARCH types.
@@ -97,8 +96,8 @@ public class Elasticsearch5Schema extends AbstractSchema
    */
   @VisibleForTesting
   Elasticsearch5Schema(Client client, String index) {
-    this.client = Preconditions.checkNotNull(client, "client");
-    this.index = Preconditions.checkNotNull(index, "index");
+    this.client = Objects.requireNonNull(client, "client");
+    this.index = Objects.requireNonNull(index, "index");
   }
 
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchNode.java
----------------------------------------------------------------------
diff --git a/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchNode.java b/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchNode.java
index cd8af9a..a28b6e0 100644
--- a/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchNode.java
+++ b/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchNode.java
@@ -34,6 +34,7 @@ import org.elasticsearch.transport.Netty3Plugin;
 import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Objects;
 
 /**
  * Represents a single elastic search node which can run embedded in a java application.
@@ -45,7 +46,7 @@ class EmbeddedElasticsearchNode implements AutoCloseable {
   private volatile boolean  isStarted;
 
   private EmbeddedElasticsearchNode(Node node) {
-    this.node = Preconditions.checkNotNull(node, "node");
+    this.node = Objects.requireNonNull(node, "node");
   }
 
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d59b639d/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchPolicy.java
----------------------------------------------------------------------
diff --git a/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchPolicy.java b/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchPolicy.java
index 6db2ddb..8cd2425 100644
--- a/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchPolicy.java
+++ b/elasticsearch5/src/test/java/org/apache/calcite/adapter/elasticsearch5/EmbeddedElasticsearchPolicy.java
@@ -16,13 +16,12 @@
  */
 package org.apache.calcite.adapter.elasticsearch5;
 
-import com.google.common.base.Preconditions;
-
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.transport.TransportAddress;
-
 import org.junit.rules.ExternalResource;
 
+import java.util.Objects;
+
 /**
  * Junit rule that is used to initialize a single Elasticsearch node for tests.
  *
@@ -56,7 +55,7 @@ class EmbeddedElasticsearchPolicy extends ExternalResource {
   private final EmbeddedElasticsearchNode node;
 
   private EmbeddedElasticsearchPolicy(EmbeddedElasticsearchNode resource) {
-    this.node = Preconditions.checkNotNull(resource, "resource");
+    this.node = Objects.requireNonNull(resource, "resource");
   }
 
   @Override protected void before() throws Throwable {