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 }