You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jb...@apache.org on 2018/08/10 00:11:31 UTC

lucene-solr:branch_7x: SOLR-11585: Solr SQL does not work with point numeric fields

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7x 6db8a3c90 -> c5ea325e0


SOLR-11585: Solr SQL does not work with point numeric fields


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c5ea325e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c5ea325e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c5ea325e

Branch: refs/heads/branch_7x
Commit: c5ea325e096a344b58cbf1df2ef167d4953c97b1
Parents: 6db8a3c
Author: Joel Bernstein <jb...@apache.org>
Authored: Thu Aug 9 19:57:24 2018 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Thu Aug 9 20:06:58 2018 -0400

----------------------------------------------------------------------
 .../org/apache/solr/handler/sql/SolrSchema.java |   4 +
 .../solr/collection1/conf/schema-sql.xml        |  27 +++
 .../org/apache/solr/handler/TestSQLHandler.java | 243 ++++++++++++++++---
 3 files changed, 246 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c5ea325e/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
index f7318cf..c4ef72c 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
@@ -108,12 +108,16 @@ class SolrSchema extends AbstractSchema {
         case "tlong":
         case "int":
         case "long":
+        case "pint":
+        case "plong":
           type = typeFactory.createJavaType(Long.class);
           break;
         case "tfloat":
         case "tdouble":
         case "float":
         case "double":
+        case "pfloat":
+        case "pdouble":
           type = typeFactory.createJavaType(Double.class);
           break;
         default:

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c5ea325e/solr/core/src/test-files/solr/collection1/conf/schema-sql.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/schema-sql.xml b/solr/core/src/test-files/solr/collection1/conf/schema-sql.xml
index 430d966..40bbe5a 100644
--- a/solr/core/src/test-files/solr/collection1/conf/schema-sql.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/schema-sql.xml
@@ -52,6 +52,14 @@
   <fieldType name="tlong" class="${solr.tests.LongFieldType}" docValues="${solr.tests.numeric.dv}" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
   <fieldType name="tdouble" class="${solr.tests.DoubleFieldType}" docValues="${solr.tests.numeric.dv}" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 
+  <!-- Point Fields -->
+  <fieldType name="pint" class="solr.IntPointField" docValues="true"/>
+  <fieldType name="plong" class="solr.LongPointField" docValues="true"/>
+  <fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
+  <fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
+  <fieldType name="pdate" class="solr.DatePointField" docValues="true"/>
+
+
   <!-- numeric field types that manipulate the value into
      a string value that isn't human readable in it's internal form,
      but sorts correctly and supports range queries.
@@ -605,6 +613,25 @@
 
   <dynamicField name="*_mfacet" type="string" indexed="true" stored="false" multiValued="true"/>
 
+
+  <!-- Test point fields explicitly -->
+  <dynamicField name="*_i_p"      type="pint"    indexed="true"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_is_p"      type="pint"    indexed="true"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_i_ni_p"   type="pint"    indexed="false"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_is_ni_p"   type="pint"    indexed="false"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_l_p"      type="plong"    indexed="true"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_ls_p"      type="plong"    indexed="true"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_l_ni_p"   type="plong"    indexed="false"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_ls_ni_p"   type="plong"    indexed="false"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_f_p"      type="pfloat"    indexed="true"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_fs_p"      type="pfloat"    indexed="true"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_f_ni_p"   type="pfloat"    indexed="false"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_fs_ni_p"   type="pfloat"    indexed="false"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_d_p"      type="pdouble"    indexed="true"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_ds_p"      type="pdouble"    indexed="true"  stored="true" docValues="true" multiValued="true"/>
+  <dynamicField name="*_d_ni_p"   type="pdouble"    indexed="false"  stored="true" docValues="true" multiValued="false"/>
+  <dynamicField name="*_ds_ni_p"   type="pdouble"    indexed="false"  stored="true" docValues="true" multiValued="true"/>
+
   <!-- make sure custom sims work with dynamic fields -->
   <!--
   <dynamicField name="*_sim1" type="sim1" indexed="true" stored="true"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c5ea325e/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 8315868..b860d6e 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
@@ -22,8 +22,8 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
-import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -78,7 +78,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
   @Test
   //28-June-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 21-May-2018
-  @LuceneTestCase.BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 2-Aug-2018
+  //@LuceneTestCase.BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 2-Aug-2018
   public void doTest() throws Exception {
     waitForRecoveriesToFinish(false);
 
@@ -87,6 +87,8 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
     testMixedCaseFields();
     testBasicGrouping();
     testBasicGroupingTint();
+    testBasicGroupingIntLongPoints();
+    testBasicGroupingFloatDoublePoints();
     testBasicGroupingFacets();
     testSelectDistinct();
     testSelectDistinctFacets();
@@ -107,21 +109,29 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       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"));
+      indexDoc(sdoc("id", "1", "text", "XXXX XXXX", "str_s", "a", "field_i", "7", "field_i_p", "7",
+          "field_f_p", "7.5", "field_d_p", "7.5", "field_l_p", "7"));
+      indexDoc(sdoc("id", "2", "text", "XXXX XXXX", "str_s", "b", "field_i", "8", "field_i_p", "8",
+          "field_f_p", "8.5", "field_d_p", "8.5","field_l_p", "8" ));
+      indexDoc(sdoc("id", "3", "text", "XXXX XXXX", "str_s", "a", "field_i", "20", "field_i_p", "20",
+          "field_f_p", "20.5", "field_d_p", "20.5", "field_l_p", "20"));
+      indexDoc(sdoc("id", "4", "text", "XXXX XXXX", "str_s", "b", "field_i", "11", "field_i_p", "11",
+          "field_f_p", "11.5", "field_d_p", "11.5", "field_l_p", "11"));
+      indexDoc(sdoc("id", "5", "text", "XXXX XXXX", "str_s", "c", "field_i", "30","field_i_p", "30", "" +
+          "field_f_p", "30.5", "field_d_p", "30.5", "field_l_p", "30"));
+      indexDoc(sdoc("id", "6", "text", "XXXX XXXX", "str_s", "c", "field_i", "40", "field_i_p", "40",
+          "field_f_p", "40.5", "field_d_p", "40.5", "field_l_p", "40"));
+      indexDoc(sdoc("id", "7", "text", "XXXX XXXX", "str_s", "c", "field_i", "50", "field_i_p", "50",
+          "field_f_p", "50.5", "field_d_p", "50.5", "field_l_p", "50"));
+      indexDoc(sdoc("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60", "field_i_p", "60",
+          "field_f_p", "60.5", "field_d_p", "60.5", "field_l_p", "60"));
       commit();
 
 
       System.out.println("############# testBasicSelect() ############");
 
       SolrParams sParams = mapParams(CommonParams.QT, "/sql", 
-          "stmt", "select id, field_i, str_s from collection1 where (text='(XXXX)' OR text='XXXX') AND text='XXXX' order by field_i desc");
+          "stmt", "select id, field_i, str_s, field_i_p, field_f_p, field_d_p, field_l_p from collection1 where (text='(XXXX)' OR text='XXXX') AND text='XXXX' order by field_i desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
@@ -130,47 +140,103 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       Tuple tuple;
 
       tuple = tuples.get(0);
-      assert(tuple.getLong("id") == 8);
-      assert(tuple.getLong("field_i") == 60);
+      assertEquals(tuple.getLong("id").longValue(),8);
+      assertEquals(tuple.getLong("field_i").longValue(), 60);
       assert(tuple.get("str_s").equals("c"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 60L);
+      assertEquals(tuple.getDouble("field_f_p"), 60.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 60.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 60);
+
+
+
 
       tuple = tuples.get(1);
-      assert(tuple.getLong("id") == 7);
-      assert(tuple.getLong("field_i") == 50);
+      assertEquals(tuple.getLong("id").longValue(), 7);
+      assertEquals(tuple.getLong("field_i").longValue(), 50);
       assert(tuple.get("str_s").equals("c"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 50);
+      assertEquals(tuple.getDouble("field_f_p"), 50.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 50.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 50);
+
+
+
 
       tuple = tuples.get(2);
-      assert(tuple.getLong("id") == 6);
-      assert(tuple.getLong("field_i") == 40);
+      assertEquals(tuple.getLong("id").longValue(),6);
+      assertEquals(tuple.getLong("field_i").longValue(), 40);
       assert(tuple.get("str_s").equals("c"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 40);
+      assertEquals(tuple.getDouble("field_f_p"), 40.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 40.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 40);
+
+
+
+
 
       tuple = tuples.get(3);
-      assert(tuple.getLong("id") == 5);
-      assert(tuple.getLong("field_i") == 30);
+      assertEquals(tuple.getLong("id").longValue(), 5);
+      assertEquals(tuple.getLong("field_i").longValue(), 30);
       assert(tuple.get("str_s").equals("c"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 30);
+      assertEquals(tuple.getDouble("field_f_p"), 30.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 30.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 30);
+
+
+
 
       tuple = tuples.get(4);
-      assert(tuple.getLong("id") == 3);
-      assert(tuple.getLong("field_i") == 20);
+      assertEquals(tuple.getLong("id").longValue(),3);
+      assertEquals(tuple.getLong("field_i").longValue(), 20);
       assert(tuple.get("str_s").equals("a"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 20);
+      assertEquals(tuple.getDouble("field_f_p"), 20.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 20.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 20);
+
+
+
 
       tuple = tuples.get(5);
-      assert(tuple.getLong("id") == 4);
-      assert(tuple.getLong("field_i") == 11);
+      assertEquals(tuple.getLong("id").longValue(), 4);
+      assertEquals(tuple.getLong("field_i").longValue(), 11);
       assert(tuple.get("str_s").equals("b"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 11);
+      assertEquals(tuple.getDouble("field_f_p"), 11.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 11.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 11);
+
+
+
 
       tuple = tuples.get(6);
-      assert(tuple.getLong("id") == 2);
-      assert(tuple.getLong("field_i") == 8);
+      assertEquals(tuple.getLong("id").longValue(), 2);
+      assertEquals(tuple.getLong("field_i").longValue(), 8);
       assert(tuple.get("str_s").equals("b"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 8);
+      assertEquals(tuple.getDouble("field_f_p"), 8.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 8.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 8);
+
+
+
 
       tuple = tuples.get(7);
-      assert(tuple.getLong("id") == 1);
-      assert(tuple.getLong("field_i") == 7);
+      assertEquals(tuple.getLong("id").longValue(), 1);
+      assertEquals(tuple.getLong("field_i").longValue(), 7);
       assert(tuple.get("str_s").equals("a"));
+      assertEquals(tuple.getLong("field_i_p").longValue(), 7);
+      assertEquals(tuple.getDouble("field_f_p"), 7.5, 0.0);
+      assertEquals(tuple.getDouble("field_d_p"), 7.5, 0.0);
+      assertEquals(tuple.getLong("field_l_p").longValue(), 7);
+
+
 
       //Assert field order
-      assertResponseContains(clients.get(0), sParams, "{\"docs\":[{\"id\":\"8\",\"field_i\":60,\"str_s\":\"c\"}");
+      assertResponseContains(clients.get(0), sParams, "{\"docs\":[{\"id\":\"8\",\"field_i\":60,\"str_s\":\"c\",\"field_i_p\":60,\"field_f_p\":60.5,\"field_d_p\":60.5,\"field_l_p\":60}");
 
       //Test unlimited unsorted result. Should sort on _version_ desc
       sParams = mapParams(CommonParams.QT, "/sql", "stmt", "select id, field_i, str_s from collection1 where text='XXXX'");
@@ -939,6 +1005,127 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
     }
   }
 
+  private void testBasicGroupingIntLongPoints() throws Exception {
+    try {
+
+      Random random = random();
+      int r = random.nextInt(2);
+      String[] intOrLong = {"field_i_p", "field_l_p"};
+      String[] facetOrMap = {"facet", "map_reduce"};
+      String field = intOrLong[r];
+      r = random.nextInt(2);
+      String mode = facetOrMap[r];
+      CloudJettyRunner jetty = this.cloudJettys.get(0);
+
+      del("*:*");
+
+      commit();
+
+      indexr("id", "1", "text", "XXXX XXXX", "str_s", "a", field, "7");
+      indexr("id", "2", "text", "XXXX XXXX", "str_s", "b", field, "8");
+      indexr("id", "3", "text", "XXXX XXXX", "str_s", "a", field, "20");
+      indexr("id", "4", "text", "XXXX XXXX", "str_s", "b", field, "11");
+      indexr("id", "5", "text", "XXXX XXXX", "str_s", "c", field, "30");
+      indexr("id", "6", "text", "XXXX XXXX", "str_s", "c", field, "40");
+      indexr("id", "7", "text", "XXXX XXXX", "str_s", "c", field, "50");
+      indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", field, "60");
+      indexr("id", "9", "text", "XXXX XXXY", "str_s", "d", field, "70");
+      commit();
+
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", mode,
+          "stmt", "select str_s, count(*), sum("+field+"), min("+field+"), max("+field+"), avg("+field+") from collection1 where text='XXXX' group by str_s order by sum("+field+") asc limit 2");
+
+      SolrStream solrStream = new SolrStream(jetty.url, sParams);
+      List<Tuple> tuples = getTuples(solrStream);
+
+      //Only two results because of the limit.
+      assert(tuples.size() == 2);
+      Tuple tuple;
+
+      tuple = tuples.get(0);
+      assert(tuple.get("str_s").equals("b"));
+      assert(tuple.getDouble("EXPR$1") == 2); //count(*)
+      assert(tuple.getDouble("EXPR$2") == 19); //sum(field_i)
+      assert(tuple.getDouble("EXPR$3") == 8); //min(field_i)
+      assert(tuple.getDouble("EXPR$4") == 11); //max(field_i)
+      assert(tuple.getDouble("EXPR$5") == 10); //avg(field_i)
+
+      tuple = tuples.get(1);
+      assert(tuple.get("str_s").equals("a"));
+      assert(tuple.getDouble("EXPR$1") == 2); //count(*)
+      assert(tuple.getDouble("EXPR$2") == 27); //sum(field_i)
+      assert(tuple.getDouble("EXPR$3") == 7); //min(field_i)
+      assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
+      assert(tuple.getDouble("EXPR$5") == 14); //avg(field_i)
+
+
+
+    } finally {
+      delete();
+    }
+  }
+
+  private void testBasicGroupingFloatDoublePoints() throws Exception {
+    try {
+
+      Random random = random();
+      int r = random.nextInt(2);
+      String[] intOrLong = {"field_f_p", "field_d_p"};
+      String[] facetOrMap = {"facet", "map_reduce"};
+      String field = intOrLong[r];
+      r = random.nextInt(2);
+      String mode = facetOrMap[r];
+
+      CloudJettyRunner jetty = this.cloudJettys.get(0);
+
+      del("*:*");
+
+      commit();
+
+      indexr("id", "1", "text", "XXXX XXXX", "str_s", "a", field, "7.0");
+      indexr("id", "2", "text", "XXXX XXXX", "str_s", "b", field, "8.0");
+      indexr("id", "3", "text", "XXXX XXXX", "str_s", "a", field, "20.0");
+      indexr("id", "4", "text", "XXXX XXXX", "str_s", "b", field, "11.0");
+      indexr("id", "5", "text", "XXXX XXXX", "str_s", "c", field, "30.0");
+      indexr("id", "6", "text", "XXXX XXXX", "str_s", "c", field, "40.0");
+      indexr("id", "7", "text", "XXXX XXXX", "str_s", "c", field, "50.0");
+      indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", field, "60.0");
+      indexr("id", "9", "text", "XXXX XXXY", "str_s", "d", field, "70.0");
+      commit();
+
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", mode,
+          "stmt", "select str_s, count(*), sum("+field+"), min("+field+"), max("+field+"), avg("+field+") from collection1 where text='XXXX' group by str_s order by sum("+field+") asc limit 2");
+
+      SolrStream solrStream = new SolrStream(jetty.url, sParams);
+      List<Tuple> tuples = getTuples(solrStream);
+
+      //Only two results because of the limit.
+      assert(tuples.size() == 2);
+      Tuple tuple;
+
+      tuple = tuples.get(0);
+      assert(tuple.get("str_s").equals("b"));
+      assertEquals(tuple.getDouble("EXPR$1"), 2, 0.0); //count(*)
+      assertEquals(tuple.getDouble("EXPR$2"), 19, 0.0); //sum(field_i)
+      assertEquals(tuple.getDouble("EXPR$3"), 8, 0.0); //min(field_i)
+      assertEquals(tuple.getDouble("EXPR$4"), 11, 0.0); //max(field_i)
+      assertEquals(tuple.getDouble("EXPR$5"), 9.5, 0.0); //avg(field_i)
+
+      tuple = tuples.get(1);
+      assert(tuple.get("str_s").equals("a"));
+      assertEquals(tuple.getDouble("EXPR$1"), 2, 0.0); //count(*)
+      assertEquals(tuple.getDouble("EXPR$2"), 27, 0.0); //sum(field_i)
+      assertEquals(tuple.getDouble("EXPR$3"), 7, 0.0); //min(field_i)
+      assertEquals(tuple.getDouble("EXPR$4"), 20, 0.0); //max(field_i)
+      assertEquals(tuple.getDouble("EXPR$5"), 13.5, 0.0); //avg(field_i)
+
+
+
+    } finally {
+      delete();
+    }
+  }
+
   private void testSelectDistinctFacets() throws Exception {
     try {
       CloudJettyRunner jetty = this.cloudJettys.get(0);