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 {
