code: @Override
    public TwoPhaseIterator asTwoPhaseIterator() {
      if (spans1 == null || spans2 == null || !query.twoPhaseIteratorAllowed()) {
        return null;
      } else {
  
        TwoPhaseIterator twoPhaseIterator1 = spans1.spans.asTwoPhaseIterator();
        if (twoPhaseIterator1 != null) {
          return new TwoPhaseIterator(twoPhaseIterator1.approximation()) {
            @Override
            public boolean matches() throws IOException {
              return twoPhaseIterator1.matches() && twoPhaseCurrentDocMatches();
            }
  
            @Override
            public float matchCost() {
              return twoPhaseIterator1.matchCost();
            }
          };
        } else {
          return new TwoPhaseIterator(spans1.spans) {
            @Override
            public boolean matches() throws IOException {
              return twoPhaseCurrentDocMatches();
            }
  
            @Override
            public float matchCost() {
              return spans1.spans.positionsCost();
            }
          };
        }
      }
    }
docs: /*
  (non-Javadoc)
  
  @see org.apache.lucene.search.spans.Spans#asTwoPhaseIterator()