github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/core/index/storedFieldsConsumer.go (about) 1 package index 2 3 // import ( 4 // "github.com/balzaczyy/golucene/core/index/model" 5 // "github.com/balzaczyy/golucene/core/store" 6 // "github.com/balzaczyy/golucene/core/util" 7 // "sync" 8 // ) 9 10 // type StoredFieldsConsumer interface { 11 // addField(docId int, field model.IndexableField, fieldInfo *model.FieldInfo) 12 // flush(state *model.SegmentWriteState) error 13 // abort() 14 // startDocument() 15 // finishDocument() error 16 // } 17 18 // /* Just switches between two DocFieldConsumers */ 19 // type TwoStoredFieldsConsumers struct { 20 // first StoredFieldsConsumer 21 // second StoredFieldsConsumer 22 // } 23 24 // func newTwoStoredFieldsConsumers(first, second StoredFieldsConsumer) *TwoStoredFieldsConsumers { 25 // return &TwoStoredFieldsConsumers{first, second} 26 // } 27 28 // func (p *TwoStoredFieldsConsumers) addField(docId int, field model.IndexableField, fieldInfo *model.FieldInfo) { 29 // // err := p.first.addField(docId, field, fieldInfo) 30 // // if err == nil { 31 // // err = p.second.addField(docId, field, fieldInfo) 32 // // } 33 // // return err 34 // p.first.addField(docId, field, fieldInfo) 35 // p.second.addField(docId, field, fieldInfo) 36 // } 37 38 // func (p *TwoStoredFieldsConsumers) flush(state *model.SegmentWriteState) error { 39 // err := p.first.flush(state) 40 // if err == nil { 41 // err = p.second.flush(state) 42 // } 43 // return err 44 // } 45 46 // func (p *TwoStoredFieldsConsumers) abort() { 47 // p.first.abort() 48 // p.second.abort() 49 // } 50 51 // func (p *TwoStoredFieldsConsumers) startDocument() { 52 // p.first.startDocument() 53 // p.second.startDocument() 54 // } 55 56 // func (p *TwoStoredFieldsConsumers) finishDocument() error { 57 // err := p.first.finishDocument() 58 // if err == nil { 59 // err = p.second.finishDocument() 60 // } 61 // return err 62 // } 63 64 // // index/StoredFieldsProcessor.java 65 66 // /* This is a StoredFieldsConsumer that writes stored fields */ 67 // type StoredFieldsProcessor struct { 68 // sync.Locker 69 70 // fieldsWriter StoredFieldsWriter 71 // lastDocId int 72 73 // docWriter *DocumentsWriterPerThread 74 75 // docState *docState 76 // codec Codec 77 78 // numStoredFields int 79 // storedFields []model.IndexableField 80 // fieldInfos []*model.FieldInfo 81 // } 82 83 // func newStoredFieldsProcessor(docWriter *DocumentsWriterPerThread) *StoredFieldsProcessor { 84 // return &StoredFieldsProcessor{ 85 // Locker: &sync.Mutex{}, 86 // docWriter: docWriter, 87 // docState: docWriter.docState, 88 // codec: docWriter.codec, 89 // } 90 // } 91 92 // func (p *StoredFieldsProcessor) reset() { 93 // p.numStoredFields = 0 94 // p.storedFields = nil 95 // p.fieldInfos = nil 96 // } 97 98 // func (p *StoredFieldsProcessor) startDocument() { 99 // p.reset() 100 // } 101 102 // func (p *StoredFieldsProcessor) flush(state *model.SegmentWriteState) (err error) { 103 // numDocs := state.SegmentInfo.DocCount() 104 // if numDocs > 0 { 105 // // It's possible that all documents seen in this segment hit 106 // // non-aborting errors, in which case we will not have yet init'd 107 // // the FieldsWriter: 108 // err = p.initFieldsWriter(state.Context) 109 // if err == nil { 110 // err = p.fill(numDocs) 111 // } 112 // } 113 // if w := p.fieldsWriter; w != nil { 114 // err = func() error { 115 // var success = false 116 // defer func() { 117 // if success { 118 // err = util.CloseWhileHandlingError(err, w) 119 // } else { 120 // util.CloseWhileSuppressingError(w) 121 // } 122 // }() 123 124 // err = w.Finish(state.FieldInfos, numDocs) 125 // if err != nil { 126 // return err 127 // } 128 // success = true 129 // return nil 130 // }() 131 // if err != nil { 132 // return err 133 // } 134 // } 135 // return 136 // } 137 138 // func (p *StoredFieldsProcessor) initFieldsWriter(ctx store.IOContext) error { 139 // p.Lock() 140 // defer p.Unlock() 141 // if p.fieldsWriter == nil { 142 // var err error 143 // p.fieldsWriter, err = p.codec.StoredFieldsFormat().FieldsWriter( 144 // p.docWriter.directory, p.docWriter.segmentInfo, ctx) 145 // if err != nil { 146 // return err 147 // } 148 // p.lastDocId = 0 149 // } 150 // return nil 151 // } 152 153 // func (p *StoredFieldsProcessor) abort() { 154 // p.reset() 155 156 // if w := p.fieldsWriter; w != nil { 157 // assert(w != nil) 158 // w.Abort() 159 // p.fieldsWriter = nil 160 // p.lastDocId = 0 161 // } 162 // } 163 164 // /* Fills in any hold in the docIDs */ 165 // func (p *StoredFieldsProcessor) fill(docId int) error { 166 // // We must "catch up" for all docs before us that had no stored fields: 167 // for p.lastDocId < docId { 168 // err := p.fieldsWriter.StartDocument(0) 169 // if err != nil { 170 // return err 171 // } 172 // p.lastDocId++ 173 // err = p.fieldsWriter.FinishDocument() 174 // if err != nil { 175 // return err 176 // } 177 // } 178 // return nil 179 // } 180 181 // func (p *StoredFieldsProcessor) finishDocument() error { 182 // p.docWriter.testPoint("StoredFieldsWriter.finishDocument start") 183 184 // err := p.initFieldsWriter(store.IO_CONTEXT_DEFAULT) 185 // if err != nil { 186 // return err 187 // } 188 // err = p.fill(p.docState.docID) 189 // if err != nil { 190 // return err 191 // } 192 193 // if w := p.fieldsWriter; w != nil && p.numStoredFields > 0 { 194 // err = w.StartDocument(p.numStoredFields) 195 // if err != nil { 196 // return err 197 // } 198 // for i := 0; i < p.numStoredFields; i++ { 199 // err = w.WriteField(p.fieldInfos[i], p.storedFields[i]) 200 // if err != nil { 201 // return err 202 // } 203 // } 204 // err = w.FinishDocument() 205 // if err != nil { 206 // return err 207 // } 208 // p.lastDocId++ 209 // } 210 211 // p.reset() 212 // p.docWriter.testPoint("StoredFieldsWriter.finishDocument end") 213 // return nil 214 // } 215 216 // func (p *StoredFieldsProcessor) addField(docId int, field model.IndexableField, fieldInfo *model.FieldInfo) { 217 // if field.FieldType().Stored() { 218 // if p.numStoredFields == len(p.storedFields) { 219 // newSize := util.Oversize(p.numStoredFields+1, util.NUM_BYTES_OBJECT_REF) 220 // newArray := make([]model.IndexableField, newSize) 221 // copy(newArray, p.storedFields) 222 // p.storedFields = newArray 223 224 // newInfoArray := make([]*model.FieldInfo, newSize) 225 // copy(newInfoArray, p.fieldInfos) 226 // p.fieldInfos = newInfoArray 227 // } 228 229 // p.storedFields[p.numStoredFields] = field 230 // p.fieldInfos[p.numStoredFields] = fieldInfo 231 // p.numStoredFields++ 232 233 // p.docState.testPoint("StoredFieldsWriterPerThread.processFields.writeField") 234 // } 235 // } 236 237 // index/DocValuesProcessor.java 238 239 // type DocValuesProcessor struct { 240 // writers map[string]DocValuesWriter 241 // bytesUsed util.Counter 242 // } 243 244 // func newDocValuesProcessor(bytesUsed util.Counter) *DocValuesProcessor { 245 // return &DocValuesProcessor{make(map[string]DocValuesWriter), bytesUsed} 246 // } 247 248 // func (p *DocValuesProcessor) startDocument() {} 249 250 // func (p *DocValuesProcessor) finishDocument() error { return nil } 251 252 // func (p *DocValuesProcessor) addField(docId int, field model.IndexableField, fieldInfo *model.FieldInfo) { 253 // if dvType := field.FieldType().DocValueType(); int(dvType) != 0 { 254 // fieldInfo.SetDocValueType(dvType) 255 // switch dvType { 256 // case model.DOC_VALUES_TYPE_BINARY: 257 // p.addBinaryField(fieldInfo, docId, field.BinaryValue()) 258 // case model.DOC_VALUES_TYPE_SORTED: 259 // p.addSortedField(fieldInfo, docId, field.BinaryValue()) 260 // case model.DOC_VALUES_TYPE_SORTED_SET: 261 // p.addSortedSetField(fieldInfo, docId, field.BinaryValue()) 262 // case model.DOC_VALUES_TYPE_NUMERIC: 263 // p.addNumericField(fieldInfo, docId, field.NumericValue()) 264 // default: 265 // assertn(false, "unrecognized DocValues.Type: %v", dvType) 266 // } 267 // } 268 // } 269 270 // func (p *DocValuesProcessor) flush(state *model.SegmentWriteState) (err error) { 271 // if len(p.writers) != 0 { 272 // codec := state.SegmentInfo.Codec().(Codec) 273 // var dvConsumer DocValuesConsumer 274 // dvConsumer, err = codec.DocValuesFormat().FieldsConsumer(state) 275 // if err != nil { 276 // return err 277 // } 278 // var success = false 279 // defer func() { 280 // if success { 281 // err = mergeError(err, util.Close(dvConsumer)) 282 // } else { 283 // util.CloseWhileSuppressingError(dvConsumer) 284 // } 285 // }() 286 287 // for _, writer := range p.writers { 288 // writer.finish(state.SegmentInfo.DocCount()) 289 // err = writer.flush(state, dvConsumer) 290 // if err != nil { 291 // return err 292 // } 293 // } 294 // // TODO: catch missing DV dields here? else we have nil/"" 295 // // depending on how docs landed in segments? but we can't detect 296 // // all cases, and we should leave this behavior undefined. dv is 297 // // not "schemaless": it's column-stride. 298 // p.writers = make(map[string]DocValuesWriter) 299 // success = true 300 // } 301 // return nil 302 // } 303 304 // func (p *DocValuesProcessor) addBinaryField(fieldInfo *model.FieldInfo, 305 // docId int, value []byte) { 306 // panic("not implemented yet") 307 // } 308 309 // func (p *DocValuesProcessor) addSortedField(fieldInfo *model.FieldInfo, 310 // docId int, value []byte) { 311 // panic("not implemented yet") 312 // } 313 314 // func (p *DocValuesProcessor) addSortedSetField(fieldInfo *model.FieldInfo, 315 // docId int, value []byte) { 316 // panic("not implemented yet") 317 // } 318 319 // func (p *DocValuesProcessor) addNumericField(field *model.FieldInfo, 320 // docId int, value interface{}) { 321 // panic("not implemented yet") 322 // } 323 324 // func (p *DocValuesProcessor) abort() { 325 // for _, writer := range p.writers { 326 // writer.abort() 327 // } 328 // p.writers = make(map[string]DocValuesWriter) 329 // }