You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by mm...@apache.org on 2018/07/20 17:41:18 UTC
[05/53] [abbrv] 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 {