github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/core/codec/lucene41/skipWriter.go (about)

     1  package lucene41
     2  
     3  import (
     4  	"github.com/balzaczyy/golucene/core/store"
     5  )
     6  
     7  type SkipWriter struct {
     8  	*store.MultiLevelSkipListWriter
     9  
    10  	lastSkipDoc         []int
    11  	lastSkipDocPointer  []int64
    12  	lastSkipPosPointer  []int64
    13  	lastSkipPayPointer  []int64
    14  	lastPayloadByteUpto []int
    15  
    16  	docOut store.IndexOutput
    17  	posOut store.IndexOutput
    18  	payOut store.IndexOutput
    19  
    20  	curDoc             int
    21  	curDocPointer      int64
    22  	curPosPointer      int64
    23  	curPayPointer      int64
    24  	curPosBufferUpto   int
    25  	curPayloadByteUpto int
    26  	fieldHasPositions  bool
    27  	fieldHasOffsets    bool
    28  	fieldHasPayloads   bool
    29  
    30  	initialized bool
    31  	lastDocFP   int64
    32  	lastPosFP   int64
    33  	lastPayFP   int64
    34  }
    35  
    36  func NewSkipWriter(maxSkipLevels, blockSize, docCount int,
    37  	docOut, posOut, payOut store.IndexOutput) *SkipWriter {
    38  	ans := &SkipWriter{
    39  		docOut:             docOut,
    40  		posOut:             posOut,
    41  		payOut:             payOut,
    42  		lastSkipDoc:        make([]int, maxSkipLevels),
    43  		lastSkipDocPointer: make([]int64, maxSkipLevels),
    44  	}
    45  	ans.MultiLevelSkipListWriter = store.NewMultiLevelSkipListWriter(ans, blockSize, 8, maxSkipLevels, docCount)
    46  
    47  	if posOut != nil {
    48  		ans.lastSkipPosPointer = make([]int64, maxSkipLevels)
    49  		if payOut != nil {
    50  			ans.lastSkipPayPointer = make([]int64, maxSkipLevels)
    51  		}
    52  		ans.lastPayloadByteUpto = make([]int, maxSkipLevels)
    53  	}
    54  	return ans
    55  }
    56  
    57  func (w *SkipWriter) SetField(fieldHasPositions, fieldHasOffsets, fieldHasPayloads bool) {
    58  	w.fieldHasPositions = fieldHasPositions
    59  	w.fieldHasOffsets = fieldHasOffsets
    60  	w.fieldHasPayloads = fieldHasPayloads
    61  }
    62  
    63  func (w *SkipWriter) ResetSkip() {
    64  	w.lastDocFP = w.docOut.FilePointer()
    65  	if w.fieldHasPositions {
    66  		w.lastPosFP = w.posOut.FilePointer()
    67  		if w.fieldHasOffsets || w.fieldHasPayloads {
    68  			w.lastPayFP = w.payOut.FilePointer()
    69  		}
    70  	}
    71  	w.initialized = false
    72  }
    73  
    74  func (w *SkipWriter) initSkip() {
    75  	if !w.initialized {
    76  		w.MultiLevelSkipListWriter.ResetSkip()
    77  		for i, _ := range w.lastSkipDoc {
    78  			w.lastSkipDoc[i] = 0
    79  		}
    80  		for i, _ := range w.lastSkipDocPointer {
    81  			w.lastSkipDocPointer[i] = w.lastDocFP
    82  		}
    83  		if w.fieldHasPositions {
    84  			for i, _ := range w.lastSkipPosPointer {
    85  				w.lastSkipPosPointer[i] = w.lastPosFP
    86  			}
    87  			if w.fieldHasPayloads {
    88  				for i, _ := range w.lastPayloadByteUpto {
    89  					w.lastPayloadByteUpto[i] = 0
    90  				}
    91  			}
    92  			if w.fieldHasOffsets || w.fieldHasPayloads {
    93  				for i, _ := range w.lastSkipPayPointer {
    94  					w.lastSkipPayPointer[i] = w.lastPayFP
    95  				}
    96  			}
    97  		}
    98  		w.initialized = true
    99  	}
   100  }
   101  
   102  /* Sets the values for the current skip data. */
   103  func (w *SkipWriter) BufferSkip(doc, numDocs int, posFP, payFP int64, posBufferUpto, payloadByteUpto int) error {
   104  	w.initSkip()
   105  	w.curDoc = doc
   106  	w.curDocPointer = w.docOut.FilePointer()
   107  	w.curPosPointer = posFP
   108  	w.curPayPointer = payFP
   109  	w.curPosBufferUpto = posBufferUpto
   110  	w.curPayloadByteUpto = payloadByteUpto
   111  	return w.MultiLevelSkipListWriter.BufferSkip(numDocs)
   112  }
   113  
   114  func (w *SkipWriter) WriteSkipData(level int, skipBuffer store.IndexOutput) error {
   115  	delta := w.curDoc - w.lastSkipDoc[level]
   116  	var err error
   117  	if err = skipBuffer.WriteVInt(int32(delta)); err != nil {
   118  		return err
   119  	}
   120  	w.lastSkipDoc[level] = w.curDoc
   121  
   122  	if err = skipBuffer.WriteVInt(int32(w.curDocPointer - w.lastSkipDocPointer[level])); err != nil {
   123  		return err
   124  	}
   125  	w.lastSkipDocPointer[level] = w.curDocPointer
   126  
   127  	if w.fieldHasPositions {
   128  		if err = skipBuffer.WriteVInt(int32(w.curPosPointer - w.lastSkipPosPointer[level])); err != nil {
   129  			return err
   130  		}
   131  		w.lastSkipPosPointer[level] = w.curPosPointer
   132  		if err = skipBuffer.WriteVInt(int32(w.curPosBufferUpto)); err != nil {
   133  			return err
   134  		}
   135  
   136  		if w.fieldHasPayloads {
   137  			if err = skipBuffer.WriteVInt(int32(w.curPayloadByteUpto)); err != nil {
   138  				return err
   139  			}
   140  		}
   141  
   142  		if w.fieldHasOffsets || w.fieldHasPayloads {
   143  			if err = skipBuffer.WriteVInt(int32(w.curPayPointer - w.lastSkipPayPointer[level])); err != nil {
   144  				return err
   145  			}
   146  			w.lastSkipPayPointer[level] = w.curPayPointer
   147  		}
   148  	}
   149  	return nil
   150  }