You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/10/06 18:11:58 UTC
lucene-solr:branch_6x: SOLR-9146: Parallel SQL engine should support
>, >=, <, <=, <>, != syntax
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6x 360ac3ad2 -> b1a5c5f92
SOLR-9146: Parallel SQL engine should support >, >=, <, <=, <>, != syntax
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b1a5c5f9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b1a5c5f9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b1a5c5f9
Branch: refs/heads/branch_6x
Commit: b1a5c5f92e41f7180fdc0af5811bd4346a42af28
Parents: 360ac3a
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Oct 6 09:34:53 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Oct 6 13:11:44 2016 -0500
----------------------------------------------------------------------
solr/CHANGES.txt | 2 +
.../org/apache/solr/handler/SQLHandler.java | 48 +++-
.../org/apache/solr/handler/TestSQLHandler.java | 235 ++++++++++++++++++-
3 files changed, 275 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1a5c5f9/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 6537cda..9c132c4 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -82,6 +82,8 @@ New Features
* SOLR-9520: Kerberos delegation support in SolrJ (Ishan Chattopadhyaya, noble)
+* SOLR-9146: Parallel SQL engine should support >, >=, <, <=, <>, != syntax (Timothy Potter, Joel Bernstein, Kevin Risden)
+
Bug Fixes
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1a5c5f9/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
index d273854..f0240c6 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -916,6 +916,10 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
}
protected Void visitComparisonExpression(ComparisonExpression node, StringBuilder buf) {
+ if (!(node.getLeft() instanceof StringLiteral || node.getLeft() instanceof QualifiedNameReference)) {
+ throw new RuntimeException("Left side of comparison must be a literal.");
+ }
+
String field = getPredicateField(node.getLeft());
String value = node.getRight().toString();
value = stripSingleQuotes(value);
@@ -925,7 +929,49 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
value = '"'+value+'"';
}
- buf.append('(').append(field + ":" + value).append(')');
+ String lowerBound;
+ String upperBound;
+ String lowerValue;
+ String upperValue;
+
+ ComparisonExpression.Type t = node.getType();
+ switch(t) {
+ case NOT_EQUAL:
+ buf.append('(').append('-').append(field).append(":").append(value).append(')');
+ return null;
+ case EQUAL:
+ buf.append('(').append(field).append(":").append(value).append(')');
+ return null;
+ case LESS_THAN:
+ lowerBound = "[";
+ upperBound = "}";
+ lowerValue = "*";
+ upperValue = value;
+ buf.append('(').append(field).append(":").append(lowerBound).append(lowerValue).append(" TO ").append(upperValue).append(upperBound).append(')');
+ return null;
+ case LESS_THAN_OR_EQUAL:
+ lowerBound = "[";
+ upperBound = "]";
+ lowerValue = "*";
+ upperValue = value;
+ buf.append('(').append(field).append(":").append(lowerBound).append(lowerValue).append(" TO ").append(upperValue).append(upperBound).append(')');
+ return null;
+ case GREATER_THAN:
+ lowerBound = "{";
+ upperBound = "]";
+ lowerValue = value;
+ upperValue = "*";
+ buf.append('(').append(field).append(":").append(lowerBound).append(lowerValue).append(" TO ").append(upperValue).append(upperBound).append(')');
+ return null;
+ case GREATER_THAN_OR_EQUAL:
+ lowerBound = "[";
+ upperBound = "]";
+ lowerValue = value;
+ upperValue = "*";
+ buf.append('(').append(field).append(":").append(lowerBound).append(lowerValue).append(" TO ").append(upperValue).append(upperBound).append(')');
+ return null;
+ }
+
return null;
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1a5c5f9/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
index 6876b26..4ce2798 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
@@ -49,11 +49,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
sliceCount = 2;
}
- //@BeforeClass
- //public static void beforeSuperClass() {
- //AbstractZkTestCase.SOLRHOME = new File(SOLR_HOME());
- // }
-
@AfterClass
public static void afterSuperClass() {
@@ -67,8 +62,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
@Override
public void setUp() throws Exception {
super.setUp();
- // we expect this time of exception as shards go up and down...
- //ignoreException(".*");
System.setProperty("numShards", Integer.toString(sliceCount));
}
@@ -89,6 +82,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
waitForRecoveriesToFinish(false);
testPredicate();
testBasicSelect();
+ testWhere();
testMixedCaseFields();
testBasicGrouping();
testBasicGroupingFacets();
@@ -112,9 +106,97 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
String sql = "select a from b where c = 'd'";
Statement statement = parser.createStatement(sql);
SQLHandler.SQLVisitor sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
- sqlVistor.process(statement, new Integer(0));
+ sqlVistor.process(statement, 0);
- assert(sqlVistor.query.equals("(c:\"d\")"));
+ assertEquals("(c:\"d\")", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c = 5";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:\"5\")", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c <> 'd'";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(-c:\"d\")", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c <> 5";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(-c:\"5\")", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c > 'd'";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:{\"d\" TO *])", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c > 5";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:{\"5\" TO *])", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c >= 'd'";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:[\"d\" TO *])", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c >= 5";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:[\"5\" TO *])", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c < 'd'";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:[* TO \"d\"})", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c < 5";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:[* TO \"5\"})", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c <= 'd'";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:[* TO \"d\"])", sqlVistor.query);
+
+ parser = new SqlParser();
+ sql = "select a from b where c <= 5";
+ statement = parser.createStatement(sql);
+ sqlVistor = new SQLHandler.SQLVisitor(new StringBuilder());
+ sqlVistor.process(statement, 0);
+
+ assertEquals("(c:[* TO \"5\"])", sqlVistor.query);
//Add parens
parser = new SqlParser();
@@ -452,6 +534,141 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
}
}
+ private void testWhere() throws Exception {
+ try {
+ CloudJettyRunner jetty = this.cloudJettys.get(0);
+
+ del("*:*");
+
+ commit();
+
+ indexDoc(sdoc("id", "1", "text", "XXXX XXXX", "str_s", "a", "field_i", "7"));
+ indexDoc(sdoc("id", "2", "text", "XXXX XXXX", "str_s", "b", "field_i", "8"));
+ indexDoc(sdoc("id", "3", "text", "XXXX XXXX", "str_s", "a", "field_i", "20"));
+ indexDoc(sdoc("id", "4", "text", "XXXX XXXX", "str_s", "b", "field_i", "11"));
+ indexDoc(sdoc("id", "5", "text", "XXXX XXXX", "str_s", "c", "field_i", "30"));
+ indexDoc(sdoc("id", "6", "text", "XXXX XXXX", "str_s", "c", "field_i", "40"));
+ indexDoc(sdoc("id", "7", "text", "XXXX XXXX", "str_s", "c", "field_i", "50"));
+ indexDoc(sdoc("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60"));
+ commit();
+
+ // Equals
+ SolrParams sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id = 1 order by id asc");
+
+ SolrStream solrStream = new SolrStream(jetty.url, sParams);
+ List<Tuple> tuples = getTuples(solrStream);
+
+ assertEquals(1, tuples.size());
+
+ Tuple tuple = tuples.get(0);
+ assertEquals(1L, tuple.get("id"));
+
+ // Not Equals <>
+ sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id <> 1 order by id asc limit 10");
+
+ solrStream = new SolrStream(jetty.url, sParams);
+ tuples = getTuples(solrStream);
+
+ assertEquals(7, tuples.size());
+
+ tuple = tuples.get(0);
+ assertEquals(2L, tuple.get("id"));
+ tuple = tuples.get(1);
+ assertEquals(3L, tuple.get("id"));
+ tuple = tuples.get(2);
+ assertEquals(4L, tuple.get("id"));
+ tuple = tuples.get(3);
+ assertEquals(5L, tuple.get("id"));
+ tuple = tuples.get(4);
+ assertEquals(6L, tuple.get("id"));
+ tuple = tuples.get(5);
+ assertEquals(7L, tuple.get("id"));
+ tuple = tuples.get(6);
+ assertEquals(8L, tuple.get("id"));
+
+ // Not Equals !=
+ sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id != 1 order by id asc limit 10");
+
+ solrStream = new SolrStream(jetty.url, sParams);
+ tuples = getTuples(solrStream);
+
+ assertEquals(7, tuples.size());
+
+ tuple = tuples.get(0);
+ assertEquals(2L, tuple.get("id"));
+ tuple = tuples.get(1);
+ assertEquals(3L, tuple.get("id"));
+ tuple = tuples.get(2);
+ assertEquals(4L, tuple.get("id"));
+ tuple = tuples.get(3);
+ assertEquals(5L, tuple.get("id"));
+ tuple = tuples.get(4);
+ assertEquals(6L, tuple.get("id"));
+ tuple = tuples.get(5);
+ assertEquals(7L, tuple.get("id"));
+ tuple = tuples.get(6);
+ assertEquals(8L, tuple.get("id"));
+
+ // Less than
+ sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id < 2 order by id asc");
+
+ solrStream = new SolrStream(jetty.url, sParams);
+ tuples = getTuples(solrStream);
+
+ assertEquals(1, tuples.size());
+
+ tuple = tuples.get(0);
+ assertEquals(1L, tuple.get("id"));
+
+ // Less than equal
+ sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id <= 2 order by id asc");
+
+ solrStream = new SolrStream(jetty.url, sParams);
+ tuples = getTuples(solrStream);
+
+ assertEquals(2, tuples.size());
+
+ tuple = tuples.get(0);
+ assertEquals(1L, tuple.get("id"));
+ tuple = tuples.get(1);
+ assertEquals(2L, tuple.get("id"));
+
+ // Greater than
+ sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id > 7 order by id asc");
+
+ solrStream = new SolrStream(jetty.url, sParams);
+ tuples = getTuples(solrStream);
+
+ assertEquals(1, tuples.size());
+
+ tuple = tuples.get(0);
+ assertEquals(8L, tuple.get("id"));
+
+ // Greater than equal
+ sParams = mapParams(CommonParams.QT, "/sql",
+ "stmt", "select id from collection1 where id >= 7 order by id asc");
+
+ solrStream = new SolrStream(jetty.url, sParams);
+ tuples = getTuples(solrStream);
+
+ assertEquals(2, tuples.size());
+
+ tuple = tuples.get(0);
+ assertEquals(7L, tuple.get("id"));
+ tuple = tuples.get(1);
+ assertEquals(8L, tuple.get("id"));
+
+ } finally {
+ delete();
+ }
+ }
+
private void testMixedCaseFields() throws Exception {
try {