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 {