You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2014/10/13 23:19:47 UTC
svn commit: r1631555 - in /lucene/dev/trunk/solr: ./
core/src/java/org/apache/solr/search/function/distance/
core/src/test/org/apache/solr/handler/component/
core/src/test/org/apache/solr/search/function/
Author: hossman
Date: Mon Oct 13 21:19:47 2014
New Revision: 1631555
URL: http://svn.apache.org/r1631555
Log:
SOLR-6540 Fix NPE from strdist() func when doc value source does not exist in a doc
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1631555&r1=1631554&r2=1631555&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Oct 13 21:19:47 2014
@@ -216,6 +216,8 @@ Bug Fixes
* SOLR-6545: Query field list with wild card on dynamic field fails.
(Burke Webster, Xu Zhang, shalin)
+* SOLR-6540 Fix NPE from strdist() func when doc value source does not exist in a doc (hossman)
+
Optimizations
----------------------
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java?rev=1631555&r1=1631554&r2=1631555&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java Mon Oct 13 21:19:47 2014
@@ -51,7 +51,18 @@ public class StringDistanceFunction exte
@Override
public float floatVal(int doc) {
- return dist.getDistance(str1DV.strVal(doc), str2DV.strVal(doc));
+ String s1 = str1DV.strVal(doc);
+ String s2 = str2DV.strVal(doc);
+ if (null == s1 || null == s2) {
+ // the only thing a missing value scores 1.0 with is another missing value
+ return (s1 == s2) ? 1.0F : 0.0F;
+ }
+ return dist.getDistance(s1, s2);
+ }
+
+ @Override
+ public boolean exists(int doc) {
+ return str1DV.exists(doc) && str2DV.exists(doc);
}
@Override
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java?rev=1631555&r1=1631554&r2=1631555&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java Mon Oct 13 21:19:47 2014
@@ -379,14 +379,13 @@ public class StatsComponentTest extends
// stats over a string function
assertQ("strdist func stats",
req("q", "*:*",
- "fq", "-id:4", // SOLR-6540
"stats","true",
"stats.field","{!func}strdist('string22',active_s,edit)")
, "//double[@name='min'][.='0.75']"
, "//double[@name='max'][.='0.875']"
, "//double[@name='sum'][.='2.375']"
, "//long[@name='count'][.='3']"
- ,"//long[@name='missing'][.='0']" // SOLR-6540 ==> '1'
+ ,"//long[@name='missing'][.='1']"
);
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java?rev=1631555&r1=1631554&r2=1631555&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java Mon Oct 13 21:19:47 2014
@@ -554,6 +554,29 @@ public class TestFunctionQuery extends S
assertQ(req("fl", "*,score", "q", "{!func}strdist(x_s, 'foit', edit)", "fq", "id:1"), "//float[@name='score']='0.75'");
assertQ(req("fl", "*,score", "q", "{!func}strdist(x_s, 'foit', jw)", "fq", "id:1"), "//float[@name='score']='0.8833333'");
assertQ(req("fl", "*,score", "q", "{!func}strdist(x_s, 'foit', ngram, 2)", "fq", "id:1"), "//float[@name='score']='0.875'");
+
+ // strdist on a missing valuesource should itself by missing, so the ValueSourceAugmenter
+ // should supress it...
+ assertQ(req("q", "id:1",
+ "fl", "good:strdist(x_s, 'toil', edit)",
+ "fl", "bad1:strdist(missing1_s, missing2_s, edit)",
+ "fl", "bad2:strdist(missing1_s, 'something', edit)",
+ "fl", "bad3:strdist(missing1_s, x_s, edit)")
+ , "//float[@name='good']='0.75'"
+ , "count(//float[starts-with(@name,'bad')])=0"
+ );
+
+ // in a query context, there is always a number...
+ //
+ // if a ValueSource is missing, it is maximally distant from every other
+ // value source *except* for another missing value source
+ // ie: strdist(null,null)==1 but strdist(null,anything)==0
+ assertQ(req("fl","score","fq", "id:1", "q", "{!func}strdist(missing1_s, missing2_s, edit)"),
+ "//float[@name='score']='1.0'");
+ assertQ(req("fl","score","fq", "id:1", "q", "{!func}strdist(missing1_s, x_s, edit)"),
+ "//float[@name='score']='0.0'");
+ assertQ(req("fl","score","fq", "id:1", "q", "{!func}strdist(missing1_s, 'const', edit)"),
+ "//float[@name='score']='0.0'");
}
public void dofunc(String func, double val) throws Exception {