You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/04/21 14:55:42 UTC

svn commit: r1675109 [2/2] - in /lucene/dev/trunk: lucene/ lucene/core/src/java/org/apache/lucene/search/ lucene/core/src/java/org/apache/lucene/search/payloads/ lucene/core/src/java/org/apache/lucene/search/similarities/ lucene/core/src/java/org/apach...

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestQueryRescorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestQueryRescorer.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestQueryRescorer.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestQueryRescorer.java Tue Apr 21 12:55:41 2015
@@ -272,7 +272,6 @@ public class TestQueryRescorer extends L
     assertTrue(s.contains("first pass score"));
     assertTrue(s.contains("no second pass score"));
     assertFalse(s.contains("= second pass score"));
-    assertTrue(s.contains("NON-MATCH"));
     assertEquals(hits2.scoreDocs[1].score, explain.getValue(), 0.0f);
 
     r.close();

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java Tue Apr 21 12:55:41 2015
@@ -48,7 +48,7 @@ public class TestSimilarity extends Luce
     @Override public float sloppyFreq(int distance) { return 2.0f; }
     @Override public float idf(long docFreq, long numDocs) { return 1.0f; }
     @Override public Explanation idfExplain(CollectionStatistics collectionStats, TermStatistics[] stats) {
-      return new Explanation(1.0f, "Inexplicable"); 
+      return Explanation.match(1.0f, "Inexplicable"); 
     }
   }
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSortRescorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSortRescorer.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSortRescorer.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestSortRescorer.java Tue Apr 21 12:55:41 2015
@@ -101,7 +101,7 @@ public class TestSortRescorer extends Lu
 
     // Confirm the explanation breaks out the individual
     // sort fields:
-    assertTrue(expl.contains("= sort field <int: \"popularity\">! value=20"));
+    assertTrue(expl, expl.contains("= sort field <int: \"popularity\">! value=20"));
 
     // Confirm the explanation includes first pass details:
     assertTrue(expl.contains("= first pass score"));

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java Tue Apr 21 12:55:41 2015
@@ -341,7 +341,7 @@ public class TestPayloadNearQuery extend
     // idf used for phrase queries
     @Override 
     public Explanation idfExplain(CollectionStatistics collectionStats, TermStatistics[] termStats) {
-      return new Explanation(1.0f, "Inexplicable");
+      return Explanation.match(1.0f, "Inexplicable");
     }
   }
 }

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/similarities/TestSimilarityBase.java Tue Apr 21 12:55:41 2015
@@ -194,7 +194,7 @@ public class TestSimilarityBase extends
           toTermStats(stats));
       float score = sim.score(realStats, freq, docLen);
       float explScore = sim.explain(
-          realStats, 1, new Explanation(freq, "freq"), docLen).getValue();
+          realStats, 1, Explanation.match(freq, "freq"), docLen).getValue();
       assertFalse("Score infinite: " + sim.toString(), Float.isInfinite(score));
       assertFalse("Score NaN: " + sim.toString(), Float.isNaN(score));
       assertTrue("Score negative: " + sim.toString(), score >= 0);

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionRescorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionRescorer.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionRescorer.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/ExpressionRescorer.java Tue Apr 21 12:55:41 2015
@@ -18,6 +18,8 @@ package org.apache.lucene.expressions;
  */
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -57,7 +59,7 @@ class ExpressionRescorer extends SortRes
 
   @Override
   public Explanation explain(IndexSearcher searcher, Explanation firstPassExplanation, int docID) throws IOException {
-    Explanation result = super.explain(searcher, firstPassExplanation, docID);
+    Explanation superExpl = super.explain(searcher, firstPassExplanation, docID);
 
     List<LeafReaderContext> leaves = searcher.getIndexReader().leaves();
     int subReader = ReaderUtil.subIndex(docID, leaves);
@@ -71,11 +73,12 @@ class ExpressionRescorer extends SortRes
 
     context.put("scorer", fakeScorer);
 
+    List<Explanation> subs = new ArrayList<>(Arrays.asList(superExpl.getDetails()));
     for(String variable : expression.variables) {
-      result.addDetail(new Explanation((float) bindings.getValueSource(variable).getValues(context, readerContext).doubleVal(docIDInSegment),
+      subs.add(Explanation.match((float) bindings.getValueSource(variable).getValues(context, readerContext).doubleVal(docIDInSegment),
                                        "variable \"" + variable + "\""));
     }
 
-    return result;
+    return Explanation.match(superExpl.getValue(), superExpl.getDescription(), subs);
   }
 }

Modified: lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsQuery.java (original)
+++ lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsQuery.java Tue Apr 21 12:55:41 2015
@@ -17,13 +17,15 @@ package org.apache.lucene.search.join;
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.util.Set;
+
 import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.MultiDocValues;
 import org.apache.lucene.index.SortedDocValues;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
@@ -36,9 +38,6 @@ import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LongBitSet;
 import org.apache.lucene.util.LongValues;
 
-import java.io.IOException;
-import java.util.Set;
-
 final class GlobalOrdinalsQuery extends Query {
 
   // All the ords of matching docs found with OrdinalsCollector.
@@ -121,10 +120,10 @@ final class GlobalOrdinalsQuery extends
         int segmentOrd = values.getOrd(doc);
         if (segmentOrd != -1) {
           BytesRef joinValue = values.lookupOrd(segmentOrd);
-          return new ComplexExplanation(true, queryNorm, "Score based on join value " + joinValue.utf8ToString());
+          return Explanation.match(queryNorm, "Score based on join value " + joinValue.utf8ToString());
         }
       }
-      return new ComplexExplanation(false, 0.0f, "Not a match");
+      return Explanation.noMatch("Not a match");
     }
 
     @Override

Modified: lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsWithScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsWithScoreQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsWithScoreQuery.java (original)
+++ lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/GlobalOrdinalsWithScoreQuery.java Tue Apr 21 12:55:41 2015
@@ -17,13 +17,15 @@ package org.apache.lucene.search.join;
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.util.Set;
+
 import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.MultiDocValues;
 import org.apache.lucene.index.SortedDocValues;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
@@ -35,9 +37,6 @@ import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LongValues;
 
-import java.io.IOException;
-import java.util.Set;
-
 final class GlobalOrdinalsWithScoreQuery extends Query {
 
   private final GlobalOrdinalsWithScoreCollector collector;
@@ -126,10 +125,10 @@ final class GlobalOrdinalsWithScoreQuery
             score = collector.score(segmentOrd);
           }
           BytesRef joinValue = values.lookupOrd(segmentOrd);
-          return new ComplexExplanation(true, score, "Score based on join value " + joinValue.utf8ToString());
+          return Explanation.match(score, "Score based on join value " + joinValue.utf8ToString());
         }
       }
-      return new ComplexExplanation(false, 0.0f, "Not a match");
+      return Explanation.noMatch("Not a match");
     }
 
     @Override

Modified: lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java (original)
+++ lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java Tue Apr 21 12:55:41 2015
@@ -27,7 +27,6 @@ import org.apache.lucene.index.PostingsE
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
@@ -137,12 +136,12 @@ class TermsIncludingScoreQuery extends Q
               postingsEnum = segmentTermsEnum.postings(null, postingsEnum, PostingsEnum.NONE);
               if (postingsEnum.advance(doc) == doc) {
                 final float score = TermsIncludingScoreQuery.this.scores[ords[i]];
-                return new ComplexExplanation(true, score, "Score based on join value " + segmentTermsEnum.term().utf8ToString());
+                return Explanation.match(score, "Score based on join value " + segmentTermsEnum.term().utf8ToString());
               }
             }
           }
         }
-        return new ComplexExplanation(false, 0.0f, "Not a match");
+        return Explanation.noMatch("Not a match");
       }
 
       @Override

Modified: lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java (original)
+++ lucene/dev/trunk/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java Tue Apr 21 12:55:41 2015
@@ -17,11 +17,16 @@ package org.apache.lucene.search.join;
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Set;
+
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
@@ -34,12 +39,6 @@ import org.apache.lucene.util.BitDocIdSe
 import org.apache.lucene.util.BitSet;
 import org.apache.lucene.util.Bits;
 
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Locale;
-import java.util.Set;
-
 /**
  * This query requires that you index
  * children and parent docs as a single block, using the
@@ -190,7 +189,7 @@ public class ToParentBlockJoinQuery exte
       if (scorer != null && scorer.advance(doc) == doc) {
         return scorer.explain(context.docBase);
       }
-      return new ComplexExplanation(false, 0.0f, "Not a match");
+      return Explanation.noMatch("Not a match");
     }
   }
 
@@ -414,8 +413,7 @@ public class ToParentBlockJoinQuery exte
     public Explanation explain(int docBase) throws IOException {
       int start = docBase + prevParentDoc + 1; // +1 b/c prevParentDoc is previous parent doc
       int end = docBase + parentDoc - 1; // -1 b/c parentDoc is parent doc
-      return new ComplexExplanation(
-          true, score(), String.format(Locale.ROOT, "Score based on child doc range from %d to %d", start, end)
+      return Explanation.match(score(), String.format(Locale.ROOT, "Score based on child doc range from %d to %d", start, end)
       );
     }
 

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/search/TestDiversifiedTopDocsCollector.java Tue Apr 21 12:55:41 2015
@@ -454,7 +454,7 @@ public class TestDiversifiedTopDocsColle
 
         @Override
         public Explanation explain(int doc, Explanation freq) {
-          return new Explanation(Float.intBitsToFloat((int) values.get(doc)),
+          return Explanation.match(Float.intBitsToFloat((int) values.get(doc)),
               "indexDocValue(" + scoreValueField + ")");
         }
       };

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreProvider.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreProvider.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreProvider.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreProvider.java Tue Apr 21 12:55:41 2015
@@ -18,9 +18,11 @@ package org.apache.lucene.queries;
  */
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.IndexReader; // for javadocs
+import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionQuery;
 import org.apache.lucene.search.Explanation;
 
@@ -130,12 +132,13 @@ public class CustomScoreProvider {
     for (Explanation valSrcExpl : valSrcExpls) {
       valSrcScore *= valSrcExpl.getValue();
     }
-    Explanation exp = new Explanation( valSrcScore * subQueryExpl.getValue(), "custom score: product of:");
-    exp.addDetail(subQueryExpl);
+    
+    List<Explanation> subs = new ArrayList<>();
+    subs.add(subQueryExpl);
     for (Explanation valSrcExpl : valSrcExpls) {
-      exp.addDetail(valSrcExpl);
+      subs.add(valSrcExpl);
     }
-    return exp;
+    return Explanation.match(valSrcScore * subQueryExpl.getValue(), "custom score: product of:", subs);
   }
   
   /**
@@ -154,10 +157,7 @@ public class CustomScoreProvider {
     if (valSrcExpl != null) {
       valSrcScore *= valSrcExpl.getValue();
     }
-    Explanation exp = new Explanation( valSrcScore * subQueryExpl.getValue(), "custom score: product of:");
-    exp.addDetail(subQueryExpl);
-    exp.addDetail(valSrcExpl);
-    return exp;
+    return Explanation.match(valSrcScore * subQueryExpl.getValue(), "custom score: product of:", subQueryExpl, valSrcExpl);
   }
 
 }

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreQuery.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreQuery.java Tue Apr 21 12:55:41 2015
@@ -28,7 +28,6 @@ import org.apache.lucene.index.LeafReade
 import org.apache.lucene.index.Term;
 import org.apache.lucene.queries.function.FunctionQuery;
 import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.FilterScorer;
 import org.apache.lucene.search.IndexSearcher;
@@ -244,7 +243,7 @@ public class CustomScoreQuery extends Qu
     @Override
     public Explanation explain(LeafReaderContext context, int doc) throws IOException {
       Explanation explain = doExplain(context, doc);
-      return explain == null ? new Explanation(0.0f, "no matching docs") : explain;
+      return explain == null ? Explanation.noMatch("no matching docs") : explain;
     }
     
     private Explanation doExplain(LeafReaderContext info, int doc) throws IOException {
@@ -259,11 +258,9 @@ public class CustomScoreQuery extends Qu
       }
       Explanation customExp = CustomScoreQuery.this.getCustomScoreProvider(info).customExplain(doc,subQueryExpl,valSrcExpls);
       float sc = queryWeight * customExp.getValue();
-      Explanation res = new ComplexExplanation(
-        true, sc, CustomScoreQuery.this.toString() + ", product of:");
-      res.addDetail(customExp);
-      res.addDetail(new Explanation(queryWeight, "queryWeight"));
-      return res;
+      return Explanation.match(
+        sc, CustomScoreQuery.this.toString() + ", product of:",
+        customExp, Explanation.match(queryWeight, "queryWeight"));
     }
     
   }

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/TermsQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/TermsQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/TermsQuery.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/TermsQuery.java Tue Apr 21 12:55:41 2015
@@ -34,7 +34,6 @@ import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.ConstantScoreQuery;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
@@ -377,19 +376,12 @@ public class TermsQuery extends Query im
         final Scorer s = scorer(context, context.reader().getLiveDocs());
         final boolean exists = (s != null && s.advance(doc) == doc);
 
-        final ComplexExplanation result = new ComplexExplanation();
         if (exists) {
-          result.setDescription(TermsQuery.this.toString() + ", product of:");
-          result.setValue(queryWeight);
-          result.setMatch(Boolean.TRUE);
-          result.addDetail(new Explanation(getBoost(), "boost"));
-          result.addDetail(new Explanation(queryNorm, "queryNorm"));
+          return Explanation.match(queryWeight, TermsQuery.this.toString() + ", product of:",
+              Explanation.match(getBoost(), "boost"), Explanation.match(queryNorm, "queryNorm"));
         } else {
-          result.setDescription(TermsQuery.this.toString() + " doesn't match id " + doc);
-          result.setValue(0);
-          result.setMatch(Boolean.FALSE);
+          return Explanation.noMatch(TermsQuery.this.toString() + " doesn't match id " + doc);
         }
-        return result;
       }
 
       @Override

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/BoostedQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/BoostedQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/BoostedQuery.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/BoostedQuery.java Tue Apr 21 12:55:41 2015
@@ -26,7 +26,6 @@ import java.util.Set;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.FilterScorer;
 import org.apache.lucene.search.IndexSearcher;
@@ -115,11 +114,7 @@ public class BoostedQuery extends Query
       }
       FunctionValues vals = boostVal.getValues(fcontext, readerContext);
       float sc = subQueryExpl.getValue() * vals.floatVal(doc);
-      Explanation res = new ComplexExplanation(
-        true, sc, BoostedQuery.this.toString() + ", product of:");
-      res.addDetail(subQueryExpl);
-      res.addDetail(vals.explain(doc));
-      return res;
+      return Explanation.match(sc, BoostedQuery.this.toString() + ", product of:", subQueryExpl, vals.explain(doc));
     }
   }
 
@@ -160,11 +155,7 @@ public class BoostedQuery extends Query
         return subQueryExpl;
       }
       float sc = subQueryExpl.getValue() * vals.floatVal(doc);
-      Explanation res = new ComplexExplanation(
-        true, sc, BoostedQuery.this.toString() + ", product of:");
-      res.addDetail(subQueryExpl);
-      res.addDetail(vals.explain(doc));
-      return res;
+      return Explanation.match(sc, BoostedQuery.this.toString() + ", product of:", subQueryExpl, vals.explain(doc));
     }
 
   }

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java Tue Apr 21 12:55:41 2015
@@ -24,7 +24,6 @@ import java.util.Set;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
@@ -170,13 +169,10 @@ public class FunctionQuery extends Query
     public Explanation explain(int doc) throws IOException {
       float sc = qWeight * vals.floatVal(doc);
 
-      Explanation result = new ComplexExplanation
-        (true, sc, "FunctionQuery(" + func + "), product of:");
-
-      result.addDetail(vals.explain(doc));
-      result.addDetail(new Explanation(getBoost(), "boost"));
-      result.addDetail(new Explanation(weight.queryNorm,"queryNorm"));
-      return result;
+      return Explanation.match(sc, "FunctionQuery(" + func + "), product of:",
+          vals.explain(doc),
+          Explanation.match(getBoost(), "boost"),
+          Explanation.match(weight.queryNorm, "queryNorm"));
     }
 
   }

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java Tue Apr 21 12:55:41 2015
@@ -133,7 +133,7 @@ public abstract class FunctionValues {
   public void strVal(int doc, String [] vals) { throw new UnsupportedOperationException(); }
 
   public Explanation explain(int doc) {
-    return new Explanation(floatVal(doc), toString(doc));
+    return Explanation.match(floatVal(doc), toString(doc));
   }
 
   public ValueSourceScorer getScorer(IndexReader reader) {

Modified: lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/TestCustomScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/TestCustomScoreQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/TestCustomScoreQuery.java (original)
+++ lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/TestCustomScoreQuery.java Tue Apr 21 12:55:41 2015
@@ -17,7 +17,18 @@ package org.apache.lucene.queries;
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.DocValues;
+import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.NumericDocValues;
+import org.apache.lucene.index.Term;
 import org.apache.lucene.queries.function.FunctionQuery;
 import org.apache.lucene.queries.function.FunctionTestSetup;
 import org.apache.lucene.queries.function.ValueSource;
@@ -33,15 +44,6 @@ import org.apache.lucene.search.TermRang
 import org.apache.lucene.search.TopDocs;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.DocValues;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.NumericDocValues;
-import org.apache.lucene.index.Term;
 
 /**
  * Test CustomScoreQuery search.
@@ -94,13 +96,13 @@ public class TestCustomScoreQuery extend
 
         @Override
         public Explanation customExplain(int doc, Explanation subQueryExpl, Explanation valSrcExpl) {
-          float valSrcScore = valSrcExpl == null ? 0 : valSrcExpl.getValue();
-          Explanation exp = new Explanation(valSrcScore + subQueryExpl.getValue(), "custom score: sum of:");
-          exp.addDetail(subQueryExpl);
+          List<Explanation> subs = new ArrayList<>();
+          subs.add(subQueryExpl);
           if (valSrcExpl != null) {
-            exp.addDetail(valSrcExpl);
+            subs.add(valSrcExpl);
           }
-          return exp;
+          float valSrcScore = valSrcExpl == null ? 0 : valSrcExpl.getValue();
+          return Explanation.match(valSrcScore + subQueryExpl.getValue(), "custom score: sum of:", subs);
         }
       };
     }
@@ -140,17 +142,12 @@ public class TestCustomScoreQuery extend
           if (valSrcExpls.length == 0) {
             return subQueryExpl;
           }
-          Explanation exp = new Explanation(valSrcExpls[0].getValue() + subQueryExpl.getValue(), "sum of:");
-          exp.addDetail(subQueryExpl);
-          exp.addDetail(valSrcExpls[0]);
           if (valSrcExpls.length == 1) {
-            exp.setDescription("CustomMulAdd, sum of:");
-            return exp;
+            return Explanation.match(valSrcExpls[0].getValue() + subQueryExpl.getValue(), "CustomMulAdd, sum of:", subQueryExpl, valSrcExpls[0]);
+          } else {
+            Explanation exp = Explanation.match(valSrcExpls[0].getValue() + subQueryExpl.getValue(), "sum of:", subQueryExpl, valSrcExpls[0]);
+            return Explanation.match(valSrcExpls[1].getValue() * exp.getValue(), "custom score: product of:", valSrcExpls[1], exp);
           }
-          Explanation exp2 = new Explanation(valSrcExpls[1].getValue() * exp.getValue(), "custom score: product of:");
-          exp2.addDetail(valSrcExpls[1]);
-          exp2.addDetail(exp);
-          return exp2;
         }
       };
     }

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxOverlapRatioValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxOverlapRatioValueSource.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxOverlapRatioValueSource.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxOverlapRatioValueSource.java Tue Apr 21 12:55:41 2015
@@ -16,10 +16,13 @@
  */
 package org.apache.lucene.spatial.bbox;
 
-import com.spatial4j.core.shape.Rectangle;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.search.Explanation;
 
+import com.spatial4j.core.shape.Rectangle;
+
 /**
  * The algorithm is implemented as envelope on envelope (rect on rect) overlays rather than
  * complex polygon on complex polygon overlays.
@@ -126,7 +129,7 @@ public class BBoxOverlapRatioValueSource
   }
 
   @Override
-  protected double score(Rectangle target, Explanation exp) {
+  protected double score(Rectangle target, AtomicReference<Explanation> exp) {
     // calculate "height": the intersection height between two boxes.
     double top = Math.min(queryExtent.getMaxY(), target.getMaxY());
     double bottom = Math.max(queryExtent.getMinY(), target.getMinY());
@@ -211,25 +214,19 @@ public class BBoxOverlapRatioValueSource
     double score = queryFactor + targetFactor;
 
     if (exp!=null) {
-      exp.setValue((float)score);
-      exp.setDescription(this.getClass().getSimpleName()+": queryFactor + targetFactor");
-
-      Explanation e;//tmp
-
       String minSideDesc = minSideLength > 0.0 ? " (minSide="+minSideLength+")" : "";
-
-      exp.addDetail( e = new Explanation((float)intersectionArea, "IntersectionArea" + minSideDesc));
-      e.addDetail(new Explanation((float)width,  "width"));
-      e.addDetail(new Explanation((float)height, "height"));
-      e.addDetail(new Explanation((float)queryTargetProportion, "queryTargetProportion"));
-
-      exp.addDetail( e = new Explanation((float)queryFactor, "queryFactor"));
-      e.addDetail(new Explanation((float)queryRatio, "ratio"));
-      e.addDetail(new Explanation((float)queryArea,  "area of " + queryExtent + minSideDesc));
-
-      exp.addDetail( e = new Explanation((float)targetFactor, "targetFactor"));
-      e.addDetail(new Explanation((float)targetRatio, "ratio"));
-      e.addDetail(new Explanation((float)targetArea,  "area of " + target + minSideDesc));
+      exp.set(Explanation.match((float) score,
+          this.getClass().getSimpleName()+": queryFactor + targetFactor",
+          Explanation.match((float)intersectionArea, "IntersectionArea" + minSideDesc,
+              Explanation.match((float)width, "width"),
+              Explanation.match((float)height, "height"),
+              Explanation.match((float)queryTargetProportion, "queryTargetProportion")),
+          Explanation.match((float)queryFactor, "queryFactor",
+              Explanation.match((float)targetRatio, "ratio"),
+              Explanation.match((float)queryArea,  "area of " + queryExtent + minSideDesc)),
+          Explanation.match((float)targetFactor, "targetFactor",
+              Explanation.match((float)targetRatio, "ratio"),
+              Explanation.match((float)targetArea,  "area of " + target + minSideDesc))));
     }
 
     return score;

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxSimilarityValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxSimilarityValueSource.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxSimilarityValueSource.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxSimilarityValueSource.java Tue Apr 21 12:55:41 2015
@@ -17,7 +17,10 @@ package org.apache.lucene.spatial.bbox;
  * limitations under the License.
  */
 
-import com.spatial4j.core.shape.Rectangle;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -25,8 +28,7 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
 
-import java.io.IOException;
-import java.util.Map;
+import com.spatial4j.core.shape.Rectangle;
 
 /**
  * A base class for calculating a spatial relevance rank per document from a provided
@@ -81,10 +83,10 @@ public abstract class BBoxSimilarityValu
       public Explanation explain(int doc) {
         final Rectangle rect = (Rectangle) shapeValues.objectVal(doc);
         if (rect == null)
-          return new Explanation(0, "no rect");
-        Explanation exp = new Explanation();
-        score(rect, exp);
-        return exp;
+          return Explanation.noMatch("no rect");
+        AtomicReference<Explanation> explanation = new AtomicReference<>();
+        score(rect, explanation);
+        return explanation.get();
       }
     };
   }
@@ -95,7 +97,7 @@ public abstract class BBoxSimilarityValu
    * @param exp Optional diagnostic holder.
    * @return a score.
    */
-  protected abstract double score(Rectangle rect, Explanation exp);
+  protected abstract double score(Rectangle rect, AtomicReference<Explanation> exp);
 
   @Override
   public boolean equals(Object o) {

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxValueSource.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxValueSource.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/BBoxValueSource.java Tue Apr 21 12:55:41 2015
@@ -87,7 +87,7 @@ class BBoxValueSource extends ValueSourc
 
       @Override
       public Explanation explain(int doc) {
-        return new Explanation(Float.NaN, toString(doc));
+        return Explanation.match(Float.NaN, toString(doc));
       }
 
       @Override

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java Tue Apr 21 12:55:41 2015
@@ -266,7 +266,7 @@ public class SerializedDVStrategy extend
 
         @Override
         public Explanation explain(int doc) {
-          return new Explanation(Float.NaN, toString(doc));
+          return Explanation.match(Float.NaN, toString(doc));
         }
 
         @Override

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/DistanceToShapeValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/DistanceToShapeValueSource.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/DistanceToShapeValueSource.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/DistanceToShapeValueSource.java Tue Apr 21 12:55:41 2015
@@ -17,10 +17,12 @@ package org.apache.lucene.spatial.util;
  * limitations under the License.
  */
 
-import com.spatial4j.core.context.SpatialContext;
-import com.spatial4j.core.distance.DistanceCalculator;
-import com.spatial4j.core.shape.Point;
-import com.spatial4j.core.shape.Shape;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -28,8 +30,10 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
 
-import java.io.IOException;
-import java.util.Map;
+import com.spatial4j.core.context.SpatialContext;
+import com.spatial4j.core.distance.DistanceCalculator;
+import com.spatial4j.core.shape.Point;
+import com.spatial4j.core.shape.Shape;
 
 /**
  * The distance from a provided Point to a Point retrieved from a ValueSource via
@@ -84,8 +88,9 @@ public class DistanceToShapeValueSource
       @Override
       public Explanation explain(int doc) {
         Explanation exp = super.explain(doc);
-        exp.addDetail(shapeValues.explain(doc));
-        return exp;
+        List<Explanation> details = new ArrayList<>(Arrays.asList(exp.getDetails()));
+        details.add(shapeValues.explain(doc));
+        return Explanation.match(exp.getValue(), exp.getDescription(), details);
       }
     };
   }

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeAreaValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeAreaValueSource.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeAreaValueSource.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeAreaValueSource.java Tue Apr 21 12:55:41 2015
@@ -18,10 +18,14 @@ package org.apache.lucene.spatial.util;
  */
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 import com.spatial4j.core.context.SpatialContext;
 import com.spatial4j.core.shape.Shape;
+
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -83,8 +87,9 @@ public class ShapeAreaValueSource extend
       @Override
       public Explanation explain(int doc) {
         Explanation exp = super.explain(doc);
-        exp.addDetail(shapeValues.explain(doc));
-        return exp;
+        List<Explanation> details = new ArrayList<>(Arrays.asList(exp.getDetails()));
+        details.add(shapeValues.explain(doc));
+        return Explanation.match(exp.getValue(), exp.getDescription(), details);
       }
     };
   }

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapePredicateValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapePredicateValueSource.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapePredicateValueSource.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapePredicateValueSource.java Tue Apr 21 12:55:41 2015
@@ -18,6 +18,7 @@ package org.apache.lucene.spatial.util;
  */
 
 import com.spatial4j.core.shape.Shape;
+
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -27,6 +28,9 @@ import org.apache.lucene.search.IndexSea
 import org.apache.lucene.spatial.query.SpatialOperation;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -79,8 +83,9 @@ public class ShapePredicateValueSource e
       @Override
       public Explanation explain(int doc) {
         Explanation exp = super.explain(doc);
-        exp.addDetail(shapeValues.explain(doc));
-        return exp;
+        List<Explanation> details = new ArrayList<>(Arrays.asList(exp.getDetails()));
+        details.add(shapeValues.explain(doc));
+        return Explanation.match(exp.getValue(), exp.getDescription(), details);
       }
     };
   }

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java Tue Apr 21 12:55:41 2015
@@ -347,7 +347,7 @@ public class CheckHits {
     if (expl.getDescription().endsWith("computed from:")) {
       return; // something more complicated.
     }
-    if (detail!=null) {
+    if (detail.length > 0) {
       if (detail.length==1) {
         // simple containment, unless it's a freq of: (which lets a query explain how the freq is calculated), 
         // just verify contained expl has same score

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java Tue Apr 21 12:55:41 2015
@@ -22,10 +22,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.spatial4j.core.context.SpatialContext;
-import com.spatial4j.core.distance.DistanceUtils;
-import com.spatial4j.core.shape.Point;
-import com.spatial4j.core.shape.Rectangle;
 import org.apache.lucene.document.FieldType;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
@@ -35,7 +31,6 @@ import org.apache.lucene.queries.functio
 import org.apache.lucene.queries.function.valuesource.VectorValueSource;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
@@ -53,6 +48,11 @@ import org.apache.solr.search.QParser;
 import org.apache.solr.search.SpatialOptions;
 import org.apache.solr.util.SpatialUtils;
 
+import com.spatial4j.core.context.SpatialContext;
+import com.spatial4j.core.distance.DistanceUtils;
+import com.spatial4j.core.shape.Point;
+import com.spatial4j.core.shape.Rectangle;
+
 
 /**
  * Represents a Latitude/Longitude as a 2 dimensional point.  Latitude is <b>always</b> specified first.
@@ -495,13 +495,14 @@ class SpatialDistanceQuery extends Exten
 
       String description = SpatialDistanceQuery.this.toString();
 
-      Explanation result = new ComplexExplanation
-        (this.doc == doc, sc, description +  " product of:");
-      // result.addDetail(new Explanation((float)dist, "hsin("+latVals.explain(doc)+","+lonVals.explain(doc)));
-      result.addDetail(new Explanation((float)dist, "hsin("+latVals.doubleVal(doc)+","+lonVals.doubleVal(doc)));
-      result.addDetail(new Explanation(getBoost(), "boost"));
-      result.addDetail(new Explanation(weight.queryNorm,"queryNorm"));
-      return result;
+      if (matched) {
+        return Explanation.match(sc, description + " product of:",
+            Explanation.match((float) dist, "hsin("+latVals.doubleVal(doc)+","+lonVals.doubleVal(doc)),
+            Explanation.match(getBoost(), "boost"),
+            Explanation.match(weight.queryNorm,"queryNorm"));
+      } else {
+        return Explanation.noMatch("No match");
+      }
     }
 
   }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java Tue Apr 21 12:55:41 2015
@@ -31,7 +31,6 @@ import org.apache.lucene.index.MultiPost
 import org.apache.lucene.index.PostingsEnum;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
@@ -568,22 +567,13 @@ class JoinQuery extends Query {
       Scorer scorer = scorer(context, context.reader().getLiveDocs());
       boolean exists = scorer.advance(doc) == doc;
 
-      ComplexExplanation result = new ComplexExplanation();
-
       if (exists) {
-        result.setDescription(this.toString()
-        + " , product of:");
-        result.setValue(queryWeight);
-        result.setMatch(Boolean.TRUE);
-        result.addDetail(new Explanation(getBoost(), "boost"));
-        result.addDetail(new Explanation(queryNorm,"queryNorm"));
+        return Explanation.match(queryWeight, this.toString() + " , product of:",
+            Explanation.match(getBoost(), "boost"),
+            Explanation.match(queryNorm,"queryNorm"));
       } else {
-        result.setDescription(this.toString()
-        + " doesn't match id " + doc);
-        result.setValue(0);
-        result.setMatch(Boolean.FALSE);
+        return Explanation.noMatch(this.toString() + " doesn't match id " + doc);
       }
-      return result;
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrConstantScoreQuery.java Tue Apr 21 12:55:41 2015
@@ -7,7 +7,6 @@ import java.util.Set;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.search.ComplexExplanation;
 import org.apache.lucene.search.ConstantScoreQuery;
 import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.search.DocIdSetIterator;
@@ -135,22 +134,13 @@ public class SolrConstantScoreQuery exte
       ConstantScorer cs = new ConstantScorer(context, this, queryWeight, context.reader().getLiveDocs());
       boolean exists = cs.docIdSetIterator.advance(doc) == doc;
 
-      ComplexExplanation result = new ComplexExplanation();
-
       if (exists) {
-        result.setDescription("ConstantScoreQuery(" + filter
-        + "), product of:");
-        result.setValue(queryWeight);
-        result.setMatch(Boolean.TRUE);
-        result.addDetail(new Explanation(getBoost(), "boost"));
-        result.addDetail(new Explanation(queryNorm,"queryNorm"));
+        return Explanation.match(queryWeight, "ConstantScoreQuery(" + filter + "), product of:",
+            Explanation.match(getBoost(), "boost"),
+            Explanation.match(queryNorm,"queryNorm"));
       } else {
-        result.setDescription("ConstantScoreQuery(" + filter
-        + ") doesn't match id " + doc);
-        result.setValue(0);
-        result.setMatch(Boolean.FALSE);
+        return Explanation.noMatch("ConstantScoreQuery(" + filter + ") doesn't match id " + doc);
       }
-      return result;
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java?rev=1675109&r1=1675108&r2=1675109&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java Tue Apr 21 12:55:41 2015
@@ -387,7 +387,7 @@ public class SolrPluginUtils {
     Explanation[] details = e.getDetails();
 
     // short circut out
-    if (null == details || 0 == details.length) return out;
+    if (0 == details.length) return out;
 
     List<NamedList<Object>> kids
       = new ArrayList<>(details.length);