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']"
+           );
+         }
 }


Reply via email to