You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by kr...@apache.org on 2022/02/22 14:04:48 UTC
[solr] 08/10: SOLR-16031: Enable spotless on sql module
This is an automated email from the ASF dual-hosted git repository.
krisden pushed a commit to branch branch_9_0
in repository https://gitbox.apache.org/repos/asf/solr.git
commit 4ac3c6c4b3eae82e9c35cae4afdd73a5b64d72f3
Author: Kevin Risden <kr...@apache.org>
AuthorDate: Sat Feb 19 15:02:08 2022 -0500
SOLR-16031: Enable spotless on sql module
---
gradle/validation/spotless.gradle | 4 -
.../apache/solr/handler/sql/CalciteJDBCStream.java | 51 +-
.../apache/solr/handler/sql/CalciteSolrDriver.java | 16 +-
.../org/apache/solr/handler/sql/LimitStream.java | 15 +-
.../org/apache/solr/handler/sql/SQLHandler.java | 38 +-
.../org/apache/solr/handler/sql/SolrAggregate.java | 67 +-
.../apache/solr/handler/sql/SolrEnumerator.java | 36 +-
.../org/apache/solr/handler/sql/SolrFilter.java | 124 +-
.../org/apache/solr/handler/sql/SolrMethod.java | 30 +-
.../org/apache/solr/handler/sql/SolrProject.java | 24 +-
.../java/org/apache/solr/handler/sql/SolrRel.java | 25 +-
.../org/apache/solr/handler/sql/SolrRules.java | 72 +-
.../org/apache/solr/handler/sql/SolrSchema.java | 51 +-
.../java/org/apache/solr/handler/sql/SolrSort.java | 24 +-
.../org/apache/solr/handler/sql/SolrTable.java | 576 +++++----
.../org/apache/solr/handler/sql/SolrTableScan.java | 33 +-
.../handler/sql/SolrToEnumerableConverter.java | 87 +-
.../handler/sql/SolrToEnumerableConverterRule.java | 9 +-
.../org/apache/solr/handler/sql/package-info.java | 3 +-
.../solr/handler/sql/SQLWithAuthzEnabledTest.java | 81 +-
.../apache/solr/handler/sql/TestSQLHandler.java | 1276 +++++++++++++++-----
.../solr/handler/sql/TestSQLHandlerNonCloud.java | 3 +-
22 files changed, 1738 insertions(+), 907 deletions(-)
diff --git a/gradle/validation/spotless.gradle b/gradle/validation/spotless.gradle
index 2793743..1fd073b 100644
--- a/gradle/validation/spotless.gradle
+++ b/gradle/validation/spotless.gradle
@@ -44,20 +44,16 @@ configure(project(":solr").subprojects) { prj ->
// Exclude certain files (generated ones, mostly).
switch (project.path) {
- case ":solr:modules:sql":
case ":solr:core":
case ":solr:solrj":
case ":solr:test-framework":
targetExclude "src/**/*.java"
break
-<<<<<<< HEAD
case ":solr:modules:ltr":
targetExclude "src/test/**/*.java"
-=======
case ":solr:modules:hdfs":
// Exclude Hadoop copied files to make upgrades easier
targetExclude "src/**/org/apache/hadoop/**"
->>>>>>> 2b6e490cafa (SOLR-16025: Enable spotless on hdfs module)
break
}
}
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteJDBCStream.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteJDBCStream.java
index 4fa6db8..b88ce58 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteJDBCStream.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteJDBCStream.java
@@ -22,21 +22,25 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Properties;
-
import org.apache.solr.client.solrj.io.comp.StreamComparator;
import org.apache.solr.client.solrj.io.stream.JDBCStream;
/**
* Used with o.a.s.Handler.SQLHandler.
- *
+ *
* @lucene.internal
* @since 7.0.0
*/
public class CalciteJDBCStream extends JDBCStream {
private static final long serialVersionUID = 1L;
- public CalciteJDBCStream(String connectionUrl, String sqlQuery, StreamComparator definedSort,
- Properties connectionProperties, String driverClassName) throws IOException {
+ public CalciteJDBCStream(
+ String connectionUrl,
+ String sqlQuery,
+ StreamComparator definedSort,
+ Properties connectionProperties,
+ String driverClassName)
+ throws IOException {
super(connectionUrl, sqlQuery, definedSort, connectionProperties, driverClassName);
}
@@ -49,26 +53,27 @@ public class CalciteJDBCStream extends JDBCStream {
final String columnName = metadata.getColumnLabel(columnNumber);
final String className = metadata.getColumnClassName(columnNumber);
if (Array.class.getName().equals(className)) {
- valueSelector = new ResultSetValueSelector() {
- @Override
- public Object selectValue(ResultSet resultSet) throws SQLException {
- Object o = resultSet.getObject(columnNumber);
- if (resultSet.wasNull()) {
- return null;
- }
- if (o instanceof Array) {
- Array array = (Array) o;
- return array.getArray();
- } else {
- return o;
- }
- }
+ valueSelector =
+ new ResultSetValueSelector() {
+ @Override
+ public Object selectValue(ResultSet resultSet) throws SQLException {
+ Object o = resultSet.getObject(columnNumber);
+ if (resultSet.wasNull()) {
+ return null;
+ }
+ if (o instanceof Array) {
+ Array array = (Array) o;
+ return array.getArray();
+ } else {
+ return o;
+ }
+ }
- @Override
- public String getColumnName() {
- return columnName;
- }
- };
+ @Override
+ public String getColumnName() {
+ return columnName;
+ }
+ };
}
}
return valueSelector;
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
index d734d51..a3e9462 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
@@ -16,6 +16,9 @@
*/
package org.apache.solr.handler.sql;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.jdbc.Driver;
import org.apache.calcite.runtime.Hook;
@@ -24,23 +27,18 @@ import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.calcite.util.Holder;
import org.apache.solr.client.solrj.io.SolrClientCache;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Properties;
-
/**
* JDBC driver for Calcite Solr.
*
- * <p>It accepts connect strings that start with "jdbc:calcitesolr:".</p>
+ * <p>It accepts connect strings that start with "jdbc:calcitesolr:".
*/
public class CalciteSolrDriver extends Driver {
- public final static String CONNECT_STRING_PREFIX = "jdbc:calcitesolr:";
+ public static final String CONNECT_STRING_PREFIX = "jdbc:calcitesolr:";
public static CalciteSolrDriver INSTANCE = new CalciteSolrDriver();
private SolrClientCache solrClientCache;
-
private CalciteSolrDriver() {
super();
}
@@ -60,7 +58,7 @@ public class CalciteSolrDriver extends Driver {
@Override
public Connection connect(String url, Properties info) throws SQLException {
- if(!this.acceptsURL(url)) {
+ if (!this.acceptsURL(url)) {
return null;
}
@@ -74,7 +72,7 @@ public class CalciteSolrDriver extends Driver {
final SchemaPlus rootSchema = calciteConnection.getRootSchema();
String schemaName = info.getProperty("zk");
- if(schemaName == null) {
+ if (schemaName == null) {
throw new SQLException("zk must be set");
}
final SolrSchema solrSchema = new SolrSchema(info, solrClientCache);
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/LimitStream.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/LimitStream.java
index 5bdf3e7..1ff4362 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/LimitStream.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/LimitStream.java
@@ -16,6 +16,9 @@
*/
package org.apache.solr.handler.sql;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.solr.client.solrj.io.Tuple;
import org.apache.solr.client.solrj.io.comp.StreamComparator;
import org.apache.solr.client.solrj.io.stream.StreamContext;
@@ -24,10 +27,6 @@ import org.apache.solr.client.solrj.io.stream.expr.Explanation;
import org.apache.solr.client.solrj.io.stream.expr.StreamExplanation;
import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
class LimitStream extends TupleStream {
private final TupleStream stream;
@@ -60,7 +59,7 @@ class LimitStream extends TupleStream {
return children;
}
- public StreamComparator getStreamSort(){
+ public StreamComparator getStreamSort() {
return stream.getStreamSort();
}
@@ -72,9 +71,7 @@ class LimitStream extends TupleStream {
public Explanation toExplanation(StreamFactory factory) throws IOException {
return new StreamExplanation(getStreamNodeId().toString())
- .withChildren(new Explanation[]{
- stream.toExplanation(factory)
- })
+ .withChildren(new Explanation[] {stream.toExplanation(factory)})
.withFunctionName("SQL LIMIT")
.withExpression("--non-expressible--")
.withImplementingClass(this.getClass().getName())
@@ -101,4 +98,4 @@ class LimitStream extends TupleStream {
return stream.read();
}
-}
\ No newline at end of file
+}
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SQLHandler.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SQLHandler.java
index 1cd785b..4f7533f 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SQLHandler.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SQLHandler.java
@@ -26,7 +26,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
-
import org.apache.calcite.config.Lex;
import org.apache.solr.client.solrj.io.Tuple;
import org.apache.solr.client.solrj.io.comp.StreamComparator;
@@ -48,7 +47,8 @@ import org.apache.solr.util.plugin.SolrCoreAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, PermissionNameProvider {
+public class SQLHandler extends RequestHandlerBase
+ implements SolrCoreAware, PermissionNameProvider {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -62,7 +62,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
public void inform(SolrCore core) {
CoreContainer coreContainer = core.getCoreContainer();
- if(coreContainer.isZooKeeperAware()) {
+ if (coreContainer.isZooKeeperAware()) {
defaultZkhost = coreContainer.getZkController().getZkServerAddress();
defaultWorkerCollection = core.getCoreDescriptor().getCollectionName();
isCloud = true;
@@ -91,11 +91,11 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
TupleStream tupleStream = null;
try {
- if(!isCloud) {
+ if (!isCloud) {
throw new IllegalStateException(sqlNonCloudErrorMsg);
}
- if(sql == null) {
+ if (sql == null) {
throw new Exception("stmt parameter cannot be null");
}
@@ -104,7 +104,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
Properties properties = new Properties();
// Add all query parameters
Iterator<String> parameterNamesIterator = params.getParameterNamesIterator();
- while(parameterNamesIterator.hasNext()) {
+ while (parameterNamesIterator.hasNext()) {
String param = parameterNamesIterator.next();
properties.setProperty(param, params.get(param));
}
@@ -115,16 +115,17 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
String driverClass = CalciteSolrDriver.class.getCanonicalName();
- // JDBC driver requires metadata from the SQLHandler. Default to false since this adds a new Metadata stream.
+ // JDBC driver requires metadata from the SQLHandler. Default to false since this adds a new
+ // Metadata stream.
boolean includeMetadata = params.getBool("includeMetadata", false);
tupleStream = new SqlHandlerStream(url, sql, null, properties, driverClass, includeMetadata);
tupleStream = new StreamHandler.TimerStream(new ExceptionStream(tupleStream));
rsp.add("result-set", tupleStream);
- } catch(Exception e) {
- //Catch the SQL parsing and query transformation exceptions.
- if(tupleStream != null) {
+ } catch (Exception e) {
+ // Catch the SQL parsing and query transformation exceptions.
+ if (tupleStream != null) {
tupleStream.close();
}
SolrException.log(log, e);
@@ -149,8 +150,13 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
List<String> metadataFields = new ArrayList<>();
Map<String, String> metadataAliases = new HashMap<>();
- SqlHandlerStream(String connectionUrl, String sqlQuery, StreamComparator definedSort,
- Properties connectionProperties, String driverClassName, boolean includeMetadata)
+ SqlHandlerStream(
+ String connectionUrl,
+ String sqlQuery,
+ StreamComparator definedSort,
+ Properties connectionProperties,
+ String driverClassName,
+ boolean includeMetadata)
throws IOException {
super(connectionUrl, sqlQuery, definedSort, connectionProperties, driverClassName);
@@ -160,7 +166,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
@Override
public Tuple read() throws IOException {
// Return a metadata tuple as the first tuple and then pass through to the JDBCStream.
- if(firstTuple) {
+ if (firstTuple) {
try {
Tuple tuple = new Tuple();
@@ -168,14 +174,14 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
- for(int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
String columnName = resultSetMetaData.getColumnName(i);
String columnLabel = resultSetMetaData.getColumnLabel(i);
metadataFields.add(columnName);
metadataAliases.put(columnName, columnLabel);
}
- if(includeMetadata) {
+ if (includeMetadata) {
tuple.put("isMetadata", true);
tuple.put("fields", metadataFields);
tuple.put("aliases", metadataAliases);
@@ -187,7 +193,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
}
Tuple tuple = super.read();
- if(!tuple.EOF) {
+ if (!tuple.EOF) {
tuple.setFieldNames(metadataFields);
tuple.setFieldLabels(metadataAliases);
}
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrAggregate.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrAggregate.java
index e1c6a6f..7c29ddc 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrAggregate.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrAggregate.java
@@ -16,10 +16,12 @@
*/
package org.apache.solr.handler.sql;
+import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.APPROX_COUNT_DISTINCT;
+import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.COUNT_DISTINCT;
+
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
-
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.RelNode;
@@ -31,26 +33,25 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.util.ImmutableBitSet;
import org.apache.calcite.util.Pair;
-import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.APPROX_COUNT_DISTINCT;
-import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.COUNT_DISTINCT;
-
/**
* Implementation of {@link org.apache.calcite.rel.core.Aggregate} relational expression in Solr.
*/
class SolrAggregate extends Aggregate implements SolrRel {
- private static final List<SqlAggFunction> SUPPORTED_AGGREGATIONS = Arrays.asList(
- SqlStdOperatorTable.COUNT,
- SqlStdOperatorTable.SUM,
- SqlStdOperatorTable.SUM0,
- SqlStdOperatorTable.MIN,
- SqlStdOperatorTable.MAX,
- SqlStdOperatorTable.AVG
- );
+ private static final List<SqlAggFunction> SUPPORTED_AGGREGATIONS =
+ Arrays.asList(
+ SqlStdOperatorTable.COUNT,
+ SqlStdOperatorTable.SUM,
+ SqlStdOperatorTable.SUM0,
+ SqlStdOperatorTable.MIN,
+ SqlStdOperatorTable.MAX,
+ SqlStdOperatorTable.AVG);
// Returns the Solr agg metric identifier (includes column) for the SQL metric
static String solrAggMetricId(String metric, String column) {
- // CountDistinctMetric's getIdentifer returns "countDist" but all others return a lowercased value
- String funcName = COUNT_DISTINCT.equals(metric) ? COUNT_DISTINCT : metric.toLowerCase(Locale.ROOT);
+ // CountDistinctMetric's getIdentifer returns "countDist" but all others return a lowercased
+ // value
+ String funcName =
+ COUNT_DISTINCT.equals(metric) ? COUNT_DISTINCT : metric.toLowerCase(Locale.ROOT);
return String.format(Locale.ROOT, "%s(%s)", funcName, column);
}
@@ -68,15 +69,23 @@ class SolrAggregate extends Aggregate implements SolrRel {
}
@Override
- public Aggregate copy(RelTraitSet traitSet, RelNode input, ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
+ public Aggregate copy(
+ RelTraitSet traitSet,
+ RelNode input,
+ ImmutableBitSet groupSet,
+ List<ImmutableBitSet> groupSets,
List<AggregateCall> aggCalls) {
- return new SolrAggregate(getCluster(), traitSet, hints,input, groupSet, groupSets, aggCalls);
+ return new SolrAggregate(getCluster(), traitSet, hints, input, groupSet, groupSets, aggCalls);
}
@Override
- public Aggregate copy(RelTraitSet traitSet, RelNode input,
- boolean indicator, ImmutableBitSet groupSet,
- List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+ public Aggregate copy(
+ RelTraitSet traitSet,
+ RelNode input,
+ boolean indicator,
+ ImmutableBitSet groupSet,
+ List<ImmutableBitSet> groupSets,
+ List<AggregateCall> aggCalls) {
return new SolrAggregate(getCluster(), traitSet, hints, input, groupSet, groupSets, aggCalls);
}
@@ -89,10 +98,16 @@ class SolrAggregate extends Aggregate implements SolrRel {
AggregateCall aggCall = namedAggCall.getKey();
Pair<String, String> metric = toSolrMetric(implementor, aggCall, inNames);
- boolean isDistinct = SqlStdOperatorTable.COUNT.equals(aggCall.getAggregation()) && aggCall.isDistinct();
- // map the SQL COUNT to either countDist or hll for distinct ops, otherwise, the metric names map over directly
- String metricKey = isDistinct ? (aggCall.isApproximate() ? APPROX_COUNT_DISTINCT : COUNT_DISTINCT) : metric.getKey();
- implementor.addReverseAggMapping(namedAggCall.getValue(), solrAggMetricId(metricKey, metric.getValue()));
+ boolean isDistinct =
+ SqlStdOperatorTable.COUNT.equals(aggCall.getAggregation()) && aggCall.isDistinct();
+ // map the SQL COUNT to either countDist or hll for distinct ops, otherwise, the metric names
+ // map over directly
+ String metricKey =
+ isDistinct
+ ? (aggCall.isApproximate() ? APPROX_COUNT_DISTINCT : COUNT_DISTINCT)
+ : metric.getKey();
+ implementor.addReverseAggMapping(
+ namedAggCall.getValue(), solrAggMetricId(metricKey, metric.getValue()));
implementor.addMetricPair(namedAggCall.getValue(), metricKey, metric.getValue());
}
@@ -103,7 +118,8 @@ class SolrAggregate extends Aggregate implements SolrRel {
}
@SuppressWarnings({"fallthrough"})
- private Pair<String, String> toSolrMetric(Implementor implementor, AggregateCall aggCall, List<String> inNames) {
+ private Pair<String, String> toSolrMetric(
+ Implementor implementor, AggregateCall aggCall, List<String> inNames) {
SqlAggFunction aggregation = aggCall.getAggregation();
List<Integer> args = aggCall.getArgList();
switch (args.size()) {
@@ -118,7 +134,8 @@ class SolrAggregate extends Aggregate implements SolrRel {
return new Pair<>(aggregation.getName(), name);
}
default:
- throw new AssertionError("Invalid aggregation " + aggregation + " with args " + args + " with names" + inNames);
+ throw new AssertionError(
+ "Invalid aggregation " + aggregation + " with args " + args + " with names" + inNames);
}
}
}
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrEnumerator.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
index e450755..8bf3f82 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
@@ -16,17 +16,16 @@
*/
package org.apache.solr.handler.sql;
-import org.apache.calcite.linq4j.Enumerator;
-import org.apache.solr.client.solrj.io.Tuple;
-import org.apache.solr.client.solrj.io.stream.TupleStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.Date;
import java.util.List;
import java.util.Map;
+import org.apache.calcite.linq4j.Enumerator;
+import org.apache.solr.client.solrj.io.Tuple;
+import org.apache.solr.client.solrj.io.stream.TupleStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/** Enumerator that reads from a Solr collection. */
class SolrEnumerator implements Enumerator<Object> {
@@ -36,7 +35,8 @@ class SolrEnumerator implements Enumerator<Object> {
private final List<Map.Entry<String, Class<?>>> fields;
private Tuple current;
- /** Creates a SolrEnumerator.
+ /**
+ * Creates a SolrEnumerator.
*
* @param tupleStream Solr TupleStream
* @param fields Fields to get from each Tuple
@@ -53,7 +53,8 @@ class SolrEnumerator implements Enumerator<Object> {
this.current = null;
}
- /** Produce the next row from the results
+ /**
+ * Produce the next row from the results
*
* @return A new row from the results
*/
@@ -74,20 +75,21 @@ class SolrEnumerator implements Enumerator<Object> {
private Object getter(Tuple tuple, Map.Entry<String, Class<?>> field) {
Object val = tuple.get(field.getKey());
- if(val == null) {
+ if (val == null) {
return null;
}
Class<?> clazz = field.getValue();
- if(clazz.equals(Long.class)) {
- if(val instanceof Double) {
+ if (clazz.equals(Long.class)) {
+ if (val instanceof Double) {
return this.getRealVal(val);
}
return val;
}
if (clazz.equals(Date.class)) {
- // make sure the val returned is a Date as Avatica cannot deal with string values for Timestamp fields
+ // make sure the val returned is a Date as Avatica cannot deal with string values for
+ // Timestamp fields
val = tuple.getDate(field.getKey());
}
@@ -96,11 +98,11 @@ class SolrEnumerator implements Enumerator<Object> {
private Object getRealVal(Object val) {
// Check if Double is really a Long
- if(val instanceof Double) {
+ if (val instanceof Double) {
double doubleVal = (double) val;
- //make sure that double has no decimals and fits within Long
- if(doubleVal % 1 == 0 && doubleVal >= Long.MIN_VALUE && doubleVal <= Long.MAX_VALUE) {
- return (long)doubleVal;
+ // make sure that double has no decimals and fits within Long
+ if (doubleVal % 1 == 0 && doubleVal >= Long.MIN_VALUE && doubleVal <= Long.MAX_VALUE) {
+ return (long) doubleVal;
}
return doubleVal;
}
@@ -129,7 +131,7 @@ class SolrEnumerator implements Enumerator<Object> {
}
public void close() {
- if(this.tupleStream != null) {
+ if (this.tupleStream != null) {
try {
this.tupleStream.close();
} catch (IOException e) {
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrFilter.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrFilter.java
index f33bdba..34454da 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrFilter.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrFilter.java
@@ -23,7 +23,6 @@ import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
import org.apache.calcite.plan.RelOptPlanner;
@@ -46,21 +45,16 @@ import org.apache.solr.common.SolrException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-/**
- * Implementation of a {@link org.apache.calcite.rel.core.Filter} relational expression in Solr.
- */
+/** Implementation of a {@link org.apache.calcite.rel.core.Filter} relational expression in Solr. */
class SolrFilter extends Filter implements SolrRel {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
- private static final Pattern CALCITE_TIMESTAMP_REGEX = Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$");
+ private static final Pattern CALCITE_TIMESTAMP_REGEX =
+ Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$");
private final RexBuilder builder;
- SolrFilter(
- RelOptCluster cluster,
- RelTraitSet traitSet,
- RelNode child,
- RexNode condition) {
+ SolrFilter(RelOptCluster cluster, RelTraitSet traitSet, RelNode child, RexNode condition) {
super(cluster, traitSet, child, condition);
assert getConvention() == SolrRel.CONVENTION;
assert getConvention() == child.getConvention();
@@ -79,7 +73,9 @@ class SolrFilter extends Filter implements SolrRel {
public void implement(Implementor implementor) {
implementor.visitChild(0, getInput());
if (getInput() instanceof SolrAggregate) {
- HavingTranslator translator = new HavingTranslator(SolrRules.solrFieldNames(getRowType()), implementor.reverseAggMappings, builder);
+ HavingTranslator translator =
+ new HavingTranslator(
+ SolrRules.solrFieldNames(getRowType()), implementor.reverseAggMappings, builder);
String havingPredicate = translator.translateMatch(condition);
implementor.setHavingPredicate(havingPredicate);
} else {
@@ -102,7 +98,8 @@ class SolrFilter extends Filter implements SolrRel {
protected String translateMatch(RexNode condition) {
if (log.isDebugEnabled()) {
- log.debug("translateMatch condition={} {}", condition.getKind(), condition.getClass().getName());
+ log.debug(
+ "translateMatch condition={} {}", condition.getKind(), condition.getClass().getName());
}
final SqlKind kind = condition.getKind();
@@ -125,17 +122,21 @@ class SolrFilter extends Filter implements SolrRel {
}
protected String translateAndOrBetween(RexNode condition) {
- // see if this is a translated range query of greater than or equals and less than or equal on same field
- // if so, then collapse into a single range criteria, e.g. field:[gte TO lte] instead of two ranges AND'd together
+ // see if this is a translated range query of greater than or equals and less than or equal on
+ // same field
+ // if so, then collapse into a single range criteria, e.g. field:[gte TO lte] instead of two
+ // ranges AND'd together
RexCall call = (RexCall) condition;
List<RexNode> operands = call.getOperands();
String query = null;
if (operands.size() == 2) {
RexNode lhs = operands.get(0);
RexNode rhs = operands.get(1);
- if (lhs.getKind() == SqlKind.GREATER_THAN_OR_EQUAL && rhs.getKind() == SqlKind.LESS_THAN_OR_EQUAL) {
+ if (lhs.getKind() == SqlKind.GREATER_THAN_OR_EQUAL
+ && rhs.getKind() == SqlKind.LESS_THAN_OR_EQUAL) {
query = translateBetween(lhs, rhs);
- } else if (lhs.getKind() == SqlKind.LESS_THAN_OR_EQUAL && rhs.getKind() == SqlKind.GREATER_THAN_OR_EQUAL) {
+ } else if (lhs.getKind() == SqlKind.LESS_THAN_OR_EQUAL
+ && rhs.getKind() == SqlKind.GREATER_THAN_OR_EQUAL) {
// just swap the nodes
query = translateBetween(rhs, lhs);
}
@@ -153,7 +154,13 @@ class SolrFilter extends Filter implements SolrRel {
String fieldName = gte.getKey();
String query = null;
if (fieldName.equals(lte.getKey()) && compareRexLiteral(gte.right, lte.right) < 0) {
- query = fieldName + ":[" + toSolrLiteral(gte.getValue()) + " TO " + toSolrLiteral(lte.getValue()) + "]";
+ query =
+ fieldName
+ + ":["
+ + toSolrLiteral(gte.getValue())
+ + " TO "
+ + toSolrLiteral(lte.getValue())
+ + "]";
}
return query;
@@ -189,7 +196,7 @@ class SolrFilter extends Filter implements SolrRel {
for (RexNode node : RelOptUtil.disjunctions(condition)) {
String orQuery = translateMatch(node);
if (orQuery.startsWith("-")) {
- orQuery = "(*:* "+orQuery+")";
+ orQuery = "(*:* " + orQuery + ")";
}
ors.add(orQuery);
}
@@ -204,11 +211,10 @@ class SolrFilter extends Filter implements SolrRel {
List<RexNode> nots = new ArrayList<>();
RelOptUtil.decomposeConjunction(node0, ands, nots);
-
for (RexNode node : ands) {
String andQuery = translateMatch(node);
if (andQuery.startsWith("-")) {
- andQuery = "(*:* "+andQuery+")";
+ andQuery = "(*:* " + andQuery + ")";
}
andStrings.add(andQuery);
}
@@ -233,7 +239,10 @@ class SolrFilter extends Filter implements SolrRel {
boolean wrappedQuotes = false;
if (!terms.startsWith("(") && !terms.startsWith("[") && !terms.startsWith("{")) {
// restore the * and ? after escaping
- terms = "\"" + ClientUtils.escapeQueryChars(terms).replace("\\*", "*").replace("\\?", "?") + "\"";
+ terms =
+ "\""
+ + ClientUtils.escapeQueryChars(terms).replace("\\*", "*").replace("\\?", "?")
+ + "\"";
wrappedQuotes = true;
}
@@ -245,7 +254,10 @@ class SolrFilter extends Filter implements SolrRel {
final SqlKind kind = node.getKind();
if (kind == SqlKind.NOT) {
RexNode negated = ((RexCall) node).getOperands().get(0);
- return "-" + (negated.getKind() == SqlKind.LIKE ? translateLike(negated) : translateMatch(negated));
+ return "-"
+ + (negated.getKind() == SqlKind.LIKE
+ ? translateLike(negated)
+ : translateMatch(negated));
}
Pair<String, RexLiteral> binaryTranslated = getFieldValuePair(node);
@@ -298,7 +310,9 @@ class SolrFilter extends Filter implements SolrRel {
Object value2 = literal.getValue2();
SqlTypeName typeName = literal.getTypeName();
final String solrLiteral;
- if (value2 instanceof Long && (typeName == SqlTypeName.TIMESTAMP || typeName == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE)) {
+ if (value2 instanceof Long
+ && (typeName == SqlTypeName.TIMESTAMP
+ || typeName == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE)) {
// return as an ISO-8601 timestamp
solrLiteral = Instant.ofEpochMilli((Long) value2).toString();
} else {
@@ -312,8 +326,11 @@ class SolrFilter extends Filter implements SolrRel {
private String toSolrLiteralForEquals(RexLiteral literal, SqlTypeName fieldTypeName) {
Object value2 = literal.getValue2();
final String solrLiteral;
- // oddly, for = criteria with a timestamp field, Calcite passes us a String instead of a Long as it does with other operators like >
- if (value2 instanceof String && fieldTypeName == SqlTypeName.TIMESTAMP && CALCITE_TIMESTAMP_REGEX.matcher((String) value2).matches()) {
+ // oddly, for = criteria with a timestamp field, Calcite passes us a String instead of a Long
+ // as it does with other operators like >
+ if (value2 instanceof String
+ && fieldTypeName == SqlTypeName.TIMESTAMP
+ && CALCITE_TIMESTAMP_REGEX.matcher((String) value2).matches()) {
String timestamp = ((String) value2).replace(' ', 'T').replace("'", "");
if (Character.isDigit(timestamp.charAt(timestamp.length() - 1))) {
timestamp += "Z";
@@ -331,7 +348,8 @@ class SolrFilter extends Filter implements SolrRel {
}
RexCall call = (RexCall) node;
- Pair<String, RexLiteral> binaryTranslated = call.getOperands().size() == 2 ? translateBinary(call) : null;
+ Pair<String, RexLiteral> binaryTranslated =
+ call.getOperands().size() == 2 ? translateBinary(call) : null;
if (binaryTranslated == null) {
throw new AssertionError("unsupported predicate expression: " + node);
}
@@ -339,9 +357,7 @@ class SolrFilter extends Filter implements SolrRel {
return binaryTranslated;
}
- /**
- * Translates a call to a binary operator, reversing arguments if necessary.
- */
+ /** Translates a call to a binary operator, reversing arguments if necessary. */
protected Pair<String, RexLiteral> translateBinary(RexCall call) {
List<RexNode> operands = call.getOperands();
if (operands.size() != 2) {
@@ -363,7 +379,8 @@ class SolrFilter extends Filter implements SolrRel {
}
if (left.getKind() == SqlKind.CAST && right.getKind() == SqlKind.CAST) {
- return translateBinary2(((RexCall) left).operands.get(0), ((RexCall) right).operands.get(0));
+ return translateBinary2(
+ ((RexCall) left).operands.get(0), ((RexCall) right).operands.get(0));
}
// for WHERE clause like: pdatex >= '2021-07-13T15:12:10.037Z'
@@ -377,9 +394,7 @@ class SolrFilter extends Filter implements SolrRel {
throw new AssertionError("cannot translate call " + call);
}
- /**
- * Translates a call to a binary operator. Returns whether successful.
- */
+ /** Translates a call to a binary operator. Returns whether successful. */
protected Pair<String, RexLiteral> translateBinary2(RexNode left, RexNode right) {
if (log.isDebugEnabled()) {
log.debug("translateBinary2 left={} right={}", left, right);
@@ -399,19 +414,17 @@ class SolrFilter extends Filter implements SolrRel {
return new Pair<>(name, rightLiteral);
case CAST:
return translateBinary2(((RexCall) left).operands.get(0), right);
-// case OTHER_FUNCTION:
-// String itemName = SolrRules.isItem((RexCall) left);
-// if (itemName != null) {
-// return translateOp2(op, itemName, rightLiteral);
-// }
+ // case OTHER_FUNCTION:
+ // String itemName = SolrRules.isItem((RexCall) left);
+ // if (itemName != null) {
+ // return translateOp2(op, itemName, rightLiteral);
+ // }
default:
return null;
}
}
- /**
- * A search node can be an IN or NOT IN clause or a BETWEEN
- */
+ /** A search node can be an IN or NOT IN clause or a BETWEEN */
protected String translateSearch(RexNode condition) {
final String fieldName = getSolrFieldName(condition);
@@ -440,15 +453,20 @@ class SolrFilter extends Filter implements SolrRel {
}
// don't know how to handle this search!
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unsupported search filter: " + condition);
+ throw new SolrException(
+ SolrException.ErrorCode.SERVER_ERROR, "Unsupported search filter: " + condition);
}
protected String toOrSetOnSameField(RexCall search) {
- String orClause = search.operands.stream().map(n -> {
- RexCall next = (RexCall) n;
- RexLiteral lit = (RexLiteral) next.getOperands().get(1);
- return "\"" + toSolrLiteral(lit) + "\"";
- }).collect(Collectors.joining(" OR "));
+ String orClause =
+ search.operands.stream()
+ .map(
+ n -> {
+ RexCall next = (RexCall) n;
+ RexLiteral lit = (RexLiteral) next.getOperands().get(1);
+ return "\"" + toSolrLiteral(lit) + "\"";
+ })
+ .collect(Collectors.joining(" OR "));
return "(" + orClause + ")";
}
@@ -458,7 +476,9 @@ class SolrFilter extends Filter implements SolrRel {
if (left instanceof RexInputRef) {
return fieldNames.get(((RexInputRef) left).getIndex());
}
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Expected Solr field name for " + call.getKind() + " but found " + left);
+ throw new SolrException(
+ SolrException.ErrorCode.SERVER_ERROR,
+ "Expected Solr field name for " + call.getKind() + " but found " + left);
}
}
@@ -466,7 +486,8 @@ class SolrFilter extends Filter implements SolrRel {
private final Map<String, String> reverseAggMappings;
- HavingTranslator(List<String> fieldNames, Map<String, String> reverseAggMappings, RexBuilder builder) {
+ HavingTranslator(
+ List<String> fieldNames, Map<String, String> reverseAggMappings, RexBuilder builder) {
super(fieldNames, builder);
this.reverseAggMappings = reverseAggMappings;
}
@@ -530,7 +551,6 @@ class SolrFilter extends Filter implements SolrRel {
}
builder.append(")");
-
if (!nots.isEmpty()) {
for (RexNode node : nots) {
notStrings.add(translateMatch(node));
@@ -552,9 +572,7 @@ class SolrFilter extends Filter implements SolrRel {
}
}
- /**
- * Translates a call to a binary operator, reversing arguments if necessary.
- */
+ /** Translates a call to a binary operator, reversing arguments if necessary. */
@Override
protected Pair<String, RexLiteral> translateBinary(RexCall call) {
List<RexNode> operands = call.getOperands();
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrMethod.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrMethod.java
index 6604822..0450ef9 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrMethod.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrMethod.java
@@ -16,26 +16,24 @@
*/
package org.apache.solr.handler.sql;
-import org.apache.calcite.linq4j.tree.Types;
-
import java.lang.reflect.Method;
import java.util.List;
+import org.apache.calcite.linq4j.tree.Types;
-/**
- * Builtin methods in the Solr adapter.
- */
+/** Builtin methods in the Solr adapter. */
enum SolrMethod {
- SOLR_QUERYABLE_QUERY(SolrTable.SolrQueryable.class,
- "query",
- List.class,
- String.class,
- List.class,
- List.class,
- List.class,
- String.class,
- String.class,
- String.class,
- String.class);
+ SOLR_QUERYABLE_QUERY(
+ SolrTable.SolrQueryable.class,
+ "query",
+ List.class,
+ String.class,
+ List.class,
+ List.class,
+ List.class,
+ String.class,
+ String.class,
+ String.class,
+ String.class);
public final Method method;
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrProject.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrProject.java
index bd36ba8..23edfeb 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrProject.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrProject.java
@@ -16,6 +16,7 @@
*/
package org.apache.solr.handler.sql;
+import java.util.List;
import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
@@ -28,21 +29,22 @@ import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.util.Pair;
-import java.util.List;
-
-/**
- * Implementation of {@link org.apache.calcite.rel.core.Project} relational expression in Solr.
- */
+/** Implementation of {@link org.apache.calcite.rel.core.Project} relational expression in Solr. */
class SolrProject extends Project implements SolrRel {
- SolrProject(RelOptCluster cluster, RelTraitSet traitSet,
- RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
+ SolrProject(
+ RelOptCluster cluster,
+ RelTraitSet traitSet,
+ RelNode input,
+ List<? extends RexNode> projects,
+ RelDataType rowType) {
super(cluster, traitSet, input, projects, rowType);
assert getConvention() == SolrRel.CONVENTION;
assert getConvention() == input.getConvention();
}
@Override
- public Project copy(RelTraitSet traitSet, RelNode input, List<RexNode> projects, RelDataType rowType) {
+ public Project copy(
+ RelTraitSet traitSet, RelNode input, List<RexNode> projects, RelDataType rowType) {
return new SolrProject(getCluster(), traitSet, input, projects, rowType);
}
@@ -53,8 +55,10 @@ class SolrProject extends Project implements SolrRel {
public void implement(Implementor implementor) {
implementor.visitChild(0, getInput());
- final SolrRules.RexToSolrTranslator translator = new SolrRules.RexToSolrTranslator(
- (JavaTypeFactory) getCluster().getTypeFactory(), SolrRules.solrFieldNames(getInput().getRowType()));
+ final SolrRules.RexToSolrTranslator translator =
+ new SolrRules.RexToSolrTranslator(
+ (JavaTypeFactory) getCluster().getTypeFactory(),
+ SolrRules.solrFieldNames(getInput().getRowType()));
for (Pair<RexNode, String> pair : getNamedProjects()) {
final String name = pair.right;
final String expr = pair.left.accept(translator);
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRel.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRel.java
index db34c43..23e19f3 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRel.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRel.java
@@ -16,25 +16,25 @@
*/
package org.apache.solr.handler.sql;
+import static org.apache.solr.handler.sql.SolrAggregate.solrAggMetricId;
+
+import java.util.*;
import org.apache.calcite.plan.Convention;
import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.util.Pair;
-import java.util.*;
-
-import static org.apache.solr.handler.sql.SolrAggregate.solrAggMetricId;
-
-/**
- * Relational expression that uses Solr calling convention.
- */
+/** Relational expression that uses Solr calling convention. */
interface SolrRel extends RelNode {
void implement(Implementor implementor);
/** Calling convention for relational operations that occur in Solr. */
Convention CONVENTION = new Convention.Impl("Solr", SolrRel.class);
- /** Callback for the implementation process that converts a tree of {@link SolrRel} nodes into a Solr query. */
+ /**
+ * Callback for the implementation process that converts a tree of {@link SolrRel} nodes into a
+ * Solr query.
+ */
class Implementor {
final Map<String, String> fieldMappings = new HashMap<>();
final Map<String, String> reverseAggMappings = new HashMap<>();
@@ -51,15 +51,15 @@ interface SolrRel extends RelNode {
SolrTable solrTable;
void addFieldMapping(String key, String val, boolean overwrite) {
- if(key != null) {
- if(overwrite || !fieldMappings.containsKey(key)) {
+ if (key != null) {
+ if (overwrite || !fieldMappings.containsKey(key)) {
this.fieldMappings.put(key, val);
}
}
}
void addReverseAggMapping(String key, String val) {
- if(key != null && !reverseAggMappings.containsKey(key)) {
+ if (key != null && !reverseAggMappings.containsKey(key)) {
this.reverseAggMappings.put(key, val);
}
}
@@ -86,7 +86,7 @@ interface SolrRel extends RelNode {
column = this.fieldMappings.getOrDefault(column, column);
this.metricPairs.add(new Pair<>(metric, column));
- if(outName != null) {
+ if (outName != null) {
this.addFieldMapping(outName, solrAggMetricId(metric, column), true);
}
}
@@ -95,7 +95,6 @@ interface SolrRel extends RelNode {
this.havingPredicate = havingPredicate;
}
-
void setLimit(String limit) {
limitValue = limit;
}
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRules.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRules.java
index 8b65184..3358afb 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRules.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrRules.java
@@ -16,6 +16,10 @@
*/
package org.apache.solr.handler.sql;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Predicate;
import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.plan.*;
import org.apache.calcite.rel.RelCollations;
@@ -34,22 +38,13 @@ import org.apache.calcite.rex.RexVisitorImpl;
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * Rules and relational operators for
- * {@link SolrRel#CONVENTION}
- * calling convention.
- */
+/** Rules and relational operators for {@link SolrRel#CONVENTION} calling convention. */
class SolrRules {
static final RelOptRule[] RULES = {
- SolrSortRule.SORT_RULE,
- SolrFilterRule.FILTER_RULE,
- SolrProjectRule.PROJECT_RULE,
- SolrAggregateRule.AGGREGATE_RULE,
+ SolrSortRule.SORT_RULE,
+ SolrFilterRule.FILTER_RULE,
+ SolrProjectRule.PROJECT_RULE,
+ SolrAggregateRule.AGGREGATE_RULE,
};
static List<String> solrFieldNames(final RelDataType rowType) {
@@ -64,7 +59,8 @@ class SolrRules {
public int size() {
return rowType.getFieldCount();
}
- }, true);
+ },
+ true);
}
/** Translator from {@link RexNode} to strings in Solr's expression language. */
@@ -102,7 +98,9 @@ class SolrRules {
}
}
- /** Base class for planner rules that convert a relational expression to Solr calling convention. */
+ /**
+ * Base class for planner rules that convert a relational expression to Solr calling convention.
+ */
abstract static class SolrConverterRule extends ConverterRule {
final Convention out = SolrRel.CONVENTION;
@@ -110,14 +108,13 @@ class SolrRules {
this(clazz, relNode -> true, description);
}
- <R extends RelNode> SolrConverterRule(Class<R> clazz, Predicate<RelNode> predicate, String description) {
+ <R extends RelNode> SolrConverterRule(
+ Class<R> clazz, Predicate<RelNode> predicate, String description) {
super(clazz, Convention.NONE, SolrRel.CONVENTION, description);
}
}
- /**
- * Rule to convert a {@link LogicalFilter} to a {@link SolrFilter}.
- */
+ /** Rule to convert a {@link LogicalFilter} to a {@link SolrFilter}. */
private static class SolrFilterRule extends SolrConverterRule {
private static boolean isNotFilterByExpr(List<RexNode> rexNodes, List<String> fieldNames) {
@@ -128,14 +125,16 @@ class SolrRules {
if (rexNode instanceof RexCall) {
result = result && isNotFilterByExpr(((RexCall) rexNode).getOperands(), fieldNames);
} else if (rexNode instanceof RexInputRef) {
- result = result && !fieldNames.get(((RexInputRef) rexNode).getIndex()).startsWith("EXPR$");
+ result =
+ result && !fieldNames.get(((RexInputRef) rexNode).getIndex()).startsWith("EXPR$");
}
}
return result;
}
private static boolean filter(RelNode relNode) {
- List<RexNode> filterOperands = ((RexCall) ((LogicalFilter) relNode).getCondition()).getOperands();
+ List<RexNode> filterOperands =
+ ((RexCall) ((LogicalFilter) relNode).getCondition()).getOperands();
return isNotFilterByExpr(filterOperands, SolrRules.solrFieldNames(relNode.getRowType()));
}
@@ -149,16 +148,11 @@ class SolrRules {
final LogicalFilter filter = (LogicalFilter) rel;
final RelTraitSet traitSet = filter.getTraitSet().replace(out);
return new SolrFilter(
- rel.getCluster(),
- traitSet,
- convert(filter.getInput(), out),
- filter.getCondition());
+ rel.getCluster(), traitSet, convert(filter.getInput(), out), filter.getCondition());
}
}
- /**
- * Rule to convert a {@link LogicalProject} to a {@link SolrProject}.
- */
+ /** Rule to convert a {@link LogicalProject} to a {@link SolrProject}. */
private static class SolrProjectRule extends SolrConverterRule {
private static final SolrProjectRule PROJECT_RULE = new SolrProjectRule();
@@ -171,17 +165,11 @@ class SolrRules {
final RelNode converted = convert(project.getInput(), out);
final RelTraitSet traitSet = project.getTraitSet().replace(out);
return new SolrProject(
- rel.getCluster(),
- traitSet,
- converted,
- project.getProjects(),
- project.getRowType());
+ rel.getCluster(), traitSet, converted, project.getProjects(), project.getRowType());
}
}
- /**
- * Rule to convert a {@link LogicalSort} to a {@link SolrSort}.
- */
+ /** Rule to convert a {@link LogicalSort} to a {@link SolrSort}. */
private static class SolrSortRule extends SolrConverterRule {
static final SolrSortRule SORT_RULE = new SolrSortRule(LogicalSort.class, "SolrSortRule");
@@ -203,13 +191,11 @@ class SolrRules {
}
}
- /**
- * Rule to convert an {@link LogicalAggregate} to an {@link SolrAggregate}.
- */
+ /** Rule to convert an {@link LogicalAggregate} to an {@link SolrAggregate}. */
private static class SolrAggregateRule extends SolrConverterRule {
-// private static final Predicate<RelNode> AGGREGATE_PREDICTE = relNode ->
-// Aggregate.IS_SIMPLE.apply(((LogicalAggregate)relNode));// &&
-// !((LogicalAggregate)relNode).containsDistinctCall();
+ // private static final Predicate<RelNode> AGGREGATE_PREDICTE = relNode ->
+ // Aggregate.IS_SIMPLE.apply(((LogicalAggregate)relNode));// &&
+ // !((LogicalAggregate)relNode).containsDistinctCall();
private static final RelOptRule AGGREGATE_RULE = new SolrAggregateRule();
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSchema.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSchema.java
index 36f1222..f354f8d 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSchema.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSchema.java
@@ -16,6 +16,7 @@
*/
package org.apache.solr.handler.sql;
+import com.google.common.collect.ImmutableMap;
import java.io.Closeable;
import java.io.IOException;
import java.util.Date;
@@ -28,8 +29,6 @@ import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-
-import com.google.common.collect.ImmutableMap;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeImpl;
@@ -139,9 +138,13 @@ class SolrSchema extends AbstractSchema implements Closeable {
}
private boolean isStoredIndexedOrDocValues(final EnumSet<FieldFlag> flags) {
- // if a field is not stored but indexed, then we should still include it in the table schema so that users
+ // if a field is not stored but indexed, then we should still include it in the table schema so
+ // that users
// can filter on it, they just won't be able to return it as a field
- return flags != null && (flags.contains(FieldFlag.DOC_VALUES) || flags.contains(FieldFlag.STORED) || flags.contains(FieldFlag.INDEXED));
+ return flags != null
+ && (flags.contains(FieldFlag.DOC_VALUES)
+ || flags.contains(FieldFlag.STORED)
+ || flags.contains(FieldFlag.INDEXED));
}
private EnumSet<FieldFlag> getFieldFlags(final LukeResponse.FieldInfo luceneFieldInfo) {
@@ -169,20 +172,31 @@ class SolrSchema extends AbstractSchema implements Closeable {
// proto-type will be copied into a real type factory.
final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
final RelDataTypeFactory.Builder fieldInfo = typeFactory.builder();
-
+
// Get fields that have data, including dynamic field instances
Map<String, LukeResponse.FieldInfo> fieldsInUseMap = getFieldInfo(collection);
LukeResponse schema = getSchema(collection);
- Map<String, LukeResponse.FieldInfo> storedFields = schema.getFieldInfo().entrySet().stream()
+ Map<String, LukeResponse.FieldInfo> storedFields =
+ schema.getFieldInfo().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
- // merge the actual fields in use returned by Luke with the declared fields in the schema that are empty
- Map<String, LukeResponse.FieldInfo> combinedFields = Stream.of(fieldsInUseMap, storedFields)
+ // merge the actual fields in use returned by Luke with the declared fields in the schema that
+ // are empty
+ Map<String, LukeResponse.FieldInfo> combinedFields =
+ Stream.of(fieldsInUseMap, storedFields)
.flatMap(map -> map.entrySet().stream())
- .filter(e -> isStoredIndexedOrDocValues(getFieldFlags(e.getValue()))) // Only want fields that are stored, indexed, or have docValues enabled
- .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, TreeMap::new));
+ .filter(
+ e ->
+ isStoredIndexedOrDocValues(
+ getFieldFlags(
+ e.getValue()))) // Only want fields that are stored, indexed, or have
+ // docValues enabled
+ .collect(
+ Collectors.toMap(
+ Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, TreeMap::new));
- Map<String, Class<?>> javaClassForTypeMap = new HashMap<>(); // local cache for custom field types we've already resolved
+ Map<String, Class<?>> javaClassForTypeMap =
+ new HashMap<>(); // local cache for custom field types we've already resolved
for (Map.Entry<String, LukeResponse.FieldInfo> entry : combinedFields.entrySet()) {
LukeResponse.FieldInfo luceneFieldInfo = entry.getValue();
@@ -198,7 +212,8 @@ class SolrSchema extends AbstractSchema implements Closeable {
// We have to pass multi-valued fields through Calcite as SQL Type ANY
// Array doesn't work for aggregations! Calcite doesn't like GROUP BY on an ARRAY field
// but Solr happily computes aggs on a multi-valued field, so we have a paradigm mis-match and
- // ANY is the best way to retain use of operators on multi-valued fields while still being able
+ // ANY is the best way to retain use of operators on multi-valued fields while still being
+ // able
// to GROUP BY and project the multi-valued fields in results
EnumSet<FieldFlag> flags = getFieldFlags(luceneFieldInfo);
if (flags != null && flags.contains(FieldFlag.MULTI_VALUED)) {
@@ -230,7 +245,8 @@ class SolrSchema extends AbstractSchema implements Closeable {
default:
Class<?> javaClass = javaClassForTypeMap.get(luceneFieldType);
if (javaClass == null) {
- javaClass = guessJavaClassForFieldType(schema.getFieldTypeInfo().get(luceneFieldType));
+ javaClass =
+ guessJavaClassForFieldType(schema.getFieldTypeInfo().get(luceneFieldType));
javaClassForTypeMap.put(luceneFieldType, javaClass);
}
type = typeFactory.createJavaType(javaClass);
@@ -248,11 +264,14 @@ class SolrSchema extends AbstractSchema implements Closeable {
Class<?> typeClass = null;
if (typeInfo != null && !typeInfo.isTokenized() && typeInfo.getClassName() != null) {
try {
- final Class<?> fieldTypeClass = getClass().getClassLoader().loadClass(typeInfo.getClassName());
+ final Class<?> fieldTypeClass =
+ getClass().getClassLoader().loadClass(typeInfo.getClassName());
// a numeric type ... narrow down
- if (IntValueFieldType.class.isAssignableFrom(fieldTypeClass) || LongValueFieldType.class.isAssignableFrom(fieldTypeClass)) {
+ if (IntValueFieldType.class.isAssignableFrom(fieldTypeClass)
+ || LongValueFieldType.class.isAssignableFrom(fieldTypeClass)) {
typeClass = Long.class;
- } else if (FloatValueFieldType.class.isAssignableFrom(fieldTypeClass) || DoubleValueFieldType.class.isAssignableFrom(fieldTypeClass)) {
+ } else if (FloatValueFieldType.class.isAssignableFrom(fieldTypeClass)
+ || DoubleValueFieldType.class.isAssignableFrom(fieldTypeClass)) {
typeClass = Double.class;
} else if (DateValueFieldType.class.isAssignableFrom(fieldTypeClass)) {
typeClass = Date.class;
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSort.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSort.java
index ca161ce..42ada8e 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSort.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrSort.java
@@ -16,6 +16,7 @@
*/
package org.apache.solr.handler.sql;
+import java.util.List;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
import org.apache.calcite.plan.RelOptPlanner;
@@ -29,15 +30,16 @@ import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
-import java.util.List;
-
-/**
- * Implementation of {@link org.apache.calcite.rel.core.Sort} relational expression in Solr.
- */
+/** Implementation of {@link org.apache.calcite.rel.core.Sort} relational expression in Solr. */
class SolrSort extends Sort implements SolrRel {
- SolrSort(RelOptCluster cluster, RelTraitSet traitSet, RelNode child, RelCollation collation, RexNode offset,
- RexNode fetch) {
+ SolrSort(
+ RelOptCluster cluster,
+ RelTraitSet traitSet,
+ RelNode child,
+ RelCollation collation,
+ RexNode offset,
+ RexNode fetch) {
super(cluster, traitSet, child, collation, offset, fetch);
assert getConvention() == SolrRel.CONVENTION;
@@ -50,7 +52,12 @@ class SolrSort extends Sort implements SolrRel {
}
@Override
- public Sort copy(RelTraitSet traitSet, RelNode input, RelCollation newCollation, RexNode offset, RexNode fetch) {
+ public Sort copy(
+ RelTraitSet traitSet,
+ RelNode input,
+ RelCollation newCollation,
+ RexNode offset,
+ RexNode fetch) {
return new SolrSort(getCluster(), traitSet, input, collation, offset, fetch);
}
@@ -71,7 +78,6 @@ class SolrSort extends Sort implements SolrRel {
}
}
-
if (fetch != null) {
implementor.setLimit(((RexLiteral) fetch).getValue().toString());
}
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTable.java
index 00d01b3..f376951 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -16,6 +16,13 @@
*/
package org.apache.solr.handler.sql;
+import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.APPROX_COUNT_DISTINCT;
+import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.COUNT_DISTINCT;
+import static org.apache.solr.common.params.CommonParams.SORT;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
import org.apache.calcite.adapter.java.AbstractQueryableTable;
import org.apache.calcite.linq4j.*;
import org.apache.calcite.plan.RelOptCluster;
@@ -36,7 +43,6 @@ import org.apache.solr.client.solrj.io.eq.FieldEqualitor;
import org.apache.solr.client.solrj.io.eq.MultipleFieldEqualitor;
import org.apache.solr.client.solrj.io.eq.StreamEqualitor;
import org.apache.solr.client.solrj.io.eval.AndEvaluator;
-import org.apache.solr.client.solrj.io.eval.RecursiveBooleanEvaluator;
import org.apache.solr.client.solrj.io.eval.EqualToEvaluator;
import org.apache.solr.client.solrj.io.eval.GreaterThanEqualToEvaluator;
import org.apache.solr.client.solrj.io.eval.GreaterThanEvaluator;
@@ -45,6 +51,7 @@ import org.apache.solr.client.solrj.io.eval.LessThanEvaluator;
import org.apache.solr.client.solrj.io.eval.NotEvaluator;
import org.apache.solr.client.solrj.io.eval.OrEvaluator;
import org.apache.solr.client.solrj.io.eval.RawValueEvaluator;
+import org.apache.solr.client.solrj.io.eval.RecursiveBooleanEvaluator;
import org.apache.solr.client.solrj.io.stream.*;
import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParser;
import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
@@ -52,17 +59,7 @@ import org.apache.solr.client.solrj.io.stream.metrics.*;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
-import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.APPROX_COUNT_DISTINCT;
-import static org.apache.solr.client.solrj.io.stream.metrics.CountDistinctMetric.COUNT_DISTINCT;
-import static org.apache.solr.common.params.CommonParams.SORT;
-
-/**
- * Table based on a Solr collection
- */
+/** Table based on a Solr collection */
class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private static final String DEFAULT_QUERY = "*:*";
@@ -86,29 +83,40 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
}
return protoRowType.apply(typeFactory);
}
-
- private Enumerable<Object> query(final Properties properties) {
- return query(properties, Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(),
- Collections.emptyList(), null, null, null, null);
- }
- /** Executes a Solr query on the underlying table.
+ private Enumerable<Object> query(final Properties properties) {
+ return query(
+ properties,
+ Collections.emptyList(),
+ null,
+ Collections.emptyList(),
+ Collections.emptyList(),
+ Collections.emptyList(),
+ null,
+ null,
+ null,
+ null);
+ }
+
+ /**
+ * Executes a Solr query on the underlying table.
*
* @param properties Connections properties
* @param fields List of fields to project
* @param query A string for the query
* @return Enumerator of results
*/
- private Enumerable<Object> query(final Properties properties,
- final List<Map.Entry<String, Class<?>>> fields,
- final String query,
- final List<Pair<String, String>> orders,
- final List<String> buckets,
- final List<Pair<String, String>> metricPairs,
- final String limit,
- final String negativeQuery,
- final String havingPredicate,
- final String offset) {
+ private Enumerable<Object> query(
+ final Properties properties,
+ final List<Map.Entry<String, Class<?>>> fields,
+ final String query,
+ final List<Pair<String, String>> orders,
+ final List<String> buckets,
+ final List<Pair<String, String>> metricPairs,
+ final String limit,
+ final String negativeQuery,
+ final String havingPredicate,
+ final String offset) {
// SolrParams should be a ModifiableParams instead of a map
boolean mapReduce = "map_reduce".equals(properties.getProperty("aggregationMode"));
boolean negative = Boolean.parseBoolean(negativeQuery);
@@ -118,7 +126,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
if (query == null) {
q = DEFAULT_QUERY;
} else {
- if(negative) {
+ if (negative) {
q = DEFAULT_QUERY + " AND " + query;
} else {
q = query;
@@ -131,30 +139,34 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
if (metricPairs.isEmpty() && buckets.isEmpty()) {
tupleStream = handleSelect(zk, collection, q, fields, orders, limit, offset);
} else {
- if(buckets.isEmpty()) {
+ if (buckets.isEmpty()) {
tupleStream = handleStats(zk, collection, q, metricPairs, fields);
} else {
- if(mapReduce) {
- tupleStream = handleGroupByMapReduce(zk,
- collection,
- properties,
- fields,
- q,
- orders,
- buckets,
- metricPairs,
- limit,
- havingPredicate);
+ if (mapReduce) {
+ tupleStream =
+ handleGroupByMapReduce(
+ zk,
+ collection,
+ properties,
+ fields,
+ q,
+ orders,
+ buckets,
+ metricPairs,
+ limit,
+ havingPredicate);
} else {
- tupleStream = handleGroupByFacet(zk,
- collection,
- fields,
- q,
- orders,
- buckets,
- metricPairs,
- limit,
- havingPredicate);
+ tupleStream =
+ handleGroupByFacet(
+ zk,
+ collection,
+ fields,
+ q,
+ orders,
+ buckets,
+ metricPairs,
+ limit,
+ havingPredicate);
}
}
}
@@ -176,15 +188,16 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
};
}
- private static StreamComparator bucketSortComp(List<Bucket> buckets, Map<String,String> dirs) {
+ private static StreamComparator bucketSortComp(List<Bucket> buckets, Map<String, String> dirs) {
FieldComparator[] comps = new FieldComparator[buckets.size()];
- for(int i=0; i<buckets.size(); i++) {
- ComparatorOrder comparatorOrder = ComparatorOrder.fromString(dirs.get(buckets.get(i).toString()));
+ for (int i = 0; i < buckets.size(); i++) {
+ ComparatorOrder comparatorOrder =
+ ComparatorOrder.fromString(dirs.get(buckets.get(i).toString()));
String sortKey = buckets.get(i).toString();
comps[i] = new FieldComparator(sortKey, comparatorOrder);
}
- if(comps.length == 1) {
+ if (comps.length == 1) {
return comps[0];
} else {
return new MultipleFieldComparator(comps);
@@ -193,13 +206,13 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private static StreamComparator bucketSortComp(Bucket[] buckets, String dir) {
FieldComparator[] comps = new FieldComparator[buckets.length];
- for(int i=0; i<buckets.length; i++) {
+ for (int i = 0; i < buckets.length; i++) {
ComparatorOrder comparatorOrder = ascDescComp(dir);
String sortKey = buckets[i].toString();
comps[i] = new FieldComparator(sortKey, comparatorOrder);
}
- if(comps.length == 1) {
+ if (comps.length == 1) {
return comps[0];
} else {
return new MultipleFieldComparator(comps);
@@ -213,7 +226,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private StreamComparator getComp(List<? extends Map.Entry<String, String>> orders) {
FieldComparator[] comps = new FieldComparator[orders.size()];
- for(int i = 0; i < orders.size(); i++) {
+ for (int i = 0; i < orders.size(); i++) {
Map.Entry<String, String> order = orders.get(i);
String direction = getSortDirection(order);
ComparatorOrder comparatorOrder = ComparatorOrder.fromString(direction);
@@ -221,7 +234,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
comps[i] = new FieldComparator(sortKey, comparatorOrder);
}
- if(comps.length == 1) {
+ if (comps.length == 1) {
return comps[0];
} else {
return new MultipleFieldComparator(comps);
@@ -231,7 +244,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private List<Metric> buildMetrics(List<Pair<String, String>> metricPairs, boolean ifEmptyCount) {
List<Metric> metrics = new ArrayList<>(metricPairs.size());
metrics.addAll(metricPairs.stream().map(this::getMetric).collect(Collectors.toList()));
- if(metrics.size() == 0 && ifEmptyCount) {
+ if (metrics.size() == 0 && ifEmptyCount) {
metrics.add(new CountMetric());
}
return metrics;
@@ -259,25 +272,27 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
}
}
- private TupleStream handleSelect(String zk,
- String collection,
- String query,
- List<Map.Entry<String, Class<?>>> fields,
- List<Pair<String, String>> orders,
- String limit,
- String offset) throws IOException {
+ private TupleStream handleSelect(
+ String zk,
+ String collection,
+ String query,
+ List<Map.Entry<String, Class<?>>> fields,
+ List<Pair<String, String>> orders,
+ String limit,
+ String offset)
+ throws IOException {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add(CommonParams.Q, query);
- //Validate the fields
- for(Map.Entry<String, Class<?>> entry : fields) {
+ // Validate the fields
+ for (Map.Entry<String, Class<?>> entry : fields) {
String fname = entry.getKey();
- if(limit == null && "score".equals(fname)) {
+ if (limit == null && "score".equals(fname)) {
throw new IOException("score is not a valid field for unlimited queries.");
}
- if(fname.contains("*")) {
+ if (fname.contains("*")) {
throw new IOException("* is not supported for column selection.");
}
}
@@ -289,7 +304,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
} else {
if (limit == null) {
params.add(SORT, "_version_ desc");
- fl = fl+",_version_";
+ fl = fl + ",_version_";
} else {
params.add(SORT, "score desc");
if (!fl.contains("score")) {
@@ -299,14 +314,16 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
}
params.add(CommonParams.FL, fl);
-
+
if (offset != null && limit == null) {
- throw new IOException("OFFSET without LIMIT not supported by Solr! Specify desired limit using 'FETCH NEXT <LIMIT> ROWS ONLY'");
+ throw new IOException(
+ "OFFSET without LIMIT not supported by Solr! Specify desired limit using 'FETCH NEXT <LIMIT> ROWS ONLY'");
}
-
+
if (limit != null) {
int limitInt = Integer.parseInt(limit);
- // if there's an offset, then we need to fetch offset + limit rows from each shard and then sort accordingly
+ // if there's an offset, then we need to fetch offset + limit rows from each shard and then
+ // sort accordingly
LimitStream limitStream;
if (offset != null) {
int offsetInt = Integer.parseInt(offset);
@@ -315,7 +332,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
params.add(CommonParams.ROWS, String.valueOf(rows));
// re-sort all the streams back from the shards
StreamComparator streamSorter = new MultipleFieldComparator(getComps(orders));
- limitStream = new LimitStream(new SortStream(new CloudSolrStream(zk, collection, params), streamSorter), limitInt, offsetInt);
+ limitStream =
+ new LimitStream(
+ new SortStream(new CloudSolrStream(zk, collection, params), streamSorter),
+ limitInt,
+ offsetInt);
} else {
params.add(CommonParams.ROWS, limit);
limitStream = new LimitStream(new CloudSolrStream(zk, collection, params), limitInt);
@@ -329,8 +350,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private String getSort(List<Pair<String, String>> orders) {
StringBuilder buf = new StringBuilder();
- for(Pair<String, String> pair : orders) {
- if(buf.length() > 0) {
+ for (Pair<String, String> pair : orders) {
+ if (buf.length() > 0) {
buf.append(",");
}
buf.append(pair.getKey()).append(" ").append(pair.getValue());
@@ -347,9 +368,9 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private String getFields(List<Map.Entry<String, Class<?>>> fields) {
StringBuilder buf = new StringBuilder();
- for(Map.Entry<String, Class<?>> field : fields) {
+ for (Map.Entry<String, Class<?>> field : fields) {
- if(buf.length() > 0) {
+ if (buf.length() > 0) {
buf.append(",");
}
@@ -361,30 +382,28 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private String getFields(Set<String> fieldSet) {
StringBuilder buf = new StringBuilder();
- for(String field : fieldSet) {
+ for (String field : fieldSet) {
- if(buf.length() > 0) {
+ if (buf.length() > 0) {
buf.append(",");
}
-
buf.append(field);
}
return buf.toString();
}
-
private Set<String> getFieldSet(Metric[] metrics, List<Map.Entry<String, Class<?>>> fields) {
HashSet<String> set = new HashSet<>();
- for(Metric metric : metrics) {
- for(String column : metric.getColumns()) {
+ for (Metric metric : metrics) {
+ for (String column : metric.getColumns()) {
set.add(column);
}
}
- for(Map.Entry<String, Class<?>> field : fields) {
- if(field.getKey().indexOf('(') == -1) {
+ for (Map.Entry<String, Class<?>> field : fields) {
+ if (field.getKey().indexOf('(') == -1) {
set.add(field.getKey());
}
}
@@ -393,8 +412,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
}
private static String getSortDirection(List<Pair<String, String>> orders) {
- if(orders != null && orders.size() > 0) {
- for(Pair<String,String> item : orders) {
+ if (orders != null && orders.size() > 0) {
+ for (Pair<String, String> item : orders) {
return item.getValue();
}
}
@@ -405,8 +424,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private static String bucketSort(Bucket[] buckets, String dir) {
StringBuilder buf = new StringBuilder();
boolean comma = false;
- for(Bucket bucket : buckets) {
- if(comma) {
+ for (Bucket bucket : buckets) {
+ if (comma) {
buf.append(",");
}
buf.append(bucket.toString()).append(" ").append(dir);
@@ -419,8 +438,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private static String getPartitionKeys(Bucket[] buckets) {
StringBuilder buf = new StringBuilder();
boolean comma = false;
- for(Bucket bucket : buckets) {
- if(comma) {
+ for (Bucket bucket : buckets) {
+ if (comma) {
buf.append(",");
}
buf.append(bucket.toString());
@@ -429,20 +448,21 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
return buf.toString();
}
- private static boolean sortsEqual(Bucket[] buckets, String direction, List<Pair<String, String>> orders) {
+ private static boolean sortsEqual(
+ Bucket[] buckets, String direction, List<Pair<String, String>> orders) {
- if(buckets.length != orders.size()) {
+ if (buckets.length != orders.size()) {
return false;
}
- for(int i=0; i< buckets.length; i++) {
+ for (int i = 0; i < buckets.length; i++) {
Bucket bucket = buckets[i];
Pair<String, String> order = orders.get(i);
- if(!bucket.toString().equals(order.getKey())) {
+ if (!bucket.toString().equals(order.getKey())) {
return false;
}
- if(!order.getValue().toLowerCase(Locale.ROOT).contains(direction.toLowerCase(Locale.ROOT))) {
+ if (!order.getValue().toLowerCase(Locale.ROOT).contains(direction.toLowerCase(Locale.ROOT))) {
return false;
}
}
@@ -450,19 +470,21 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
return true;
}
- private TupleStream handleGroupByMapReduce(String zk,
- String collection,
- Properties properties,
- final List<Map.Entry<String, Class<?>>> fields,
- final String query,
- final List<Pair<String, String>> orders,
- final List<String> _buckets,
- final List<Pair<String, String>> metricPairs,
- final String limit,
- final String havingPredicate) throws IOException {
+ private TupleStream handleGroupByMapReduce(
+ String zk,
+ String collection,
+ Properties properties,
+ final List<Map.Entry<String, Class<?>>> fields,
+ final String query,
+ final List<Pair<String, String>> orders,
+ final List<String> _buckets,
+ final List<Pair<String, String>> metricPairs,
+ final String limit,
+ final String havingPredicate)
+ throws IOException {
Map<String, Class<?>> fmap = new HashMap<>();
- for(Map.Entry<String, Class<?>> entry : fields) {
+ for (Map.Entry<String, Class<?>> entry : fields) {
fmap.put(entry.getKey(), entry.getValue());
}
@@ -471,12 +493,13 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
Bucket[] buckets = buildBuckets(_buckets, fields);
Metric[] metrics = buildMetrics(metricPairs, false).toArray(new Metric[0]);
- if(metrics.length == 0) {
- return handleSelectDistinctMapReduce(zk, collection, properties, fields, query, orders, buckets, limit);
+ if (metrics.length == 0) {
+ return handleSelectDistinctMapReduce(
+ zk, collection, properties, fields, query, orders, buckets, limit);
} else {
- for(Metric metric : metrics) {
+ for (Metric metric : metrics) {
Class<?> c = fmap.get(metric.getIdentifier());
- if(Long.class.equals(c)) {
+ if (Long.class.equals(c)) {
metric.outputLong = true;
}
}
@@ -484,7 +507,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
Set<String> fieldSet = getFieldSet(metrics, fields);
- if(metrics.length == 0) {
+ if (metrics.length == 0) {
throw new IOException("Group by queries must include atleast one aggregate function.");
}
@@ -497,10 +520,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
params.set(CommonParams.FL, fl);
params.set(CommonParams.Q, query);
params.set(CommonParams.WT, CommonParams.JAVABIN);
- //Always use the /export handler for Group By Queries because it requires exporting full result sets.
+ // Always use the /export handler for Group By Queries because it requires exporting full result
+ // sets.
params.set(CommonParams.QT, "/export");
- if(numWorkers > 1) {
+ if (numWorkers > 1) {
params.set("partitionKeys", getPartitionKeys(buckets));
}
@@ -511,64 +535,68 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
CloudSolrStream cstream = new CloudSolrStream(zk, collection, params);
tupleStream = new RollupStream(cstream, buckets, metrics);
- StreamFactory factory = new StreamFactory()
- .withFunctionName("search", CloudSolrStream.class)
- .withFunctionName("parallel", ParallelStream.class)
- .withFunctionName("rollup", RollupStream.class)
- .withFunctionName("sum", SumMetric.class)
- .withFunctionName("min", MinMetric.class)
- .withFunctionName("max", MaxMetric.class)
- .withFunctionName("avg", MeanMetric.class)
- .withFunctionName("count", CountMetric.class)
- .withFunctionName("and", AndEvaluator.class)
- .withFunctionName("or", OrEvaluator.class)
- .withFunctionName("not", NotEvaluator.class)
- .withFunctionName("eq", EqualToEvaluator.class)
- .withFunctionName("gt", GreaterThanEvaluator.class)
- .withFunctionName("lt", LessThanEvaluator.class)
- .withFunctionName("val", RawValueEvaluator.class)
- .withFunctionName("lteq", LessThanEqualToEvaluator.class)
- .withFunctionName("having", HavingStream.class)
- .withFunctionName("gteq", GreaterThanEqualToEvaluator.class);
-
- if(havingPredicate != null) {
- RecursiveBooleanEvaluator booleanOperation = (RecursiveBooleanEvaluator)factory.constructEvaluator(StreamExpressionParser.parse(havingPredicate));
+ StreamFactory factory =
+ new StreamFactory()
+ .withFunctionName("search", CloudSolrStream.class)
+ .withFunctionName("parallel", ParallelStream.class)
+ .withFunctionName("rollup", RollupStream.class)
+ .withFunctionName("sum", SumMetric.class)
+ .withFunctionName("min", MinMetric.class)
+ .withFunctionName("max", MaxMetric.class)
+ .withFunctionName("avg", MeanMetric.class)
+ .withFunctionName("count", CountMetric.class)
+ .withFunctionName("and", AndEvaluator.class)
+ .withFunctionName("or", OrEvaluator.class)
+ .withFunctionName("not", NotEvaluator.class)
+ .withFunctionName("eq", EqualToEvaluator.class)
+ .withFunctionName("gt", GreaterThanEvaluator.class)
+ .withFunctionName("lt", LessThanEvaluator.class)
+ .withFunctionName("val", RawValueEvaluator.class)
+ .withFunctionName("lteq", LessThanEqualToEvaluator.class)
+ .withFunctionName("having", HavingStream.class)
+ .withFunctionName("gteq", GreaterThanEqualToEvaluator.class);
+
+ if (havingPredicate != null) {
+ RecursiveBooleanEvaluator booleanOperation =
+ (RecursiveBooleanEvaluator)
+ factory.constructEvaluator(StreamExpressionParser.parse(havingPredicate));
tupleStream = new HavingStream(tupleStream, booleanOperation);
}
- if(numWorkers > 1) {
+ if (numWorkers > 1) {
// Do the rollups in parallel
// Maintain the sort of the Tuples coming from the workers.
StreamComparator comp = bucketSortComp(buckets, sortDirection);
@SuppressWarnings("resource")
- final ParallelStream parallelStream = new ParallelStream(zk, collection, tupleStream, numWorkers, comp);
-
+ final ParallelStream parallelStream =
+ new ParallelStream(zk, collection, tupleStream, numWorkers, comp);
parallelStream.setStreamFactory(factory);
tupleStream = parallelStream;
}
- //TODO: Currently we are not pushing down the having clause.
- // We need to push down the having clause to ensure that LIMIT does not cut off records prior to the having filter.
+ // TODO: Currently we are not pushing down the having clause.
+ // We need to push down the having clause to ensure that LIMIT does not cut off records
+ // prior to the having filter.
- if(orders != null && orders.size() > 0) {
- if(!sortsEqual(buckets, sortDirection, orders)) {
+ if (orders != null && orders.size() > 0) {
+ if (!sortsEqual(buckets, sortDirection, orders)) {
int lim = (limit == null) ? 100 : Integer.parseInt(limit);
StreamComparator comp = getComp(orders);
- //Rank the Tuples
- //If parallel stream is used ALL the Rolled up tuples from the workers will be ranked
- //Providing a true Top or Bottom.
+ // Rank the Tuples
+ // If parallel stream is used ALL the Rolled up tuples from the workers will be ranked
+ // Providing a true Top or Bottom.
tupleStream = new RankStream(tupleStream, lim, comp);
} else {
// Sort is the same as the same as the underlying stream
// Only need to limit the result, not Rank the result
- if(limit != null) {
+ if (limit != null) {
tupleStream = new LimitStream(tupleStream, Integer.parseInt(limit));
}
}
} else {
- //No order by, check for limit
- if(limit != null) {
+ // No order by, check for limit
+ if (limit != null) {
tupleStream = new LimitStream(tupleStream, Integer.parseInt(limit));
}
}
@@ -579,10 +607,10 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
private Bucket[] buildBuckets(List<String> buckets, List<Map.Entry<String, Class<?>>> fields) {
Bucket[] bucketsArray = new Bucket[buckets.size()];
- int i=0;
- for(Map.Entry<String,Class<?>> field : fields) {
+ int i = 0;
+ for (Map.Entry<String, Class<?>> field : fields) {
String fieldName = field.getKey();
- if(buckets.contains(fieldName)) {
+ if (buckets.contains(fieldName)) {
bucketsArray[i++] = new Bucket(fieldName);
}
}
@@ -590,19 +618,20 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
return bucketsArray;
}
- private TupleStream handleGroupByFacet(String zkHost,
- String collection,
- final List<Map.Entry<String, Class<?>>> fields,
- final String query,
- final List<Pair<String, String>> orders,
- final List<String> bucketFields,
- final List<Pair<String, String>> metricPairs,
- final String lim,
- final String havingPredicate) throws IOException {
-
+ private TupleStream handleGroupByFacet(
+ String zkHost,
+ String collection,
+ final List<Map.Entry<String, Class<?>>> fields,
+ final String query,
+ final List<Pair<String, String>> orders,
+ final List<String> bucketFields,
+ final List<Pair<String, String>> metricPairs,
+ final String lim,
+ final String havingPredicate)
+ throws IOException {
Map<String, Class<?>> fmap = new HashMap<>();
- for(Map.Entry<String, Class<?>> f : fields) {
+ for (Map.Entry<String, Class<?>> f : fields) {
fmap.put(f.getKey(), f.getValue());
}
@@ -611,11 +640,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
Bucket[] buckets = buildBuckets(bucketFields, fields);
Metric[] metrics = buildMetrics(metricPairs, true).toArray(new Metric[0]);
- if(metrics.length == 0) {
+ if (metrics.length == 0) {
metrics = new Metric[1];
metrics[0] = new CountMetric();
} else {
- for(Metric metric : metrics) {
+ for (Metric metric : metrics) {
Class<?> c = fmap.get(metric.getIdentifier());
if (!metric.outputLong && Long.class.equals(c)) {
metric.outputLong = true;
@@ -627,67 +656,64 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
FieldComparator[] sorts = null;
- if(orders == null || orders.size() == 0) {
+ if (orders == null || orders.size() == 0) {
sorts = new FieldComparator[buckets.length];
- for(int i=0; i<sorts.length; i++) {
+ for (int i = 0; i < sorts.length; i++) {
sorts[i] = new FieldComparator("index", ComparatorOrder.ASCENDING);
}
} else {
sorts = getComps(orders);
}
- int overfetch = (int)(limit * 1.25);
-
- TupleStream tupleStream = new FacetStream(zkHost,
- collection,
- solrParams,
- buckets,
- metrics,
- sorts,
- overfetch);
-
-
-
- StreamFactory factory = new StreamFactory()
- .withFunctionName("search", CloudSolrStream.class)
- .withFunctionName("parallel", ParallelStream.class)
- .withFunctionName("rollup", RollupStream.class)
- .withFunctionName("sum", SumMetric.class)
- .withFunctionName("min", MinMetric.class)
- .withFunctionName("max", MaxMetric.class)
- .withFunctionName("avg", MeanMetric.class)
- .withFunctionName("count", CountMetric.class)
- .withFunctionName("and", AndEvaluator.class)
- .withFunctionName("or", OrEvaluator.class)
- .withFunctionName("not", NotEvaluator.class)
- .withFunctionName("eq", EqualToEvaluator.class)
- .withFunctionName("val", RawValueEvaluator.class)
- .withFunctionName("gt", GreaterThanEvaluator.class)
- .withFunctionName("lt", LessThanEvaluator.class)
- .withFunctionName("lteq", LessThanEqualToEvaluator.class)
- .withFunctionName("gteq", GreaterThanEqualToEvaluator.class);
-
- if(havingPredicate != null) {
- RecursiveBooleanEvaluator booleanOperation = (RecursiveBooleanEvaluator)factory.constructEvaluator(StreamExpressionParser.parse(havingPredicate));
+ int overfetch = (int) (limit * 1.25);
+
+ TupleStream tupleStream =
+ new FacetStream(zkHost, collection, solrParams, buckets, metrics, sorts, overfetch);
+
+ StreamFactory factory =
+ new StreamFactory()
+ .withFunctionName("search", CloudSolrStream.class)
+ .withFunctionName("parallel", ParallelStream.class)
+ .withFunctionName("rollup", RollupStream.class)
+ .withFunctionName("sum", SumMetric.class)
+ .withFunctionName("min", MinMetric.class)
+ .withFunctionName("max", MaxMetric.class)
+ .withFunctionName("avg", MeanMetric.class)
+ .withFunctionName("count", CountMetric.class)
+ .withFunctionName("and", AndEvaluator.class)
+ .withFunctionName("or", OrEvaluator.class)
+ .withFunctionName("not", NotEvaluator.class)
+ .withFunctionName("eq", EqualToEvaluator.class)
+ .withFunctionName("val", RawValueEvaluator.class)
+ .withFunctionName("gt", GreaterThanEvaluator.class)
+ .withFunctionName("lt", LessThanEvaluator.class)
+ .withFunctionName("lteq", LessThanEqualToEvaluator.class)
+ .withFunctionName("gteq", GreaterThanEqualToEvaluator.class);
+
+ if (havingPredicate != null) {
+ RecursiveBooleanEvaluator booleanOperation =
+ (RecursiveBooleanEvaluator)
+ factory.constructEvaluator(StreamExpressionParser.parse(havingPredicate));
tupleStream = new HavingStream(tupleStream, booleanOperation);
}
- if(lim != null)
- {
+ if (lim != null) {
tupleStream = new LimitStream(tupleStream, limit);
}
return tupleStream;
}
- private TupleStream handleSelectDistinctMapReduce(final String zkHost,
- final String collection,
- final Properties properties,
- final List<Map.Entry<String, Class<?>>> fields,
- final String query,
- final List<Pair<String, String>> orders,
- final Bucket[] buckets,
- final String limit) throws IOException{
+ private TupleStream handleSelectDistinctMapReduce(
+ final String zkHost,
+ final String collection,
+ final Properties properties,
+ final List<Map.Entry<String, Class<?>>> fields,
+ final String query,
+ final List<Pair<String, String>> orders,
+ final Bucket[] buckets,
+ final String limit)
+ throws IOException {
int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
@@ -697,24 +723,26 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
StreamEqualitor ecomp = null;
StreamComparator comp = null;
- if(orders != null && orders.size() > 0) {
+ if (orders != null && orders.size() > 0) {
StreamComparator[] adjustedSorts = adjustSorts(orders, buckets);
// Because of the way adjustSorts works we know that each FieldComparator has a single
// field name. For this reason we can just look at the leftFieldName
FieldEqualitor[] fieldEqualitors = new FieldEqualitor[adjustedSorts.length];
StringBuilder buf = new StringBuilder();
- for(int i=0; i<adjustedSorts.length; i++) {
- FieldComparator fieldComparator = (FieldComparator)adjustedSorts[i];
+ for (int i = 0; i < adjustedSorts.length; i++) {
+ FieldComparator fieldComparator = (FieldComparator) adjustedSorts[i];
fieldEqualitors[i] = new FieldEqualitor(fieldComparator.getLeftFieldName());
- if(i>0) {
+ if (i > 0) {
buf.append(",");
}
- buf.append(fieldComparator.getLeftFieldName()).append(" ").append(fieldComparator.getOrder().toString());
+ buf.append(fieldComparator.getLeftFieldName())
+ .append(" ")
+ .append(fieldComparator.getOrder().toString());
}
sort = buf.toString();
- if(adjustedSorts.length == 1) {
+ if (adjustedSorts.length == 1) {
ecomp = fieldEqualitors[0];
comp = adjustedSorts[0];
} else {
@@ -725,10 +753,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
StringBuilder sortBuf = new StringBuilder();
FieldEqualitor[] equalitors = new FieldEqualitor[buckets.length];
StreamComparator[] streamComparators = new StreamComparator[buckets.length];
- for(int i=0; i<buckets.length; i++) {
+ for (int i = 0; i < buckets.length; i++) {
equalitors[i] = new FieldEqualitor(buckets[i].toString());
- streamComparators[i] = new FieldComparator(buckets[i].toString(), ComparatorOrder.ASCENDING);
- if(i>0) {
+ streamComparators[i] =
+ new FieldComparator(buckets[i].toString(), ComparatorOrder.ASCENDING);
+ if (i > 0) {
sortBuf.append(',');
}
sortBuf.append(buckets[i].toString()).append(" asc");
@@ -736,7 +765,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
sort = sortBuf.toString();
- if(equalitors.length == 1) {
+ if (equalitors.length == 1) {
ecomp = equalitors[0];
comp = streamComparators[0];
} else {
@@ -750,10 +779,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
params.set(CommonParams.FL, fl);
params.set(CommonParams.Q, query);
params.set(CommonParams.WT, CommonParams.JAVABIN);
- //Always use the /export handler for Distinct Queries because it requires exporting full result sets.
+ // Always use the /export handler for Distinct Queries because it requires exporting full result
+ // sets.
params.set(CommonParams.QT, "/export");
- if(numWorkers > 1) {
+ if (numWorkers > 1) {
params.set("partitionKeys", getPartitionKeys(buckets));
}
@@ -764,56 +794,58 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
CloudSolrStream cstream = new CloudSolrStream(zkHost, collection, params);
tupleStream = new UniqueStream(cstream, ecomp);
- if(numWorkers > 1) {
+ if (numWorkers > 1) {
// Do the unique in parallel
// Maintain the sort of the Tuples coming from the workers.
@SuppressWarnings("resource")
- final ParallelStream parallelStream = new ParallelStream(zkHost, collection, tupleStream, numWorkers, comp);
+ final ParallelStream parallelStream =
+ new ParallelStream(zkHost, collection, tupleStream, numWorkers, comp);
- StreamFactory factory = new StreamFactory()
- .withFunctionName("search", CloudSolrStream.class)
- .withFunctionName("parallel", ParallelStream.class)
- .withFunctionName("unique", UniqueStream.class);
+ StreamFactory factory =
+ new StreamFactory()
+ .withFunctionName("search", CloudSolrStream.class)
+ .withFunctionName("parallel", ParallelStream.class)
+ .withFunctionName("unique", UniqueStream.class);
parallelStream.setStreamFactory(factory);
tupleStream = parallelStream;
}
- if(limit != null) {
+ if (limit != null) {
tupleStream = new LimitStream(tupleStream, Integer.parseInt(limit));
}
return tupleStream;
}
-
- private StreamComparator[] adjustSorts(List<Pair<String, String>> orders, Bucket[] buckets) throws IOException {
+ private StreamComparator[] adjustSorts(List<Pair<String, String>> orders, Bucket[] buckets)
+ throws IOException {
List<FieldComparator> adjustedSorts = new ArrayList<>();
Set<String> bucketFields = new HashSet<>();
Set<String> sortFields = new HashSet<>();
ComparatorOrder comparatorOrder = ComparatorOrder.ASCENDING;
- for(Pair<String, String> order : orders) {
+ for (Pair<String, String> order : orders) {
sortFields.add(order.getKey());
adjustedSorts.add(new FieldComparator(order.getKey(), ascDescComp(order.getValue())));
comparatorOrder = ascDescComp(order.getValue());
}
- for(Bucket bucket : buckets) {
+ for (Bucket bucket : buckets) {
bucketFields.add(bucket.toString());
}
- for(String sf : sortFields) {
- if(!bucketFields.contains(sf)) {
+ for (String sf : sortFields) {
+ if (!bucketFields.contains(sf)) {
throw new IOException("All sort fields must be in the field list.");
}
}
- //Add sort fields if needed
- if(sortFields.size() < buckets.length) {
- for(Bucket bucket : buckets) {
+ // Add sort fields if needed
+ if (sortFields.size() < buckets.length) {
+ for (Bucket bucket : buckets) {
String b = bucket.toString();
- if(!sortFields.contains(b)) {
+ if (!sortFields.contains(b)) {
adjustedSorts.add(new FieldComparator(bucket.toString(), comparatorOrder));
}
}
@@ -822,15 +854,16 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
return adjustedSorts.toArray(new FieldComparator[adjustedSorts.size()]);
}
- private TupleStream handleStats(String zk,
- String collection,
- String query,
- List<Pair<String, String>> metricPairs,
- List<Map.Entry<String, Class<?>>> fields) throws IOException {
-
+ private TupleStream handleStats(
+ String zk,
+ String collection,
+ String query,
+ List<Pair<String, String>> metricPairs,
+ List<Map.Entry<String, Class<?>>> fields)
+ throws IOException {
Map<String, Class<?>> fmap = new HashMap<>();
- for(Map.Entry<String, Class<?>> entry : fields) {
+ for (Map.Entry<String, Class<?>> entry : fields) {
fmap.put(entry.getKey(), entry.getValue());
}
@@ -838,7 +871,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
solrParams.add(CommonParams.Q, query);
Metric[] metrics = buildMetrics(metricPairs, false).toArray(new Metric[0]);
- for(Metric metric : metrics) {
+ for (Metric metric : metrics) {
Class<?> c = fmap.get(metric.getIdentifier());
if (!metric.outputLong && Long.class.equals(c)) {
metric.outputLong = true;
@@ -848,18 +881,21 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
return new StatsStream(zk, collection, solrParams, metrics);
}
- public <T> Queryable<T> asQueryable(QueryProvider queryProvider, SchemaPlus schema, String tableName) {
+ public <T> Queryable<T> asQueryable(
+ QueryProvider queryProvider, SchemaPlus schema, String tableName) {
return new SolrQueryable<>(queryProvider, schema, this, tableName);
}
public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) {
final RelOptCluster cluster = context.getCluster();
- return new SolrTableScan(cluster, cluster.traitSetOf(SolrRel.CONVENTION), relOptTable, this, null);
+ return new SolrTableScan(
+ cluster, cluster.traitSetOf(SolrRel.CONVENTION), relOptTable, this, null);
}
@SuppressWarnings("WeakerAccess")
public static class SolrQueryable<T> extends AbstractTableQueryable<T> {
- SolrQueryable(QueryProvider queryProvider, SchemaPlus schema, SolrTable table, String tableName) {
+ SolrQueryable(
+ QueryProvider queryProvider, SchemaPlus schema, SolrTable table, String tableName) {
super(queryProvider, schema, table, tableName);
}
@@ -877,21 +913,41 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
return schema.unwrap(SolrSchema.class).properties;
}
- /** Called via code-generation.
+ /**
+ * Called via code-generation.
*
* @see SolrMethod#SOLR_QUERYABLE_QUERY
*/
@SuppressWarnings({"UnusedDeclaration"})
- public Enumerable<Object> query(List<Map.Entry<String, Class<?>>> fields, String query, List<Pair<String, String>> order,
- List<String> buckets, List<Pair<String, String>> metricPairs, String limit, String negativeQuery, String havingPredicate, String offset) {
- return getTable().query(getProperties(), fields, query, order, buckets, metricPairs, limit, negativeQuery, havingPredicate, offset);
+ public Enumerable<Object> query(
+ List<Map.Entry<String, Class<?>>> fields,
+ String query,
+ List<Pair<String, String>> order,
+ List<String> buckets,
+ List<Pair<String, String>> metricPairs,
+ String limit,
+ String negativeQuery,
+ String havingPredicate,
+ String offset) {
+ return getTable()
+ .query(
+ getProperties(),
+ fields,
+ query,
+ order,
+ buckets,
+ metricPairs,
+ limit,
+ negativeQuery,
+ havingPredicate,
+ offset);
}
}
private static FieldComparator[] getComps(List<Pair<String, String>> orders) {
FieldComparator[] comps = new FieldComparator[orders.size()];
- for(int i=0; i<orders.size(); i++) {
- Pair<String,String> sortItem = orders.get(i);
+ for (int i = 0; i < orders.size(); i++) {
+ Pair<String, String> sortItem = orders.get(i);
String ordering = sortItem.getValue();
ComparatorOrder comparatorOrder = ascDescComp(ordering);
String sortKey = sortItem.getKey();
@@ -902,7 +958,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
}
private static ComparatorOrder ascDescComp(String s) {
- if(s.toLowerCase(Locale.ROOT).contains("desc")) {
+ if (s.toLowerCase(Locale.ROOT).contains("desc")) {
return ComparatorOrder.DESCENDING;
} else {
return ComparatorOrder.ASCENDING;
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTableScan.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTableScan.java
index d0e6194..ed264fd 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTableScan.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrTableScan.java
@@ -16,6 +16,7 @@
*/
package org.apache.solr.handler.sql;
+import java.util.List;
import org.apache.calcite.adapter.enumerable.EnumerableRules;
import org.apache.calcite.plan.*;
import org.apache.calcite.rel.RelNode;
@@ -24,11 +25,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rel.rules.CoreRules;
import org.apache.calcite.rel.type.RelDataType;
-import java.util.List;
-
-/**
- * Relational expression representing a scan of a Solr collection.
- */
+/** Relational expression representing a scan of a Solr collection. */
class SolrTableScan extends TableScan implements SolrRel {
private final SolrTable solrTable;
private final RelDataType projectRowType;
@@ -36,14 +33,18 @@ class SolrTableScan extends TableScan implements SolrRel {
/**
* Creates a SolrTableScan.
*
- * @param cluster Cluster
- * @param traitSet Traits
- * @param table Table
- * @param solrTable Solr table
+ * @param cluster Cluster
+ * @param traitSet Traits
+ * @param table Table
+ * @param solrTable Solr table
* @param projectRowType Fields and types to project; null to project raw row
*/
- SolrTableScan(RelOptCluster cluster, RelTraitSet traitSet, RelOptTable table, SolrTable solrTable,
- RelDataType projectRowType) {
+ SolrTableScan(
+ RelOptCluster cluster,
+ RelTraitSet traitSet,
+ RelOptTable table,
+ SolrTable solrTable,
+ RelDataType projectRowType) {
super(cluster, traitSet, table);
this.solrTable = solrTable;
this.projectRowType = projectRowType;
@@ -52,7 +53,8 @@ class SolrTableScan extends TableScan implements SolrRel {
assert getConvention() == SolrRel.CONVENTION;
}
- @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) {
+ @Override
+ public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) {
final float f = projectRowType == null ? 1f : (float) projectRowType.getFieldCount() / 100f;
return super.computeSelfCost(planner, mq).multiplyBy(.1 * f);
}
@@ -75,9 +77,12 @@ class SolrTableScan extends TableScan implements SolrRel {
planner.addRule(rule);
}
- // Solr's impl only supports LogicalAggregate, so don't let Calcite convert LogicalAggregate's to Enumerable (SOLR-15974)
+ // Solr's impl only supports LogicalAggregate, so don't let Calcite convert LogicalAggregate's
+ // to Enumerable (SOLR-15974)
planner.removeRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
- planner.removeRule(CoreRules.FILTER_REDUCE_EXPRESSIONS); // prevent AND NOT from being reduced away, see SOLR-15461
+ planner.removeRule(
+ CoreRules
+ .FILTER_REDUCE_EXPRESSIONS); // prevent AND NOT from being reduced away, see SOLR-15461
}
public void implement(Implementor implementor) {
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
index acea8bd..82dfb4b 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
@@ -17,6 +17,10 @@
package org.apache.solr.handler.sql;
import com.google.common.collect.Lists;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
import org.apache.calcite.adapter.enumerable.*;
import org.apache.calcite.linq4j.tree.BlockBuilder;
import org.apache.calcite.linq4j.tree.Expression;
@@ -31,14 +35,7 @@ import org.apache.calcite.runtime.Hook;
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.Pair;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Relational expression representing a scan of a table in Solr
- */
+/** Relational expression representing a scan of a table in Solr */
class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
SolrToEnumerableConverter(RelOptCluster cluster, RelTraitSet traits, RelNode input) {
super(cluster, ConventionTraitDef.INSTANCE, traits, input);
@@ -60,12 +57,17 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
final SolrRel.Implementor solrImplementor = new SolrRel.Implementor();
solrImplementor.visitChild(0, getInput());
final RelDataType rowType = getRowType();
- final PhysType physType = PhysTypeImpl.of(implementor.getTypeFactory(), rowType, pref.prefer(JavaRowFormat.ARRAY));
- final Expression table = list.append("table", solrImplementor.table.getExpression(SolrTable.SolrQueryable.class));
+ final PhysType physType =
+ PhysTypeImpl.of(implementor.getTypeFactory(), rowType, pref.prefer(JavaRowFormat.ARRAY));
+ final Expression table =
+ list.append("table", solrImplementor.table.getExpression(SolrTable.SolrQueryable.class));
final Expression fields =
- list.append("fields",
+ list.append(
+ "fields",
constantArrayList(
- Pair.zip(generateFields(SolrRules.solrFieldNames(rowType), solrImplementor.fieldMappings),
+ Pair.zip(
+ generateFields(
+ SolrRules.solrFieldNames(rowType), solrImplementor.fieldMappings),
new AbstractList<Class<?>>() {
@Override
public Class<?> get(int index) {
@@ -78,16 +80,39 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
}
}),
Pair.class));
- final Expression query = list.append("query", Expressions.constant(solrImplementor.query, String.class));
- final Expression orders = list.append("orders", constantArrayList(solrImplementor.orders, Pair.class));
- final Expression buckets = list.append("buckets", constantArrayList(solrImplementor.buckets, String.class));
- final Expression metricPairs = list.append("metricPairs", constantArrayList(solrImplementor.metricPairs, Pair.class));
+ final Expression query =
+ list.append("query", Expressions.constant(solrImplementor.query, String.class));
+ final Expression orders =
+ list.append("orders", constantArrayList(solrImplementor.orders, Pair.class));
+ final Expression buckets =
+ list.append("buckets", constantArrayList(solrImplementor.buckets, String.class));
+ final Expression metricPairs =
+ list.append("metricPairs", constantArrayList(solrImplementor.metricPairs, Pair.class));
final Expression limit = list.append("limit", Expressions.constant(solrImplementor.limitValue));
- final Expression negativeQuery = list.append("negativeQuery", Expressions.constant(Boolean.toString(solrImplementor.negativeQuery), String.class));
- final Expression havingPredicate = list.append("havingTest", Expressions.constant(solrImplementor.havingPredicate, String.class));
- final Expression offset = list.append("offset", Expressions.constant(solrImplementor.offsetValue));
- Expression enumerable = list.append("enumerable", Expressions.call(table, SolrMethod.SOLR_QUERYABLE_QUERY.method,
- fields, query, orders, buckets, metricPairs, limit, negativeQuery, havingPredicate, offset));
+ final Expression negativeQuery =
+ list.append(
+ "negativeQuery",
+ Expressions.constant(Boolean.toString(solrImplementor.negativeQuery), String.class));
+ final Expression havingPredicate =
+ list.append(
+ "havingTest", Expressions.constant(solrImplementor.havingPredicate, String.class));
+ final Expression offset =
+ list.append("offset", Expressions.constant(solrImplementor.offsetValue));
+ Expression enumerable =
+ list.append(
+ "enumerable",
+ Expressions.call(
+ table,
+ SolrMethod.SOLR_QUERYABLE_QUERY.method,
+ fields,
+ query,
+ orders,
+ buckets,
+ metricPairs,
+ limit,
+ negativeQuery,
+ havingPredicate,
+ offset));
Hook.QUERY_PLAN.run(query);
list.add(Expressions.return_(null, enumerable));
return implementor.result(physType, list.toBlock());
@@ -95,11 +120,11 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
private List<String> generateFields(List<String> queryFields, Map<String, String> fieldMappings) {
- if(fieldMappings.isEmpty()) {
+ if (fieldMappings.isEmpty()) {
return queryFields;
} else {
List<String> fields = new ArrayList<>();
- for(String field : queryFields) {
+ for (String field : queryFields) {
fields.add(getField(fieldMappings, field));
}
return fields;
@@ -108,9 +133,9 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
private String getField(Map<String, String> fieldMappings, String field) {
String retField = field;
- while(fieldMappings.containsKey(field)) {
+ while (fieldMappings.containsKey(field)) {
field = fieldMappings.getOrDefault(field, retField);
- if(retField.equals(field)) {
+ if (retField.equals(field)) {
break;
} else {
retField = field;
@@ -119,17 +144,15 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
return retField;
}
- /**
- * E.g. {@code constantArrayList("x", "y")} returns
- * "Arrays.asList('x', 'y')".
- */
+ /** E.g. {@code constantArrayList("x", "y")} returns "Arrays.asList('x', 'y')". */
private static <T> MethodCallExpression constantArrayList(List<T> values, Class<?> clazz) {
- return Expressions.call(BuiltInMethod.ARRAYS_AS_LIST.method,
- Expressions.newArrayInit(clazz, constantList(values)));
+ return Expressions.call(
+ BuiltInMethod.ARRAYS_AS_LIST.method, Expressions.newArrayInit(clazz, constantList(values)));
}
/**
- * E.g. {@code constantList("x", "y")} returns "{ConstantExpression("x"), ConstantExpression("y")}".
+ * E.g. {@code constantList("x", "y")} returns "{ConstantExpression("x"),
+ * ConstantExpression("y")}".
*/
private static <T> List<Expression> constantList(List<T> values) {
return Lists.transform(values, Expressions::constant);
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverterRule.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverterRule.java
index 80365ca..ff9ac21 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverterRule.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverterRule.java
@@ -22,13 +22,18 @@ import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterRule;
/**
- * Rule to convert a relational expression from {@link SolrRel#CONVENTION} to {@link EnumerableConvention}.
+ * Rule to convert a relational expression from {@link SolrRel#CONVENTION} to {@link
+ * EnumerableConvention}.
*/
class SolrToEnumerableConverterRule extends ConverterRule {
static final ConverterRule INSTANCE = new SolrToEnumerableConverterRule();
private SolrToEnumerableConverterRule() {
- super(RelNode.class, SolrRel.CONVENTION, EnumerableConvention.INSTANCE, "SolrToEnumerableConverterRule");
+ super(
+ RelNode.class,
+ SolrRel.CONVENTION,
+ EnumerableConvention.INSTANCE,
+ "SolrToEnumerableConverterRule");
}
@Override
diff --git a/solr/modules/sql/src/java/org/apache/solr/handler/sql/package-info.java b/solr/modules/sql/src/java/org/apache/solr/handler/sql/package-info.java
index e4ce787..d7e1d51 100644
--- a/solr/modules/sql/src/java/org/apache/solr/handler/sql/package-info.java
+++ b/solr/modules/sql/src/java/org/apache/solr/handler/sql/package-info.java
@@ -16,6 +16,7 @@
*/
/**
- * Classes related to Apache Calcite implementation in {@link org.apache.solr.handler.sql.SQLHandler}
+ * Classes related to Apache Calcite implementation in {@link
+ * org.apache.solr.handler.sql.SQLHandler}
*/
package org.apache.solr.handler.sql;
diff --git a/solr/modules/sql/src/test/org/apache/solr/handler/sql/SQLWithAuthzEnabledTest.java b/solr/modules/sql/src/test/org/apache/solr/handler/sql/SQLWithAuthzEnabledTest.java
index 3205988..22aeb97 100644
--- a/solr/modules/sql/src/test/org/apache/solr/handler/sql/SQLWithAuthzEnabledTest.java
+++ b/solr/modules/sql/src/test/org/apache/solr/handler/sql/SQLWithAuthzEnabledTest.java
@@ -17,10 +17,11 @@
package org.apache.solr.handler.sql;
+import static org.apache.solr.security.Sha256AuthenticationProvider.getSaltedHashedValue;
+
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
-
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.client.solrj.io.Tuple;
@@ -37,8 +38,6 @@ import org.apache.solr.security.RuleBasedAuthorizationPlugin;
import org.junit.BeforeClass;
import org.junit.Test;
-import static org.apache.solr.security.Sha256AuthenticationProvider.getSaltedHashedValue;
-
public class SQLWithAuthzEnabledTest extends SolrCloudTestCase {
private static final String ADMIN_USER = "solr";
@@ -49,22 +48,32 @@ public class SQLWithAuthzEnabledTest extends SolrCloudTestCase {
@BeforeClass
public static void setupClusterWithSecurityEnabled() throws Exception {
- final String SECURITY_JSON = Utils.toJSONString
- (Map.of("authorization",
- Map.of("class", RuleBasedAuthorizationPlugin.class.getName(),
- "user-role", Map.of(SQL_USER, "sql", ADMIN_USER, "admin", SAD_USER, "sad"),
- "permissions", Arrays.asList(
- Map.of("name", "sql", "role", "sql", "path", "/sql", "collection", "*"),
- Map.of("name", "export", "role", "sql", "path", "/export", "collection", "*"),
- Map.of("name", "all", "role", "admin"))
- ),
- "authentication",
- Map.of("class", BasicAuthPlugin.class.getName(),
- "blockUnknown", true,
- "credentials", Map.of(
- SAD_USER, getSaltedHashedValue(PASS),
- SQL_USER, getSaltedHashedValue(PASS),
- ADMIN_USER, getSaltedHashedValue(PASS)))));
+ final String SECURITY_JSON =
+ Utils.toJSONString(
+ Map.of(
+ "authorization",
+ Map.of(
+ "class",
+ RuleBasedAuthorizationPlugin.class.getName(),
+ "user-role",
+ Map.of(SQL_USER, "sql", ADMIN_USER, "admin", SAD_USER, "sad"),
+ "permissions",
+ Arrays.asList(
+ Map.of("name", "sql", "role", "sql", "path", "/sql", "collection", "*"),
+ Map.of(
+ "name", "export", "role", "sql", "path", "/export", "collection", "*"),
+ Map.of("name", "all", "role", "admin"))),
+ "authentication",
+ Map.of(
+ "class",
+ BasicAuthPlugin.class.getName(),
+ "blockUnknown",
+ true,
+ "credentials",
+ Map.of(
+ SAD_USER, getSaltedHashedValue(PASS),
+ SQL_USER, getSaltedHashedValue(PASS),
+ ADMIN_USER, getSaltedHashedValue(PASS)))));
configureCluster(2)
.addConfig("conf", configset("sql"))
@@ -79,23 +88,30 @@ public class SQLWithAuthzEnabledTest extends SolrCloudTestCase {
@Test
public void testSqlAuthz() throws Exception {
- doAsAdmin(CollectionAdminRequest.createCollection(collectionName, "conf", 1, 2, 0, 0)).process(cluster.getSolrClient());
- waitForState("Expected collection to be created with 1 shards and 2 replicas", collectionName, clusterShape(1, 2));
+ doAsAdmin(CollectionAdminRequest.createCollection(collectionName, "conf", 1, 2, 0, 0))
+ .process(cluster.getSolrClient());
+ waitForState(
+ "Expected collection to be created with 1 shards and 2 replicas",
+ collectionName,
+ clusterShape(1, 2));
- doAsAdmin(new UpdateRequest()
- .add("id", "1")
- .add("id", "2")
- .add("id", "3")
- .add("id", "4")
- .add("id", "5")
- .add("id", "6")
- .add("id", "7")
- .add("id", "8")).commit(cluster.getSolrClient(), collectionName);
+ doAsAdmin(
+ new UpdateRequest()
+ .add("id", "1")
+ .add("id", "2")
+ .add("id", "3")
+ .add("id", "4")
+ .add("id", "5")
+ .add("id", "6")
+ .add("id", "7")
+ .add("id", "8"))
+ .commit(cluster.getSolrClient(), collectionName);
ModifiableSolrParams params = new ModifiableSolrParams();
params.set(CommonParams.QT, "/sql");
params.set("stmt", "select id from " + collectionName);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + collectionName;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + collectionName;
SolrStream solrStream = new SolrStream(baseUrl, params);
solrStream.setCredentials(SAD_USER, PASS);
@@ -112,8 +128,7 @@ public class SQLWithAuthzEnabledTest extends SolrCloudTestCase {
int count = 0;
try (tupleStream) {
tupleStream.open();
- for (Tuple t = tupleStream.read(); !t.EOF; t = tupleStream.read())
- count++;
+ for (Tuple t = tupleStream.read(); !t.EOF; t = tupleStream.read()) count++;
}
return count;
}
diff --git a/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java b/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java
index 4fcd6d6..a3f35b5 100644
--- a/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java
+++ b/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java
@@ -26,7 +26,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.LuceneTestCase.Slow;
@@ -59,9 +58,7 @@ public class TestSQLHandler extends SolrCloudTestCase {
@BeforeClass
public static void setupCluster() throws Exception {
- configureCluster(4)
- .addConfig("conf", configset("sql"))
- .configure();
+ configureCluster(4).addConfig("conf", configset("sql")).configure();
String collection;
useAlias = random().nextBoolean();
@@ -76,37 +73,151 @@ public class TestSQLHandler extends SolrCloudTestCase {
.process(cluster.getSolrClient());
cluster.waitForActiveCollection(collection, 2, 2);
if (useAlias) {
- CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection).process(cluster.getSolrClient());
+ CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection)
+ .process(cluster.getSolrClient());
}
}
@Before
public void cleanIndex() throws Exception {
- new UpdateRequest()
- .deleteByQuery("*:*")
- .commit(cluster.getSolrClient(), COLLECTIONORALIAS);
+ new UpdateRequest().deleteByQuery("*:*").commit(cluster.getSolrClient(), COLLECTIONORALIAS);
}
@Test
public void testBasicSelect() throws Exception {
-
new UpdateRequest()
- .add("id", "1", "text_t", "XXXX XXXX", "str_s", "a", "field_i", "7", "field_f", "7.5", "field_d", "7.5", "field_l", "7")
- .add("id", "2", "text_t", "XXXX XXXX", "str_s", "b", "field_i", "8", "field_f", "8.5", "field_d", "8.5", "field_l", "8")
- .add("id", "3", "text_t", "XXXX XXXX", "str_s", "a", "field_i", "20", "field_f", "20.5", "field_d", "20.5", "field_l", "20")
- .add("id", "4", "text_t", "XXXX XXXX", "str_s", "b", "field_i", "11", "field_f", "11.5", "field_d", "11.5", "field_l", "11")
- .add("id", "5", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "30", "field_f", "30.5", "field_d", "30.5", "field_l", "30")
- .add("id", "6", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "40", "field_f", "40.5", "field_d", "40.5", "field_l", "40")
- .add("id", "7", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "50", "field_f", "50.5", "field_d", "50.5", "field_l", "50")
- .add("id", "8", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "60", "field_f", "60.5", "field_d", "60.5", "field_l", "60")
+ .add(
+ "id",
+ "1",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "a",
+ "field_i",
+ "7",
+ "field_f",
+ "7.5",
+ "field_d",
+ "7.5",
+ "field_l",
+ "7")
+ .add(
+ "id",
+ "2",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "b",
+ "field_i",
+ "8",
+ "field_f",
+ "8.5",
+ "field_d",
+ "8.5",
+ "field_l",
+ "8")
+ .add(
+ "id",
+ "3",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "a",
+ "field_i",
+ "20",
+ "field_f",
+ "20.5",
+ "field_d",
+ "20.5",
+ "field_l",
+ "20")
+ .add(
+ "id",
+ "4",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "b",
+ "field_i",
+ "11",
+ "field_f",
+ "11.5",
+ "field_d",
+ "11.5",
+ "field_l",
+ "11")
+ .add(
+ "id",
+ "5",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "30",
+ "field_f",
+ "30.5",
+ "field_d",
+ "30.5",
+ "field_l",
+ "30")
+ .add(
+ "id",
+ "6",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "40",
+ "field_f",
+ "40.5",
+ "field_d",
+ "40.5",
+ "field_l",
+ "40")
+ .add(
+ "id",
+ "7",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "50",
+ "field_f",
+ "50.5",
+ "field_d",
+ "50.5",
+ "field_l",
+ "50")
+ .add(
+ "id",
+ "8",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "60",
+ "field_f",
+ "60.5",
+ "field_d",
+ "60.5",
+ "field_l",
+ "60")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- SolrParams sParams = params(CommonParams.QT, "/sql",
- "stmt",
- "select id, field_i, str_s, field_f, field_d, field_l from collection1 where (text_t='(XXXX)' OR text_t='XXXX') AND text_t='XXXX' order by field_i desc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id, field_i, str_s, field_f, field_d, field_l from collection1 where (text_t='(XXXX)' OR text_t='XXXX') AND text_t='XXXX' order by field_i desc");
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
List<Tuple> tuples = getTuples(sParams, baseUrl);
assert (tuples.size() == 8);
@@ -185,11 +296,15 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals(tuple.getLong("field_l").longValue(), 7);
// Assert field order
- //assertResponseContains(clients.get(0), sParams, "{\"docs\":[{\"id\":\"8\",\"field_i\":60,\"str_s\":\"c\",\"field_i\":60,\"field_f\":60.5,\"field_d\":60.5,\"field_l\":60}");
+ // assertResponseContains(clients.get(0), sParams,
+ // "{\"docs\":[{\"id\":\"8\",\"field_i\":60,\"str_s\":\"c\",\"field_i\":60,\"field_f\":60.5,\"field_d\":60.5,\"field_l\":60}");
-
- sParams = params(CommonParams.QT, "/sql", "stmt",
- "select id, field_i, str_s from collection1 where text_t='XXXX' order by id desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id, field_i, str_s from collection1 where text_t='XXXX' order by id desc");
tuples = getTuples(sParams, baseUrl);
@@ -235,8 +350,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 7);
assert (tuple.get("str_s").equals("a"));
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id, field_i, str_s from collection1 where text_t='XXXX' order by field_i desc limit 1");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id, field_i, str_s from collection1 where text_t='XXXX' order by field_i desc limit 1");
tuples = getTuples(sParams, baseUrl);
@@ -247,8 +366,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
assert (tuple.get("str_s").equals("c"));
- sParams = params(CommonParams.QT, "/sql", "stmt",
- "select id, field_i, str_s from collection1 where text_t='XXXX' AND id='(1 2 3)' order by field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id, field_i, str_s from collection1 where text_t='XXXX' AND id='(1 2 3)' order by field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -269,9 +392,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 7);
assert (tuple.get("str_s").equals("a"));
- sParams = params(CommonParams.QT, "/sql",
- "stmt",
- "select id as myId, field_i as myInt, str_s as myString from collection1 where text_t='XXXX' AND id='(1 2 3)' order by myInt desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id as myId, field_i as myInt, str_s as myString from collection1 where text_t='XXXX' AND id='(1 2 3)' order by myInt desc");
tuples = getTuples(sParams, baseUrl);
@@ -292,9 +418,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("myInt") == 7);
assert (tuple.get("myString").equals("a"));
- sParams = params(CommonParams.QT, "/sql",
- "stmt",
- "select id as myId, field_i as myInt, str_s as myString from collection1 where text_t='XXXX' AND id='(1 2 3)' order by field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id as myId, field_i as myInt, str_s as myString from collection1 where text_t='XXXX' AND id='(1 2 3)' order by field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -316,13 +445,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.get("myString").equals("a"));
// SOLR-8845 - Test to make sure that 1 = 0 works for things like Spark SQL
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id, field_i, str_s from collection1 where 1 = 0");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id, field_i, str_s from collection1 where 1 = 0");
tuples = getTuples(sParams, baseUrl);
assertEquals(0, tuples.size());
-
}
@Test
@@ -333,17 +465,62 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "2", "text_t", "XXXX XXXX", "str_s", "b", "field_i", "8")
.add("id", "3", "text_t", "XXXX XXXX", "str_s", "a", "field_i", "20")
.add("id", "4", "text_t", "XXXX XXXX", "str_s", "b", "field_i", "11")
- .add("id", "5", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "30", "specialchars_s", "witha|pipe")
- .add("id", "6", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "40", "specialchars_s", "witha\\slash")
- .add("id", "7", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "50", "specialchars_s", "witha!bang")
- .add("id", "8", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "60", "specialchars_s", "witha\"quote")
+ .add(
+ "id",
+ "5",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "30",
+ "specialchars_s",
+ "witha|pipe")
+ .add(
+ "id",
+ "6",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "40",
+ "specialchars_s",
+ "witha\\slash")
+ .add(
+ "id",
+ "7",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "50",
+ "specialchars_s",
+ "witha!bang")
+ .add(
+ "id",
+ "8",
+ "text_t",
+ "XXXX XXXX",
+ "str_s",
+ "c",
+ "field_i",
+ "60",
+ "specialchars_s",
+ "witha\"quote")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
// Equals
- SolrParams sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id from collection1 where id = 1 order by id asc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where id = 1 order by id asc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -353,8 +530,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals("1", tuple.get("id"));
// Not Equals <>
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id from collection1 where id <> 1 order by id asc limit 10");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where id <> 1 order by id asc limit 10");
tuples = getTuples(sParams, baseUrl);
@@ -400,8 +581,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
// assertEquals(8L, tuple.get("id"));
// Less than
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id from collection1 where id < 2 order by id asc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where id < 2 order by id asc");
tuples = getTuples(sParams, baseUrl);
@@ -411,8 +596,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals("1", tuple.get("id"));
// Less than equal
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id from collection1 where id <= 2 order by id asc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where id <= 2 order by id asc");
tuples = getTuples(sParams, baseUrl);
@@ -424,8 +613,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals("2", tuple.get("id"));
// Greater than
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id from collection1 where id > 7 order by id asc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where id > 7 order by id asc");
tuples = getTuples(sParams, baseUrl);
@@ -435,8 +628,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals("8", tuple.get("id"));
// Greater than equal
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id from collection1 where id >= 7 order by id asc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where id >= 7 order by id asc");
tuples = getTuples(sParams, baseUrl);
@@ -471,10 +668,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "8", "Text_t", "XXXX XXXX", "Str_s", "c", "Field_i", "60")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select id, Field_i, Str_s from collection1 where Text_t='XXXX' order by Field_i desc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select id, Field_i, Str_s from collection1 where Text_t='XXXX' order by Field_i desc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -523,13 +727,15 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.get("Str_s").equals("a"));
// TODO get sum(Field_i) as named one
- sParams = params(CommonParams.QT, "/sql",
- "stmt",
- "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
tuples = getTuples(sParams, baseUrl);
-
assertEquals(tuples.toString(), 2, tuples.size());
tuple = tuples.get(0);
@@ -540,9 +746,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.get("Str_s").equals("a"));
assert (tuple.getDouble("EXPR$1") == 7);
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt",
- "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
tuples = getTuples(sParams, baseUrl);
@@ -555,7 +766,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
tuple = tuples.get(1);
assert (tuple.get("Str_s").equals("a"));
assert (tuple.getDouble("EXPR$1") == 7);
-
}
@Test
@@ -572,12 +782,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "8", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "60")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
-
-
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -611,8 +826,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
// reverse the sort
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -643,8 +864,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 1);
// reverse the sort
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select distinct str_s as myString, field_i as myInt from collection1 order by str_s desc, myInt desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select distinct str_s as myString, field_i as myInt from collection1 order by str_s desc, myInt desc");
tuples = getTuples(sParams, baseUrl);
@@ -675,8 +902,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("myInt") == 1);
// test with limit
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
tuples = getTuples(sParams, baseUrl);
@@ -691,8 +924,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 50);
// Test without a sort. Sort should be asc by default.
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select distinct str_s, field_i from collection1");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select distinct str_s, field_i from collection1");
tuples = getTuples(sParams, baseUrl);
@@ -728,8 +967,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
// Test with a predicate.
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select distinct str_s, field_i from collection1 where str_s = 'a'");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select distinct str_s, field_i from collection1 where str_s = 'a'");
tuples = getTuples(sParams, baseUrl);
@@ -742,7 +987,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
tuple = tuples.get(1);
assert (tuple.get("str_s").equals("a"));
assert (tuple.getLong("field_i") == 20);
-
}
@Test
@@ -759,10 +1003,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "8", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "60")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -792,8 +1043,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
// reverse the sort
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -823,8 +1080,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.get("str_s").equals("a"));
assert (tuple.getLong("field_i") == 1);
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s as myString, field_i from collection1 order by myString desc, field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s as myString, field_i from collection1 order by myString desc, field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -855,8 +1118,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 1);
// test with limit
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
tuples = getTuples(sParams, baseUrl);
@@ -871,8 +1140,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 50);
// Test without a sort. Sort should be asc by default.
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1");
tuples = getTuples(sParams, baseUrl);
@@ -903,11 +1178,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
// Test with a predicate.
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 where str_s = 'a'");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 where str_s = 'a'");
tuples = getTuples(sParams, baseUrl);
- Assert.assertEquals (tuples.toString(), 2, tuples.size());
+ Assert.assertEquals(tuples.toString(), 2, tuples.size());
tuple = tuples.get(0);
assert (tuple.get("str_s").equals("a"));
@@ -916,7 +1197,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
tuple = tuples.get(1);
assert (tuple.get("str_s").equals("a"));
assert (tuple.getLong("field_i") == 20);
-
}
@Test
@@ -933,9 +1213,18 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "8", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "60")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -968,8 +1257,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
// reverse the sort
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1000,8 +1297,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 1);
// reverse the sort
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s as myString, field_i from collection1 order by myString desc, field_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s as myString, field_i from collection1 order by myString desc, field_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1032,8 +1337,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 1);
// test with limit
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
tuples = getTuples(sParams, baseUrl);
@@ -1048,8 +1361,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 50);
// Test without a sort. Sort should be asc by default.
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1");
tuples = getTuples(sParams, baseUrl);
@@ -1080,8 +1401,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("field_i") == 60);
// Test with a predicate.
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select distinct str_s, field_i from collection1 where str_s = 'a'");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select distinct str_s, field_i from collection1 where str_s = 'a'");
tuples = getTuples(sParams, baseUrl);
@@ -1094,7 +1423,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
tuple = tuples.get(1);
assert (tuple.get("str_s").equals("a"));
assert (tuple.getLong("field_i") == 20);
-
}
@Test
@@ -1112,12 +1440,19 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "9", "text_t", "XXXX XXXY", "str_s", "d", "field_i", "70")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
- "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s " +
- "order by sum(field_i) asc limit 2");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s "
+ + "order by sum(field_i) asc limit 2");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -1142,10 +1477,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 20); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 13.5D); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
- "avg(field_i) from collection1 where text_t='XXXX' group by str_s " +
- "order by sum(field_i) asc limit 2");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
+ + "avg(field_i) from collection1 where text_t='XXXX' group by str_s "
+ + "order by sum(field_i) asc limit 2");
tuples = getTuples(sParams, baseUrl);
@@ -1168,10 +1509,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 20); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 14); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
- + "cast(avg(1.0 * field_i) as float) from collection1 where (text_t='XXXX' AND NOT (text_t='XXXY')) "
- + "group by str_s order by str_s desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where (text_t='XXXX' AND NOT (text_t='XXXY')) "
+ + "group by str_s order by str_s desc");
tuples = getTuples(sParams, baseUrl);
@@ -1204,10 +1551,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 20); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 13.5D); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s as myString, count(*), sum(field_i) as mySum, min(field_i), max(field_i), "
- + "cast(avg(1.0 * field_i) as float) from collection1 where (text_t='XXXX' AND NOT (text_t='XXXY')) "
- + "group by str_s order by myString desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s as myString, count(*), sum(field_i) as mySum, min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where (text_t='XXXX' AND NOT (text_t='XXXY')) "
+ + "group by str_s order by myString desc");
tuples = getTuples(sParams, baseUrl);
@@ -1240,9 +1593,15 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 20); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 13.5D); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
- "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s having sum(field_i) = 19");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s having sum(field_i) = 19");
tuples = getTuples(sParams, baseUrl);
@@ -1256,10 +1615,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 11); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 9.5D); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
- "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s " +
- "having ((sum(field_i) = 19) AND (min(field_i) = 8))");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s "
+ + "having ((sum(field_i) = 19) AND (min(field_i) = 8))");
tuples = getTuples(sParams, baseUrl);
@@ -1273,10 +1638,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 11); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 9.5D); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i) as mySum, min(field_i), max(field_i), " +
- "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s " +
- "having ((sum(field_i) = 19) AND (min(field_i) = 8))");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i) as mySum, min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s "
+ + "having ((sum(field_i) = 19) AND (min(field_i) = 8))");
tuples = getTuples(sParams, baseUrl);
@@ -1290,15 +1661,20 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getDouble("EXPR$4") == 11); // max(field_i)
assert (tuple.getDouble("EXPR$5") == 9.5D); // avg(field_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
- "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s " +
- "having ((sum(field_i) = 19) AND (min(field_i) = 100))");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
+ + "cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s "
+ + "having ((sum(field_i) = 19) AND (min(field_i) = 100))");
tuples = getTuples(sParams, baseUrl);
assert (tuples.size() == 0);
-
}
@Test
@@ -1317,12 +1693,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add(id, "9", "a_s", "hello0", "a_i", "14", "a_f", "10")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
-
- SolrParams sParams = params(CommonParams.QT, "/sql", "stmt",
- "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), " +
- "min(a_f), max(a_f), avg(a_f) from collection1");
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), "
+ + "min(a_f), max(a_f), avg(a_f) from collection1");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -1352,10 +1732,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertTrue(maxf == 10.0D);
assertTrue(avgf == 5.5D);
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select count(*) as myCount, sum(a_i) as mySum, min(a_i) as myMin, max(a_i) as myMax, " +
- "cast(avg(1.0 * a_i) as float) as myAvg, sum(a_f), min(a_f), max(a_f), avg(a_f) from collection1");
-
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select count(*) as myCount, sum(a_i) as mySum, min(a_i) as myMin, max(a_i) as myMax, "
+ + "cast(avg(1.0 * a_i) as float) as myAvg, sum(a_f), min(a_f), max(a_f), avg(a_f) from collection1");
tuples = getTuples(sParams, baseUrl);
@@ -1386,10 +1769,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertTrue(avgf == 5.5D);
// Test without cast on average int field
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select count(*) as myCount, sum(a_i) as mySum, min(a_i) as myMin, max(a_i) as myMax, " +
- "avg(a_i) as myAvg, sum(a_f), min(a_f), max(a_f), avg(a_f) from collection1");
-
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select count(*) as myCount, sum(a_i) as mySum, min(a_i) as myMin, max(a_i) as myMax, "
+ + "avg(a_i) as myAvg, sum(a_f), min(a_f), max(a_f), avg(a_f) from collection1");
tuples = getTuples(sParams, baseUrl);
@@ -1421,10 +1807,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertTrue(avgf == 5.5D);
// Test where clause hits
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), " +
- "min(a_f), max(a_f), avg(a_f) from collection1 where id = 2");
-
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), "
+ + "min(a_f), max(a_f), avg(a_f) from collection1 where id = 2");
tuples = getTuples(sParams, baseUrl);
@@ -1453,9 +1842,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertTrue(avgf == 2.0);
// Test zero hits
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), " +
- "min(a_f), max(a_f), avg(a_f) from collection1 where a_s = 'blah'");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), "
+ + "min(a_f), max(a_f), avg(a_f) from collection1 where a_s = 'blah'");
tuples = getTuples(sParams, baseUrl);
@@ -1484,10 +1877,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertTrue(avgf == null);
// test bunch of where predicates
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), " +
- "min(a_f), max(a_f), avg(a_f) from collection1 where id = 2 AND a_s='hello0' AND a_i=2 AND a_f=2");
-
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select count(*), sum(a_i), min(a_i), max(a_i), cast(avg(1.0 * a_i) as float), sum(a_f), "
+ + "min(a_f), max(a_f), avg(a_f) from collection1 where id = 2 AND a_s='hello0' AND a_i=2 AND a_f=2");
tuples = getTuples(sParams, baseUrl);
assert (tuples.size() == 1);
@@ -1496,7 +1892,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
@Test
public void testTimeSeriesGrouping() throws Exception {
-
new UpdateRequest()
.add(id, "1", "year_i", "2015", "month_i", "11", "day_i", "7", "item_i", "5")
.add(id, "2", "year_i", "2015", "month_i", "11", "day_i", "7", "item_i", "10")
@@ -1506,13 +1901,19 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add(id, "6", "year_i", "2015", "month_i", "10", "day_i", "3", "item_i", "5")
.add(id, "7", "year_i", "2014", "month_i", "4", "day_i", "4", "item_i", "6")
.add(id, "8", "year_i", "2014", "month_i", "4", "day_i", "2", "item_i", "1")
-
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -1528,9 +1929,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("year_i") == 2014);
assert (tuple.getDouble("EXPR$1") == 7); // sum(item_i)
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i " +
- "order by year_i desc, month_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i "
+ + "order by year_i desc, month_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1551,9 +1956,13 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("month_i") == 4);
assert (tuple.getDouble("EXPR$2") == 7); // sum(item_i)
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i " +
- "order by year_i desc, month_i desc, day_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i "
+ + "order by year_i desc, month_i desc, day_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1594,7 +2003,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("month_i") == 4);
assert (tuple.getLong("day_i") == 2);
assert (tuple.getDouble("EXPR$3") == 1); // sum(item_i)
-
}
@Test
@@ -1609,13 +2017,19 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add(id, "6", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "40")
.add(id, "7", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "50")
.add(id, "8", "text_t", "XXXX XXXX", "str_s", "c", "field_i", "60")
-
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt", "select id, str_s from collection1 where text_t='XXXX' order by field_iff desc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select id, str_s from collection1 where text_t='XXXX' order by field_iff desc");
SolrStream solrStream = new SolrStream(baseUrl, sParams);
Tuple tuple = getTuple(new ExceptionStream(solrStream));
@@ -1623,8 +2037,12 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.EXCEPTION);
assert (tuple.getException().contains("Column 'field_iff' not found in any table"));
- sParams = params(CommonParams.QT, "/sql",
- "stmt", "select id, field_iff, str_s from collection1 where text_t='XXXX' order by field_iff desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id, field_iff, str_s from collection1 where text_t='XXXX' order by field_iff desc");
solrStream = new SolrStream(baseUrl, sParams);
tuple = getTuple(new ExceptionStream(solrStream));
@@ -1633,9 +2051,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getException().contains("Column 'field_iff' not found in any table"));
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt",
- "select str_s, count(*), sum(field_iff), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s having ((sum(field_iff) = 19) AND (min(field_i) = 8))");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select str_s, count(*), sum(field_iff), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s having ((sum(field_iff) = 19) AND (min(field_i) = 8))");
solrStream = new SolrStream(baseUrl, sParams);
tuple = getTuple(new ExceptionStream(solrStream));
@@ -1643,9 +2066,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.EXCEPTION);
assert (tuple.getException().contains("Column 'field_iff' not found in any table"));
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt",
- "select str_s, count(*), blah(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s having ((sum(field_i) = 19) AND (min(field_i) = 8))");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select str_s, count(*), blah(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text_t='XXXX' group by str_s having ((sum(field_i) = 19) AND (min(field_i) = 8))");
solrStream = new SolrStream(baseUrl, sParams);
tuple = getTuple(new ExceptionStream(solrStream));
@@ -1654,9 +2082,14 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getException().contains("No match found for function signature blah"));
// verify exception message formatting with wildcard query
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
- "stmt",
- "select str_s from collection1 where not_a_field LIKE 'foo%'");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select str_s from collection1 where not_a_field LIKE 'foo%'");
solrStream = new SolrStream(baseUrl, sParams);
tuple = getTuple(new ExceptionStream(solrStream));
@@ -1677,13 +2110,19 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add(id, "6", "year_i", "2015", "month_i", "10", "day_i", "3", "item_i", "5")
.add(id, "7", "year_i", "2014", "month_i", "4", "day_i", "4", "item_i", "6")
.add(id, "8", "year_i", "2014", "month_i", "4", "day_i", "2", "item_i", "1")
-
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -1699,9 +2138,15 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("year_i") == 2014);
assert (tuple.getDouble("EXPR$1") == 7); // sum(item_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i " +
- "order by year_i desc, month_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i "
+ + "order by year_i desc, month_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1722,9 +2167,15 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("month_i") == 4);
assert (tuple.getDouble("EXPR$2") == 7); // sum(item_i)
- sParams = params(CommonParams.QT, "/sql", "aggregationMode", "facet",
- "stmt", "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i " +
- "order by year_i desc, month_i desc, day_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "aggregationMode",
+ "facet",
+ "stmt",
+ "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i "
+ + "order by year_i desc, month_i desc, day_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1765,7 +2216,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("month_i") == 4);
assert (tuple.getLong("day_i") == 2);
assert (tuple.getDouble("EXPR$3") == 1); // sum(item_i)
-
}
@Test
@@ -1780,13 +2230,21 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add(id, "6", "year_i", "2015", "month_i", "10", "day_i", "3", "item_i", "5")
.add(id, "7", "year_i", "2014", "month_i", "4", "day_i", "4", "item_i", "6")
.add(id, "8", "year_i", "2014", "month_i", "4", "day_i", "2", "item_i", "1")
-
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
- SolrParams sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
List<Tuple> tuples = getTuples(sParams, baseUrl);
@@ -1796,7 +2254,8 @@ public class TestSQLHandler extends SolrCloudTestCase {
tuple = tuples.get(0);
assert (tuple.getLong("year_i") == 2015);
- assert (tuple.get("year_i") instanceof Long); // SOLR-8601, This tests that the bucket is actually a Long and not
+ assert (tuple.get("year_i")
+ instanceof Long); // SOLR-8601, This tests that the bucket is actually a Long and not
// parsed from a String.
assert (tuple.getDouble("EXPR$1") == 66); // sum(item_i)
@@ -1804,9 +2263,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("year_i") == 2014);
assert (tuple.getDouble("EXPR$1") == 7); // sum(item_i)
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i " +
- "order by year_i desc, month_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i "
+ + "order by year_i desc, month_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1829,9 +2296,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("month_i") == 4);
assert (tuple.getDouble("EXPR$2") == 7); // sum(item_i)
- sParams = params(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
- "stmt", "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i " +
- "order by year_i desc, month_i desc, day_i desc");
+ sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "numWorkers",
+ "2",
+ "aggregationMode",
+ "map_reduce",
+ "stmt",
+ "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i "
+ + "order by year_i desc, month_i desc, day_i desc");
tuples = getTuples(sParams, baseUrl);
@@ -1872,7 +2347,6 @@ public class TestSQLHandler extends SolrCloudTestCase {
assert (tuple.getLong("month_i") == 4);
assert (tuple.getLong("day_i") == 2);
assert (tuple.getDouble("EXPR$3") == 1); // sum(item_i)
-
}
protected List<Tuple> getTuples(final SolrParams params, String baseUrl) throws IOException {
@@ -1907,11 +2381,15 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "4", "text_t", "foobaz", "str_s", "d")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- SolrParams sParams = params(CommonParams.QT, "/sql",
- "stmt",
- "select id from collection1 where str_s IN ('a','b','c')");
+ SolrParams sParams =
+ params(
+ CommonParams.QT,
+ "/sql",
+ "stmt",
+ "select id from collection1 where str_s IN ('a','b','c')");
- String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
+ String baseUrl =
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
List<Tuple> tuples = getTuples(sParams, baseUrl);
assertEquals(3, tuples.size());
}
@@ -2005,14 +2483,16 @@ public class TestSQLHandler extends SolrCloudTestCase {
expectResults("SELECT id FROM $ALIAS WHERE b_is >= 2 AND b_is <= 4", 3);
expectResults("SELECT id FROM $ALIAS WHERE b_is <= 4 AND b_is >= 2", 3);
expectResults("SELECT id FROM $ALIAS WHERE b_is <= 2 OR b_is >= 8", 4);
- // tricky ~ with Solr, this should return 2 docs, but Calcite short-circuits this query and returns 0
+ // tricky ~ with Solr, this should return 2 docs, but Calcite short-circuits this query and
+ // returns 0
// Calcite sees the predicate as disjoint from a single-valued field perspective ...
expectResults("SELECT id FROM $ALIAS WHERE b_is >= 5 AND b_is <= 2", 0);
// hacky work-around the aforementioned problem ^^
expectResults("SELECT id FROM $ALIAS WHERE b_is = '(+[5 TO *] +[* TO 2])'", 2);
}
- private SolrInputDocument withMultiValuedField(String mvField, List<Object> values, String... fields) {
+ private SolrInputDocument withMultiValuedField(
+ String mvField, List<Object> values, String... fields) {
SolrInputDocument doc = new SolrInputDocument(fields);
doc.addField(mvField, values);
return doc;
@@ -2031,11 +2511,17 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "8", "a_s", "world-8", "b_s", "bar", "a_i", "5", "d_s", "c")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- List<Tuple> tuples = expectResults("SELECT a_s FROM $ALIAS WHERE a_s LIKE 'world%' AND b_s IS NOT NULL AND c_s IS NULL AND a_i BETWEEN 2 AND 4 AND d_s IN ('a','b','c') ORDER BY id ASC LIMIT 10", 3);
+ List<Tuple> tuples =
+ expectResults(
+ "SELECT a_s FROM $ALIAS WHERE a_s LIKE 'world%' AND b_s IS NOT NULL AND c_s IS NULL AND a_i BETWEEN 2 AND 4 AND d_s IN ('a','b','c') ORDER BY id ASC LIMIT 10",
+ 3);
assertEquals("world-2", tuples.get(0).getString("a_s"));
assertEquals("world-4", tuples.get(1).getString("a_s"));
assertEquals("world-6", tuples.get(2).getString("a_s"));
- tuples = expectResults("SELECT a_s FROM $ALIAS WHERE a_s NOT LIKE 'hello%' AND b_s IS NOT NULL AND c_s IS NULL AND a_i NOT BETWEEN 2 AND 4 AND d_s IN ('a','b','c') ORDER BY id ASC LIMIT 10", 1);
+ tuples =
+ expectResults(
+ "SELECT a_s FROM $ALIAS WHERE a_s NOT LIKE 'hello%' AND b_s IS NOT NULL AND c_s IS NULL AND a_i NOT BETWEEN 2 AND 4 AND d_s IN ('a','b','c') ORDER BY id ASC LIMIT 10",
+ 1);
assertEquals("world-8", tuples.get(0).getString("a_s"));
}
@@ -2052,7 +2538,10 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "8", "a_s", "world-8", "b_s", "bar", "a_i", "5", "d_s", "c")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- List<Tuple> tuples = expectResults("SELECT COUNT(1) as `the_count` FROM $ALIAS as `alias` WHERE (`alias`.`b_s`='foo' AND `alias`.`a_s` LIKE 'hell%' AND `alias`.`c_s` IS NOT NULL) HAVING (COUNT(1) > 0)", 1);
+ List<Tuple> tuples =
+ expectResults(
+ "SELECT COUNT(1) as `the_count` FROM $ALIAS as `alias` WHERE (`alias`.`b_s`='foo' AND `alias`.`a_s` LIKE 'hell%' AND `alias`.`c_s` IS NOT NULL) HAVING (COUNT(1) > 0)",
+ 1);
assertEquals(4L, (long) tuples.get(0).getLong("the_count"));
}
@@ -2075,8 +2564,10 @@ public class TestSQLHandler extends SolrCloudTestCase {
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex <= '2021-06-01'", 1);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex > '2021-06-04 04:00:00'", 1);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex = '2021-06-04 04:00:00'", 1);
- expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex = CAST('2021-06-04 04:04:00' as TIMESTAMP)", 1);
- expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex BETWEEN '2021-06-03' AND '2021-06-05'", 4);
+ expectResults(
+ "SELECT id, pdatex FROM $ALIAS WHERE pdatex = CAST('2021-06-04 04:04:00' as TIMESTAMP)", 1);
+ expectResults(
+ "SELECT id, pdatex FROM $ALIAS WHERE pdatex BETWEEN '2021-06-03' AND '2021-06-05'", 4);
}
@Test
@@ -2087,28 +2578,127 @@ public class TestSQLHandler extends SolrCloudTestCase {
.add("id", "3", "pdatex", "2021-07-13T15:12:11.037Z")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex >= CAST('2021-07-13 15:12:10.037' as TIMESTAMP)", 2);
+ expectResults(
+ "SELECT id, pdatex FROM $ALIAS WHERE pdatex >= CAST('2021-07-13 15:12:10.037' as TIMESTAMP)",
+ 2);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex >= '2021-07-13T15:12:10.037Z'", 2);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex < '2021-07-13T15:12:10.037Z'", 1);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex = '2021-07-13T15:12:10.037Z'", 1);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex <> '2021-07-13T15:12:10.037Z'", 2);
- expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex BETWEEN '2021-07-13T15:12:09.037Z' AND '2021-07-13T15:12:10.037Z' ORDER BY pdatex ASC", 2);
+ expectResults(
+ "SELECT id, pdatex FROM $ALIAS WHERE pdatex BETWEEN '2021-07-13T15:12:09.037Z' AND '2021-07-13T15:12:10.037Z' ORDER BY pdatex ASC",
+ 2);
expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex >= '2021-07-13T15:12:10.037Z'", 2);
- expectResults("SELECT id, pdatex FROM $ALIAS WHERE pdatex >= '2021-07-13T15:12:10.037Z' ORDER BY pdatex ASC LIMIT 10", 2);
+ expectResults(
+ "SELECT id, pdatex FROM $ALIAS WHERE pdatex >= '2021-07-13T15:12:10.037Z' ORDER BY pdatex ASC LIMIT 10",
+ 2);
}
@Test
public void testAggsOnCustomFieldType() throws Exception {
new UpdateRequest()
- .add(withMultiValuedField("pintxs", Arrays.asList(1,5),"id", "1", "tintx", "1", "pintx", "2", "tfloatx", "3.33", "pfloatx", "3.33", "tlongx", "1623875868000", "plongx", "1623875868000", "tdoublex", "3.14159265359", "pdoublex", "3.14159265359", "stringx", "A", "textx", "aaa", "pdatex", "2021-06-17T00:00:00Z"))
- .add(withMultiValuedField("pintxs", Arrays.asList(2,6),"id", "2", "tintx", "2", "pintx", "4", "tfloatx", "4.44", "pfloatx", "4.44", "tlongx", "1723875868000", "plongx", "1723875868000", "tdoublex", "6.14159265359", "pdoublex", "6.14159265359", "stringx", "B", "textx", "bbb", "pdatex", "2021-06-18T00:00:00Z"))
- .add(withMultiValuedField("pintxs", Arrays.asList(3,7),"id", "3", "tintx", "3", "pintx", "6", "tfloatx", "5.55", "pfloatx", "5.55", "tlongx", "1823875868000", "plongx", "1823875868000", "tdoublex", "9.14159265359", "pdoublex", "9.14159265359", "stringx", "C", "textx", "ccc", "pdatex", "2021-06-19T00:00:00Z"))
+ .add(
+ withMultiValuedField(
+ "pintxs",
+ Arrays.asList(1, 5),
+ "id",
+ "1",
+ "tintx",
+ "1",
+ "pintx",
+ "2",
+ "tfloatx",
+ "3.33",
+ "pfloatx",
+ "3.33",
+ "tlongx",
+ "1623875868000",
+ "plongx",
+ "1623875868000",
+ "tdoublex",
+ "3.14159265359",
+ "pdoublex",
+ "3.14159265359",
+ "stringx",
+ "A",
+ "textx",
+ "aaa",
+ "pdatex",
+ "2021-06-17T00:00:00Z"))
+ .add(
+ withMultiValuedField(
+ "pintxs",
+ Arrays.asList(2, 6),
+ "id",
+ "2",
+ "tintx",
+ "2",
+ "pintx",
+ "4",
+ "tfloatx",
+ "4.44",
+ "pfloatx",
+ "4.44",
+ "tlongx",
+ "1723875868000",
+ "plongx",
+ "1723875868000",
+ "tdoublex",
+ "6.14159265359",
+ "pdoublex",
+ "6.14159265359",
+ "stringx",
+ "B",
+ "textx",
+ "bbb",
+ "pdatex",
+ "2021-06-18T00:00:00Z"))
+ .add(
+ withMultiValuedField(
+ "pintxs",
+ Arrays.asList(3, 7),
+ "id",
+ "3",
+ "tintx",
+ "3",
+ "pintx",
+ "6",
+ "tfloatx",
+ "5.55",
+ "pfloatx",
+ "5.55",
+ "tlongx",
+ "1823875868000",
+ "plongx",
+ "1823875868000",
+ "tdoublex",
+ "9.14159265359",
+ "pdoublex",
+ "9.14159265359",
+ "stringx",
+ "C",
+ "textx",
+ "ccc",
+ "pdatex",
+ "2021-06-19T00:00:00Z"))
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String dateStatsSql = "min(pdatex) as min_pdatex, max(pdatex) as max_pdatex";
String numTypeStatsSql = toStatsSql(Arrays.asList("intx", "floatx", "longx", "doublex"));
- String sql = "SELECT min(pintxs) as min_pintxs, max(pintxs) as max_pintxs, "+
- min("stringx")+", "+max("stringx")+", "+min("textx")+", "+max("textx")+", "+numTypeStatsSql+", "+dateStatsSql+" FROM $ALIAS";
+ String sql =
+ "SELECT min(pintxs) as min_pintxs, max(pintxs) as max_pintxs, "
+ + min("stringx")
+ + ", "
+ + max("stringx")
+ + ", "
+ + min("textx")
+ + ", "
+ + max("textx")
+ + ", "
+ + numTypeStatsSql
+ + ", "
+ + dateStatsSql
+ + " FROM $ALIAS";
List<Tuple> tuples = expectResults(sql, 1);
Tuple stats = tuples.get(0);
@@ -2145,8 +2735,8 @@ public class TestSQLHandler extends SolrCloudTestCase {
if (sb.length() > 0) {
sb.append(", ");
}
- sb.append(min("t"+type)).append(", ").append(min("p"+type));
- sb.append(", ").append(max("t"+type)).append(", ").append(max("p"+type));
+ sb.append(min("t" + type)).append(", ").append(min("p" + type));
+ sb.append(", ").append(max("t" + type)).append(", ").append(max("p" + type));
}
return sb.toString();
}
@@ -2177,7 +2767,8 @@ public class TestSQLHandler extends SolrCloudTestCase {
final int numDocs = 11;
- List<Tuple> results = expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 0 FETCH NEXT 5 ROWS ONLY", 5);
+ List<Tuple> results =
+ expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 0 FETCH NEXT 5 ROWS ONLY", 5);
assertEquals("11", results.get(0).getString("id"));
assertEquals("10", results.get(1).getString("id"));
assertEquals("09", results.get(2).getString("id"));
@@ -2192,30 +2783,37 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals("08", results.get(3).getString("id"));
assertEquals("07", results.get(4).getString("id"));
- results = expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 5 FETCH NEXT 5 ROWS ONLY", 5);
+ results =
+ expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 5 FETCH NEXT 5 ROWS ONLY", 5);
assertEquals("06", results.get(0).getString("id"));
assertEquals("05", results.get(1).getString("id"));
assertEquals("04", results.get(2).getString("id"));
assertEquals("03", results.get(3).getString("id"));
assertEquals("02", results.get(4).getString("id"));
- results = expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 10 FETCH NEXT 5 ROWS ONLY", 1);
+ results =
+ expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 10 FETCH NEXT 5 ROWS ONLY", 1);
assertEquals("01", results.get(0).getString("id"));
- expectResults("SELECT id FROM $ALIAS ORDER BY id DESC LIMIT "+numDocs, numDocs);
+ expectResults("SELECT id FROM $ALIAS ORDER BY id DESC LIMIT " + numDocs, numDocs);
- for (int i=0; i < numDocs; i++) {
- results = expectResults("SELECT id FROM $ALIAS ORDER BY id ASC OFFSET "+i+" FETCH NEXT 1 ROW ONLY", 1);
+ for (int i = 0; i < numDocs; i++) {
+ results =
+ expectResults(
+ "SELECT id FROM $ALIAS ORDER BY id ASC OFFSET " + i + " FETCH NEXT 1 ROW ONLY", 1);
String id = results.get(0).getString("id");
if (id.startsWith("0")) id = id.substring(1);
- assertEquals(i+1, Integer.parseInt(id));
+ assertEquals(i + 1, Integer.parseInt(id));
}
// just past the end of the results
- expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET "+numDocs+" FETCH NEXT 5 ROWS ONLY", 0);
+ expectResults(
+ "SELECT id FROM $ALIAS ORDER BY id DESC OFFSET " + numDocs + " FETCH NEXT 5 ROWS ONLY", 0);
// Solr doesn't support OFFSET w/o LIMIT
- expectThrows(IOException.class, () -> expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 5", 5));
+ expectThrows(
+ IOException.class,
+ () -> expectResults("SELECT id FROM $ALIAS ORDER BY id DESC OFFSET 5", 5));
}
@Test
@@ -2229,7 +2827,10 @@ public class TestSQLHandler extends SolrCloudTestCase {
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
- List<Tuple> tuples = expectResults("SELECT COUNT(1) AS total_rows, COUNT(distinct str_s) AS distinct_str, MIN(str_s) AS min_str, MAX(str_s) AS max_str FROM $ALIAS", 1);
+ List<Tuple> tuples =
+ expectResults(
+ "SELECT COUNT(1) AS total_rows, COUNT(distinct str_s) AS distinct_str, MIN(str_s) AS min_str, MAX(str_s) AS max_str FROM $ALIAS",
+ 1);
Tuple firstRow = tuples.get(0);
assertEquals(maxDocs, (long) firstRow.getLong("total_rows"));
assertEquals(cardinality, (long) firstRow.getLong("distinct_str"));
@@ -2244,18 +2845,29 @@ public class TestSQLHandler extends SolrCloudTestCase {
assertEquals(String.format(Locale.ROOT, padFmt, t), tuples.get(t).getString("str_s"));
}
- tuples = expectResults("SELECT APPROX_COUNT_DISTINCT(distinct str_s) AS approx_distinct FROM $ALIAS", 1);
+ tuples =
+ expectResults(
+ "SELECT APPROX_COUNT_DISTINCT(distinct str_s) AS approx_distinct FROM $ALIAS", 1);
firstRow = tuples.get(0);
assertEquals(cardinality, (long) firstRow.getLong("approx_distinct"));
- tuples = expectResults("SELECT country_s, COUNT(*) AS count_per_bucket FROM $ALIAS GROUP BY country_s", 2);
- assertEquals(maxDocs/2L, (long)tuples.get(0).getLong("count_per_bucket"));
- assertEquals(maxDocs/2L, (long)tuples.get(1).getLong("count_per_bucket"));
+ tuples =
+ expectResults(
+ "SELECT country_s, COUNT(*) AS count_per_bucket FROM $ALIAS GROUP BY country_s", 2);
+ assertEquals(maxDocs / 2L, (long) tuples.get(0).getLong("count_per_bucket"));
+ assertEquals(maxDocs / 2L, (long) tuples.get(1).getLong("count_per_bucket"));
}
- private UpdateRequest addDocForDistinctTests(int id, UpdateRequest updateRequest, int cardinality, String padFmt) {
+ private UpdateRequest addDocForDistinctTests(
+ int id, UpdateRequest updateRequest, int cardinality, String padFmt) {
String country = id % 2 == 0 ? "US" : "CA";
- return updateRequest.add("id", String.valueOf(id), "str_s", String.format(Locale.ROOT, padFmt, id % cardinality), "country_s", country);
+ return updateRequest.add(
+ "id",
+ String.valueOf(id),
+ "str_s",
+ String.format(Locale.ROOT, padFmt, id % cardinality),
+ "country_s",
+ country);
}
@Test
@@ -2289,15 +2901,25 @@ public class TestSQLHandler extends SolrCloudTestCase {
expectResults("SELECT id, stringx, dvonly FROM $ALIAS LIMIT 10", 5);
// notafield_i matches a dynamic field pattern but has no docs, so don't allow this
- expectThrows(IOException.class, () -> expectResults("SELECT id, stringx, notafield_i FROM $ALIAS", 5));
- expectThrows(IOException.class, () -> expectResults("SELECT id, stringx, notstored FROM $ALIAS", 5));
+ expectThrows(
+ IOException.class, () -> expectResults("SELECT id, stringx, notafield_i FROM $ALIAS", 5));
+ expectThrows(
+ IOException.class, () -> expectResults("SELECT id, stringx, notstored FROM $ALIAS", 5));
}
@Test
public void testMultiValuedFieldHandling() throws Exception {
- List<String> textmv = Arrays.asList("just some text here", "across multiple values", "the quick brown fox jumped over the lazy dog");
- List<String> listOfTimestamps = Arrays.asList("2021-08-06T15:37:52Z", "2021-08-06T15:37:53Z", "2021-08-06T15:37:54Z");
- List<Date> dates = listOfTimestamps.stream().map(ts -> new Date(Instant.parse(ts).toEpochMilli())).collect(Collectors.toList());
+ List<String> textmv =
+ Arrays.asList(
+ "just some text here",
+ "across multiple values",
+ "the quick brown fox jumped over the lazy dog");
+ List<String> listOfTimestamps =
+ Arrays.asList("2021-08-06T15:37:52Z", "2021-08-06T15:37:53Z", "2021-08-06T15:37:54Z");
+ List<Date> dates =
+ listOfTimestamps.stream()
+ .map(ts -> new Date(Instant.parse(ts).toEpochMilli()))
+ .collect(Collectors.toList());
List<String> stringxmv = Arrays.asList("a", "b", "c");
List<String> stringsx = Arrays.asList("d", "e", "f");
List<Double> pdoublesx = Arrays.asList(1d, 2d, 3d);
@@ -2329,13 +2951,21 @@ public class TestSQLHandler extends SolrCloudTestCase {
update.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
expectResults("SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv > 'a'", 10);
- expectResults("SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv NOT IN ('a')", 1);
- expectResults("SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv > 'a' LIMIT 10", 10);
- expectResults("SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv NOT IN ('a') LIMIT 10", 1);
+ expectResults(
+ "SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv NOT IN ('a')", 1);
+ expectResults(
+ "SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv > 'a' LIMIT 10", 10);
+ expectResults(
+ "SELECT stringxmv, stringsx, booleans FROM $ALIAS WHERE stringxmv NOT IN ('a') LIMIT 10",
+ 1);
// can't sort by a mv field
- expectThrows(IOException.class,
- () -> expectResults("SELECT stringxmv FROM $ALIAS WHERE stringxmv IS NOT NULL ORDER BY stringxmv ASC", 0));
+ expectThrows(
+ IOException.class,
+ () ->
+ expectResults(
+ "SELECT stringxmv FROM $ALIAS WHERE stringxmv IS NOT NULL ORDER BY stringxmv ASC",
+ 0));
// even id's have these fields, odd's are null ...
expectListInResults("0", "stringsx", stringsx, -1, 5);
@@ -2367,7 +2997,8 @@ public class TestSQLHandler extends SolrCloudTestCase {
expectAggCount("longs", 6);
}
- private void expectListInResults(String id, String mvField, List<?> expected, int limit, int expCount) throws Exception {
+ private void expectListInResults(
+ String id, String mvField, List<?> expected, int limit, int expCount) throws Exception {
String projection = limit > 0 ? "*" : "id," + mvField;
String sql = "SELECT " + projection + " FROM $ALIAS WHERE id='" + id + "'";
if (limit > 0) sql += " LIMIT " + limit;
@@ -2386,7 +3017,8 @@ public class TestSQLHandler extends SolrCloudTestCase {
// test "IN" operator but skip for text analyzed fields
if (!"textmv".equals(mvField)) {
- String inClause = expected.stream().map(o -> "'" + o + "'").collect(Collectors.joining(","));
+ String inClause =
+ expected.stream().map(o -> "'" + o + "'").collect(Collectors.joining(","));
sql = "SELECT " + projection + " FROM $ALIAS WHERE " + mvField + " IN (" + inClause + ")";
if (limit > 0) sql += " LIMIT " + limit;
expectResults(sql, expCount);
@@ -2403,7 +3035,7 @@ public class TestSQLHandler extends SolrCloudTestCase {
int maxSize = 1000;
int width = 4;
List<String> bigList = new ArrayList<>(maxSize);
- for (int i=0; i < maxSize; i++) {
+ for (int i = 0; i < maxSize; i++) {
bigList.add(StringUtils.leftPad(String.valueOf(i), width, "0"));
}
@@ -2416,11 +3048,11 @@ public class TestSQLHandler extends SolrCloudTestCase {
}
update.add("id", String.valueOf(maxDocs)); // no stringxmv
- SolrInputDocument doc = new SolrInputDocument("id", String.valueOf(maxDocs+1));
+ SolrInputDocument doc = new SolrInputDocument("id", String.valueOf(maxDocs + 1));
doc.setField("stringxmv", Arrays.asList("a", "b", "c"));
update.add(doc);
- doc = new SolrInputDocument("id", String.valueOf(maxDocs+2));
+ doc = new SolrInputDocument("id", String.valueOf(maxDocs + 2));
doc.setField("stringxmv", Arrays.asList("d", "e", "f"));
update.add(doc);
@@ -2429,15 +3061,23 @@ public class TestSQLHandler extends SolrCloudTestCase {
int numIn = 200;
List<String> bigInList = new ArrayList<>(bigList);
Collections.shuffle(bigInList, random());
- bigInList = bigInList.subList(0, numIn).stream().map(s -> "'"+s+"'").collect(Collectors.toList());
+ bigInList =
+ bigInList.subList(0, numIn).stream().map(s -> "'" + s + "'").collect(Collectors.toList());
String inClause = String.join(",", bigInList);
- String sql = "SELECT id FROM $ALIAS WHERE stringxmv IN ("+inClause+") ORDER BY id ASC";
+ String sql = "SELECT id FROM $ALIAS WHERE stringxmv IN (" + inClause + ") ORDER BY id ASC";
expectResults(sql, maxDocs);
- sql = "SELECT * FROM $ALIAS WHERE stringxmv IN ("+inClause+") ORDER BY id ASC LIMIT "+maxDocs;
+ sql =
+ "SELECT * FROM $ALIAS WHERE stringxmv IN ("
+ + inClause
+ + ") ORDER BY id ASC LIMIT "
+ + maxDocs;
expectResults(sql, maxDocs);
- sql = "SELECT id FROM $ALIAS WHERE stringxmv NOT IN ("+inClause+") ORDER BY id ASC";
+ sql = "SELECT id FROM $ALIAS WHERE stringxmv NOT IN (" + inClause + ") ORDER BY id ASC";
expectResults(sql, 3);
- sql = "SELECT id FROM $ALIAS WHERE stringxmv IS NOT NULL AND stringxmv NOT IN ("+inClause+") ORDER BY id ASC";
+ sql =
+ "SELECT id FROM $ALIAS WHERE stringxmv IS NOT NULL AND stringxmv NOT IN ("
+ + inClause
+ + ") ORDER BY id ASC";
expectResults(sql, 2);
sql = "SELECT * FROM $ALIAS WHERE stringxmv IN ('a','d') ORDER BY id ASC LIMIT 10";
expectResults(sql, 2);
@@ -2459,35 +3099,61 @@ public class TestSQLHandler extends SolrCloudTestCase {
expectResults("SELECT id FROM $ALIAS WHERE a_i IS NULL ORDER BY id ASC LIMIT 10", 2);
expectResults("SELECT id FROM $ALIAS WHERE c_s IS NOT NULL ORDER BY id ASC LIMIT 10", 2);
- expectResults("SELECT * FROM $ALIAS WHERE a_s='hello-1' AND d_s='x' ORDER BY id ASC LIMIT 10", 1);
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE a_s='hello-1' AND d_s='x' ORDER BY id ASC LIMIT 10", 1);
expectResults("SELECT id FROM $ALIAS WHERE a_s='hello-1' AND d_s='x'", 1);
- expectResults("SELECT * FROM $ALIAS WHERE a_s <> 'hello-1' AND d_s <> 'x' ORDER BY id ASC LIMIT 10", 2);
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE a_s <> 'hello-1' AND d_s <> 'x' ORDER BY id ASC LIMIT 10", 2);
expectResults("SELECT id FROM $ALIAS WHERE a_s <> 'hello-1' AND d_s <> 'x'", 2);
expectResults("SELECT * FROM $ALIAS WHERE d_s <> 'x' ORDER BY id ASC LIMIT 10", 2);
expectResults("SELECT id FROM $ALIAS WHERE d_s <> 'x'", 2);
- expectResults("SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s <> 'x' ORDER BY id ASC LIMIT 10", 0);
- expectResults("SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s <> 'x'", 0);
-
- expectResults("SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('x') ORDER BY id ASC LIMIT 10", 0);
- expectResults("SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('x')", 0);
- expectResults("SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('a') ORDER BY id ASC LIMIT 10", 2);
- expectResults("SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('a')", 2);
-
- expectResults("SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'x' ORDER BY id ASC LIMIT 10", 0);
- expectResults("SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'x'", 0);
- expectResults("SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'b' ORDER BY id ASC LIMIT 10", 2);
- expectResults("SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'b'", 2);
- expectResults("SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s LIKE 'x' ORDER BY id ASC LIMIT 10", 2);
- expectResults("SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s LIKE 'x'", 2);
-
- expectResults("SELECT * FROM $ALIAS WHERE a_s <> 'hello-1' AND b_s='foo' AND d_s IS NOT NULL AND a_i IS NULL AND c_s IN ('bar') ORDER BY id ASC LIMIT 10", 1);
- expectResults("SELECT id FROM $ALIAS WHERE a_s <> 'hello-1' AND b_s='foo' AND d_s IS NOT NULL AND a_i IS NULL AND c_s IN ('bar')", 1);
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s <> 'x' ORDER BY id ASC LIMIT 10",
+ 0);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s <> 'x'", 0);
+
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('x') ORDER BY id ASC LIMIT 10",
+ 0);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('x')", 0);
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('a') ORDER BY id ASC LIMIT 10",
+ 2);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT IN ('a')", 2);
+
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'x' ORDER BY id ASC LIMIT 10",
+ 0);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'x'", 0);
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'b' ORDER BY id ASC LIMIT 10",
+ 2);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s NOT LIKE 'b'", 2);
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s LIKE 'x' ORDER BY id ASC LIMIT 10",
+ 2);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE (a_s = 'hello-1' OR a_s = 'hello-3') AND d_s LIKE 'x'", 2);
+
+ expectResults(
+ "SELECT * FROM $ALIAS WHERE a_s <> 'hello-1' AND b_s='foo' AND d_s IS NOT NULL AND a_i IS NULL AND c_s IN ('bar') ORDER BY id ASC LIMIT 10",
+ 1);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE a_s <> 'hello-1' AND b_s='foo' AND d_s IS NOT NULL AND a_i IS NULL AND c_s IN ('bar')",
+ 1);
// just a bunch of OR's that end up matching all docs
- expectResults("SELECT id FROM $ALIAS WHERE a_s <> 'hello-1' OR a_i <> 2 OR d_s <> 'x' ORDER BY id ASC LIMIT 10", 4);
+ expectResults(
+ "SELECT id FROM $ALIAS WHERE a_s <> 'hello-1' OR a_i <> 2 OR d_s <> 'x' ORDER BY id ASC LIMIT 10",
+ 4);
}
@Test
@@ -2501,10 +3167,20 @@ public class TestSQLHandler extends SolrCloudTestCase {
expectResults("SELECT COUNT(*) as QUERY_COUNT FROM $ALIAS WHERE (id='1')", 1);
expectResults("SELECT COUNT(*) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1')", 1);
- expectResults("SELECT COUNT(*) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo')", 1);
- expectResults("SELECT COUNT(1) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo')", 1);
- expectResults("SELECT COUNT(1) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo') AND (a_s='hello-1')", 1);
- expectResults("SELECT COUNT(*) as QUERY_COUNT, max(id) as max_id FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo')", 1);
- expectResults("SELECT COUNT(*) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo') HAVING COUNT(*) > 0", 1);
+ expectResults(
+ "SELECT COUNT(*) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo')",
+ 1);
+ expectResults(
+ "SELECT COUNT(1) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo')",
+ 1);
+ expectResults(
+ "SELECT COUNT(1) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo') AND (a_s='hello-1')",
+ 1);
+ expectResults(
+ "SELECT COUNT(*) as QUERY_COUNT, max(id) as max_id FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo')",
+ 1);
+ expectResults(
+ "SELECT COUNT(*) as QUERY_COUNT FROM $ALIAS WHERE (d_s='x') AND (id='1') AND (b_s='foo') HAVING COUNT(*) > 0",
+ 1);
}
}
diff --git a/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandlerNonCloud.java b/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandlerNonCloud.java
index b0e5b3f..a0af911 100644
--- a/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandlerNonCloud.java
+++ b/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandlerNonCloud.java
@@ -20,7 +20,6 @@ import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.solr.SolrJettyTestBase;
import org.apache.solr.client.solrj.io.Tuple;
import org.apache.solr.client.solrj.io.stream.SolrStream;
@@ -53,7 +52,7 @@ public class TestSQLHandlerNonCloud extends SolrJettyTestBase {
String url = jetty.getBaseUrl() + "/" + DEFAULT_TEST_COLLECTION_NAME;
SolrStream solrStream = new SolrStream(url, sParams);
- IOException ex = expectThrows(IOException.class, () -> getTuples(solrStream));
+ IOException ex = expectThrows(IOException.class, () -> getTuples(solrStream));
assertTrue(ex.getMessage().contains(SQLHandler.sqlNonCloudErrorMsg));
}