Author: gsingers
Date: Fri Oct 2 13:31:17 2009
New Revision: 821014
URL: http://svn.apache.org/viewvc?rev=821014&view=rev
Log:
SOLR-1471: fix single value case for missing fields
Modified:
lucene/solr/trunk/CHANGES.txt
lucene/solr/trunk/src/java/org/apache/solr/handler/component/FieldFacetStats.java
lucene/solr/trunk/src/java/org/apache/solr/request/UnInvertedField.java
lucene/solr/trunk/src/test/org/apache/solr/handler/component/StatsComponentTest.java
Modified: lucene/solr/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=821014&r1=821013&r2=821014&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Fri Oct 2 13:31:17 2009
@@ -594,6 +594,10 @@
68. SOLR-1468: SolrJ's XML response parsing threw an exception for null
names, such as those produced when facet.missing=true (yonik)
+69. SOLR-1471: Fixed issue with calculating missing values for facets in
single valued cases in Stats Component.
+ This is not correctly calculated for the multivalued case. (James Miller,
gsingers)
+
+
Other Changes
----------------------
1. Upgraded to Lucene 2.4.0 (yonik)
Modified:
lucene/solr/trunk/src/java/org/apache/solr/handler/component/FieldFacetStats.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/component/FieldFacetStats.java?rev=821014&r1=821013&r2=821014&view=diff
==============================================================================
---
lucene/solr/trunk/src/java/org/apache/solr/handler/component/FieldFacetStats.java
(original)
+++
lucene/solr/trunk/src/java/org/apache/solr/handler/component/FieldFacetStats.java
Fri Oct 2 13:31:17 2009
@@ -82,8 +82,6 @@
public boolean facet(int docID, Double v) {
- if (v == null) return false;
-
int term = termNum[docID];
int arrIdx = term - startTermIndex;
if (arrIdx >= 0 && arrIdx < nTerms) {
@@ -93,7 +91,12 @@
stats = new StatsValues();
facetStatsValues.put(key, stats);
}
- stats.accumulate(v);
+ if (v != null) {
+ stats.accumulate(v);
+ } else {
+ stats.missing++;
+ return false;
+ }
return true;
}
return false;
Modified:
lucene/solr/trunk/src/java/org/apache/solr/request/UnInvertedField.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/request/UnInvertedField.java?rev=821014&r1=821013&r2=821014&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/request/UnInvertedField.java
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/request/UnInvertedField.java Fri
Oct 2 13:31:17 2009
@@ -634,33 +634,33 @@
//functionality between the two and refactor code somewhat
use.incrementAndGet();
- FieldType ft = searcher.getSchema().getFieldType(field);
StatsValues allstats = new StatsValues();
- int i = 0;
- final FieldFacetStats[] finfo = new FieldFacetStats[facet.length];
- //Initialize facetstats, if facets have been passed in
- FieldCache.StringIndex si;
- for (String f : facet) {
- ft = searcher.getSchema().getFieldType(f);
- try {
- si = FieldCache.DEFAULT.getStringIndex(searcher.getReader(), f);
- }
- catch (IOException e) {
- throw new RuntimeException("failed to open field cache for: " + f, e);
- }
- finfo[i++] = new FieldFacetStats(f, si, ft, numTermsInField);
- }
-
DocSet docs = baseDocs;
int baseSize = docs.size();
int maxDoc = searcher.maxDoc();
if (baseSize > 0) {
+ FieldType ft = searcher.getSchema().getFieldType(field);
+
+ int i = 0;
+ final FieldFacetStats[] finfo = new FieldFacetStats[facet.length];
+ //Initialize facetstats, if facets have been passed in
+ FieldCache.StringIndex si;
+ for (String f : facet) {
+ ft = searcher.getSchema().getFieldType(f);
+ try {
+ si = FieldCache.DEFAULT.getStringIndex(searcher.getReader(), f);
+ }
+ catch (IOException e) {
+ throw new RuntimeException("failed to open field cache for: " + f,
e);
+ }
+ finfo[i++] = new FieldFacetStats(f, si, ft, numTermsInField);
+ }
final int[] index = this.index;
- final int[] counts = new int[numTermsInField];
+ final int[] counts = new int[numTermsInField];//keep track of the number
of times we see each word in the field for all the documents in the docset
NumberedTermEnum te = ti.getEnumerator(searcher.getReader());
@@ -769,11 +769,11 @@
if (c > 0) {
allstats.addMissing(c);
}
- }
- if (finfo.length > 0) {
- allstats.facets = new HashMap<String, Map<String, StatsValues>>();
- for (FieldFacetStats f : finfo) {
- allstats.facets.put(f.name, f.facetStatsValues);
+ if (finfo.length > 0) {
+ allstats.facets = new HashMap<String, Map<String, StatsValues>>();
+ for (FieldFacetStats f : finfo) {
+ allstats.facets.put(f.name, f.facetStatsValues);
+ }
}
}
return allstats;
Modified:
lucene/solr/trunk/src/test/org/apache/solr/handler/component/StatsComponentTest.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/handler/component/StatsComponentTest.java?rev=821014&r1=821013&r2=821014&view=diff
==============================================================================
---
lucene/solr/trunk/src/test/org/apache/solr/handler/component/StatsComponentTest.java
(original)
+++
lucene/solr/trunk/src/test/org/apache/solr/handler/component/StatsComponentTest.java
Fri Oct 2 13:31:17 2009
@@ -82,32 +82,27 @@
assertU(adoc("id", "1", "stats_ii", "-10", "stats_ii", "-100", "active_s",
"true"));
assertU(adoc("id", "2", "stats_ii", "-20", "stats_ii", "200", "active_s",
"true"));
+
assertU(adoc("id", "3", "stats_ii", "-30", "stats_ii", "-1", "active_s",
"false"));
assertU(adoc("id", "4", "stats_ii", "-40", "stats_ii", "10", "active_s",
"false"));
+ assertU(adoc("id", "5", "active_s", "false"));
assertU(commit());
-
-
Map<String, String> args = new HashMap<String, String>();
args.put(CommonParams.Q, "*:*");
args.put(StatsParams.STATS, "true");
args.put(StatsParams.STATS_FIELD, "stats_ii");
args.put("indent", "true");
SolrQueryRequest req = new LocalSolrQueryRequest(core, new
MapSolrParams(args));
-
-
assertQ("test statistics values", req
, "//doub...@name='min'][.='-100.0']"
, "//doub...@name='max'][.='200.0']"
, "//doub...@name='sum'][.='9.0']"
, "//lo...@name='count'][.='8']"
- , "//lo...@name='missing'][.='0']"
+ , "//lo...@name='missing'][.='1']"
, "//doub...@name='sumOfSquares'][.='53101.0']"
, "//doub...@name='mean'][.='1.125']"
, "//doub...@name='stddev'][.='87.08852228787508']"
);
-
-
-
args.put(StatsParams.STATS_FACET, "active_s");
req = new LocalSolrQueryRequest(core, new MapSolrParams(args));
@@ -116,15 +111,11 @@
, "//doub...@name='max'][.='200.0']"
, "//doub...@name='sum'][.='9.0']"
, "//lo...@name='count'][.='8']"
- , "//lo...@name='missing'][.='0']"
+ , "//lo...@name='missing'][.='1']"
, "//doub...@name='sumOfSquares'][.='53101.0']"
, "//doub...@name='mean'][.='1.125']"
, "//doub...@name='stddev'][.='87.08852228787508']"
);
-
-
-
-
assertQ("test value for active_s=true", req
, "//l...@name='true']/doub...@name='min'][.='-100.0']"
, "//l...@name='true']/doub...@name='max'][.='200.0']"
@@ -135,6 +126,17 @@
, "//l...@name='true']/doub...@name='mean'][.='17.5']"
,
"//l...@name='true']/doub...@name='stddev'][.='128.16005617976296']"
);
+ //Test for fixing multivalued missing
+ /*assertQ("test value for active_s=false", req
+ , "//l...@name='false']/doub...@name='min'][.='-40.0']"
+ , "//l...@name='false']/doub...@name='max'][.='10.0']"
+ , "//l...@name='false']/doub...@name='sum'][.='-61.0']"
+ , "//l...@name='false']/lo...@name='count'][.='4']"
+ , "//l...@name='false']/lo...@name='missing'][.='1']"
+ , "//l...@name='false']/doub...@name='sumOfSquares'][.='2601.0']"
+ , "//l...@name='false']/doub...@name='mean'][.='-15.22']"
+ ,
"//l...@name='false']/doub...@name='stddev'][.='23.59908190304586']"
+ );*/
}
@@ -205,4 +207,43 @@
,
"//l...@name='false']/doub...@name='stddev'][.='7.0710678118654755']"
);
}
+
+ public void testFacetStatisticsMissingResult() throws Exception {
+ SolrCore core = h.getCore();
+ assertU(adoc("id", "1", "stats_i", "10", "active_s", "true"));
+ assertU(adoc("id", "2", "stats_i", "20", "active_s", "true"));
+ assertU(adoc("id", "3", "active_s", "false"));
+ assertU(adoc("id", "4", "stats_i", "40", "active_s", "false"));
+ assertU(commit());
+
+ Map<String, String> args = new HashMap<String, String>();
+ args.put(CommonParams.Q, "*:*");
+ args.put(StatsParams.STATS, "true");
+ args.put(StatsParams.STATS_FIELD, "stats_i");
+ args.put(StatsParams.STATS_FACET, "active_s");
+ args.put("indent", "true");
+ SolrQueryRequest req = new LocalSolrQueryRequest(core, new
MapSolrParams(args));
+
+ assertQ("test value for active_s=true", req
+ , "//l...@name='true']/doub...@name='min'][.='10.0']"
+ , "//l...@name='true']/doub...@name='max'][.='20.0']"
+ , "//l...@name='true']/doub...@name='sum'][.='30.0']"
+ , "//l...@name='true']/lo...@name='count'][.='2']"
+ , "//l...@name='true']/lo...@name='missing'][.='0']"
+ ,
"//l...@name='true']/doub...@name='sumOfSquares'][.='500.0']"
+ , "//l...@name='true']/doub...@name='mean'][.='15.0']"
+ ,
"//l...@name='true']/doub...@name='stddev'][.='7.0710678118654755']"
+ );
+
+ assertQ("test value for active_s=false", req
+ , "//l...@name='false']/doub...@name='min'][.='40.0']"
+ , "//l...@name='false']/doub...@name='max'][.='40.0']"
+ , "//l...@name='false']/doub...@name='sum'][.='40.0']"
+ , "//l...@name='false']/lo...@name='count'][.='1']"
+ , "//l...@name='false']/lo...@name='missing'][.='1']"
+ ,
"//l...@name='false']/doub...@name='sumOfSquares'][.='1600.0']"
+ , "//l...@name='false']/doub...@name='mean'][.='40.0']"
+ , "//l...@name='false']/doub...@name='stddev'][.='0.0']"
+ );
+ }
}