You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2018/09/04 10:02:38 UTC

[2/2] lucene-solr:master: LUCENE-6228: Add Scorable class and make LeafCollector.setScorer() take Scorable

LUCENE-6228: Add Scorable class and make LeafCollector.setScorer() take Scorable


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/910a0231
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/910a0231
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/910a0231

Branch: refs/heads/master
Commit: 910a0231f6fc668426056e31d43e293248ff5ce1
Parents: 1acfca5
Author: Alan Woodward <ro...@apache.org>
Authored: Mon Sep 3 16:46:59 2018 +0100
Committer: Alan Woodward <ro...@apache.org>
Committed: Tue Sep 4 11:01:44 2018 +0100

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  4 +
 lucene/MIGRATE.txt                              |  7 ++
 .../document/LatLonPointDistanceComparator.java |  4 +-
 .../search/BlockMaxConjunctionScorer.java       |  6 +-
 .../org/apache/lucene/search/BooleanScorer.java |  4 +-
 .../org/apache/lucene/search/BooleanWeight.java |  2 +-
 .../apache/lucene/search/CachingCollector.java  |  4 +-
 .../apache/lucene/search/ConjunctionScorer.java |  6 +-
 .../lucene/search/ConstantScoreQuery.java       | 14 ++--
 .../apache/lucene/search/DisjunctionScorer.java |  6 +-
 .../lucene/search/DoubleValuesSource.java       |  6 +-
 .../org/apache/lucene/search/FakeScorer.java    |  2 +-
 .../apache/lucene/search/FieldComparator.java   | 10 +--
 .../lucene/search/FilterLeafCollector.java      |  2 +-
 .../apache/lucene/search/FilterScorable.java    | 58 +++++++++++++
 .../org/apache/lucene/search/LRUQueryCache.java |  4 +-
 .../org/apache/lucene/search/LeafCollector.java |  2 +-
 .../lucene/search/LeafFieldComparator.java      |  2 +-
 .../apache/lucene/search/LongValuesSource.java  |  2 +-
 .../lucene/search/MinShouldMatchSumScorer.java  |  6 +-
 .../apache/lucene/search/MultiCollector.java    |  9 +-
 .../lucene/search/MultiCollectorManager.java    |  6 +-
 .../lucene/search/MultiLeafFieldComparator.java |  2 +-
 .../search/PositiveScoresOnlyCollector.java     |  4 +-
 .../org/apache/lucene/search/ReqExclScorer.java |  4 +-
 .../apache/lucene/search/ReqOptSumScorer.java   |  8 +-
 .../java/org/apache/lucene/search/Scorable.java | 86 ++++++++++++++++++++
 .../search/ScoreCachingWrappingScorer.java      | 24 +++---
 .../java/org/apache/lucene/search/Scorer.java   | 70 +---------------
 .../apache/lucene/search/SimpleCollector.java   |  2 +-
 .../lucene/search/SimpleFieldComparator.java    |  2 +-
 .../apache/lucene/search/TopFieldCollector.java |  4 +-
 .../lucene/search/TopScoreDocCollector.java     |  6 +-
 .../org/apache/lucene/search/WANDScorer.java    |  6 +-
 .../org/apache/lucene/index/TestOmitTf.java     | 18 ++--
 .../apache/lucene/search/JustCompileSearch.java |  2 +-
 .../lucene/search/MultiCollectorTest.java       |  8 +-
 .../org/apache/lucene/search/TestBooleanOr.java |  2 +-
 .../apache/lucene/search/TestBooleanQuery.java  |  4 +-
 .../search/TestBooleanQueryVisitSubscorers.java | 19 ++---
 .../apache/lucene/search/TestConjunctions.java  |  8 +-
 .../lucene/search/TestConstantScoreQuery.java   | 26 +++++-
 .../lucene/search/TestDoubleValuesSource.java   |  6 +-
 .../lucene/search/TestElevationComparator.java  |  2 +-
 .../lucene/search/TestMultiCollector.java       |  6 +-
 .../lucene/search/TestReqExclBulkScorer.java    |  4 +-
 .../search/TestScoreCachingWrappingScorer.java  |  4 +-
 .../apache/lucene/search/TestSimilarity.java    | 16 ++--
 .../lucene/search/TestSloppyPhraseQuery.java    | 14 +---
 .../lucene/search/TestSubScorerFreqs.java       | 22 ++---
 .../apache/lucene/search/TestTermScorer.java    |  4 +-
 .../search/TestTimeLimitingCollector.java       |  2 +-
 .../lucene/search/TestTopDocsCollector.java     |  2 +-
 .../lucene/search/TestTopFieldCollector.java    | 19 +----
 .../lucene/facet/DrillSidewaysScorer.java       |  4 +-
 .../apache/lucene/facet/FacetsCollector.java    |  6 +-
 .../facet/AssertingSubDocsAtOnceCollector.java  | 11 ++-
 .../search/grouping/AllGroupHeadsCollector.java | 24 +++---
 .../search/grouping/AllGroupsCollector.java     |  4 +-
 .../search/grouping/BlockGroupingCollector.java |  5 +-
 .../grouping/FirstPassGroupingCollector.java    |  4 +-
 .../search/grouping/GroupFacetCollector.java    |  4 +-
 .../lucene/search/grouping/GroupReducer.java    |  4 +-
 .../grouping/SecondPassGroupingCollector.java   |  4 +-
 .../search/grouping/TopGroupsCollector.java     |  6 +-
 .../search/highlight/HighlighterPhraseTest.java |  5 +-
 .../search/join/GlobalOrdinalsCollector.java    |  6 +-
 .../join/GlobalOrdinalsWithScoreCollector.java  | 14 ++--
 .../org/apache/lucene/search/join/JoinUtil.java | 10 +--
 .../search/join/TermsWithScoreCollector.java    |  6 +-
 .../search/join/ToChildBlockJoinQuery.java      |  4 +-
 .../search/join/ToParentBlockJoinQuery.java     |  4 +-
 .../apache/lucene/search/join/TestJoinUtil.java | 10 +--
 .../apache/lucene/index/memory/MemoryIndex.java |  6 +-
 .../search/DiversifiedTopDocsCollector.java     |  4 +-
 .../lucene/search/DocValuesStatsCollector.java  |  4 +-
 .../surround/query/BooleanQueryTst.java         | 10 +--
 .../apache/lucene/search/CoveringScorer.java    |  6 +-
 .../spatial3d/Geo3DPointDistanceComparator.java |  4 +-
 .../Geo3DPointOutsideDistanceComparator.java    |  4 +-
 .../document/TopSuggestDocsCollector.java       |  2 +-
 .../lucene/search/AssertingBulkScorer.java      |  4 +-
 .../lucene/search/AssertingCollector.java       | 11 +--
 .../lucene/search/AssertingIndexSearcher.java   |  2 +-
 .../lucene/search/AssertingLeafCollector.java   | 13 +--
 .../apache/lucene/search/AssertingScorable.java | 64 +++++++++++++++
 .../apache/lucene/search/AssertingScorer.java   |  4 +-
 .../lucene/search/BulkScorerWrapperScorer.java  |  4 +-
 .../org/apache/lucene/search/CheckHits.java     |  6 +-
 .../org/apache/lucene/search/QueryUtils.java    | 14 ++--
 .../org/apache/solr/ltr/LTRScoringQuery.java    | 14 ++--
 .../solr/ltr/TestLTRReRankingPipeline.java      |  6 +-
 .../solr/handler/component/ExpandComponent.java |  6 +-
 .../solr/handler/component/QueryComponent.java  |  2 +-
 .../solr/search/CollapsingQParserPlugin.java    | 11 +--
 .../apache/solr/search/DelegatingCollector.java |  8 +-
 .../org/apache/solr/search/DocSetCollector.java |  4 +-
 .../apache/solr/search/ExportQParserPlugin.java |  4 +-
 .../apache/solr/search/HashQParserPlugin.java   |  7 +-
 .../apache/solr/search/MaxScoreCollector.java   |  6 +-
 .../apache/solr/search/SolrIndexSearcher.java   |  8 +-
 .../apache/solr/search/TestRankQueryPlugin.java |  9 +-
 102 files changed, 542 insertions(+), 412 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index c2a9e2e..f95ce90 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -69,6 +69,10 @@ API Changes
   need to be set on top hits via TopFieldCollector#populateScores instead.
   (Adrien Grand)
 
+* LUCENE-6228: A new Scorable abstract class has been added, containing only those
+  methods from Scorer that should be called from Collectors.  LeafCollector.setScorer()
+  now takes a Scorable rather than a Scorer. (Alan Woodward, Adrien Grand)
+
 Changes in Runtime Behavior
 
 * LUCENE-8333: Switch MoreLikeThis.setMaxDocFreqPct to use maxDoc instead of

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/MIGRATE.txt
----------------------------------------------------------------------
diff --git a/lucene/MIGRATE.txt b/lucene/MIGRATE.txt
index 01e0baa..97ceb77 100644
--- a/lucene/MIGRATE.txt
+++ b/lucene/MIGRATE.txt
@@ -106,3 +106,10 @@ This RAM-based directory implementation is an old piece of code that uses ineffi
 thread synchronization primitives and can be confused as "faster" than the NIO-based
 MMapDirectory. It is deprecated and scheduled for removal in future versions of 
 Lucene. (LUCENE-8467, LUCENE-8438)
+
+## LeafCollector.setScorer() now takes a Scorable rather than a Scorer ##
+
+Scorer has a number of methods that should never be called from Collectors, for example
+those that advance the underlying iterators.  To hide these, LeafCollector.setScorer()
+now takes a Scorable, an abstract class that Scorers can extend, with methods
+docId() and score() (LUCENE-6228)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/document/LatLonPointDistanceComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonPointDistanceComparator.java b/lucene/core/src/java/org/apache/lucene/document/LatLonPointDistanceComparator.java
index 40e8dee..7a2c5b0 100644
--- a/lucene/core/src/java/org/apache/lucene/document/LatLonPointDistanceComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/document/LatLonPointDistanceComparator.java
@@ -26,7 +26,7 @@ import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.SortedNumericDocValues;
 import org.apache.lucene.search.FieldComparator;
 import org.apache.lucene.search.LeafFieldComparator;
-import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.Scorable;
 import org.apache.lucene.util.ArrayUtil;
 import org.apache.lucene.util.RamUsageEstimator;
 import org.apache.lucene.util.SloppyMath;
@@ -78,7 +78,7 @@ class LatLonPointDistanceComparator extends FieldComparator<Double> implements L
   }
   
   @Override
-  public void setScorer(Scorer scorer) {}
+  public void setScorer(Scorable scorer) {}
 
   @Override
   public int compare(int slot1, int slot2) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionScorer.java b/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionScorer.java
index b49c800..fa3743f 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BlockMaxConjunctionScorer.java
@@ -250,10 +250,10 @@ final class BlockMaxConjunctionScorer extends Scorer {
   }
 
   @Override
-  public Collection<ChildScorer> getChildren() {
-    ArrayList<ChildScorer> children = new ArrayList<>();
+  public Collection<ChildScorable> getChildren() {
+    ArrayList<ChildScorable> children = new ArrayList<>();
     for (Scorer scorer : scorers) {
-      children.add(new ChildScorer(scorer, "MUST"));
+      children.add(new ChildScorable(scorer, "MUST"));
     }
     return children;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java b/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
index 0e075b4..a66305b 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
@@ -124,10 +124,10 @@ final class BooleanScorer extends BulkScorer {
   final long cost;
 
   final class OrCollector implements LeafCollector {
-    Scorer scorer;
+    Scorable scorer;
 
     @Override
-    public void setScorer(Scorer scorer) {
+    public void setScorer(Scorable scorer) {
       this.scorer = scorer;
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/BooleanWeight.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/BooleanWeight.java b/lucene/core/src/java/org/apache/lucene/search/BooleanWeight.java
index e0ea044..d58b246 100644
--- a/lucene/core/src/java/org/apache/lucene/search/BooleanWeight.java
+++ b/lucene/core/src/java/org/apache/lucene/search/BooleanWeight.java
@@ -163,7 +163,7 @@ final class BooleanWeight extends Weight {
           FakeScorer fake = new FakeScorer();
 
           @Override
-          public void setScorer(Scorer scorer) throws IOException {
+          public void setScorer(Scorable scorer) throws IOException {
             collector.setScorer(fake);
           }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java b/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java
index 6681c59..f2da14b 100644
--- a/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java
@@ -256,7 +256,7 @@ public abstract class CachingCollector extends FilterCollector {
 
   private class ScoreCachingLeafCollector extends NoScoreCachingLeafCollector {
 
-    Scorer scorer;
+    Scorable scorer;
     float[] scores;
 
     ScoreCachingLeafCollector(LeafCollector in, int maxDocsToCache) {
@@ -265,7 +265,7 @@ public abstract class CachingCollector extends FilterCollector {
     }
 
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
+    public void setScorer(Scorable scorer) throws IOException {
       this.scorer = scorer;
       super.setScorer(scorer);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java b/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
index 5fe5c75..eafc57f 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
@@ -91,10 +91,10 @@ class ConjunctionScorer extends Scorer {
   }
 
   @Override
-  public Collection<ChildScorer> getChildren() {
-    ArrayList<ChildScorer> children = new ArrayList<>();
+  public Collection<ChildScorable> getChildren() {
+    ArrayList<ChildScorable> children = new ArrayList<>();
     for (Scorer scorer : required) {
-      children.add(new ChildScorer(scorer, "MUST"));
+      children.add(new ChildScorable(scorer, "MUST"));
     }
     return children;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java b/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
index d696c21..5c9ed19 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
@@ -87,15 +87,11 @@ public final class ConstantScoreQuery extends Query {
     private LeafCollector wrapCollector(LeafCollector collector) {
       return new FilterLeafCollector(collector) {
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           // we must wrap again here, but using the scorer passed in as parameter:
-          in.setScorer(new FilterScorer(scorer) {
+          in.setScorer(new FilterScorable(scorer) {
             @Override
-            public float score() throws IOException {
-              return theScore;
-            }
-            @Override
-            public float getMaxScore(int upTo) throws IOException {
+            public float score() {
               return theScore;
             }
           });
@@ -145,8 +141,8 @@ public final class ConstantScoreQuery extends Query {
                   return score;
                 }
                 @Override
-                public Collection<ChildScorer> getChildren() {
-                  return Collections.singleton(new ChildScorer(innerScorer, "constant"));
+                public Collection<ChildScorable> getChildren() {
+                  return Collections.singleton(new ChildScorable(innerScorer, "constant"));
                 }
               };
             }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/DisjunctionScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/DisjunctionScorer.java b/lucene/core/src/java/org/apache/lucene/search/DisjunctionScorer.java
index 249521e..b1f2fd2 100644
--- a/lucene/core/src/java/org/apache/lucene/search/DisjunctionScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/DisjunctionScorer.java
@@ -198,10 +198,10 @@ abstract class DisjunctionScorer extends Scorer {
   protected abstract float score(DisiWrapper topList) throws IOException;
 
   @Override
-  public final Collection<ChildScorer> getChildren() throws IOException {
-    ArrayList<ChildScorer> children = new ArrayList<>();
+  public final Collection<ChildScorable> getChildren() throws IOException {
+    ArrayList<ChildScorable> children = new ArrayList<>();
     for (DisiWrapper scorer = getSubMatches(); scorer != null; scorer = scorer.next) {
-      children.add(new ChildScorer(scorer.scorer, "SHOULD"));
+      children.add(new ChildScorable(scorer.scorer, "SHOULD"));
     }
     return children;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java b/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
index 3938d3f..929e45f 100644
--- a/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
+++ b/lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java
@@ -41,7 +41,7 @@ import org.apache.lucene.index.NumericDocValues;
  * special long-to-double encoding is required.
  *
  * Scores may be used as a source for value calculations by wrapping a {@link Scorer} using
- * {@link #fromScorer(Scorer)} and passing the resulting DoubleValues to {@link #getValues(LeafReaderContext, DoubleValues)}.
+ * {@link #fromScorer(Scorable)} and passing the resulting DoubleValues to {@link #getValues(LeafReaderContext, DoubleValues)}.
  * The scores can then be accessed using the {@link #SCORES} DoubleValuesSource.
  */
 public abstract class DoubleValuesSource implements SegmentCacheable {
@@ -331,7 +331,7 @@ public abstract class DoubleValuesSource implements SegmentCacheable {
   /**
    * Returns a DoubleValues instance that wraps scores returned by a Scorer
    */
-  public static DoubleValues fromScorer(Scorer scorer) {
+  public static DoubleValues fromScorer(Scorable scorer) {
     return new DoubleValues() {
       @Override
       public double doubleValue() throws IOException {
@@ -471,7 +471,7 @@ public abstract class DoubleValuesSource implements SegmentCacheable {
         }
 
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           holder.values = producer.getValues(ctx, fromScorer(scorer));
         }
       };

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/FakeScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/FakeScorer.java b/lucene/core/src/java/org/apache/lucene/search/FakeScorer.java
index c8b3438..271833a 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FakeScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FakeScorer.java
@@ -56,7 +56,7 @@ final class FakeScorer extends Scorer {
   }
 
   @Override
-  public Collection<ChildScorer> getChildren() {
+  public Collection<ChildScorable> getChildren() {
     throw new UnsupportedOperationException();
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
index 3fe0e93..2437a33 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java
@@ -412,7 +412,7 @@ public abstract class FieldComparator<T> {
   public static final class RelevanceComparator extends FieldComparator<Float> implements LeafFieldComparator {
     private final float[] scores;
     private float bottom;
-    private Scorer scorer;
+    private Scorable scorer;
     private float topValue;
 
     /** Creates a new comparator based on relevance for {@code numHits}. */
@@ -454,7 +454,7 @@ public abstract class FieldComparator<T> {
     }
 
     @Override
-    public void setScorer(Scorer scorer) {
+    public void setScorer(Scorable scorer) {
       // wrap with a ScoreCachingWrappingScorer so that successive calls to
       // score() will not incur score computation over and
       // over again.
@@ -546,7 +546,7 @@ public abstract class FieldComparator<T> {
     }
 
     @Override
-    public void setScorer(Scorer scorer) {}
+    public void setScorer(Scorable scorer) {}
   }
   
   /** Sorts by field's natural Term sort order, using
@@ -818,7 +818,7 @@ public abstract class FieldComparator<T> {
     }
 
     @Override
-    public void setScorer(Scorer scorer) {}
+    public void setScorer(Scorable scorer) {}
   }
   
   /** Sorts by field's natural Term sort order.  All
@@ -926,6 +926,6 @@ public abstract class FieldComparator<T> {
     }
 
     @Override
-    public void setScorer(Scorer scorer) {}
+    public void setScorer(Scorable scorer) {}
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java b/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java
index 14f5ab0..5adecb9 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java
@@ -34,7 +34,7 @@ public abstract class FilterLeafCollector implements LeafCollector {
   }
 
   @Override
-  public void setScorer(Scorer scorer) throws IOException {
+  public void setScorer(Scorable scorer) throws IOException {
     in.setScorer(scorer);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/FilterScorable.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/FilterScorable.java b/lucene/core/src/java/org/apache/lucene/search/FilterScorable.java
new file mode 100644
index 0000000..c2e68c1
--- /dev/null
+++ b/lucene/core/src/java/org/apache/lucene/search/FilterScorable.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.search;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Filter a {@link Scorable}, intercepting methods and optionally changing
+ * their return values
+ *
+ * The default implementation simply passes all calls to its delegate, with
+ * the exception of {@link #setMinCompetitiveScore(float)} which defaults
+ * to a no-op.
+ */
+public class FilterScorable extends Scorable {
+
+  protected final Scorable in;
+
+  /**
+   * Filter a scorer
+   * @param in  the scorer to filter
+   */
+  public FilterScorable(Scorable in) {
+    this.in = in;
+  }
+
+  @Override
+  public float score() throws IOException {
+    return in.score();
+  }
+
+  @Override
+  public int docID() {
+    return in.docID();
+  }
+
+  @Override
+  public Collection<ChildScorable> getChildren() throws IOException {
+    return Collections.singletonList(new ChildScorable(in, "FILTER"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/LRUQueryCache.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/LRUQueryCache.java b/lucene/core/src/java/org/apache/lucene/search/LRUQueryCache.java
index 27480e0..511de47 100644
--- a/lucene/core/src/java/org/apache/lucene/search/LRUQueryCache.java
+++ b/lucene/core/src/java/org/apache/lucene/search/LRUQueryCache.java
@@ -503,7 +503,7 @@ public class LRUQueryCache implements QueryCache, Accountable {
     scorer.score(new LeafCollector() {
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {}
+      public void setScorer(Scorable scorer) throws IOException {}
 
       @Override
       public void collect(int doc) throws IOException {
@@ -520,7 +520,7 @@ public class LRUQueryCache implements QueryCache, Accountable {
     scorer.score(new LeafCollector() {
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {}
+      public void setScorer(Scorable scorer) throws IOException {}
 
       @Override
       public void collect(int doc) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java b/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java
index 9704026..02e3036 100644
--- a/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java
@@ -76,7 +76,7 @@ public interface LeafCollector {
    * {@link #collect(int)}), should save the passed-in Scorer and call
    * scorer.score() when needed.
    */
-  void setScorer(Scorer scorer) throws IOException;
+  void setScorer(Scorable scorer) throws IOException;
   
   /**
    * Called once for every document matching a query, with the unbased document

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
index 677639c..c2c2274 100644
--- a/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/LeafFieldComparator.java
@@ -114,6 +114,6 @@ public interface LeafFieldComparator {
    * 
    * @param scorer Scorer instance that you should use to
    * obtain the current hit's score, if necessary. */
-  void setScorer(Scorer scorer) throws IOException;
+  void setScorer(Scorable scorer) throws IOException;
 
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java b/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
index a7d5981..867d411 100644
--- a/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
+++ b/lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java
@@ -325,7 +325,7 @@ public abstract class LongValuesSource implements SegmentCacheable {
         }
 
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           holder.values = producer.getValues(ctx, DoubleValuesSource.fromScorer(scorer));
         }
       };

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/MinShouldMatchSumScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/MinShouldMatchSumScorer.java b/lucene/core/src/java/org/apache/lucene/search/MinShouldMatchSumScorer.java
index 6ffbe34..9a95da4 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MinShouldMatchSumScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MinShouldMatchSumScorer.java
@@ -117,11 +117,11 @@ final class MinShouldMatchSumScorer extends Scorer {
   }
 
   @Override
-  public final Collection<ChildScorer> getChildren() throws IOException {
-    List<ChildScorer> matchingChildren = new ArrayList<>();
+  public final Collection<ChildScorable> getChildren() throws IOException {
+    List<ChildScorable> matchingChildren = new ArrayList<>();
     updateFreq();
     for (DisiWrapper s = lead; s != null; s = s.next) {
-      matchingChildren.add(new ChildScorer(s.scorer, "SHOULD"));
+      matchingChildren.add(new ChildScorable(s.scorer, "SHOULD"));
     }
     return matchingChildren;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java b/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java
index 2b8bda3..82251e4 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java
@@ -151,11 +151,11 @@ public class MultiCollector implements Collector {
     }
 
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
+    public void setScorer(Scorable scorer) throws IOException {
       if (cacheScores) {
         scorer = new ScoreCachingWrappingScorer(scorer);
       }
-      scorer = new FilterScorer(scorer) {
+      scorer = new FilterScorable(scorer) {
         @Override
         public void setMinCompetitiveScore(float minScore) {
           // Ignore calls to setMinCompetitiveScore so that if we wrap two
@@ -164,10 +164,7 @@ public class MultiCollector implements Collector {
           // min scores and take the maximum min score across collectors, but
           // this is very unlikely to be helpful in practice.
         }
-        @Override
-        public float getMaxScore(int upTo) throws IOException {
-          return in.getMaxScore(upTo);
-        }
+
       };
       for (int i = 0; i < numCollectors; ++i) {
         final LeafCollector c = collectors[i];

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/MultiCollectorManager.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/MultiCollectorManager.java b/lucene/core/src/java/org/apache/lucene/search/MultiCollectorManager.java
index efb2864..6e73c54 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MultiCollectorManager.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MultiCollectorManager.java
@@ -16,13 +16,13 @@
  */
 package org.apache.lucene.search;
 
-import org.apache.lucene.index.LeafReaderContext;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.lucene.index.LeafReaderContext;
+
 /**
  * A {@link CollectorManager} implements which wrap a set of {@link CollectorManager}
  * as {@link MultiCollector} acts for {@link Collector}.
@@ -97,7 +97,7 @@ public class MultiCollectorManager implements CollectorManager<MultiCollectorMan
       }
 
       @Override
-      final public void setScorer(final Scorer scorer) throws IOException {
+      final public void setScorer(final Scorable scorer) throws IOException {
         for (LeafCollector leafCollector : leafCollectors)
           if (leafCollector != null)
             leafCollector.setScorer(scorer);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/MultiLeafFieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/MultiLeafFieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/MultiLeafFieldComparator.java
index 5fdb87d..acec040 100644
--- a/lucene/core/src/java/org/apache/lucene/search/MultiLeafFieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/MultiLeafFieldComparator.java
@@ -83,7 +83,7 @@ final class MultiLeafFieldComparator implements LeafFieldComparator {
   }
 
   @Override
-  public void setScorer(Scorer scorer) throws IOException {
+  public void setScorer(Scorable scorer) throws IOException {
     for (LeafFieldComparator comparator : comparators) {
       comparator.setScorer(scorer);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/PositiveScoresOnlyCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/PositiveScoresOnlyCollector.java b/lucene/core/src/java/org/apache/lucene/search/PositiveScoresOnlyCollector.java
index e5294db..def8d65 100644
--- a/lucene/core/src/java/org/apache/lucene/search/PositiveScoresOnlyCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/PositiveScoresOnlyCollector.java
@@ -37,10 +37,10 @@ public class PositiveScoresOnlyCollector extends FilterCollector {
       throws IOException {
     return new FilterLeafCollector(super.getLeafCollector(context)) {
 
-      private Scorer scorer;
+      private Scorable scorer;
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {
+      public void setScorer(Scorable scorer) throws IOException {
         this.scorer = new ScoreCachingWrappingScorer(scorer);
         in.setScorer(this.scorer);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java b/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
index cee0a45..d5c114a 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ReqExclScorer.java
@@ -93,8 +93,8 @@ class ReqExclScorer extends Scorer {
   }
 
   @Override
-  public Collection<ChildScorer> getChildren() {
-    return Collections.singleton(new ChildScorer(reqScorer, "MUST"));
+  public Collection<ChildScorable> getChildren() {
+    return Collections.singleton(new ChildScorable(reqScorer, "MUST"));
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java b/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
index 28f64b2..22df0af 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ReqOptSumScorer.java
@@ -300,10 +300,10 @@ class ReqOptSumScorer extends Scorer {
   }
 
   @Override
-  public Collection<ChildScorer> getChildren() {
-    ArrayList<ChildScorer> children = new ArrayList<>(2);
-    children.add(new ChildScorer(reqScorer, "MUST"));
-    children.add(new ChildScorer(optScorer, "SHOULD"));
+  public Collection<ChildScorable> getChildren() {
+    ArrayList<ChildScorable> children = new ArrayList<>(2);
+    children.add(new ChildScorable(reqScorer, "MUST"));
+    children.add(new ChildScorable(optScorer, "SHOULD"));
     return children;
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/Scorable.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/Scorable.java b/lucene/core/src/java/org/apache/lucene/search/Scorable.java
new file mode 100644
index 0000000..5102949
--- /dev/null
+++ b/lucene/core/src/java/org/apache/lucene/search/Scorable.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.search;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Allows access to the score of a Query
+ */
+public abstract class Scorable {
+
+  /**
+   * Returns the score of the current document matching the query.
+   */
+  public abstract float score() throws IOException;
+
+  /**
+   * Returns the doc ID that is currently being scored.
+   */
+  public abstract int docID();
+
+  /**
+   * Optional method: Tell the scorer that its iterator may safely ignore all
+   * documents whose score is less than the given {@code minScore}. This is a
+   * no-op by default.
+   *
+   * This method may only be called from collectors that use
+   * {@link ScoreMode#TOP_SCORES}, and successive calls may only set increasing
+   * values of {@code minScore}.
+   */
+  public void setMinCompetitiveScore(float minScore) {
+    // no-op by default
+  }
+
+  /**
+   * Returns child sub-scorers positioned on the current document
+   * @lucene.experimental
+   */
+  public Collection<ChildScorable> getChildren() throws IOException {
+    return Collections.emptyList();
+  }
+
+  /** A child Scorer and its relationship to its parent.
+   * the meaning of the relationship depends upon the parent query.
+   * @lucene.experimental */
+  public static class ChildScorable {
+    /**
+     * Child Scorer. (note this is typically a direct child, and may
+     * itself also have children).
+     */
+    public final Scorable child;
+    /**
+     * An arbitrary string relating this scorer to the parent.
+     */
+    public final String relationship;
+
+    /**
+     * Creates a new ChildScorer node with the specified relationship.
+     * <p>
+     * The relationship can be any be any string that makes sense to
+     * the parent Scorer.
+     */
+    public ChildScorable(Scorable child, String relationship) {
+      this.child = child;
+      this.relationship = relationship;
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/ScoreCachingWrappingScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/ScoreCachingWrappingScorer.java b/lucene/core/src/java/org/apache/lucene/search/ScoreCachingWrappingScorer.java
index d775c37..0f11609 100644
--- a/lucene/core/src/java/org/apache/lucene/search/ScoreCachingWrappingScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/ScoreCachingWrappingScorer.java
@@ -32,14 +32,15 @@ import java.util.Collections;
  * several places, however all they have in hand is a {@link Scorer} object, and
  * might end up computing the score of a document more than once.
  */
-public final class ScoreCachingWrappingScorer extends FilterScorer {
+public final class ScoreCachingWrappingScorer extends Scorable {
 
   private int curDoc = -1;
   private float curScore;
+  private final Scorable in;
 
   /** Creates a new instance by wrapping the given scorer. */
-  public ScoreCachingWrappingScorer(Scorer scorer) {
-    super(scorer);
+  public ScoreCachingWrappingScorer(Scorable scorer) {
+    this.in = scorer;
   }
 
   @Override
@@ -54,22 +55,17 @@ public final class ScoreCachingWrappingScorer extends FilterScorer {
   }
 
   @Override
-  public float getMaxScore(int upTo) throws IOException {
-    return in.getMaxScore(upTo);
-  }
-
-  @Override
-  public int advanceShallow(int target) throws IOException {
-    return in.advanceShallow(target);
+  public void setMinCompetitiveScore(float minScore) {
+    in.setMinCompetitiveScore(minScore);
   }
 
   @Override
-  public void setMinCompetitiveScore(float minScore) {
-    in.setMinCompetitiveScore(minScore);
+  public int docID() {
+    return in.docID();
   }
 
   @Override
-  public Collection<ChildScorer> getChildren() {
-    return Collections.singleton(new ChildScorer(in, "CACHED"));
+  public Collection<ChildScorable> getChildren() {
+    return Collections.singleton(new ChildScorable(in, "CACHED"));
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/Scorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/Scorer.java b/lucene/core/src/java/org/apache/lucene/search/Scorer.java
index 9a48840..aef2168 100644
--- a/lucene/core/src/java/org/apache/lucene/search/Scorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/Scorer.java
@@ -18,8 +18,6 @@ package org.apache.lucene.search;
 
 
 import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
 
 /**
  * Expert: Common scoring functionality for different types of queries.
@@ -39,7 +37,7 @@ import java.util.Collections;
  * TopScoreDocCollector}) will not properly collect hits
  * with these scores.
  */
-public abstract class Scorer {
+public abstract class Scorer extends Scorable {
   /** the Scorer's parent Weight. in some cases this may be null */
   // TODO can we clean this up?
   protected final Weight weight;
@@ -52,65 +50,12 @@ public abstract class Scorer {
     this.weight = weight;
   }
 
-  /**
-   * Returns the doc ID that is currently being scored.
-   * This will return {@code -1} if the {@link #iterator()} is not positioned
-   * or {@link DocIdSetIterator#NO_MORE_DOCS} if it has been entirely consumed.
-   * @see DocIdSetIterator#docID()
-   */
-  public abstract int docID();
-
-  /** Returns the score of the current document matching the query.
-   * Initially invalid, until {@link DocIdSetIterator#nextDoc()} or
-   * {@link DocIdSetIterator#advance(int)} is called on the {@link #iterator()}
-   * the first time, or when called from within {@link LeafCollector#collect}.
-   */
-  public abstract float score() throws IOException;
-
   /** returns parent Weight
    * @lucene.experimental
    */
   public Weight getWeight() {
     return weight;
   }
-  
-  /**
-   * Returns child sub-scorers positioned on the current document
-   *
-   * Note that this method should not be called on Scorers passed to {@link LeafCollector#setScorer(Scorer)},
-   * as these may be synthetic Scorers produced by {@link BulkScorer} which will throw an Exception.
-   *
-   * @lucene.experimental
-   */
-  public Collection<ChildScorer> getChildren() throws IOException {
-    return Collections.emptyList();
-  }
-  
-  /** A child Scorer and its relationship to its parent.
-   * the meaning of the relationship depends upon the parent query. 
-   * @lucene.experimental */
-  public static class ChildScorer {
-    /**
-     * Child Scorer. (note this is typically a direct child, and may
-     * itself also have children).
-     */
-    public final Scorer child;
-    /**
-     * An arbitrary string relating this scorer to the parent.
-     */
-    public final String relationship;
-    
-    /**
-     * Creates a new ChildScorer node with the specified relationship.
-     * <p>
-     * The relationship can be any be any string that makes sense to 
-     * the parent Scorer. 
-     */
-    public ChildScorer(Scorer child, String relationship) {
-      this.child = child;
-      this.relationship = relationship;
-    }
-  }
 
   /**
    * Return a {@link DocIdSetIterator} over matching documents.
@@ -145,19 +90,6 @@ public abstract class Scorer {
   }
 
   /**
-   * Optional method: Tell the scorer that its iterator may safely ignore all
-   * documents whose score is less than the given {@code minScore}. This is a
-   * no-op by default.
-   *
-   * This method may only be called from collectors that use
-   * {@link ScoreMode#TOP_SCORES}, and successive calls may only set increasing
-   * values of {@code minScore}.
-   */
-  public void setMinCompetitiveScore(float minScore) {
-    // no-op by default
-  }
-
-  /**
    * Advance to the block of documents that contains {@code target} in order to
    * get scoring information about this block. This method is implicitly called
    * by {@link DocIdSetIterator#advance(int)} and

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java b/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java
index b299f52..23a0736 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java
@@ -38,7 +38,7 @@ public abstract class SimpleCollector implements Collector, LeafCollector {
   protected void doSetNextReader(LeafReaderContext context) throws IOException {}
 
   @Override
-  public void setScorer(Scorer scorer) throws IOException {
+  public void setScorer(Scorable scorer) throws IOException {
     // no-op by default
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/SimpleFieldComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/SimpleFieldComparator.java b/lucene/core/src/java/org/apache/lucene/search/SimpleFieldComparator.java
index a258e24..c6ea195 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SimpleFieldComparator.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SimpleFieldComparator.java
@@ -38,5 +38,5 @@ public abstract class SimpleFieldComparator<T> extends FieldComparator<T> implem
   }
 
   @Override
-  public void setScorer(Scorer scorer) throws IOException {}
+  public void setScorer(Scorable scorer) throws IOException {}
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
index 90c4555..616ad32 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
@@ -49,7 +49,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
 
     final LeafFieldComparator comparator;
     final int reverseMul;
-    Scorer scorer;
+    Scorable scorer;
 
     MultiComparatorLeafCollector(LeafFieldComparator[] comparators, int[] reverseMul) {
       if (comparators.length == 1) {
@@ -62,7 +62,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
     }
 
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
+    public void setScorer(Scorable scorer) throws IOException {
       comparator.setScorer(scorer);
       this.scorer = scorer;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
index f769f1a..9a24406 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
@@ -38,10 +38,10 @@ public abstract class TopScoreDocCollector extends TopDocsCollector<ScoreDoc> {
 
   abstract static class ScorerLeafCollector implements LeafCollector {
 
-    Scorer scorer;
+    Scorable scorer;
 
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
+    public void setScorer(Scorable scorer) throws IOException {
       this.scorer = scorer;
     }
 
@@ -70,7 +70,7 @@ public abstract class TopScoreDocCollector extends TopDocsCollector<ScoreDoc> {
         }
 
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           super.setScorer(scorer);
           if (totalHits >= totalHitsThreshold
               && pqTop != null

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/java/org/apache/lucene/search/WANDScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/WANDScorer.java b/lucene/core/src/java/org/apache/lucene/search/WANDScorer.java
index 01b46f7..c6a5528 100644
--- a/lucene/core/src/java/org/apache/lucene/search/WANDScorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/WANDScorer.java
@@ -197,11 +197,11 @@ final class WANDScorer extends Scorer {
   }
 
   @Override
-  public final Collection<ChildScorer> getChildren() throws IOException {
-    List<ChildScorer> matchingChildren = new ArrayList<>();
+  public final Collection<ChildScorable> getChildren() throws IOException {
+    List<ChildScorable> matchingChildren = new ArrayList<>();
     advanceAllTail();
     for (DisiWrapper s = lead; s != null; s = s.next) {
-      matchingChildren.add(new ChildScorer(s.scorer, "SHOULD"));
+      matchingChildren.add(new ChildScorable(s.scorer, "SHOULD"));
     }
     return matchingChildren;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java b/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
index 9873953..cfa51b9 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
@@ -31,8 +31,8 @@ import org.apache.lucene.search.CollectionStatistics;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.PhraseQuery;
+import org.apache.lucene.search.Scorable;
 import org.apache.lucene.search.ScoreMode;
-import org.apache.lucene.search.Scorer;
 import org.apache.lucene.search.SimpleCollector;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TermStatistics;
@@ -198,13 +198,13 @@ public class TestOmitTf extends LuceneTestCase {
         
     searcher.search(q1,
                     new CountingHitCollector() {
-                      private Scorer scorer;
+                      private Scorable scorer;
                       @Override
                       public ScoreMode scoreMode() {
                         return ScoreMode.COMPLETE;
                       }
                       @Override
-                      public final void setScorer(Scorer scorer) {
+                      public final void setScorer(Scorable scorer) {
                         this.scorer = scorer;
                       }
                       @Override
@@ -220,13 +220,13 @@ public class TestOmitTf extends LuceneTestCase {
         
     searcher.search(q2,
                     new CountingHitCollector() {
-                      private Scorer scorer;
+                      private Scorable scorer;
                       @Override
                       public ScoreMode scoreMode() {
                         return ScoreMode.COMPLETE;
                       }
                       @Override
-                      public final void setScorer(Scorer scorer) {
+                      public final void setScorer(Scorable scorer) {
                         this.scorer = scorer;
                       }
                       @Override
@@ -245,13 +245,13 @@ public class TestOmitTf extends LuceneTestCase {
         
     searcher.search(q3,
                     new CountingHitCollector() {
-                      private Scorer scorer;
+                      private Scorable scorer;
                       @Override
                       public ScoreMode scoreMode() {
                         return ScoreMode.COMPLETE;
                       }
                       @Override
-                      public final void setScorer(Scorer scorer) {
+                      public final void setScorer(Scorable scorer) {
                         this.scorer = scorer;
                       }
                       @Override
@@ -268,13 +268,13 @@ public class TestOmitTf extends LuceneTestCase {
         
     searcher.search(q4,
                     new CountingHitCollector() {
-                      private Scorer scorer;
+                      private Scorable scorer;
                       @Override
                       public ScoreMode scoreMode() {
                         return ScoreMode.COMPLETE;
                       }
                       @Override
-                      public final void setScorer(Scorer scorer) {
+                      public final void setScorer(Scorable scorer) {
                         this.scorer = scorer;
                       }
                       @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java b/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
index 1657f9b..a9d84cf 100644
--- a/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
+++ b/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
@@ -50,7 +50,7 @@ final class JustCompileSearch {
     }
 
     @Override
-    public void setScorer(Scorer scorer) {
+    public void setScorer(Scorable scorer) {
       throw new UnsupportedOperationException(UNSUPPORTED_MSG);
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java b/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java
index d306dd9..de86924 100644
--- a/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java
+++ b/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java
@@ -46,7 +46,7 @@ public class MultiCollectorTest extends LuceneTestCase {
     }
 
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
+    public void setScorer(Scorable scorer) throws IOException {
       setScorerCalled = true;
     }
 
@@ -110,9 +110,9 @@ public class MultiCollectorTest extends LuceneTestCase {
         return new LeafCollector() {
 
           @Override
-          public void setScorer(Scorer scorer) throws IOException {
-            while (expectedScorer.equals(scorer.getClass()) == false && scorer instanceof FilterScorer) {
-              scorer = ((FilterScorer) scorer).in;
+          public void setScorer(Scorable scorer) throws IOException {
+            while (expectedScorer.equals(scorer.getClass()) == false && scorer instanceof FilterScorable) {
+              scorer = ((FilterScorable) scorer).in;
             }
             assertEquals(expectedScorer, scorer.getClass());
           }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestBooleanOr.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestBooleanOr.java b/lucene/core/src/test/org/apache/lucene/search/TestBooleanOr.java
index d8273a5..7b12500 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestBooleanOr.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestBooleanOr.java
@@ -262,7 +262,7 @@ public class TestBooleanOr extends LuceneTestCase {
     scorer.score(new LeafCollector() {
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {}
+      public void setScorer(Scorable scorer) throws IOException {}
 
       @Override
       public void collect(int doc) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
index 37d5557..1b5da1b 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
@@ -501,7 +501,7 @@ public class TestBooleanQuery extends LuceneTestCase {
     final AtomicBoolean matched = new AtomicBoolean();
     searcher.search(bq, new SimpleCollector() {
       int docBase;
-      Scorer scorer;
+      Scorable scorer;
 
       @Override
       protected void doSetNextReader(LeafReaderContext context)
@@ -516,7 +516,7 @@ public class TestBooleanQuery extends LuceneTestCase {
       }
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {
+      public void setScorer(Scorable scorer) throws IOException {
         this.scorer = scorer;
       }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestBooleanQueryVisitSubscorers.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestBooleanQueryVisitSubscorers.java b/lucene/core/src/test/org/apache/lucene/search/TestBooleanQueryVisitSubscorers.java
index b207264..ba1d8f9 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestBooleanQueryVisitSubscorers.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestBooleanQueryVisitSubscorers.java
@@ -37,7 +37,6 @@ import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause.Occur;
-import org.apache.lucene.search.Scorer.ChildScorer;
 import org.apache.lucene.search.similarities.ClassicSimilarity;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.Directory;
@@ -150,7 +149,7 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
       return new FilterLeafCollector(super.getLeafCollector(context)) {
         
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           super.setScorer(scorer);
           tqsSet.clear();
           fillLeaves(scorer, tqsSet);
@@ -171,11 +170,11 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
       };
     }
     
-    private void fillLeaves(Scorer scorer, Set<Scorer> set) throws IOException {
-      if (scorer.getWeight().getQuery() instanceof TermQuery) {
-        set.add(scorer);
+    private void fillLeaves(Scorable scorer, Set<Scorer> set) throws IOException {
+      if (scorer instanceof TermScorer) {
+        set.add((Scorer)scorer);
       } else {
-        for (ChildScorer child : scorer.getChildren()) {
+        for (Scorable.ChildScorable child : scorer.getChildren()) {
           fillLeaves(child.child, set);
         }
       }
@@ -283,7 +282,7 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
       return new LeafCollector() {
 
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           final StringBuilder builder = new StringBuilder();
           summarizeScorer(builder, scorer, 0);
           summaries.add(builder.toString());
@@ -296,13 +295,13 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
       };
     }
 
-    private static void summarizeScorer(final StringBuilder builder, final Scorer scorer, final int indent) throws IOException {
+    private static void summarizeScorer(final StringBuilder builder, final Scorable scorer, final int indent) throws IOException {
       builder.append(scorer.getClass().getSimpleName());
       if (scorer instanceof TermScorer) {
-        TermQuery termQuery = (TermQuery) scorer.getWeight().getQuery();
+        TermQuery termQuery = (TermQuery) ((Scorer)scorer).getWeight().getQuery();
         builder.append(" ").append(termQuery.getTerm().field()).append(":").append(termQuery.getTerm().text());
       }
-      for (final ChildScorer childScorer : scorer.getChildren()) {
+      for (final Scorable.ChildScorable childScorer : scorer.getChildren()) {
         indent(builder, indent + 1).append(childScorer.relationship).append(" ");
         summarizeScorer(builder, childScorer.child, indent + 2);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java b/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
index ebe7887..b4e56ec 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestConjunctions.java
@@ -125,13 +125,13 @@ public class TestConjunctions extends LuceneTestCase {
     final boolean[] setScorerCalled = new boolean[1];
     s.search(q, new SimpleCollector() {
         @Override
-        public void setScorer(Scorer s) throws IOException {
-          Collection<Scorer.ChildScorer> childScorers = s.getChildren();
+        public void setScorer(Scorable s) throws IOException {
+          Collection<Scorer.ChildScorable> childScorers = s.getChildren();
           setScorerCalled[0] = true;
           assertEquals(2, childScorers.size());
           Set<String> terms = new HashSet<>();
-          for (Scorer.ChildScorer childScorer : childScorers) {
-            Query query = childScorer.child.getWeight().getQuery();
+          for (Scorer.ChildScorable childScorer : childScorers) {
+            Query query = ((Scorer)childScorer.child).getWeight().getQuery();
             assertTrue(query instanceof TermQuery);
             Term term = ((TermQuery) query).getTerm();
             assertEquals("field", term.field());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
index ef28b43..2035f9e 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
@@ -18,6 +18,7 @@ package org.apache.lucene.search;
 
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
@@ -56,14 +57,14 @@ public class TestConstantScoreQuery extends LuceneTestCase {
   private void checkHits(IndexSearcher searcher, Query q, final float expectedScore, final Class<? extends Scorer> innerScorerClass) throws IOException {
     final int[] count = new int[1];
     searcher.search(q, new SimpleCollector() {
-      private Scorer scorer;
+      private Scorable scorer;
     
       @Override
-      public void setScorer(Scorer scorer) {
+      public void setScorer(Scorable scorer) {
         this.scorer = scorer;
         if (innerScorerClass != null) {
-          final FilterScorer innerScorer = (FilterScorer) scorer;
-          assertEquals("inner Scorer is implemented by wrong class", innerScorerClass, innerScorer.in.getClass());
+          Scorable innerScorer = rootScorer(scorer);
+          assertEquals("inner Scorer is implemented by wrong class", innerScorerClass, innerScorer.getClass());
         }
       }
       
@@ -80,6 +81,23 @@ public class TestConstantScoreQuery extends LuceneTestCase {
     });
     assertEquals("invalid number of results", 1, count[0]);
   }
+
+  private Scorable rootScorer(Scorable s) {
+    while (true) {
+      try {
+        Collection<Scorable.ChildScorable> children = s.getChildren();
+        if (children.size() == 0)
+          return s;
+        s = children.stream().findFirst().get().child;
+      }
+      catch (Exception e) {
+        // If FakeScorer returns UnsupportedOperationException
+        // We catch Exception here to deal with the (impossible) IOException too
+        return s;
+      }
+
+    }
+  }
   
   public void testWrapped2Times() throws Exception {
     Directory directory = null;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java b/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
index e300cf7..a6cd8e1 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
@@ -210,7 +210,7 @@ public class TestDoubleValuesSource extends LuceneTestCase {
       }
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {
+      public void setScorer(Scorable scorer) throws IOException {
         this.v = rewritten.getValues(this.ctx, DoubleValuesSource.fromScorer(scorer));
       }
 
@@ -238,7 +238,7 @@ public class TestDoubleValuesSource extends LuceneTestCase {
     searcher.search(q, new SimpleCollector() {
 
       DoubleValues v;
-      Scorer scorer;
+      Scorable scorer;
       LeafReaderContext ctx;
 
       @Override
@@ -247,7 +247,7 @@ public class TestDoubleValuesSource extends LuceneTestCase {
       }
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {
+      public void setScorer(Scorable scorer) throws IOException {
         this.scorer = scorer;
         this.v = vs.getValues(this.ctx, DoubleValuesSource.fromScorer(scorer));
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java b/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
index 69d8679..d4ea75d 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
@@ -193,7 +193,7 @@ class ElevationComparatorSource extends FieldComparatorSource {
         }
 
         @Override
-        public void setScorer(Scorer scorer) {}
+        public void setScorer(Scorable scorer) {}
       };
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestMultiCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestMultiCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestMultiCollector.java
index 6049e5f..f189821 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestMultiCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestMultiCollector.java
@@ -81,7 +81,7 @@ public class TestMultiCollector extends LuceneTestCase {
     public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
       return new FilterLeafCollector(super.getLeafCollector(context)) {
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           super.setScorer(scorer);
           setScorerCalled.set(true);
         }
@@ -200,7 +200,7 @@ public class TestMultiCollector extends LuceneTestCase {
     };
 
     Collector collector = new SimpleCollector() {
-      private Scorer scorer;
+      private Scorable scorer;
       float minScore = 0;
 
       @Override
@@ -209,7 +209,7 @@ public class TestMultiCollector extends LuceneTestCase {
       }
 
       @Override
-      public void setScorer(Scorer scorer) throws IOException {
+      public void setScorer(Scorable scorer) throws IOException {
         this.scorer = scorer;
       }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestReqExclBulkScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestReqExclBulkScorer.java b/lucene/core/src/test/org/apache/lucene/search/TestReqExclBulkScorer.java
index be711b0..4509605 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestReqExclBulkScorer.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestReqExclBulkScorer.java
@@ -81,7 +81,7 @@ public class TestReqExclBulkScorer extends LuceneTestCase {
     if (random().nextBoolean()) {
       reqExcl.score(new LeafCollector() {
         @Override
-        public void setScorer(Scorer scorer) throws IOException {}
+        public void setScorer(Scorable scorer) throws IOException {}
         
         @Override
         public void collect(int doc) throws IOException {
@@ -95,7 +95,7 @@ public class TestReqExclBulkScorer extends LuceneTestCase {
         final int max = min + random().nextInt(10);
         next = reqExcl.score(new LeafCollector() {
           @Override
-          public void setScorer(Scorer scorer) throws IOException {}
+          public void setScorer(Scorable scorer) throws IOException {}
           
           @Override
           public void collect(int doc) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestScoreCachingWrappingScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestScoreCachingWrappingScorer.java b/lucene/core/src/test/org/apache/lucene/search/TestScoreCachingWrappingScorer.java
index 2573101..c3da803 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestScoreCachingWrappingScorer.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestScoreCachingWrappingScorer.java
@@ -75,7 +75,7 @@ public class TestScoreCachingWrappingScorer extends LuceneTestCase {
   private static final class ScoreCachingCollector extends SimpleCollector {
 
     private int idx = 0;
-    private Scorer scorer;
+    private Scorable scorer;
     float[] mscores;
     
     public ScoreCachingCollector(int numToCollect) {
@@ -95,7 +95,7 @@ public class TestScoreCachingWrappingScorer extends LuceneTestCase {
       ++idx;
     }
 
-    @Override public void setScorer(Scorer scorer) {
+    @Override public void setScorer(Scorable scorer) {
       this.scorer = new ScoreCachingWrappingScorer(scorer);
     }
     

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java b/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java
index d855b4f..5f9c631 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java
@@ -70,9 +70,9 @@ public class TestSimilarity extends LuceneTestCase {
     Term c = new Term("field", "c");
 
     searcher.search(new TermQuery(b), new SimpleCollector() {
-         private Scorer scorer;
+         private Scorable scorer;
          @Override
-        public void setScorer(Scorer scorer) {
+        public void setScorer(Scorable scorer) {
            this.scorer = scorer; 
          }
          @Override
@@ -91,9 +91,9 @@ public class TestSimilarity extends LuceneTestCase {
     //System.out.println(bq.toString("field"));
     searcher.search(bq.build(), new SimpleCollector() {
          private int base = 0;
-         private Scorer scorer;
+         private Scorable scorer;
          @Override
-        public void setScorer(Scorer scorer) {
+        public void setScorer(Scorable scorer) {
            this.scorer = scorer; 
          }
          @Override
@@ -115,9 +115,9 @@ public class TestSimilarity extends LuceneTestCase {
     //System.out.println(pq.toString("field"));
     searcher.search(pq,
        new SimpleCollector() {
-         private Scorer scorer;
+         private Scorable scorer;
          @Override
-         public void setScorer(Scorer scorer) {
+         public void setScorer(Scorable scorer) {
           this.scorer = scorer; 
          }
          @Override
@@ -134,9 +134,9 @@ public class TestSimilarity extends LuceneTestCase {
     pq = new PhraseQuery(2, a.field(), a.bytes(), b.bytes());
     //System.out.println(pq.toString("field"));
     searcher.search(pq, new SimpleCollector() {
-      private Scorer scorer;
+      private Scorable scorer;
       @Override
-      public void setScorer(Scorer scorer) {
+      public void setScorer(Scorable scorer) {
         this.scorer = scorer; 
       }
       @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestSloppyPhraseQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSloppyPhraseQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestSloppyPhraseQuery.java
index 2fd22a0..c26cab8 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSloppyPhraseQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSloppyPhraseQuery.java
@@ -185,11 +185,8 @@ public class TestSloppyPhraseQuery extends LuceneTestCase {
     Scorer scorer;
     
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
-      this.scorer = scorer;
-      while (this.scorer instanceof AssertingScorer) {
-        this.scorer = ((AssertingScorer)this.scorer).getIn();
-      }
+    public void setScorer(Scorable scorer) throws IOException {
+      this.scorer = (Scorer) AssertingScorable.unwrap(scorer);
     }
 
     @Override
@@ -215,11 +212,8 @@ public class TestSloppyPhraseQuery extends LuceneTestCase {
       Scorer scorer;
       
       @Override
-      public void setScorer(Scorer scorer) {
-        this.scorer = scorer;
-        while (this.scorer instanceof AssertingScorer) {
-          this.scorer = ((AssertingScorer)this.scorer).getIn();
-        }
+      public void setScorer(Scorable scorer) {
+        this.scorer = (Scorer) AssertingScorable.unwrap(scorer);
       }
       
       @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestSubScorerFreqs.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSubScorerFreqs.java b/lucene/core/src/test/org/apache/lucene/search/TestSubScorerFreqs.java
index b49793e..7e6e323 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSubScorerFreqs.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSubScorerFreqs.java
@@ -33,7 +33,6 @@ import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause.Occur;
-import org.apache.lucene.search.Scorer.ChildScorer;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.RAMDirectory;
@@ -80,7 +79,7 @@ public class TestSubScorerFreqs extends LuceneTestCase {
   private static class CountingCollector extends FilterCollector {
     public final Map<Integer, Map<Query, Float>> docCounts = new HashMap<>();
 
-    private final Map<Query, Scorer> subScorers = new HashMap<>();
+    private final Map<Query, Scorable> subScorers = new HashMap<>();
     private final Set<String> relationships;
 
     public CountingCollector(Collector other) {
@@ -92,13 +91,14 @@ public class TestSubScorerFreqs extends LuceneTestCase {
       this.relationships = relationships;
     }
     
-    public void setSubScorers(Scorer scorer, String relationship) throws IOException {
-      for (ChildScorer child : scorer.getChildren()) {
-        if (scorer instanceof AssertingScorer || relationships.contains(child.relationship)) {
-          setSubScorers(child.child, child.relationship);
+    public void setSubScorers(Scorable scorer) throws IOException {
+      scorer = AssertingScorable.unwrap(scorer);
+      for (Scorable.ChildScorable child : scorer.getChildren()) {
+        if (relationships.contains(child.relationship)) {
+          setSubScorers(child.child);
         }
       }
-      subScorers.put(scorer.getWeight().getQuery(), scorer);
+      subScorers.put(((Scorer)scorer).getWeight().getQuery(), scorer);
     }
     
     public LeafCollector getLeafCollector(LeafReaderContext context)
@@ -109,8 +109,8 @@ public class TestSubScorerFreqs extends LuceneTestCase {
         @Override
         public void collect(int doc) throws IOException {
           final Map<Query, Float> freqs = new HashMap<Query, Float>();
-          for (Map.Entry<Query, Scorer> ent : subScorers.entrySet()) {
-            Scorer value = ent.getValue();
+          for (Map.Entry<Query, Scorable> ent : subScorers.entrySet()) {
+            Scorable value = ent.getValue();
             int matchId = value.docID();
             freqs.put(ent.getKey(), matchId == doc ? value.score() : 0.0f);
           }
@@ -119,10 +119,10 @@ public class TestSubScorerFreqs extends LuceneTestCase {
         }
         
         @Override
-        public void setScorer(Scorer scorer) throws IOException {
+        public void setScorer(Scorable scorer) throws IOException {
           super.setScorer(scorer);
           subScorers.clear();
-          setSubScorers(scorer, "TOP");
+          setSubScorers(scorer);
         }
         
       };

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java b/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
index f05935c..6c3f89f 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
@@ -94,10 +94,10 @@ public class TestTermScorer extends LuceneTestCase {
     
     ts.score(new SimpleCollector() {
       private int base = 0;
-      private Scorer scorer;
+      private Scorable scorer;
       
       @Override
-      public void setScorer(Scorer scorer) {
+      public void setScorer(Scorable scorer) {
         this.scorer = scorer;
       }
       

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java
index f375537..630e310 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java
@@ -342,7 +342,7 @@ public class TestTimeLimitingCollector extends LuceneTestCase {
     }
 
     @Override
-    public void setScorer(Scorer scorer) throws IOException {
+    public void setScorer(Scorable scorer) throws IOException {
       // scorer is not needed
     }
     

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
index 9701199..caba25f 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
@@ -61,7 +61,7 @@ public class TestTopDocsCollector extends LuceneTestCase {
         }
 
         @Override
-        public void setScorer(Scorer scorer) {
+        public void setScorer(Scorable scorer) {
           // Don't do anything. Assign scores in random
         }
       };

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
index 2962a2e..36a1838 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
@@ -243,8 +243,8 @@ public class TestTopFieldCollector extends LuceneTestCase {
           final LeafCollector in = topCollector.getLeafCollector(context);
           return new FilterLeafCollector(in) {
             @Override
-            public void setScorer(final Scorer scorer) throws IOException {
-              Scorer s = new Scorer(null) {
+            public void setScorer(final Scorable scorer) throws IOException {
+              Scorable s = new FilterScorable(scorer) {
 
                 int lastComputedDoc = -1;
 
@@ -257,21 +257,6 @@ public class TestTopFieldCollector extends LuceneTestCase {
                   return scorer.score();
                 }
 
-                @Override
-                public float getMaxScore(int upTo) throws IOException {
-                  return scorer.getMaxScore(upTo);
-                }
-
-                @Override
-                public int docID() {
-                  return scorer.docID();
-                }
-
-                @Override
-                public DocIdSetIterator iterator() {
-                  return scorer.iterator();
-                }
-
               };
               super.setScorer(s);
             }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java b/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
index c5f3f76..e1e5b55 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
@@ -607,8 +607,8 @@ class DrillSidewaysScorer extends BulkScorer {
     }
 
     @Override
-    public Collection<ChildScorer> getChildren() {
-      return Collections.singletonList(new ChildScorer(baseScorer, "MUST"));
+    public Collection<ChildScorable> getChildren() {
+      return Collections.singletonList(new ChildScorable(baseScorer, "MUST"));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/910a0231/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java b/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
index f06527e..3626b91 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
@@ -27,9 +27,9 @@ import org.apache.lucene.search.FieldDoc;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.MultiCollector;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Scorable;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.ScoreMode;
-import org.apache.lucene.search.Scorer;
 import org.apache.lucene.search.SimpleCollector;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.TopDocs;
@@ -52,7 +52,7 @@ import org.apache.lucene.util.DocIdSetBuilder;
 public class FacetsCollector extends SimpleCollector implements Collector {
 
   private LeafReaderContext context;
-  private Scorer scorer;
+  private Scorable scorer;
   private int totalHits;
   private float[] scores;
   private final boolean keepScores;
@@ -137,7 +137,7 @@ public class FacetsCollector extends SimpleCollector implements Collector {
   }
 
   @Override
-  public final void setScorer(Scorer scorer) throws IOException {
+  public final void setScorer(Scorable scorer) throws IOException {
     this.scorer = scorer;
   }