You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2014/12/01 03:52:42 UTC
svn commit: r1642624 - in /lucene/dev/branches/lucene_solr_4_10: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/search/
solr/core/src/test-files/solr/collection1/conf/
solr/core/src/test/org/apache/solr/search/
Author: dsmiley
Date: Mon Dec 1 02:52:42 2014
New Revision: 1642624
URL: http://svn.apache.org/r1642624
Log:
SOLR-6510: fix collapse on docvalues, empty index
Modified:
lucene/dev/branches/lucene_solr_4_10/ (props changed)
lucene/dev/branches/lucene_solr_4_10/solr/ (props changed)
lucene/dev/branches/lucene_solr_4_10/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/lucene_solr_4_10/solr/core/ (props changed)
lucene/dev/branches/lucene_solr_4_10/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
lucene/dev/branches/lucene_solr_4_10/solr/core/src/test-files/solr/collection1/conf/schema11.xml
lucene/dev/branches/lucene_solr_4_10/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
Modified: lucene/dev/branches/lucene_solr_4_10/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/solr/CHANGES.txt?rev=1642624&r1=1642623&r2=1642624&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_10/solr/CHANGES.txt Mon Dec 1 02:52:42 2014
@@ -52,6 +52,9 @@ Bug Fixes
* SOLR-6784: BBoxField's 'score' mode should have been optional. (David Smiley)
+* SOLR-6510: The collapse QParser would throw a NPE when used on a DocValues field on
+ an empty segment/index. (Christine Poerschke, David Smiley)
+
Other Changes
----------------------
Modified: lucene/dev/branches/lucene_solr_4_10/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java?rev=1642624&r1=1642623&r2=1642624&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java Mon Dec 1 02:52:42 2014
@@ -17,22 +17,20 @@
package org.apache.solr.search;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-
+import com.carrotsearch.hppc.FloatArrayList;
+import com.carrotsearch.hppc.IntIntOpenHashMap;
+import com.carrotsearch.hppc.IntOpenHashSet;
+import com.carrotsearch.hppc.cursors.IntIntCursor;
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.queries.function.FunctionQuery;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
-import org.apache.lucene.search.FieldCache;
-
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.FixedBitSet;
import org.apache.solr.common.SolrException;
@@ -44,16 +42,14 @@ import org.apache.solr.request.LocalSolr
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.schema.FieldType;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.SchemaField;
import org.apache.solr.schema.TrieFloatField;
import org.apache.solr.schema.TrieIntField;
import org.apache.solr.schema.TrieLongField;
-import com.carrotsearch.hppc.FloatArrayList;
-import com.carrotsearch.hppc.IntOpenHashSet;
-import com.carrotsearch.hppc.IntIntOpenHashMap;
-import com.carrotsearch.hppc.cursors.IntIntCursor;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Map;
/**
@@ -221,16 +217,11 @@ public class CollapsingQParserPlugin ext
try {
SolrIndexSearcher searcher = (SolrIndexSearcher)indexSearcher;
- IndexSchema schema = searcher.getSchema();
- SchemaField schemaField = schema.getField(this.field);
- SortedDocValues docValues = null;
+ //FYI FieldCache uses DocValues if available and doesn't return null
+ SortedDocValues docValues = FieldCache.DEFAULT.getTermsIndex(searcher.getAtomicReader(), this.field);
+ assert docValues != null;
FunctionQuery funcQuery = null;
- if(schemaField.hasDocValues()) {
- docValues = searcher.getAtomicReader().getSortedDocValues(this.field);
- } else {
- docValues = FieldCache.DEFAULT.getTermsIndex(searcher.getAtomicReader(), this.field);
- }
FieldType fieldType = null;
Modified: lucene/dev/branches/lucene_solr_4_10/solr/core/src/test-files/solr/collection1/conf/schema11.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/solr/core/src/test-files/solr/collection1/conf/schema11.xml?rev=1642624&r1=1642623&r2=1642624&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/solr/core/src/test-files/solr/collection1/conf/schema11.xml (original)
+++ lucene/dev/branches/lucene_solr_4_10/solr/core/src/test-files/solr/collection1/conf/schema11.xml Mon Dec 1 02:52:42 2014
@@ -345,6 +345,7 @@ valued. -->
Longer patterns will be matched first. if equal size patterns
both match, the first appearing in the schema will be used. -->
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
+ <dynamicField name="*_s_dv" type="string" indexed="true" stored="true" docValues="true"/>
<dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_sS" type="string" indexed="false" stored="true"/>
<dynamicField name="*_i" type="sint" indexed="true" stored="true"/>
Modified: lucene/dev/branches/lucene_solr_4_10/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java?rev=1642624&r1=1642623&r2=1642624&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/solr/core/src/test/org/apache/solr/search/TestCollapseQParserPlugin.java Mon Dec 1 02:52:42 2014
@@ -17,18 +17,16 @@
package org.apache.solr.search;
+import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
-import com.carrotsearch.hppc.IntOpenHashSet;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.Random;
+//We want codecs that support DocValues, and ones supporting blank/empty values.
+@SuppressCodecs({"Appending","Lucene3x","Lucene40","Lucene41","Lucene42"})
public class TestCollapseQParserPlugin extends SolrTestCaseJ4 {
@BeforeClass
@@ -48,10 +46,12 @@ public class TestCollapseQParserPlugin e
@Test
public void testCollapseQueries() throws Exception {
- String[] doc = {"id","1", "term_s", "YYYY", "group_s", "group1", "test_ti", "5", "test_tl", "10", "test_tf", "2000"};
+ final String group = (random().nextBoolean() ? "group_s" : "group_s_dv");
+
+ String[] doc = {"id","1", "term_s", "YYYY", group, "group1", "test_ti", "5", "test_tl", "10", "test_tf", "2000"};
assertU(adoc(doc));
assertU(commit());
- String[] doc1 = {"id","2", "term_s","YYYY", "group_s", "group1", "test_ti", "50", "test_tl", "100", "test_tf", "200"};
+ String[] doc1 = {"id","2", "term_s","YYYY", group, "group1", "test_ti", "50", "test_tl", "100", "test_tf", "200"};
assertU(adoc(doc1));
@@ -63,10 +63,10 @@ public class TestCollapseQParserPlugin e
assertU(adoc(doc3));
- String[] doc4 = {"id","5", "term_s", "YYYY", "group_s", "group2", "test_ti", "4", "test_tl", "10", "test_tf", "2000"};
+ String[] doc4 = {"id","5", "term_s", "YYYY", group, "group2", "test_ti", "4", "test_tl", "10", "test_tf", "2000"};
assertU(adoc(doc4));
assertU(commit());
- String[] doc5 = {"id","6", "term_s","YYYY", "group_s", "group2", "test_ti", "10", "test_tl", "100", "test_tf", "200"};
+ String[] doc5 = {"id","6", "term_s","YYYY", group, "group2", "test_ti", "10", "test_tl", "100", "test_tf", "200"};
assertU(adoc(doc5));
assertU(commit());
@@ -75,10 +75,10 @@ public class TestCollapseQParserPlugin e
//Test collapse by score and following sort by score
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s}");
+ params.add("fq", "{!collapse field="+group+"}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
- assertQ(req(params), "*[count(//doc)=2]",
+ assertQ(req(params, "indent", "on"), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='2.0']",
"//result/doc[2]/float[@name='id'][.='6.0']"
);
@@ -87,7 +87,7 @@ public class TestCollapseQParserPlugin e
// SOLR-5544 test ordering with empty sort param
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s nullPolicy=expand min=test_tf}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=expand min=test_tf}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("sort","");
@@ -101,7 +101,7 @@ public class TestCollapseQParserPlugin e
// Test value source collapse criteria
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s nullPolicy=collapse min=field(test_ti)}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=collapse min=field(test_ti)}");
params.add("sort", "test_ti desc");
assertQ(req(params), "*[count(//doc)=3]",
"//result/doc[1]/float[@name='id'][.='4.0']",
@@ -112,7 +112,7 @@ public class TestCollapseQParserPlugin e
// Test value source collapse criteria with cscore function
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s nullPolicy=collapse min=cscore()}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=collapse min=cscore()}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
assertQ(req(params), "*[count(//doc)=3]",
@@ -124,7 +124,7 @@ public class TestCollapseQParserPlugin e
// Test value source collapse criteria with compound cscore function
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s nullPolicy=collapse min=sum(cscore(),field(test_ti))}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=collapse min=sum(cscore(),field(test_ti))}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
assertQ(req(params), "*[count(//doc)=3]",
@@ -137,7 +137,7 @@ public class TestCollapseQParserPlugin e
params = new ModifiableSolrParams();
params.add("q", "YYYY");
- params.add("fq", "{!collapse field=group_s nullPolicy=collapse}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=collapse}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("qf", "term_s");
@@ -151,7 +151,7 @@ public class TestCollapseQParserPlugin e
//Test SOLR-5773 with score collapse criteria
params = new ModifiableSolrParams();
params.add("q", "YYYY");
- params.add("fq", "{!collapse field=group_s nullPolicy=collapse}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=collapse}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("qf", "term_s");
@@ -165,7 +165,7 @@ public class TestCollapseQParserPlugin e
//Test SOLR-5773 with max field collapse criteria
params = new ModifiableSolrParams();
params.add("q", "YYYY");
- params.add("fq", "{!collapse field=group_s min=test_ti nullPolicy=collapse}");
+ params.add("fq", "{!collapse field="+group+" min=test_ti nullPolicy=collapse}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("qf", "term_s");
@@ -180,7 +180,7 @@ public class TestCollapseQParserPlugin e
//Test SOLR-5773 elevating documents with null group
params = new ModifiableSolrParams();
params.add("q", "YYYY");
- params.add("fq", "{!collapse field=group_s}");
+ params.add("fq", "{!collapse field="+group+"}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("qf", "term_s");
@@ -197,7 +197,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by min int field and sort
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s min=test_ti}");
+ params.add("fq", "{!collapse field="+group+" min=test_ti}");
params.add("sort", "id desc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='5.0']",
@@ -205,7 +205,7 @@ public class TestCollapseQParserPlugin e
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s min=test_ti}");
+ params.add("fq", "{!collapse field="+group+" min=test_ti}");
params.add("sort", "id asc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='1.0']",
@@ -213,7 +213,7 @@ public class TestCollapseQParserPlugin e
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s min=test_ti}");
+ params.add("fq", "{!collapse field="+group+" min=test_ti}");
params.add("sort", "test_tl asc,id desc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='5.0']",
@@ -221,7 +221,7 @@ public class TestCollapseQParserPlugin e
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s min=test_ti}");
+ params.add("fq", "{!collapse field="+group+" min=test_ti}");
params.add("sort", "score desc,id asc");
params.add("defType", "edismax");
params.add("bf", "field(id)");
@@ -235,7 +235,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by max int field
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s max=test_ti}");
+ params.add("fq", "{!collapse field="+group+" max=test_ti}");
params.add("sort", "test_ti asc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='6.0']",
@@ -247,7 +247,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by min long field
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s min=test_tl}");
+ params.add("fq", "{!collapse field="+group+" min=test_tl}");
params.add("sort", "test_ti desc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='1.0']",
@@ -257,7 +257,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by max long field
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s max=test_tl}");
+ params.add("fq", "{!collapse field="+group+" max=test_tl}");
params.add("sort", "test_ti desc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='2.0']",
@@ -267,7 +267,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by min float field
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s min=test_tf}");
+ params.add("fq", "{!collapse field="+group+" min=test_tf}");
params.add("sort", "test_ti desc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='2.0']",
@@ -279,7 +279,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by min float field
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s max=test_tf}");
+ params.add("fq", "{!collapse field="+group+" max=test_tf}");
params.add("sort", "test_ti asc");
assertQ(req(params), "*[count(//doc)=2]",
"//result/doc[1]/float[@name='id'][.='5.0']",
@@ -288,7 +288,7 @@ public class TestCollapseQParserPlugin e
//Test collapse by min float field sort by score
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s max=test_tf}");
+ params.add("fq", "{!collapse field="+group+" max=test_tf}");
params.add("defType", "edismax");
params.add("bf", "field(id)");
params.add("fl", "score, id");
@@ -304,7 +304,7 @@ public class TestCollapseQParserPlugin e
//Test nullPolicy expand
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s max=test_tf nullPolicy=expand}");
+ params.add("fq", "{!collapse field="+group+" max=test_tf nullPolicy=expand}");
params.add("sort", "id desc");
assertQ(req(params), "*[count(//doc)=4]",
"//result/doc[1]/float[@name='id'][.='5.0']",
@@ -316,7 +316,7 @@ public class TestCollapseQParserPlugin e
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s max=test_tf nullPolicy=collapse}");
+ params.add("fq", "{!collapse field="+group+" max=test_tf nullPolicy=collapse}");
params.add("sort", "id desc");
assertQ(req(params), "*[count(//doc)=3]",
"//result/doc[1]/float[@name='id'][.='5.0']",
@@ -326,7 +326,7 @@ public class TestCollapseQParserPlugin e
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s}");
+ params.add("fq", "{!collapse field="+group+"}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("fq","{!tag=test_ti}id:5");
@@ -338,7 +338,7 @@ public class TestCollapseQParserPlugin e
// SOLR-5230 - ensure CollapsingFieldValueCollector.finish() is called
params = new ModifiableSolrParams();
params.add("q", "*:*");
- params.add("fq", "{!collapse field=group_s}");
+ params.add("fq", "{!collapse field="+group+"}");
params.add("group", "true");
params.add("group.field", "id");
assertQ(req(params), "*[count(//doc)=2]");
@@ -350,7 +350,7 @@ public class TestCollapseQParserPlugin e
assertU(commit());
params = new ModifiableSolrParams();
params.add("q", "YYYY");
- params.add("fq", "{!collapse field=group_s nullPolicy=collapse}");
+ params.add("fq", "{!collapse field="+group+" nullPolicy=collapse}");
params.add("defType", "edismax");
params.add("bf", "field(test_ti)");
params.add("qf", "term_s");
@@ -371,4 +371,18 @@ public class TestCollapseQParserPlugin e
SolrException.ErrorCode.BAD_REQUEST);
}
+ @Test
+ public void testEmptyCollection() throws Exception {
+ // group_s is docValues=false and group_dv_s is docValues=true
+ String group = (random().nextBoolean() ? "group_s" : "group_s_dv");
+
+ // min-or-max is for CollapsingScoreCollector vs. CollapsingFieldValueCollector
+ String optional_min_or_max = (random().nextBoolean() ? "" : (random().nextBoolean() ? "min=field(test_ti)" : "max=field(test_ti)"));
+
+ ModifiableSolrParams params = new ModifiableSolrParams();
+ params.add("q", "*:*");
+ params.add("fq", "{!collapse field="+group+" "+optional_min_or_max+"}");
+ assertQ(req(params), "*[count(//doc)=0]");
+ }
+
}