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  // }