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:05:57 UTC
lucene-solr:master: SOLR-11585: Solr SQL does not work with point
numeric fields
Repository: lucene-solr
Updated Branches:
refs/heads/master 00aeb64c1 -> 71310a472
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/71310a47
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/71310a47
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/71310a47
Branch: refs/heads/master
Commit: 71310a4722f3e95a0e10a4ca4297d090ace3efd4
Parents: 00aeb64
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 19:57:50 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/71310a47/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/71310a47/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/71310a47/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);