@Override
  public void setScorer(Scorer scorer) {
    // System.out.println("C.setScorer scorer=" + scorer);
    // Since we invoke .score(), and the comparators likely
    // do as well, cache it so it's only "really" computed
    // once:
    this.scorer = new ScoreCachingWrappingScorer(scorer);
    for (int compIDX = 0; compIDX < comparators.length; compIDX++) {
      comparators[compIDX].setScorer(this.scorer);
    }
    Arrays.fill(joinScorers, null);

    Queue<Scorer> queue = new LinkedList<>();
    // System.out.println("\nqueue: add top scorer=" + scorer);
    queue.add(scorer);
    while ((scorer = queue.poll()) != null) {
      // System.out.println("  poll: " + scorer + "; " + scorer.getWeight().getQuery());
      if (scorer instanceof ToParentBlockJoinQuery.BlockJoinScorer) {
        enroll(
            (ToParentBlockJoinQuery) scorer.getWeight().getQuery(),
            (ToParentBlockJoinQuery.BlockJoinScorer) scorer);
      }

      for (ChildScorer sub : scorer.getChildren()) {
        // System.out.println("  add sub: " + sub.child + "; " + sub.child.getWeight().getQuery());
        queue.add(sub.child);
      }
    }
  }
  /**
   * Get a list of all Spans made available from the passed-in Scorer
   *
   * @param scorer the scorer to extract spans from
   * @param errorOnNoSpans if true, throw an error if no Spans can be extracted from the Scorer or
   *     any of its children
   * @return a List of Spans
   */
  public static List<Spans> getSpans(Scorer scorer, boolean errorOnNoSpans) {

    List<Spans> spans = new ArrayList<>();
    if (scorer instanceof Spans) {
      spans.add((Spans) scorer);
      return spans;
    }

    Collection<Scorer.ChildScorer> children = scorer.getChildren();
    if (errorOnNoSpans && children.size() == 0)
      throw new RuntimeException(
          "Couldn't extract SpanScorer from " + scorer.getClass().getCanonicalName());

    for (Scorer.ChildScorer child : children) {
      spans.addAll(getSpans(child.child, errorOnNoSpans));
    }

    return spans;
  }