SOLR-10171: Add Constant Reduction Rules to Calcite Planner

This commit is contained in:
Kevin Risden 2017-02-19 21:34:40 -06:00
parent b2dcb47ef4
commit 686fbd3ba2
5 changed files with 47 additions and 0 deletions

View File

@ -285,6 +285,8 @@ Other Changes
* SOLR-10155: For numeric types facet.contains= and facet.prefix= are now rejected.
(Gus Heck, Christine Poerschke)
* SOLR-10171 Add Constant Reduction Rules to Calcite Planner (Kevin Risden)
================== 6.4.2 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

View File

@ -26,6 +26,9 @@ import org.apache.calcite.rel.logical.LogicalAggregate;
import org.apache.calcite.rel.logical.LogicalFilter;
import org.apache.calcite.rel.logical.LogicalProject;
import org.apache.calcite.rel.logical.LogicalSort;
import org.apache.calcite.rel.rules.AggregateValuesRule;
import org.apache.calcite.rel.rules.ReduceExpressionsRule;
import org.apache.calcite.rel.rules.ValuesReduceRule;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexCall;
import org.apache.calcite.rex.RexInputRef;
@ -52,6 +55,17 @@ class SolrRules {
SolrAggregateRule.AGGREGATE_RULE,
};
static final RelOptRule[] CONSTANT_REDUCTION_RULES = {
ReduceExpressionsRule.PROJECT_INSTANCE,
ReduceExpressionsRule.FILTER_INSTANCE,
ReduceExpressionsRule.CALC_INSTANCE,
ReduceExpressionsRule.JOIN_INSTANCE,
ValuesReduceRule.FILTER_INSTANCE,
ValuesReduceRule.PROJECT_FILTER_INSTANCE,
ValuesReduceRule.PROJECT_INSTANCE,
AggregateValuesRule.INSTANCE
};
static List<String> solrFieldNames(final RelDataType rowType) {
return SqlValidatorUtil.uniquify(
new AbstractList<String>() {

View File

@ -72,6 +72,10 @@ class SolrTableScan extends TableScan implements SolrRel {
for (RelOptRule rule : SolrRules.RULES) {
planner.addRule(rule);
}
for (RelOptRule rule : SolrRules.CONSTANT_REDUCTION_RULES) {
planner.addRule(rule);
}
}
public void implement(Implementor implementor) {

View File

@ -317,6 +317,14 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
assert(tuple.getLong("myInt") == 7);
assert(tuple.get("myString").equals("a"));
// SOLR-8845 - Test to make sure that 1 = 0 works for things like Spark SQL
sParams = mapParams(CommonParams.QT, "/sql",
"stmt", "select id, field_i, str_s from collection1 where 1 = 0");
solrStream = new SolrStream(jetty.url, sParams);
tuples = getTuples(solrStream);
assertEquals(0, tuples.size());
} finally {
delete();
}

View File

@ -449,6 +449,25 @@ public class JdbcTest extends SolrCloudTestCase {
}
}
@Test
public void testOneEqualZeroMetadata() throws Exception {
// SOLR-8845 - Make sure that 1 = 1 (literal comparison literal) works
try (Connection con = DriverManager.getConnection("jdbc:solr://" + zkHost +
"?collection=" + COLLECTIONORALIAS)) {
try (Statement stmt = con.createStatement()) {
try (ResultSet rs = stmt.executeQuery("select a_s from " + COLLECTIONORALIAS + " where 1 = 0")) {
assertFalse(rs.next());
ResultSetMetaData resultSetMetaData = rs.getMetaData();
assertNotNull(resultSetMetaData);
assertEquals(1, resultSetMetaData.getColumnCount());
assertEquals("a_s", resultSetMetaData.getColumnName(1));
}
}
}
}
@Test
public void testDriverMetadata() throws Exception {
String collection = COLLECTIONORALIAS;