github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/core/search/docs.go (about)

     1  package search
     2  
     3  import (
     4  	"fmt"
     5  	. "github.com/balzaczyy/golucene/core/index/model"
     6  	// . "github.com/balzaczyy/golucene/core/search/model"
     7  	"math"
     8  )
     9  
    10  // search/Scorer.java
    11  
    12  type Scorer interface {
    13  	DocsEnum
    14  	IScorer
    15  	// ScoreAndCollect(c Collector) error
    16  }
    17  
    18  type IScorer interface {
    19  	Score() (float32, error)
    20  }
    21  
    22  type ScorerSPI interface {
    23  	DocId() int
    24  	NextDoc() (int, error)
    25  }
    26  
    27  type abstractScorer struct {
    28  	spi ScorerSPI
    29  	// index.DocsEnum
    30  	// IScorer
    31  	/** the Scorer's parent Weight. in some cases this may be null */
    32  	// TODO can we clean this up?
    33  	weight Weight
    34  }
    35  
    36  func newScorer(spi ScorerSPI, w Weight) *abstractScorer {
    37  	return &abstractScorer{spi: spi, weight: w}
    38  }
    39  
    40  /** Scores and collects all matching documents.
    41   * @param collector The collector to which all matching documents are passed.
    42   */
    43  // func (s *abstractScorer) ScoreAndCollect(c Collector) (err error) {
    44  // 	assert(s.spi.DocId() == -1) // not started
    45  // 	c.SetScorer(s.spi.(Scorer))
    46  // 	doc, err := s.spi.NextDoc()
    47  // 	for doc != NO_MORE_DOCS && err == nil {
    48  // 		c.Collect(doc)
    49  // 		doc, err = s.spi.NextDoc()
    50  // 	}
    51  // 	return
    52  // }
    53  
    54  func assert(ok bool) {
    55  	if !ok {
    56  		panic("assert fail")
    57  	}
    58  }
    59  
    60  func assert2(ok bool, msg string, args ...interface{}) {
    61  	if !ok {
    62  		panic(fmt.Sprintf(msg, args...))
    63  	}
    64  }
    65  
    66  // search/BulkScorer.java
    67  
    68  /*
    69  This class is used to score a range of documents at once, and is
    70  returned by Weight.BulkScorer(). Only queries that have a more
    71  optimized means of scoring across a range of documents need to
    72  override this. Otherwise, a default implementation is wrapped around
    73  the Scorer returned by Weight.Scorer().
    74  */
    75  type BulkScorer interface {
    76  	ScoreAndCollect(Collector) error
    77  	BulkScorerImplSPI
    78  }
    79  
    80  type BulkScorerImplSPI interface {
    81  	ScoreAndCollectUpto(Collector, int) (bool, error)
    82  }
    83  
    84  type BulkScorerImpl struct {
    85  	spi BulkScorerImplSPI
    86  }
    87  
    88  func newBulkScorer(spi BulkScorerImplSPI) *BulkScorerImpl {
    89  	return &BulkScorerImpl{spi}
    90  }
    91  
    92  func (bs *BulkScorerImpl) ScoreAndCollect(collector Collector) (err error) {
    93  	assert(bs != nil)
    94  	assert(bs.spi != nil)
    95  	_, err = bs.spi.ScoreAndCollectUpto(collector, math.MaxInt32)
    96  	return
    97  }