SOLR-14821: {!terms} dVTFTL supports single-valued strings

Prior to this commit the docValuesTermsFilterTopLevel method of the
{!terms} query parser would return zero results when run against a
single-valued String.  This commit fixes this by wrapping the
single-valued 'SortedDocValues' in a 'SortedSetDocValues' object.
This commit is contained in:
Jason Gerlowski 2020-09-04 10:45:31 -04:00
parent f71ba62d4a
commit ecb8ca2fef
3 changed files with 14 additions and 11 deletions

View File

@ -217,6 +217,9 @@ Bug Fixes
* SOLR-14714: Solr.cmd in windows loads the incorrect jetty module when using java>=9 (Endika Posadas via
Erick Erickson)
* SOLR-14821: {!terms} docValuesTermsFilterTopLevel method now works with single-valued strings (Anatolii Siuniaev
via Jason Gerlowski)
Other Changes
---------------------

View File

@ -205,8 +205,8 @@ public class TermsQParserPlugin extends QParserPlugin {
if (! matchesAtLeastOneTerm) {
return null;
}
SortedSetDocValues segmentDocValues = context.reader().getSortedSetDocValues(fieldName);
SortedSetDocValues segmentDocValues = DocValues.getSortedSet(context.reader(), fieldName);
if (segmentDocValues == null) {
return null;
}

View File

@ -28,14 +28,14 @@ public class TestTermsQParserPlugin extends SolrTestCaseJ4 {
public static void beforeClass() throws Exception {
initCore("solrconfig.xml", "schema.xml");
assertU(adoc("id","1", "author_s", "Lev Grossman", "t_title", "The Magicians", "cat_s", "fantasy", "pubyear_i", "2009"));
assertU(adoc("id", "2", "author_s", "Robert Jordan", "t_title", "The Eye of the World", "cat_s", "fantasy", "cat_s", "childrens", "pubyear_i", "1990"));
assertU(adoc("id", "3", "author_s", "Robert Jordan", "t_title", "The Great Hunt", "cat_s", "fantasy", "cat_s", "childrens", "pubyear_i", "1990"));
assertU(adoc("id", "4", "author_s", "N.K. Jemisin", "t_title", "The Fifth Season", "cat_s", "fantasy", "pubyear_i", "2015"));
assertU(adoc("id","1", "author_s1", "Lev Grossman", "t_title", "The Magicians", "cat_s", "fantasy", "pubyear_i", "2009"));
assertU(adoc("id", "2", "author_s1", "Robert Jordan", "t_title", "The Eye of the World", "cat_s", "fantasy", "cat_s", "childrens", "pubyear_i", "1990"));
assertU(adoc("id", "3", "author_s1", "Robert Jordan", "t_title", "The Great Hunt", "cat_s", "fantasy", "cat_s", "childrens", "pubyear_i", "1990"));
assertU(adoc("id", "4", "author_s1", "N.K. Jemisin", "t_title", "The Fifth Season", "cat_s", "fantasy", "pubyear_i", "2015"));
assertU(commit());
assertU(adoc("id", "5", "author_s", "Ursula K. Le Guin", "t_title", "The Dispossessed", "cat_s", "scifi", "pubyear_i", "1974"));
assertU(adoc("id", "6", "author_s", "Ursula K. Le Guin", "t_title", "The Left Hand of Darkness", "cat_s", "scifi", "pubyear_i", "1969"));
assertU(adoc("id", "7", "author_s", "Isaac Asimov", "t_title", "Foundation", "cat_s", "scifi", "pubyear_i", "1951"));
assertU(adoc("id", "5", "author_s1", "Ursula K. Le Guin", "t_title", "The Dispossessed", "cat_s", "scifi", "pubyear_i", "1974"));
assertU(adoc("id", "6", "author_s1", "Ursula K. Le Guin", "t_title", "The Left Hand of Darkness", "cat_s", "scifi", "pubyear_i", "1969"));
assertU(adoc("id", "7", "author_s1", "Isaac Asimov", "t_title", "Foundation", "cat_s", "scifi", "pubyear_i", "1951"));
assertU(commit());
}
@ -114,7 +114,7 @@ public class TestTermsQParserPlugin extends SolrTestCaseJ4 {
for (TermsParams method : methods) {
// Single-valued field, single term value
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", method.buildQuery("author_s", "Robert Jordan"));
params.add("q", method.buildQuery("author_s1", "Robert Jordan"));
params.add("sort", "id asc");
assertQ(req(params, "indent", "on"), "*[count(//doc)=2]",
"//result/doc[1]/str[@name='id'][.='2']",
@ -123,7 +123,7 @@ public class TestTermsQParserPlugin extends SolrTestCaseJ4 {
// Single-valued field, multiple term values
params = new ModifiableSolrParams();
params.add("q", method.buildQuery("author_s", "Robert Jordan,Isaac Asimov"));
params.add("q", method.buildQuery("author_s1", "Robert Jordan,Isaac Asimov"));
params.add("sort", "id asc");
assertQ(req(params, "indent", "on"), "*[count(//doc)=3]",
"//result/doc[1]/str[@name='id'][.='2']",