SOLR-9802: fix grouping failure for date fields in solrcloud

Closes #221
This commit is contained in:
Munendra S N 2019-10-20 15:57:19 +05:30
parent c65451115c
commit 437b7445c6
4 changed files with 39 additions and 8 deletions

View File

@ -53,6 +53,8 @@ Bug Fixes
* SOLR-13403: Fix NPE in TermsComponent for DatePointField (yonik, Munendra S N) * SOLR-13403: Fix NPE in TermsComponent for DatePointField (yonik, Munendra S N)
* SOLR-9802: Fix grouping failure for date field in solrcloud (Erick Erickson, Munendra S N, Vitaly Lavrov)
Other Changes Other Changes
--------------------- ---------------------

View File

@ -32,6 +32,7 @@ import org.apache.lucene.util.mutable.MutableValueDouble;
import org.apache.lucene.util.mutable.MutableValueFloat; import org.apache.lucene.util.mutable.MutableValueFloat;
import org.apache.lucene.util.mutable.MutableValueInt; import org.apache.lucene.util.mutable.MutableValueInt;
import org.apache.lucene.util.mutable.MutableValueLong; import org.apache.lucene.util.mutable.MutableValueLong;
import org.apache.solr.common.util.Utils;
import org.apache.solr.schema.FieldType; import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.NumberType; import org.apache.solr.schema.NumberType;
import org.apache.solr.schema.SchemaField; import org.apache.solr.schema.SchemaField;
@ -50,11 +51,11 @@ class GroupConverter {
FieldType fieldType = field.getType(); FieldType fieldType = field.getType();
List<SearchGroup<BytesRef>> result = new ArrayList<>(values.size()); List<SearchGroup<BytesRef>> result = new ArrayList<>(values.size());
for (SearchGroup<MutableValue> original : values) { for (SearchGroup<MutableValue> original : values) {
SearchGroup<BytesRef> converted = new SearchGroup<BytesRef>(); SearchGroup<BytesRef> converted = new SearchGroup<>();
converted.sortValues = original.sortValues; converted.sortValues = original.sortValues;
if (original.groupValue.exists) { if (original.groupValue.exists) {
BytesRefBuilder binary = new BytesRefBuilder(); BytesRefBuilder binary = new BytesRefBuilder();
fieldType.readableToIndexed(original.groupValue.toString(), binary); fieldType.readableToIndexed(Utils.OBJECT_TO_STRING.apply(original.groupValue.toObject()), binary);
converted.groupValue = binary.get(); converted.groupValue = binary.get();
} else { } else {
converted.groupValue = null; converted.groupValue = null;
@ -68,7 +69,7 @@ class GroupConverter {
FieldType fieldType = field.getType(); FieldType fieldType = field.getType();
List<SearchGroup<MutableValue>> result = new ArrayList<>(values.size()); List<SearchGroup<MutableValue>> result = new ArrayList<>(values.size());
for (SearchGroup<BytesRef> original : values) { for (SearchGroup<BytesRef> original : values) {
SearchGroup<MutableValue> converted = new SearchGroup<MutableValue>(); SearchGroup<MutableValue> converted = new SearchGroup<>();
converted.sortValues = original.sortValues; // ? converted.sortValues = original.sortValues; // ?
NumberType type = fieldType.getNumberType(); NumberType type = fieldType.getNumberType();
final MutableValue v; final MutableValue v;
@ -147,14 +148,14 @@ class GroupConverter {
final BytesRef groupValue; final BytesRef groupValue;
if (original.groupValue.exists) { if (original.groupValue.exists) {
BytesRefBuilder binary = new BytesRefBuilder(); BytesRefBuilder binary = new BytesRefBuilder();
fieldType.readableToIndexed(original.groupValue.toString(), binary); fieldType.readableToIndexed(Utils.OBJECT_TO_STRING.apply(original.groupValue.toObject()), binary);
groupValue = binary.get(); groupValue = binary.get();
} else { } else {
groupValue = null; groupValue = null;
} }
groupDocs[i] = new GroupDocs<BytesRef>(original.score, original.maxScore, original.totalHits, original.scoreDocs, groupValue, original.groupSortValues); groupDocs[i] = new GroupDocs<>(original.score, original.maxScore, original.totalHits, original.scoreDocs, groupValue, original.groupSortValues);
} }
return new TopGroups<BytesRef>(values.groupSort, values.withinGroupSort, values.totalHitCount, values.totalGroupedHitCount, groupDocs, values.maxScore); return new TopGroups<>(values.groupSort, values.withinGroupSort, values.totalHitCount, values.totalGroupedHitCount, groupDocs, values.maxScore);
} }
} }

View File

@ -57,8 +57,8 @@ public class TestDistributedGrouping extends BaseDistributedSearchTestCase {
String s1dv = "a_s_dvo"; String s1dv = "a_s_dvo";
String b1dv = "a_b_dvo"; String b1dv = "a_b_dvo";
String tlong = "other_tl1"; String tlong = "other_tl1";
String tdate_a = "a_n_tdt"; String tdate_a = "a_n_tdt1"; // use single-valued date field
String tdate_b = "b_n_tdt"; String tdate_b = "b_n_tdt1";
String oddField="oddField_s1"; String oddField="oddField_s1";
@Test @Test
@ -248,6 +248,9 @@ public class TestDistributedGrouping extends BaseDistributedSearchTestCase {
"group.query", t1 + ":kings OR " + t1 + ":eggs", "rows", "13", "start", "2", "group.query", t1 + ":kings OR " + t1 + ":eggs", "rows", "13", "start", "2",
"fl", "id", "group.main", "true", "sort", i1 + " asc, id asc"); "fl", "id", "group.main", "true", "sort", i1 + " asc, id asc");
// SOLR-9802
query("q", "*:*", "group", "true", "group.field", tdate_a, "sort", i1 + " asc, id asc", "fl", "id");
// SOLR-3109 // SOLR-3109
query("q", t1 + ":eggs", "rows", 100, "fl", "id," + i1, "group", "true", "group.field", i1, "group.limit", 10, "sort", tlong + " asc, id asc"); query("q", t1 + ":eggs", "rows", 100, "fl", "id," + i1, "group", "true", "group.field", i1, "group.limit", 10, "sort", tlong + " asc, id asc");
query("q", i1 + ":232", "rows", 100, "fl", "id," + i1, "group", "true", "group.field", i1, "group.limit", 10, "sort", tlong + " asc, id asc"); query("q", i1 + ":232", "rows", 100, "fl", "id," + i1, "group", "true", "group.field", i1, "group.limit", 10, "sort", tlong + " asc, id asc");

View File

@ -34,6 +34,7 @@ import org.apache.solr.client.solrj.impl.BinaryResponseParser;
import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.GroupParams; import org.apache.solr.common.params.GroupParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.Utils; import org.apache.solr.common.util.Utils;
import org.apache.solr.index.LogDocMergePolicyFactory; import org.apache.solr.index.LogDocMergePolicyFactory;
import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrQueryRequest;
@ -698,6 +699,30 @@ public class TestGroupingSearch extends SolrTestCaseJ4 {
); );
} }
@Test
public void testGroupingOnDateField() throws Exception {
assertU(add(doc("id", "1", "date_dt", "2012-11-20T00:00:00Z")));
assertU(add(doc("id", "2", "date_dt", "2012-11-21T00:00:00Z")));
assertU(commit());
assertU(add(doc("id", "3", "date_dt", "2012-11-20T00:00:00Z")));
assertU(add(doc("id", "4", "date_dt", "2013-01-15T00:00:00Z")));
assertU(add(doc("id", "5")));
assertU(commit());
ModifiableSolrParams params = params("q", "*:*", "group.limit", "10",
"group", "true", "fl", "id", "group.ngroups", "true");
assertJQ(req(params, "group.field", "date_dt", "sort", "id asc"),
"/grouped=={'date_dt':{'matches':5,'ngroups':4, 'groups':" +
"[{'groupValue':'2012-11-20T00:00:00Z','doclist':{'numFound':2,'start':0,'docs':[{'id':'1'},{'id':'3'}]}}," +
"{'groupValue':'2012-11-21T00:00:00Z','doclist':{'numFound':1,'start':0,'docs':[{'id':'2'}]}}," +
"{'groupValue':'2013-01-15T00:00:00Z','doclist':{'numFound':1,'start':0,'docs':[{'id':'4'}]}}," +
"{'groupValue':null,'doclist':{'numFound':1,'start':0,'docs':[{'id':'5'}]}}" +
"]}}"
);
}
@Test @Test
public void testRandomGrouping() throws Exception { public void testRandomGrouping() throws Exception {
/** /**