Integrate BACKBEAT SDK and resolve KACHING license validation
Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							
								
								
									
										129
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/analysis.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/analysis.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| //  Copyright (c) 2015 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	index "github.com/blevesearch/bleve_index_api" | ||||
| ) | ||||
|  | ||||
| type IndexRow interface { | ||||
| 	KeySize() int | ||||
| 	KeyTo([]byte) (int, error) | ||||
| 	Key() []byte | ||||
|  | ||||
| 	ValueSize() int | ||||
| 	ValueTo([]byte) (int, error) | ||||
| 	Value() []byte | ||||
| } | ||||
|  | ||||
| type AnalysisResult struct { | ||||
| 	DocID string | ||||
| 	Rows  []IndexRow | ||||
| } | ||||
|  | ||||
| func (udc *UpsideDownCouch) Analyze(d index.Document) *AnalysisResult { | ||||
| 	return udc.analyze(d) | ||||
| } | ||||
|  | ||||
| func (udc *UpsideDownCouch) analyze(d index.Document) *AnalysisResult { | ||||
| 	rv := &AnalysisResult{ | ||||
| 		DocID: d.ID(), | ||||
| 		Rows:  make([]IndexRow, 0, 100), | ||||
| 	} | ||||
|  | ||||
| 	docIDBytes := []byte(d.ID()) | ||||
|  | ||||
| 	// track our back index entries | ||||
| 	backIndexStoredEntries := make([]*BackIndexStoreEntry, 0) | ||||
|  | ||||
| 	// information we collate as we merge fields with same name | ||||
| 	fieldTermFreqs := make(map[uint16]index.TokenFrequencies) | ||||
| 	fieldLengths := make(map[uint16]int) | ||||
| 	fieldIncludeTermVectors := make(map[uint16]bool) | ||||
| 	fieldNames := make(map[uint16]string) | ||||
|  | ||||
| 	analyzeField := func(field index.Field, storable bool) { | ||||
| 		fieldIndex, newFieldRow := udc.fieldIndexOrNewRow(field.Name()) | ||||
| 		if newFieldRow != nil { | ||||
| 			rv.Rows = append(rv.Rows, newFieldRow) | ||||
| 		} | ||||
| 		fieldNames[fieldIndex] = field.Name() | ||||
|  | ||||
| 		if field.Options().IsIndexed() { | ||||
| 			field.Analyze() | ||||
| 			fieldLength := field.AnalyzedLength() | ||||
| 			tokenFreqs := field.AnalyzedTokenFrequencies() | ||||
| 			existingFreqs := fieldTermFreqs[fieldIndex] | ||||
| 			if existingFreqs == nil { | ||||
| 				fieldTermFreqs[fieldIndex] = tokenFreqs | ||||
| 			} else { | ||||
| 				existingFreqs.MergeAll(field.Name(), tokenFreqs) | ||||
| 				fieldTermFreqs[fieldIndex] = existingFreqs | ||||
| 			} | ||||
| 			fieldLengths[fieldIndex] += fieldLength | ||||
| 			fieldIncludeTermVectors[fieldIndex] = field.Options().IncludeTermVectors() | ||||
| 		} | ||||
|  | ||||
| 		if storable && field.Options().IsStored() { | ||||
| 			rv.Rows, backIndexStoredEntries = udc.storeField(docIDBytes, field, fieldIndex, rv.Rows, backIndexStoredEntries) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// walk all the fields, record stored fields now | ||||
| 	// place information about indexed fields into map | ||||
| 	// this collates information across fields with | ||||
| 	// same names (arrays) | ||||
| 	d.VisitFields(func(field index.Field) { | ||||
| 		analyzeField(field, true) | ||||
| 	}) | ||||
|  | ||||
| 	if d.HasComposite() { | ||||
| 		for fieldIndex, tokenFreqs := range fieldTermFreqs { | ||||
| 			// see if any of the composite fields need this | ||||
| 			d.VisitComposite(func(field index.CompositeField) { | ||||
| 				field.Compose(fieldNames[fieldIndex], fieldLengths[fieldIndex], tokenFreqs) | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| 		d.VisitComposite(func(field index.CompositeField) { | ||||
| 			analyzeField(field, false) | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	rowsCapNeeded := len(rv.Rows) + 1 | ||||
| 	for _, tokenFreqs := range fieldTermFreqs { | ||||
| 		rowsCapNeeded += len(tokenFreqs) | ||||
| 	} | ||||
|  | ||||
| 	rv.Rows = append(make([]IndexRow, 0, rowsCapNeeded), rv.Rows...) | ||||
|  | ||||
| 	backIndexTermsEntries := make([]*BackIndexTermsEntry, 0, len(fieldTermFreqs)) | ||||
|  | ||||
| 	// walk through the collated information and process | ||||
| 	// once for each indexed field (unique name) | ||||
| 	for fieldIndex, tokenFreqs := range fieldTermFreqs { | ||||
| 		fieldLength := fieldLengths[fieldIndex] | ||||
| 		includeTermVectors := fieldIncludeTermVectors[fieldIndex] | ||||
|  | ||||
| 		// encode this field | ||||
| 		rv.Rows, backIndexTermsEntries = udc.indexField(docIDBytes, includeTermVectors, fieldIndex, fieldLength, tokenFreqs, rv.Rows, backIndexTermsEntries) | ||||
| 	} | ||||
|  | ||||
| 	// build the back index row | ||||
| 	backIndexRow := NewBackIndexRow(docIDBytes, backIndexTermsEntries, backIndexStoredEntries) | ||||
| 	rv.Rows = append(rv.Rows, backIndexRow) | ||||
|  | ||||
| 	return rv | ||||
| } | ||||
							
								
								
									
										8
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/benchmark_all.sh
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/benchmark_all.sh
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| BENCHMARKS=`grep "func Benchmark" *_test.go  | sed 's/.*func //' | sed s/\(.*{//` | ||||
|  | ||||
| for BENCHMARK in $BENCHMARKS | ||||
| do | ||||
| 	go test -v -run=xxx -bench=^$BENCHMARK$ -benchtime=10s -tags 'forestdb leveldb'  | grep -v ok | grep -v PASS | ||||
| done | ||||
							
								
								
									
										174
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/dump.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/dump.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,174 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"sort" | ||||
|  | ||||
| 	"github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| // the functions in this file are only intended to be used by | ||||
| // the bleve_dump utility and the debug http handlers | ||||
| // if your application relies on them, you're doing something wrong | ||||
| // they may change or be removed at any time | ||||
|  | ||||
| func dumpPrefix(kvreader store.KVReader, rv chan interface{}, prefix []byte) { | ||||
| 	start := prefix | ||||
| 	if start == nil { | ||||
| 		start = []byte{0} | ||||
| 	} | ||||
| 	it := kvreader.PrefixIterator(start) | ||||
| 	defer func() { | ||||
| 		cerr := it.Close() | ||||
| 		if cerr != nil { | ||||
| 			rv <- cerr | ||||
| 		} | ||||
| 	}() | ||||
| 	key, val, valid := it.Current() | ||||
| 	for valid { | ||||
| 		ck := make([]byte, len(key)) | ||||
| 		copy(ck, key) | ||||
| 		cv := make([]byte, len(val)) | ||||
| 		copy(cv, val) | ||||
| 		row, err := ParseFromKeyValue(ck, cv) | ||||
| 		if err != nil { | ||||
| 			rv <- err | ||||
| 			return | ||||
| 		} | ||||
| 		rv <- row | ||||
|  | ||||
| 		it.Next() | ||||
| 		key, val, valid = it.Current() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func dumpRange(kvreader store.KVReader, rv chan interface{}, start, end []byte) { | ||||
| 	it := kvreader.RangeIterator(start, end) | ||||
| 	defer func() { | ||||
| 		cerr := it.Close() | ||||
| 		if cerr != nil { | ||||
| 			rv <- cerr | ||||
| 		} | ||||
| 	}() | ||||
| 	key, val, valid := it.Current() | ||||
| 	for valid { | ||||
| 		ck := make([]byte, len(key)) | ||||
| 		copy(ck, key) | ||||
| 		cv := make([]byte, len(val)) | ||||
| 		copy(cv, val) | ||||
| 		row, err := ParseFromKeyValue(ck, cv) | ||||
| 		if err != nil { | ||||
| 			rv <- err | ||||
| 			return | ||||
| 		} | ||||
| 		rv <- row | ||||
|  | ||||
| 		it.Next() | ||||
| 		key, val, valid = it.Current() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) DumpAll() chan interface{} { | ||||
| 	rv := make(chan interface{}) | ||||
| 	go func() { | ||||
| 		defer close(rv) | ||||
| 		dumpRange(i.kvreader, rv, nil, nil) | ||||
| 	}() | ||||
| 	return rv | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) DumpFields() chan interface{} { | ||||
| 	rv := make(chan interface{}) | ||||
| 	go func() { | ||||
| 		defer close(rv) | ||||
| 		dumpPrefix(i.kvreader, rv, []byte{'f'}) | ||||
| 	}() | ||||
| 	return rv | ||||
| } | ||||
|  | ||||
| type keyset [][]byte | ||||
|  | ||||
| func (k keyset) Len() int           { return len(k) } | ||||
| func (k keyset) Swap(i, j int)      { k[i], k[j] = k[j], k[i] } | ||||
| func (k keyset) Less(i, j int) bool { return bytes.Compare(k[i], k[j]) < 0 } | ||||
|  | ||||
| // DumpDoc returns all rows in the index related to this doc id | ||||
| func (i *IndexReader) DumpDoc(id string) chan interface{} { | ||||
| 	idBytes := []byte(id) | ||||
|  | ||||
| 	rv := make(chan interface{}) | ||||
|  | ||||
| 	go func() { | ||||
| 		defer close(rv) | ||||
|  | ||||
| 		back, err := backIndexRowForDoc(i.kvreader, []byte(id)) | ||||
| 		if err != nil { | ||||
| 			rv <- err | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		// no such doc | ||||
| 		if back == nil { | ||||
| 			return | ||||
| 		} | ||||
| 		// build sorted list of term keys | ||||
| 		keys := make(keyset, 0) | ||||
| 		for _, entry := range back.termsEntries { | ||||
| 			for i := range entry.Terms { | ||||
| 				tfr := NewTermFrequencyRow([]byte(entry.Terms[i]), uint16(*entry.Field), idBytes, 0, 0) | ||||
| 				key := tfr.Key() | ||||
| 				keys = append(keys, key) | ||||
| 			} | ||||
| 		} | ||||
| 		sort.Sort(keys) | ||||
|  | ||||
| 		// first add all the stored rows | ||||
| 		storedRowPrefix := NewStoredRow(idBytes, 0, []uint64{}, 'x', []byte{}).ScanPrefixForDoc() | ||||
| 		dumpPrefix(i.kvreader, rv, storedRowPrefix) | ||||
|  | ||||
| 		// now walk term keys in order and add them as well | ||||
| 		if len(keys) > 0 { | ||||
| 			it := i.kvreader.RangeIterator(keys[0], nil) | ||||
| 			defer func() { | ||||
| 				cerr := it.Close() | ||||
| 				if cerr != nil { | ||||
| 					rv <- cerr | ||||
| 				} | ||||
| 			}() | ||||
|  | ||||
| 			for _, key := range keys { | ||||
| 				it.Seek(key) | ||||
| 				rkey, rval, valid := it.Current() | ||||
| 				if !valid { | ||||
| 					break | ||||
| 				} | ||||
| 				rck := make([]byte, len(rkey)) | ||||
| 				copy(rck, key) | ||||
| 				rcv := make([]byte, len(rval)) | ||||
| 				copy(rcv, rval) | ||||
| 				row, err := ParseFromKeyValue(rck, rcv) | ||||
| 				if err != nil { | ||||
| 					rv <- err | ||||
| 					return | ||||
| 				} | ||||
| 				rv <- row | ||||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return rv | ||||
| } | ||||
							
								
								
									
										88
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/field_cache.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/field_cache.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| //  Copyright (c) 2015 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| type FieldCache struct { | ||||
| 	fieldIndexes   map[string]uint16 | ||||
| 	indexFields    []string | ||||
| 	lastFieldIndex int | ||||
| 	mutex          sync.RWMutex | ||||
| } | ||||
|  | ||||
| func NewFieldCache() *FieldCache { | ||||
| 	return &FieldCache{ | ||||
| 		fieldIndexes:   make(map[string]uint16), | ||||
| 		lastFieldIndex: -1, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (f *FieldCache) AddExisting(field string, index uint16) { | ||||
| 	f.mutex.Lock() | ||||
| 	f.addLOCKED(field, index) | ||||
| 	f.mutex.Unlock() | ||||
| } | ||||
|  | ||||
| func (f *FieldCache) addLOCKED(field string, index uint16) uint16 { | ||||
| 	f.fieldIndexes[field] = index | ||||
| 	if len(f.indexFields) < int(index)+1 { | ||||
| 		prevIndexFields := f.indexFields | ||||
| 		f.indexFields = make([]string, int(index)+16) | ||||
| 		copy(f.indexFields, prevIndexFields) | ||||
| 	} | ||||
| 	f.indexFields[int(index)] = field | ||||
| 	if int(index) > f.lastFieldIndex { | ||||
| 		f.lastFieldIndex = int(index) | ||||
| 	} | ||||
| 	return index | ||||
| } | ||||
|  | ||||
| // FieldNamed returns the index of the field, and whether or not it existed | ||||
| // before this call.  if createIfMissing is true, and new field index is assigned | ||||
| // but the second return value will still be false | ||||
| func (f *FieldCache) FieldNamed(field string, createIfMissing bool) (uint16, bool) { | ||||
| 	f.mutex.RLock() | ||||
| 	if index, ok := f.fieldIndexes[field]; ok { | ||||
| 		f.mutex.RUnlock() | ||||
| 		return index, true | ||||
| 	} else if !createIfMissing { | ||||
| 		f.mutex.RUnlock() | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	// trade read lock for write lock | ||||
| 	f.mutex.RUnlock() | ||||
| 	f.mutex.Lock() | ||||
| 	// need to check again with write lock | ||||
| 	if index, ok := f.fieldIndexes[field]; ok { | ||||
| 		f.mutex.Unlock() | ||||
| 		return index, true | ||||
| 	} | ||||
| 	// assign next field id | ||||
| 	index := f.addLOCKED(field, uint16(f.lastFieldIndex+1)) | ||||
| 	f.mutex.Unlock() | ||||
| 	return index, false | ||||
| } | ||||
|  | ||||
| func (f *FieldCache) FieldIndexed(index uint16) (field string) { | ||||
| 	f.mutex.RLock() | ||||
| 	if int(index) < len(f.indexFields) { | ||||
| 		field = f.indexFields[int(index)] | ||||
| 	} | ||||
| 	f.mutex.RUnlock() | ||||
| 	return field | ||||
| } | ||||
							
								
								
									
										86
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/field_dict.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/field_dict.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	index "github.com/blevesearch/bleve_index_api" | ||||
| 	store "github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| type UpsideDownCouchFieldDict struct { | ||||
| 	indexReader *IndexReader | ||||
| 	iterator    store.KVIterator | ||||
| 	dictRow     *DictionaryRow | ||||
| 	dictEntry   *index.DictEntry | ||||
| 	field       uint16 | ||||
| } | ||||
|  | ||||
| func newUpsideDownCouchFieldDict(indexReader *IndexReader, field uint16, startTerm, endTerm []byte) (*UpsideDownCouchFieldDict, error) { | ||||
|  | ||||
| 	startKey := NewDictionaryRow(startTerm, field, 0).Key() | ||||
| 	if endTerm == nil { | ||||
| 		endTerm = []byte{ByteSeparator} | ||||
| 	} else { | ||||
| 		endTerm = incrementBytes(endTerm) | ||||
| 	} | ||||
| 	endKey := NewDictionaryRow(endTerm, field, 0).Key() | ||||
|  | ||||
| 	it := indexReader.kvreader.RangeIterator(startKey, endKey) | ||||
|  | ||||
| 	return &UpsideDownCouchFieldDict{ | ||||
| 		indexReader: indexReader, | ||||
| 		iterator:    it, | ||||
| 		dictRow:     &DictionaryRow{},   // Pre-alloced, reused row. | ||||
| 		dictEntry:   &index.DictEntry{}, // Pre-alloced, reused entry. | ||||
| 		field:       field, | ||||
| 	}, nil | ||||
|  | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchFieldDict) BytesRead() uint64 { | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchFieldDict) Next() (*index.DictEntry, error) { | ||||
| 	key, val, valid := r.iterator.Current() | ||||
| 	if !valid { | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	err := r.dictRow.parseDictionaryK(key) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("unexpected error parsing dictionary row key: %v", err) | ||||
| 	} | ||||
| 	err = r.dictRow.parseDictionaryV(val) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("unexpected error parsing dictionary row val: %v", err) | ||||
| 	} | ||||
| 	r.dictEntry.Term = string(r.dictRow.term) | ||||
| 	r.dictEntry.Count = r.dictRow.count | ||||
| 	// advance the iterator to the next term | ||||
| 	r.iterator.Next() | ||||
| 	return r.dictEntry, nil | ||||
|  | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchFieldDict) Cardinality() int { | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchFieldDict) Close() error { | ||||
| 	return r.iterator.Close() | ||||
| } | ||||
							
								
								
									
										228
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/index_reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										228
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/index_reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,228 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"github.com/blevesearch/bleve/v2/document" | ||||
| 	index "github.com/blevesearch/bleve_index_api" | ||||
| 	store "github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| var reflectStaticSizeIndexReader int | ||||
|  | ||||
| func init() { | ||||
| 	var ir IndexReader | ||||
| 	reflectStaticSizeIndexReader = int(reflect.TypeOf(ir).Size()) | ||||
| } | ||||
|  | ||||
| type IndexReader struct { | ||||
| 	index    *UpsideDownCouch | ||||
| 	kvreader store.KVReader | ||||
| 	docCount uint64 | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) TermFieldReader(ctx context.Context, term []byte, fieldName string, includeFreq, includeNorm, includeTermVectors bool) (index.TermFieldReader, error) { | ||||
| 	fieldIndex, fieldExists := i.index.fieldCache.FieldNamed(fieldName, false) | ||||
| 	if fieldExists { | ||||
| 		return newUpsideDownCouchTermFieldReader(i, term, uint16(fieldIndex), includeFreq, includeNorm, includeTermVectors) | ||||
| 	} | ||||
| 	return newUpsideDownCouchTermFieldReader(i, []byte{ByteSeparator}, ^uint16(0), includeFreq, includeNorm, includeTermVectors) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) FieldDict(fieldName string) (index.FieldDict, error) { | ||||
| 	return i.FieldDictRange(fieldName, nil, nil) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) FieldDictRange(fieldName string, startTerm []byte, endTerm []byte) (index.FieldDict, error) { | ||||
| 	fieldIndex, fieldExists := i.index.fieldCache.FieldNamed(fieldName, false) | ||||
| 	if fieldExists { | ||||
| 		return newUpsideDownCouchFieldDict(i, uint16(fieldIndex), startTerm, endTerm) | ||||
| 	} | ||||
| 	return newUpsideDownCouchFieldDict(i, ^uint16(0), []byte{ByteSeparator}, []byte{}) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) FieldDictPrefix(fieldName string, termPrefix []byte) (index.FieldDict, error) { | ||||
| 	return i.FieldDictRange(fieldName, termPrefix, termPrefix) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) DocIDReaderAll() (index.DocIDReader, error) { | ||||
| 	return newUpsideDownCouchDocIDReader(i) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) DocIDReaderOnly(ids []string) (index.DocIDReader, error) { | ||||
| 	return newUpsideDownCouchDocIDReaderOnly(i, ids) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) Document(id string) (doc index.Document, err error) { | ||||
| 	// first hit the back index to confirm doc exists | ||||
| 	var backIndexRow *BackIndexRow | ||||
| 	backIndexRow, err = backIndexRowForDoc(i.kvreader, []byte(id)) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if backIndexRow == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	rvd := document.NewDocument(id) | ||||
| 	storedRow := NewStoredRow([]byte(id), 0, []uint64{}, 'x', nil) | ||||
| 	storedRowScanPrefix := storedRow.ScanPrefixForDoc() | ||||
| 	it := i.kvreader.PrefixIterator(storedRowScanPrefix) | ||||
| 	defer func() { | ||||
| 		if cerr := it.Close(); err == nil && cerr != nil { | ||||
| 			err = cerr | ||||
| 		} | ||||
| 	}() | ||||
| 	key, val, valid := it.Current() | ||||
| 	for valid { | ||||
| 		safeVal := make([]byte, len(val)) | ||||
| 		copy(safeVal, val) | ||||
| 		var row *StoredRow | ||||
| 		row, err = NewStoredRowKV(key, safeVal) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		if row != nil { | ||||
| 			fieldName := i.index.fieldCache.FieldIndexed(row.field) | ||||
| 			field := decodeFieldType(row.typ, fieldName, row.arrayPositions, row.value) | ||||
| 			if field != nil { | ||||
| 				rvd.AddField(field) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		it.Next() | ||||
| 		key, val, valid = it.Current() | ||||
| 	} | ||||
| 	return rvd, nil | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) documentVisitFieldTerms(id index.IndexInternalID, fields []string, visitor index.DocValueVisitor) error { | ||||
| 	fieldsMap := make(map[uint16]string, len(fields)) | ||||
| 	for _, f := range fields { | ||||
| 		id, ok := i.index.fieldCache.FieldNamed(f, false) | ||||
| 		if ok { | ||||
| 			fieldsMap[id] = f | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	tempRow := BackIndexRow{ | ||||
| 		doc: id, | ||||
| 	} | ||||
|  | ||||
| 	keyBuf := GetRowBuffer() | ||||
| 	if tempRow.KeySize() > len(keyBuf.buf) { | ||||
| 		keyBuf.buf = make([]byte, 2*tempRow.KeySize()) | ||||
| 	} | ||||
| 	defer PutRowBuffer(keyBuf) | ||||
| 	keySize, err := tempRow.KeyTo(keyBuf.buf) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	value, err := i.kvreader.Get(keyBuf.buf[:keySize]) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if value == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	return visitBackIndexRow(value, func(field uint32, term []byte) { | ||||
| 		if field, ok := fieldsMap[uint16(field)]; ok { | ||||
| 			visitor(field, term) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) Fields() (fields []string, err error) { | ||||
| 	fields = make([]string, 0) | ||||
| 	it := i.kvreader.PrefixIterator([]byte{'f'}) | ||||
| 	defer func() { | ||||
| 		if cerr := it.Close(); err == nil && cerr != nil { | ||||
| 			err = cerr | ||||
| 		} | ||||
| 	}() | ||||
| 	key, val, valid := it.Current() | ||||
| 	for valid { | ||||
| 		var row UpsideDownCouchRow | ||||
| 		row, err = ParseFromKeyValue(key, val) | ||||
| 		if err != nil { | ||||
| 			fields = nil | ||||
| 			return | ||||
| 		} | ||||
| 		if row != nil { | ||||
| 			fieldRow, ok := row.(*FieldRow) | ||||
| 			if ok { | ||||
| 				fields = append(fields, fieldRow.name) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		it.Next() | ||||
| 		key, val, valid = it.Current() | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) GetInternal(key []byte) ([]byte, error) { | ||||
| 	internalRow := NewInternalRow(key, nil) | ||||
| 	return i.kvreader.Get(internalRow.Key()) | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) DocCount() (uint64, error) { | ||||
| 	return i.docCount, nil | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) Close() error { | ||||
| 	return i.kvreader.Close() | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) ExternalID(id index.IndexInternalID) (string, error) { | ||||
| 	return string(id), nil | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) InternalID(id string) (index.IndexInternalID, error) { | ||||
| 	return index.IndexInternalID(id), nil | ||||
| } | ||||
|  | ||||
| func incrementBytes(in []byte) []byte { | ||||
| 	rv := make([]byte, len(in)) | ||||
| 	copy(rv, in) | ||||
| 	for i := len(rv) - 1; i >= 0; i-- { | ||||
| 		rv[i] = rv[i] + 1 | ||||
| 		if rv[i] != 0 { | ||||
| 			// didn't overflow, so stop | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return rv | ||||
| } | ||||
|  | ||||
| func (i *IndexReader) DocValueReader(fields []string) (index.DocValueReader, error) { | ||||
| 	return &DocValueReader{i: i, fields: fields}, nil | ||||
| } | ||||
|  | ||||
| type DocValueReader struct { | ||||
| 	i      *IndexReader | ||||
| 	fields []string | ||||
| } | ||||
|  | ||||
| func (dvr *DocValueReader) VisitDocValues(id index.IndexInternalID, | ||||
| 	visitor index.DocValueVisitor) error { | ||||
| 	return dvr.i.documentVisitFieldTerms(id, dvr.fields, visitor) | ||||
| } | ||||
|  | ||||
| func (dvr *DocValueReader) BytesRead() uint64 { return 0 } | ||||
							
								
								
									
										376
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										376
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,376 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"github.com/blevesearch/bleve/v2/size" | ||||
| 	index "github.com/blevesearch/bleve_index_api" | ||||
| 	"github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| var reflectStaticSizeUpsideDownCouchTermFieldReader int | ||||
| var reflectStaticSizeUpsideDownCouchDocIDReader int | ||||
|  | ||||
| func init() { | ||||
| 	var tfr UpsideDownCouchTermFieldReader | ||||
| 	reflectStaticSizeUpsideDownCouchTermFieldReader = | ||||
| 		int(reflect.TypeOf(tfr).Size()) | ||||
| 	var cdr UpsideDownCouchDocIDReader | ||||
| 	reflectStaticSizeUpsideDownCouchDocIDReader = | ||||
| 		int(reflect.TypeOf(cdr).Size()) | ||||
| } | ||||
|  | ||||
| type UpsideDownCouchTermFieldReader struct { | ||||
| 	count              uint64 | ||||
| 	indexReader        *IndexReader | ||||
| 	iterator           store.KVIterator | ||||
| 	term               []byte | ||||
| 	tfrNext            *TermFrequencyRow | ||||
| 	tfrPrealloc        TermFrequencyRow | ||||
| 	keyBuf             []byte | ||||
| 	field              uint16 | ||||
| 	includeTermVectors bool | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchTermFieldReader) Size() int { | ||||
| 	sizeInBytes := reflectStaticSizeUpsideDownCouchTermFieldReader + size.SizeOfPtr + | ||||
| 		len(r.term) + | ||||
| 		r.tfrPrealloc.Size() + | ||||
| 		len(r.keyBuf) | ||||
|  | ||||
| 	if r.tfrNext != nil { | ||||
| 		sizeInBytes += r.tfrNext.Size() | ||||
| 	} | ||||
|  | ||||
| 	return sizeInBytes | ||||
| } | ||||
|  | ||||
| func newUpsideDownCouchTermFieldReader(indexReader *IndexReader, term []byte, field uint16, includeFreq, includeNorm, includeTermVectors bool) (*UpsideDownCouchTermFieldReader, error) { | ||||
| 	bufNeeded := termFrequencyRowKeySize(term, nil) | ||||
| 	if bufNeeded < dictionaryRowKeySize(term) { | ||||
| 		bufNeeded = dictionaryRowKeySize(term) | ||||
| 	} | ||||
| 	buf := make([]byte, bufNeeded) | ||||
|  | ||||
| 	bufUsed := dictionaryRowKeyTo(buf, field, term) | ||||
| 	val, err := indexReader.kvreader.Get(buf[:bufUsed]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if val == nil { | ||||
| 		atomic.AddUint64(&indexReader.index.stats.termSearchersStarted, uint64(1)) | ||||
| 		rv := &UpsideDownCouchTermFieldReader{ | ||||
| 			count:              0, | ||||
| 			term:               term, | ||||
| 			field:              field, | ||||
| 			includeTermVectors: includeTermVectors, | ||||
| 		} | ||||
| 		rv.tfrNext = &rv.tfrPrealloc | ||||
| 		return rv, nil | ||||
| 	} | ||||
|  | ||||
| 	count, err := dictionaryRowParseV(val) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	bufUsed = termFrequencyRowKeyTo(buf, field, term, nil) | ||||
| 	it := indexReader.kvreader.PrefixIterator(buf[:bufUsed]) | ||||
|  | ||||
| 	atomic.AddUint64(&indexReader.index.stats.termSearchersStarted, uint64(1)) | ||||
| 	return &UpsideDownCouchTermFieldReader{ | ||||
| 		indexReader:        indexReader, | ||||
| 		iterator:           it, | ||||
| 		count:              count, | ||||
| 		term:               term, | ||||
| 		field:              field, | ||||
| 		includeTermVectors: includeTermVectors, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchTermFieldReader) Count() uint64 { | ||||
| 	return r.count | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchTermFieldReader) Next(preAlloced *index.TermFieldDoc) (*index.TermFieldDoc, error) { | ||||
| 	if r.iterator != nil { | ||||
| 		// We treat tfrNext also like an initialization flag, which | ||||
| 		// tells us whether we need to invoke the underlying | ||||
| 		// iterator.Next().  The first time, don't call iterator.Next(). | ||||
| 		if r.tfrNext != nil { | ||||
| 			r.iterator.Next() | ||||
| 		} else { | ||||
| 			r.tfrNext = &r.tfrPrealloc | ||||
| 		} | ||||
| 		key, val, valid := r.iterator.Current() | ||||
| 		if valid { | ||||
| 			tfr := r.tfrNext | ||||
| 			err := tfr.parseKDoc(key, r.term) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			err = tfr.parseV(val, r.includeTermVectors) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			rv := preAlloced | ||||
| 			if rv == nil { | ||||
| 				rv = &index.TermFieldDoc{} | ||||
| 			} | ||||
| 			rv.ID = append(rv.ID, tfr.doc...) | ||||
| 			rv.Freq = tfr.freq | ||||
| 			rv.Norm = float64(tfr.norm) | ||||
| 			if tfr.vectors != nil { | ||||
| 				rv.Vectors = r.indexReader.index.termFieldVectorsFromTermVectors(tfr.vectors) | ||||
| 			} | ||||
| 			return rv, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchTermFieldReader) Advance(docID index.IndexInternalID, preAlloced *index.TermFieldDoc) (rv *index.TermFieldDoc, err error) { | ||||
| 	if r.iterator != nil { | ||||
| 		if r.tfrNext == nil { | ||||
| 			r.tfrNext = &TermFrequencyRow{} | ||||
| 		} | ||||
| 		tfr := InitTermFrequencyRow(r.tfrNext, r.term, r.field, docID, 0, 0) | ||||
| 		r.keyBuf, err = tfr.KeyAppendTo(r.keyBuf[:0]) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		r.iterator.Seek(r.keyBuf) | ||||
| 		key, val, valid := r.iterator.Current() | ||||
| 		if valid { | ||||
| 			err := tfr.parseKDoc(key, r.term) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			err = tfr.parseV(val, r.includeTermVectors) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			rv = preAlloced | ||||
| 			if rv == nil { | ||||
| 				rv = &index.TermFieldDoc{} | ||||
| 			} | ||||
| 			rv.ID = append(rv.ID, tfr.doc...) | ||||
| 			rv.Freq = tfr.freq | ||||
| 			rv.Norm = float64(tfr.norm) | ||||
| 			if tfr.vectors != nil { | ||||
| 				rv.Vectors = r.indexReader.index.termFieldVectorsFromTermVectors(tfr.vectors) | ||||
| 			} | ||||
| 			return rv, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchTermFieldReader) Close() error { | ||||
| 	if r.indexReader != nil { | ||||
| 		atomic.AddUint64(&r.indexReader.index.stats.termSearchersFinished, uint64(1)) | ||||
| 	} | ||||
| 	if r.iterator != nil { | ||||
| 		return r.iterator.Close() | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type UpsideDownCouchDocIDReader struct { | ||||
| 	indexReader *IndexReader | ||||
| 	iterator    store.KVIterator | ||||
| 	only        []string | ||||
| 	onlyPos     int | ||||
| 	onlyMode    bool | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchDocIDReader) Size() int { | ||||
| 	sizeInBytes := reflectStaticSizeUpsideDownCouchDocIDReader + | ||||
| 		reflectStaticSizeIndexReader + size.SizeOfPtr | ||||
|  | ||||
| 	for _, entry := range r.only { | ||||
| 		sizeInBytes += size.SizeOfString + len(entry) | ||||
| 	} | ||||
|  | ||||
| 	return sizeInBytes | ||||
| } | ||||
|  | ||||
| func newUpsideDownCouchDocIDReader(indexReader *IndexReader) (*UpsideDownCouchDocIDReader, error) { | ||||
| 	startBytes := []byte{0x0} | ||||
| 	endBytes := []byte{0xff} | ||||
|  | ||||
| 	bisr := NewBackIndexRow(startBytes, nil, nil) | ||||
| 	bier := NewBackIndexRow(endBytes, nil, nil) | ||||
| 	it := indexReader.kvreader.RangeIterator(bisr.Key(), bier.Key()) | ||||
|  | ||||
| 	return &UpsideDownCouchDocIDReader{ | ||||
| 		indexReader: indexReader, | ||||
| 		iterator:    it, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func newUpsideDownCouchDocIDReaderOnly(indexReader *IndexReader, ids []string) (*UpsideDownCouchDocIDReader, error) { | ||||
| 	// we don't actually own the list of ids, so if before we sort we must copy | ||||
| 	idsCopy := make([]string, len(ids)) | ||||
| 	copy(idsCopy, ids) | ||||
| 	// ensure ids are sorted | ||||
| 	sort.Strings(idsCopy) | ||||
| 	startBytes := []byte{0x0} | ||||
| 	if len(idsCopy) > 0 { | ||||
| 		startBytes = []byte(idsCopy[0]) | ||||
| 	} | ||||
| 	endBytes := []byte{0xff} | ||||
| 	if len(idsCopy) > 0 { | ||||
| 		endBytes = incrementBytes([]byte(idsCopy[len(idsCopy)-1])) | ||||
| 	} | ||||
| 	bisr := NewBackIndexRow(startBytes, nil, nil) | ||||
| 	bier := NewBackIndexRow(endBytes, nil, nil) | ||||
| 	it := indexReader.kvreader.RangeIterator(bisr.Key(), bier.Key()) | ||||
|  | ||||
| 	return &UpsideDownCouchDocIDReader{ | ||||
| 		indexReader: indexReader, | ||||
| 		iterator:    it, | ||||
| 		only:        idsCopy, | ||||
| 		onlyMode:    true, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchDocIDReader) Next() (index.IndexInternalID, error) { | ||||
| 	key, val, valid := r.iterator.Current() | ||||
|  | ||||
| 	if r.onlyMode { | ||||
| 		var rv index.IndexInternalID | ||||
| 		for valid && r.onlyPos < len(r.only) { | ||||
| 			br, err := NewBackIndexRowKV(key, val) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			if !bytes.Equal(br.doc, []byte(r.only[r.onlyPos])) { | ||||
| 				ok := r.nextOnly() | ||||
| 				if !ok { | ||||
| 					return nil, nil | ||||
| 				} | ||||
| 				r.iterator.Seek(NewBackIndexRow([]byte(r.only[r.onlyPos]), nil, nil).Key()) | ||||
| 				key, val, valid = r.iterator.Current() | ||||
| 				continue | ||||
| 			} else { | ||||
| 				rv = append([]byte(nil), br.doc...) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		if valid && r.onlyPos < len(r.only) { | ||||
| 			ok := r.nextOnly() | ||||
| 			if ok { | ||||
| 				r.iterator.Seek(NewBackIndexRow([]byte(r.only[r.onlyPos]), nil, nil).Key()) | ||||
| 			} | ||||
| 			return rv, nil | ||||
| 		} | ||||
|  | ||||
| 	} else { | ||||
| 		if valid { | ||||
| 			br, err := NewBackIndexRowKV(key, val) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			rv := append([]byte(nil), br.doc...) | ||||
| 			r.iterator.Next() | ||||
| 			return rv, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchDocIDReader) Advance(docID index.IndexInternalID) (index.IndexInternalID, error) { | ||||
|  | ||||
| 	if r.onlyMode { | ||||
| 		r.onlyPos = sort.SearchStrings(r.only, string(docID)) | ||||
| 		if r.onlyPos >= len(r.only) { | ||||
| 			// advanced to key after our last only key | ||||
| 			return nil, nil | ||||
| 		} | ||||
| 		r.iterator.Seek(NewBackIndexRow([]byte(r.only[r.onlyPos]), nil, nil).Key()) | ||||
| 		key, val, valid := r.iterator.Current() | ||||
|  | ||||
| 		var rv index.IndexInternalID | ||||
| 		for valid && r.onlyPos < len(r.only) { | ||||
| 			br, err := NewBackIndexRowKV(key, val) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			if !bytes.Equal(br.doc, []byte(r.only[r.onlyPos])) { | ||||
| 				// the only key we seek'd to didn't exist | ||||
| 				// now look for the closest key that did exist in only | ||||
| 				r.onlyPos = sort.SearchStrings(r.only, string(br.doc)) | ||||
| 				if r.onlyPos >= len(r.only) { | ||||
| 					// advanced to key after our last only key | ||||
| 					return nil, nil | ||||
| 				} | ||||
| 				// now seek to this new only key | ||||
| 				r.iterator.Seek(NewBackIndexRow([]byte(r.only[r.onlyPos]), nil, nil).Key()) | ||||
| 				key, val, valid = r.iterator.Current() | ||||
| 				continue | ||||
| 			} else { | ||||
| 				rv = append([]byte(nil), br.doc...) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		if valid && r.onlyPos < len(r.only) { | ||||
| 			ok := r.nextOnly() | ||||
| 			if ok { | ||||
| 				r.iterator.Seek(NewBackIndexRow([]byte(r.only[r.onlyPos]), nil, nil).Key()) | ||||
| 			} | ||||
| 			return rv, nil | ||||
| 		} | ||||
| 	} else { | ||||
| 		bir := NewBackIndexRow(docID, nil, nil) | ||||
| 		r.iterator.Seek(bir.Key()) | ||||
| 		key, val, valid := r.iterator.Current() | ||||
| 		if valid { | ||||
| 			br, err := NewBackIndexRowKV(key, val) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			rv := append([]byte(nil), br.doc...) | ||||
| 			r.iterator.Next() | ||||
| 			return rv, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func (r *UpsideDownCouchDocIDReader) Close() error { | ||||
| 	return r.iterator.Close() | ||||
| } | ||||
|  | ||||
| // move the r.only pos forward one, skipping duplicates | ||||
| // return true if there is more data, or false if we got to the end of the list | ||||
| func (r *UpsideDownCouchDocIDReader) nextOnly() bool { | ||||
|  | ||||
| 	// advance 1 position, until we see a different key | ||||
| 	//   it's already sorted, so this skips duplicates | ||||
| 	start := r.onlyPos | ||||
| 	r.onlyPos++ | ||||
| 	for r.onlyPos < len(r.only) && r.only[r.onlyPos] == r.only[start] { | ||||
| 		start = r.onlyPos | ||||
| 		r.onlyPos++ | ||||
| 	} | ||||
| 	// inidicate if we got to the end of the list | ||||
| 	return r.onlyPos < len(r.only) | ||||
| } | ||||
							
								
								
									
										1144
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/row.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1144
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/row.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										76
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/row_merge.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/row_merge.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| ) | ||||
|  | ||||
| var mergeOperator upsideDownMerge | ||||
|  | ||||
| var dictionaryTermIncr []byte | ||||
| var dictionaryTermDecr []byte | ||||
|  | ||||
| func init() { | ||||
| 	dictionaryTermIncr = make([]byte, 8) | ||||
| 	binary.LittleEndian.PutUint64(dictionaryTermIncr, uint64(1)) | ||||
| 	dictionaryTermDecr = make([]byte, 8) | ||||
| 	var negOne = int64(-1) | ||||
| 	binary.LittleEndian.PutUint64(dictionaryTermDecr, uint64(negOne)) | ||||
| } | ||||
|  | ||||
| type upsideDownMerge struct{} | ||||
|  | ||||
| func (m *upsideDownMerge) FullMerge(key, existingValue []byte, operands [][]byte) ([]byte, bool) { | ||||
| 	// set up record based on key | ||||
| 	dr, err := NewDictionaryRowK(key) | ||||
| 	if err != nil { | ||||
| 		return nil, false | ||||
| 	} | ||||
| 	if len(existingValue) > 0 { | ||||
| 		// if existing value, parse it | ||||
| 		err = dr.parseDictionaryV(existingValue) | ||||
| 		if err != nil { | ||||
| 			return nil, false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// now process operands | ||||
| 	for _, operand := range operands { | ||||
| 		next := int64(binary.LittleEndian.Uint64(operand)) | ||||
| 		if next < 0 && uint64(-next) > dr.count { | ||||
| 			// subtracting next from existing would overflow | ||||
| 			dr.count = 0 | ||||
| 		} else if next < 0 { | ||||
| 			dr.count -= uint64(-next) | ||||
| 		} else { | ||||
| 			dr.count += uint64(next) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return dr.Value(), true | ||||
| } | ||||
|  | ||||
| func (m *upsideDownMerge) PartialMerge(key, leftOperand, rightOperand []byte) ([]byte, bool) { | ||||
| 	left := int64(binary.LittleEndian.Uint64(leftOperand)) | ||||
| 	right := int64(binary.LittleEndian.Uint64(rightOperand)) | ||||
| 	rv := make([]byte, 8) | ||||
| 	binary.LittleEndian.PutUint64(rv, uint64(left+right)) | ||||
| 	return rv, true | ||||
| } | ||||
|  | ||||
| func (m *upsideDownMerge) Name() string { | ||||
| 	return "upsideDownMerge" | ||||
| } | ||||
							
								
								
									
										55
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/stats.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/stats.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package upsidedown | ||||
|  | ||||
| import ( | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"github.com/blevesearch/bleve/v2/util" | ||||
| 	"github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| type indexStat struct { | ||||
| 	updates, deletes, batches, errors uint64 | ||||
| 	analysisTime, indexTime           uint64 | ||||
| 	termSearchersStarted              uint64 | ||||
| 	termSearchersFinished             uint64 | ||||
| 	numPlainTextBytesIndexed          uint64 | ||||
| 	i                                 *UpsideDownCouch | ||||
| } | ||||
|  | ||||
| func (i *indexStat) statsMap() map[string]interface{} { | ||||
| 	m := map[string]interface{}{} | ||||
| 	m["updates"] = atomic.LoadUint64(&i.updates) | ||||
| 	m["deletes"] = atomic.LoadUint64(&i.deletes) | ||||
| 	m["batches"] = atomic.LoadUint64(&i.batches) | ||||
| 	m["errors"] = atomic.LoadUint64(&i.errors) | ||||
| 	m["analysis_time"] = atomic.LoadUint64(&i.analysisTime) | ||||
| 	m["index_time"] = atomic.LoadUint64(&i.indexTime) | ||||
| 	m["term_searchers_started"] = atomic.LoadUint64(&i.termSearchersStarted) | ||||
| 	m["term_searchers_finished"] = atomic.LoadUint64(&i.termSearchersFinished) | ||||
| 	m["num_plain_text_bytes_indexed"] = atomic.LoadUint64(&i.numPlainTextBytesIndexed) | ||||
|  | ||||
| 	if o, ok := i.i.store.(store.KVStoreStats); ok { | ||||
| 		m["kv"] = o.StatsMap() | ||||
| 	} | ||||
|  | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| func (i *indexStat) MarshalJSON() ([]byte, error) { | ||||
| 	m := i.statsMap() | ||||
| 	return util.MarshalJSON(m) | ||||
| } | ||||
							
								
								
									
										85
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package boltdb | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
|  | ||||
| 	bolt "go.etcd.io/bbolt" | ||||
| ) | ||||
|  | ||||
| type Iterator struct { | ||||
| 	store  *Store | ||||
| 	tx     *bolt.Tx | ||||
| 	cursor *bolt.Cursor | ||||
| 	prefix []byte | ||||
| 	start  []byte | ||||
| 	end    []byte | ||||
| 	valid  bool | ||||
| 	key    []byte | ||||
| 	val    []byte | ||||
| } | ||||
|  | ||||
| func (i *Iterator) updateValid() { | ||||
| 	i.valid = (i.key != nil) | ||||
| 	if i.valid { | ||||
| 		if i.prefix != nil { | ||||
| 			i.valid = bytes.HasPrefix(i.key, i.prefix) | ||||
| 		} else if i.end != nil { | ||||
| 			i.valid = bytes.Compare(i.key, i.end) < 0 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Seek(k []byte) { | ||||
| 	if i.start != nil && bytes.Compare(k, i.start) < 0 { | ||||
| 		k = i.start | ||||
| 	} | ||||
| 	if i.prefix != nil && !bytes.HasPrefix(k, i.prefix) { | ||||
| 		if bytes.Compare(k, i.prefix) < 0 { | ||||
| 			k = i.prefix | ||||
| 		} else { | ||||
| 			i.valid = false | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	i.key, i.val = i.cursor.Seek(k) | ||||
| 	i.updateValid() | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Next() { | ||||
| 	i.key, i.val = i.cursor.Next() | ||||
| 	i.updateValid() | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Current() ([]byte, []byte, bool) { | ||||
| 	return i.key, i.val, i.valid | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Key() []byte { | ||||
| 	return i.key | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Value() []byte { | ||||
| 	return i.val | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Valid() bool { | ||||
| 	return i.valid | ||||
| } | ||||
|  | ||||
| func (i *Iterator) Close() error { | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										73
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package boltdb | ||||
|  | ||||
| import ( | ||||
| 	store "github.com/blevesearch/upsidedown_store_api" | ||||
| 	bolt "go.etcd.io/bbolt" | ||||
| ) | ||||
|  | ||||
| type Reader struct { | ||||
| 	store  *Store | ||||
| 	tx     *bolt.Tx | ||||
| 	bucket *bolt.Bucket | ||||
| } | ||||
|  | ||||
| func (r *Reader) Get(key []byte) ([]byte, error) { | ||||
| 	var rv []byte | ||||
| 	v := r.bucket.Get(key) | ||||
| 	if v != nil { | ||||
| 		rv = make([]byte, len(v)) | ||||
| 		copy(rv, v) | ||||
| 	} | ||||
| 	return rv, nil | ||||
| } | ||||
|  | ||||
| func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) { | ||||
| 	return store.MultiGet(r, keys) | ||||
| } | ||||
|  | ||||
| func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator { | ||||
| 	cursor := r.bucket.Cursor() | ||||
|  | ||||
| 	rv := &Iterator{ | ||||
| 		store:  r.store, | ||||
| 		tx:     r.tx, | ||||
| 		cursor: cursor, | ||||
| 		prefix: prefix, | ||||
| 	} | ||||
|  | ||||
| 	rv.Seek(prefix) | ||||
| 	return rv | ||||
| } | ||||
|  | ||||
| func (r *Reader) RangeIterator(start, end []byte) store.KVIterator { | ||||
| 	cursor := r.bucket.Cursor() | ||||
|  | ||||
| 	rv := &Iterator{ | ||||
| 		store:  r.store, | ||||
| 		tx:     r.tx, | ||||
| 		cursor: cursor, | ||||
| 		start:  start, | ||||
| 		end:    end, | ||||
| 	} | ||||
|  | ||||
| 	rv.Seek(start) | ||||
| 	return rv | ||||
| } | ||||
|  | ||||
| func (r *Reader) Close() error { | ||||
| 	return r.tx.Rollback() | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/stats.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/stats.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package boltdb | ||||
|  | ||||
| import ( | ||||
| 	"github.com/blevesearch/bleve/v2/util" | ||||
| ) | ||||
|  | ||||
| type stats struct { | ||||
| 	s *Store | ||||
| } | ||||
|  | ||||
| func (s *stats) MarshalJSON() ([]byte, error) { | ||||
| 	bs := s.s.db.Stats() | ||||
| 	return util.MarshalJSON(bs) | ||||
| } | ||||
							
								
								
									
										184
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/store.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/store.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package boltdb implements a store.KVStore on top of BoltDB. It supports the | ||||
| // following options: | ||||
| // | ||||
| // "bucket" (string): the name of BoltDB bucket to use, defaults to "bleve". | ||||
| // | ||||
| // "nosync" (bool): if true, set boltdb.DB.NoSync to true. It speeds up index | ||||
| // operations in exchange of losing integrity guarantees if indexation aborts | ||||
| // without closing the index. Use it when rebuilding indexes from zero. | ||||
| package boltdb | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/blevesearch/bleve/v2/registry" | ||||
| 	store "github.com/blevesearch/upsidedown_store_api" | ||||
| 	bolt "go.etcd.io/bbolt" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	Name                    = "boltdb" | ||||
| 	defaultCompactBatchSize = 100 | ||||
| ) | ||||
|  | ||||
| type Store struct { | ||||
| 	path        string | ||||
| 	bucket      string | ||||
| 	db          *bolt.DB | ||||
| 	noSync      bool | ||||
| 	fillPercent float64 | ||||
| 	mo          store.MergeOperator | ||||
| } | ||||
|  | ||||
| func New(mo store.MergeOperator, config map[string]interface{}) (store.KVStore, error) { | ||||
| 	path, ok := config["path"].(string) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("must specify path") | ||||
| 	} | ||||
| 	if path == "" { | ||||
| 		return nil, os.ErrInvalid | ||||
| 	} | ||||
|  | ||||
| 	bucket, ok := config["bucket"].(string) | ||||
| 	if !ok { | ||||
| 		bucket = "bleve" | ||||
| 	} | ||||
|  | ||||
| 	noSync, _ := config["nosync"].(bool) | ||||
|  | ||||
| 	fillPercent, ok := config["fillPercent"].(float64) | ||||
| 	if !ok { | ||||
| 		fillPercent = bolt.DefaultFillPercent | ||||
| 	} | ||||
|  | ||||
| 	bo := &bolt.Options{} | ||||
| 	ro, ok := config["read_only"].(bool) | ||||
| 	if ok { | ||||
| 		bo.ReadOnly = ro | ||||
| 	} | ||||
|  | ||||
| 	if initialMmapSize, ok := config["initialMmapSize"].(int); ok { | ||||
| 		bo.InitialMmapSize = initialMmapSize | ||||
| 	} else if initialMmapSize, ok := config["initialMmapSize"].(float64); ok { | ||||
| 		bo.InitialMmapSize = int(initialMmapSize) | ||||
| 	} | ||||
|  | ||||
| 	db, err := bolt.Open(path, 0600, bo) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	db.NoSync = noSync | ||||
|  | ||||
| 	if !bo.ReadOnly { | ||||
| 		err = db.Update(func(tx *bolt.Tx) error { | ||||
| 			_, err := tx.CreateBucketIfNotExists([]byte(bucket)) | ||||
|  | ||||
| 			return err | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	rv := Store{ | ||||
| 		path:        path, | ||||
| 		bucket:      bucket, | ||||
| 		db:          db, | ||||
| 		mo:          mo, | ||||
| 		noSync:      noSync, | ||||
| 		fillPercent: fillPercent, | ||||
| 	} | ||||
| 	return &rv, nil | ||||
| } | ||||
|  | ||||
| func (bs *Store) Close() error { | ||||
| 	return bs.db.Close() | ||||
| } | ||||
|  | ||||
| func (bs *Store) Reader() (store.KVReader, error) { | ||||
| 	tx, err := bs.db.Begin(false) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &Reader{ | ||||
| 		store:  bs, | ||||
| 		tx:     tx, | ||||
| 		bucket: tx.Bucket([]byte(bs.bucket)), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (bs *Store) Writer() (store.KVWriter, error) { | ||||
| 	return &Writer{ | ||||
| 		store: bs, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (bs *Store) Stats() json.Marshaler { | ||||
| 	return &stats{ | ||||
| 		s: bs, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // CompactWithBatchSize removes DictionaryTerm entries with a count of zero (in batchSize batches) | ||||
| // Removing entries is a workaround for github issue #374. | ||||
| func (bs *Store) CompactWithBatchSize(batchSize int) error { | ||||
| 	for { | ||||
| 		cnt := 0 | ||||
| 		err := bs.db.Batch(func(tx *bolt.Tx) error { | ||||
| 			c := tx.Bucket([]byte(bs.bucket)).Cursor() | ||||
| 			prefix := []byte("d") | ||||
|  | ||||
| 			for k, v := c.Seek(prefix); bytes.HasPrefix(k, prefix); k, v = c.Next() { | ||||
| 				if bytes.Equal(v, []byte{0}) { | ||||
| 					cnt++ | ||||
| 					if err := c.Delete(); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if cnt == batchSize { | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 			} | ||||
| 			return nil | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if cnt == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Compact calls CompactWithBatchSize with a default batch size of 100.  This is a workaround | ||||
| // for github issue #374. | ||||
| func (bs *Store) Compact() error { | ||||
| 	return bs.CompactWithBatchSize(defaultCompactBatchSize) | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	err := registry.RegisterKVStore(Name, New) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										95
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/boltdb/writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| //  Copyright (c) 2014 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package boltdb | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	store "github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| type Writer struct { | ||||
| 	store *Store | ||||
| } | ||||
|  | ||||
| func (w *Writer) NewBatch() store.KVBatch { | ||||
| 	return store.NewEmulatedBatch(w.store.mo) | ||||
| } | ||||
|  | ||||
| func (w *Writer) NewBatchEx(options store.KVBatchOptions) ([]byte, store.KVBatch, error) { | ||||
| 	return make([]byte, options.TotalBytes), w.NewBatch(), nil | ||||
| } | ||||
|  | ||||
| func (w *Writer) ExecuteBatch(batch store.KVBatch) (err error) { | ||||
|  | ||||
| 	emulatedBatch, ok := batch.(*store.EmulatedBatch) | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("wrong type of batch") | ||||
| 	} | ||||
|  | ||||
| 	tx, err := w.store.db.Begin(true) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	// defer function to ensure that once started, | ||||
| 	// we either Commit tx or Rollback | ||||
| 	defer func() { | ||||
| 		// if nothing went wrong, commit | ||||
| 		if err == nil { | ||||
| 			// careful to catch error here too | ||||
| 			err = tx.Commit() | ||||
| 		} else { | ||||
| 			// caller should see error that caused abort, | ||||
| 			// not success or failure of Rollback itself | ||||
| 			_ = tx.Rollback() | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	bucket := tx.Bucket([]byte(w.store.bucket)) | ||||
| 	bucket.FillPercent = w.store.fillPercent | ||||
|  | ||||
| 	for k, mergeOps := range emulatedBatch.Merger.Merges { | ||||
| 		kb := []byte(k) | ||||
| 		existingVal := bucket.Get(kb) | ||||
| 		mergedVal, fullMergeOk := w.store.mo.FullMerge(kb, existingVal, mergeOps) | ||||
| 		if !fullMergeOk { | ||||
| 			err = fmt.Errorf("merge operator returned failure") | ||||
| 			return | ||||
| 		} | ||||
| 		err = bucket.Put(kb, mergedVal) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for _, op := range emulatedBatch.Ops { | ||||
| 		if op.V != nil { | ||||
| 			err = bucket.Put(op.K, op.V) | ||||
| 			if err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 		} else { | ||||
| 			err = bucket.Delete(op.K) | ||||
| 			if err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (w *Writer) Close() error { | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										152
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | ||||
| //  Copyright (c) 2015 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package gtreap provides an in-memory implementation of the | ||||
| // KVStore interfaces using the gtreap balanced-binary treap, | ||||
| // copy-on-write data structure. | ||||
| package gtreap | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/blevesearch/gtreap" | ||||
| ) | ||||
|  | ||||
| type Iterator struct { | ||||
| 	t *gtreap.Treap | ||||
|  | ||||
| 	m        sync.Mutex | ||||
| 	cancelCh chan struct{} | ||||
| 	nextCh   chan *Item | ||||
| 	curr     *Item | ||||
| 	currOk   bool | ||||
|  | ||||
| 	prefix []byte | ||||
| 	start  []byte | ||||
| 	end    []byte | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Seek(k []byte) { | ||||
| 	if w.start != nil && bytes.Compare(k, w.start) < 0 { | ||||
| 		k = w.start | ||||
| 	} | ||||
| 	if w.prefix != nil && !bytes.HasPrefix(k, w.prefix) { | ||||
| 		if bytes.Compare(k, w.prefix) < 0 { | ||||
| 			k = w.prefix | ||||
| 		} else { | ||||
| 			var end []byte | ||||
| 			for i := len(w.prefix) - 1; i >= 0; i-- { | ||||
| 				c := w.prefix[i] | ||||
| 				if c < 0xff { | ||||
| 					end = make([]byte, i+1) | ||||
| 					copy(end, w.prefix) | ||||
| 					end[i] = c + 1 | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			k = end | ||||
| 		} | ||||
| 	} | ||||
| 	w.restart(&Item{k: k}) | ||||
| } | ||||
|  | ||||
| func (w *Iterator) restart(start *Item) *Iterator { | ||||
| 	cancelCh := make(chan struct{}) | ||||
| 	nextCh := make(chan *Item, 1) | ||||
|  | ||||
| 	w.m.Lock() | ||||
| 	if w.cancelCh != nil { | ||||
| 		close(w.cancelCh) | ||||
| 	} | ||||
| 	w.cancelCh = cancelCh | ||||
| 	w.nextCh = nextCh | ||||
| 	w.curr = nil | ||||
| 	w.currOk = false | ||||
| 	w.m.Unlock() | ||||
|  | ||||
| 	go func() { | ||||
| 		if start != nil { | ||||
| 			w.t.VisitAscend(start, func(itm gtreap.Item) bool { | ||||
| 				select { | ||||
| 				case <-cancelCh: | ||||
| 					return false | ||||
| 				case nextCh <- itm.(*Item): | ||||
| 					return true | ||||
| 				} | ||||
| 			}) | ||||
| 		} | ||||
| 		close(nextCh) | ||||
| 	}() | ||||
|  | ||||
| 	w.Next() | ||||
|  | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Next() { | ||||
| 	w.m.Lock() | ||||
| 	nextCh := w.nextCh | ||||
| 	w.m.Unlock() | ||||
| 	w.curr, w.currOk = <-nextCh | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Current() ([]byte, []byte, bool) { | ||||
| 	w.m.Lock() | ||||
| 	defer w.m.Unlock() | ||||
| 	if !w.currOk || w.curr == nil { | ||||
| 		return nil, nil, false | ||||
| 	} | ||||
| 	if w.prefix != nil && !bytes.HasPrefix(w.curr.k, w.prefix) { | ||||
| 		return nil, nil, false | ||||
| 	} else if w.end != nil && bytes.Compare(w.curr.k, w.end) >= 0 { | ||||
| 		return nil, nil, false | ||||
| 	} | ||||
| 	return w.curr.k, w.curr.v, w.currOk | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Key() []byte { | ||||
| 	k, _, ok := w.Current() | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return k | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Value() []byte { | ||||
| 	_, v, ok := w.Current() | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Valid() bool { | ||||
| 	_, _, ok := w.Current() | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| func (w *Iterator) Close() error { | ||||
| 	w.m.Lock() | ||||
| 	if w.cancelCh != nil { | ||||
| 		close(w.cancelCh) | ||||
| 	} | ||||
| 	w.cancelCh = nil | ||||
| 	w.nextCh = nil | ||||
| 	w.curr = nil | ||||
| 	w.currOk = false | ||||
| 	w.m.Unlock() | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										66
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| //  Copyright (c) 2015 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package gtreap provides an in-memory implementation of the | ||||
| // KVStore interfaces using the gtreap balanced-binary treap, | ||||
| // copy-on-write data structure. | ||||
| package gtreap | ||||
|  | ||||
| import ( | ||||
| 	"github.com/blevesearch/upsidedown_store_api" | ||||
|  | ||||
| 	"github.com/blevesearch/gtreap" | ||||
| ) | ||||
|  | ||||
| type Reader struct { | ||||
| 	t *gtreap.Treap | ||||
| } | ||||
|  | ||||
| func (w *Reader) Get(k []byte) (v []byte, err error) { | ||||
| 	var rv []byte | ||||
| 	itm := w.t.Get(&Item{k: k}) | ||||
| 	if itm != nil { | ||||
| 		rv = make([]byte, len(itm.(*Item).v)) | ||||
| 		copy(rv, itm.(*Item).v) | ||||
| 		return rv, nil | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) { | ||||
| 	return store.MultiGet(r, keys) | ||||
| } | ||||
|  | ||||
| func (w *Reader) PrefixIterator(k []byte) store.KVIterator { | ||||
| 	rv := Iterator{ | ||||
| 		t:      w.t, | ||||
| 		prefix: k, | ||||
| 	} | ||||
| 	rv.restart(&Item{k: k}) | ||||
| 	return &rv | ||||
| } | ||||
|  | ||||
| func (w *Reader) RangeIterator(start, end []byte) store.KVIterator { | ||||
| 	rv := Iterator{ | ||||
| 		t:     w.t, | ||||
| 		start: start, | ||||
| 		end:   end, | ||||
| 	} | ||||
| 	rv.restart(&Item{k: start}) | ||||
| 	return &rv | ||||
| } | ||||
|  | ||||
| func (w *Reader) Close() error { | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										85
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/store.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/store.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| //  Copyright (c) 2015 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package gtreap provides an in-memory implementation of the | ||||
| // KVStore interfaces using the gtreap balanced-binary treap, | ||||
| // copy-on-write data structure. | ||||
|  | ||||
| package gtreap | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/blevesearch/bleve/v2/registry" | ||||
| 	"github.com/blevesearch/gtreap" | ||||
| 	store "github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| const Name = "gtreap" | ||||
|  | ||||
| type Store struct { | ||||
| 	m  sync.Mutex | ||||
| 	t  *gtreap.Treap | ||||
| 	mo store.MergeOperator | ||||
| } | ||||
|  | ||||
| type Item struct { | ||||
| 	k []byte | ||||
| 	v []byte | ||||
| } | ||||
|  | ||||
| func itemCompare(a, b interface{}) int { | ||||
| 	return bytes.Compare(a.(*Item).k, b.(*Item).k) | ||||
| } | ||||
|  | ||||
| func New(mo store.MergeOperator, config map[string]interface{}) (store.KVStore, error) { | ||||
| 	path, ok := config["path"].(string) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("must specify path") | ||||
| 	} | ||||
| 	if path != "" { | ||||
| 		return nil, os.ErrInvalid | ||||
| 	} | ||||
|  | ||||
| 	rv := Store{ | ||||
| 		t:  gtreap.NewTreap(itemCompare), | ||||
| 		mo: mo, | ||||
| 	} | ||||
| 	return &rv, nil | ||||
| } | ||||
|  | ||||
| func (s *Store) Close() error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (s *Store) Reader() (store.KVReader, error) { | ||||
| 	s.m.Lock() | ||||
| 	t := s.t | ||||
| 	s.m.Unlock() | ||||
| 	return &Reader{t: t}, nil | ||||
| } | ||||
|  | ||||
| func (s *Store) Writer() (store.KVWriter, error) { | ||||
| 	return &Writer{s: s}, nil | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	err := registry.RegisterKVStore(Name, New) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										76
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/store/gtreap/writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| //  Copyright (c) 2015 Couchbase, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| // 		http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package gtreap provides an in-memory implementation of the | ||||
| // KVStore interfaces using the gtreap balanced-binary treap, | ||||
| // copy-on-write data structure. | ||||
| package gtreap | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/rand" | ||||
|  | ||||
| 	"github.com/blevesearch/upsidedown_store_api" | ||||
| ) | ||||
|  | ||||
| type Writer struct { | ||||
| 	s *Store | ||||
| } | ||||
|  | ||||
| func (w *Writer) NewBatch() store.KVBatch { | ||||
| 	return store.NewEmulatedBatch(w.s.mo) | ||||
| } | ||||
|  | ||||
| func (w *Writer) NewBatchEx(options store.KVBatchOptions) ([]byte, store.KVBatch, error) { | ||||
| 	return make([]byte, options.TotalBytes), w.NewBatch(), nil | ||||
| } | ||||
|  | ||||
| func (w *Writer) ExecuteBatch(batch store.KVBatch) error { | ||||
|  | ||||
| 	emulatedBatch, ok := batch.(*store.EmulatedBatch) | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("wrong type of batch") | ||||
| 	} | ||||
|  | ||||
| 	w.s.m.Lock() | ||||
| 	for k, mergeOps := range emulatedBatch.Merger.Merges { | ||||
| 		kb := []byte(k) | ||||
| 		var existingVal []byte | ||||
| 		existingItem := w.s.t.Get(&Item{k: kb}) | ||||
| 		if existingItem != nil { | ||||
| 			existingVal = w.s.t.Get(&Item{k: kb}).(*Item).v | ||||
| 		} | ||||
| 		mergedVal, fullMergeOk := w.s.mo.FullMerge(kb, existingVal, mergeOps) | ||||
| 		if !fullMergeOk { | ||||
| 			return fmt.Errorf("merge operator returned failure") | ||||
| 		} | ||||
| 		w.s.t = w.s.t.Upsert(&Item{k: kb, v: mergedVal}, rand.Int()) | ||||
| 	} | ||||
|  | ||||
| 	for _, op := range emulatedBatch.Ops { | ||||
| 		if op.V != nil { | ||||
| 			w.s.t = w.s.t.Upsert(&Item{k: op.K, v: op.V}, rand.Int()) | ||||
| 		} else { | ||||
| 			w.s.t = w.s.t.Delete(&Item{k: op.K}) | ||||
| 		} | ||||
| 	} | ||||
| 	w.s.m.Unlock() | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (w *Writer) Close() error { | ||||
| 	w.s = nil | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										1079
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/upsidedown.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1079
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/upsidedown.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										690
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/upsidedown.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										690
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/upsidedown.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,690 @@ | ||||
| // Code generated by protoc-gen-gogo. | ||||
| // source: upsidedown.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package upsidedown is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
|  | ||||
| 	upsidedown.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
|  | ||||
| 	BackIndexTermsEntry | ||||
| 	BackIndexStoreEntry | ||||
| 	BackIndexRowValue | ||||
| */ | ||||
| package upsidedown | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import math "math" | ||||
|  | ||||
| import io "io" | ||||
| import fmt "fmt" | ||||
| import github_com_golang_protobuf_proto "github.com/golang/protobuf/proto" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = math.Inf | ||||
|  | ||||
| type BackIndexTermsEntry struct { | ||||
| 	Field            *uint32  `protobuf:"varint,1,req,name=field" json:"field,omitempty"` | ||||
| 	Terms            []string `protobuf:"bytes,2,rep,name=terms" json:"terms,omitempty"` | ||||
| 	XXX_unrecognized []byte   `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *BackIndexTermsEntry) Reset()         { *m = BackIndexTermsEntry{} } | ||||
| func (m *BackIndexTermsEntry) String() string { return proto.CompactTextString(m) } | ||||
| func (*BackIndexTermsEntry) ProtoMessage()    {} | ||||
|  | ||||
| func (m *BackIndexTermsEntry) GetField() uint32 { | ||||
| 	if m != nil && m.Field != nil { | ||||
| 		return *m.Field | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *BackIndexTermsEntry) GetTerms() []string { | ||||
| 	if m != nil { | ||||
| 		return m.Terms | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type BackIndexStoreEntry struct { | ||||
| 	Field            *uint32  `protobuf:"varint,1,req,name=field" json:"field,omitempty"` | ||||
| 	ArrayPositions   []uint64 `protobuf:"varint,2,rep,name=arrayPositions" json:"arrayPositions,omitempty"` | ||||
| 	XXX_unrecognized []byte   `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *BackIndexStoreEntry) Reset()         { *m = BackIndexStoreEntry{} } | ||||
| func (m *BackIndexStoreEntry) String() string { return proto.CompactTextString(m) } | ||||
| func (*BackIndexStoreEntry) ProtoMessage()    {} | ||||
|  | ||||
| func (m *BackIndexStoreEntry) GetField() uint32 { | ||||
| 	if m != nil && m.Field != nil { | ||||
| 		return *m.Field | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *BackIndexStoreEntry) GetArrayPositions() []uint64 { | ||||
| 	if m != nil { | ||||
| 		return m.ArrayPositions | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type BackIndexRowValue struct { | ||||
| 	TermsEntries     []*BackIndexTermsEntry `protobuf:"bytes,1,rep,name=termsEntries" json:"termsEntries,omitempty"` | ||||
| 	StoredEntries    []*BackIndexStoreEntry `protobuf:"bytes,2,rep,name=storedEntries" json:"storedEntries,omitempty"` | ||||
| 	XXX_unrecognized []byte                 `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *BackIndexRowValue) Reset()         { *m = BackIndexRowValue{} } | ||||
| func (m *BackIndexRowValue) String() string { return proto.CompactTextString(m) } | ||||
| func (*BackIndexRowValue) ProtoMessage()    {} | ||||
|  | ||||
| func (m *BackIndexRowValue) GetTermsEntries() []*BackIndexTermsEntry { | ||||
| 	if m != nil { | ||||
| 		return m.TermsEntries | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexRowValue) GetStoredEntries() []*BackIndexStoreEntry { | ||||
| 	if m != nil { | ||||
| 		return m.StoredEntries | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexTermsEntry) Unmarshal(data []byte) error { | ||||
| 	var hasFields [1]uint64 | ||||
| 	l := len(data) | ||||
| 	iNdEx := 0 | ||||
| 	for iNdEx < l { | ||||
| 		var wire uint64 | ||||
| 		for shift := uint(0); ; shift += 7 { | ||||
| 			if iNdEx >= l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			b := data[iNdEx] | ||||
| 			iNdEx++ | ||||
| 			wire |= (uint64(b) & 0x7F) << shift | ||||
| 			if b < 0x80 { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		fieldNum := int32(wire >> 3) | ||||
| 		wireType := int(wire & 0x7) | ||||
| 		switch fieldNum { | ||||
| 		case 1: | ||||
| 			if wireType != 0 { | ||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Field", wireType) | ||||
| 			} | ||||
| 			var v uint32 | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				v |= (uint32(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			m.Field = &v | ||||
| 			hasFields[0] |= uint64(0x00000001) | ||||
| 		case 2: | ||||
| 			if wireType != 2 { | ||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Terms", wireType) | ||||
| 			} | ||||
| 			var stringLen uint64 | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				stringLen |= (uint64(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			postIndex := iNdEx + int(stringLen) | ||||
| 			if postIndex > l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			m.Terms = append(m.Terms, string(data[iNdEx:postIndex])) | ||||
| 			iNdEx = postIndex | ||||
| 		default: | ||||
| 			var sizeOfWire int | ||||
| 			for { | ||||
| 				sizeOfWire++ | ||||
| 				wire >>= 7 | ||||
| 				if wire == 0 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			iNdEx -= sizeOfWire | ||||
| 			skippy, err := skipUpsidedown(data[iNdEx:]) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if skippy < 0 { | ||||
| 				return ErrInvalidLengthUpsidedown | ||||
| 			} | ||||
| 			if (iNdEx + skippy) > l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			m.XXX_unrecognized = append(m.XXX_unrecognized, data[iNdEx:iNdEx+skippy]...) | ||||
| 			iNdEx += skippy | ||||
| 		} | ||||
| 	} | ||||
| 	if hasFields[0]&uint64(0x00000001) == 0 { | ||||
| 		return new(github_com_golang_protobuf_proto.RequiredNotSetError) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
| func (m *BackIndexStoreEntry) Unmarshal(data []byte) error { | ||||
| 	var hasFields [1]uint64 | ||||
| 	l := len(data) | ||||
| 	iNdEx := 0 | ||||
| 	for iNdEx < l { | ||||
| 		var wire uint64 | ||||
| 		for shift := uint(0); ; shift += 7 { | ||||
| 			if iNdEx >= l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			b := data[iNdEx] | ||||
| 			iNdEx++ | ||||
| 			wire |= (uint64(b) & 0x7F) << shift | ||||
| 			if b < 0x80 { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		fieldNum := int32(wire >> 3) | ||||
| 		wireType := int(wire & 0x7) | ||||
| 		switch fieldNum { | ||||
| 		case 1: | ||||
| 			if wireType != 0 { | ||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Field", wireType) | ||||
| 			} | ||||
| 			var v uint32 | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				v |= (uint32(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			m.Field = &v | ||||
| 			hasFields[0] |= uint64(0x00000001) | ||||
| 		case 2: | ||||
| 			if wireType != 0 { | ||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field ArrayPositions", wireType) | ||||
| 			} | ||||
| 			var v uint64 | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				v |= (uint64(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			m.ArrayPositions = append(m.ArrayPositions, v) | ||||
| 		default: | ||||
| 			var sizeOfWire int | ||||
| 			for { | ||||
| 				sizeOfWire++ | ||||
| 				wire >>= 7 | ||||
| 				if wire == 0 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			iNdEx -= sizeOfWire | ||||
| 			skippy, err := skipUpsidedown(data[iNdEx:]) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if skippy < 0 { | ||||
| 				return ErrInvalidLengthUpsidedown | ||||
| 			} | ||||
| 			if (iNdEx + skippy) > l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			m.XXX_unrecognized = append(m.XXX_unrecognized, data[iNdEx:iNdEx+skippy]...) | ||||
| 			iNdEx += skippy | ||||
| 		} | ||||
| 	} | ||||
| 	if hasFields[0]&uint64(0x00000001) == 0 { | ||||
| 		return new(github_com_golang_protobuf_proto.RequiredNotSetError) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
| func (m *BackIndexRowValue) Unmarshal(data []byte) error { | ||||
| 	l := len(data) | ||||
| 	iNdEx := 0 | ||||
| 	for iNdEx < l { | ||||
| 		var wire uint64 | ||||
| 		for shift := uint(0); ; shift += 7 { | ||||
| 			if iNdEx >= l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			b := data[iNdEx] | ||||
| 			iNdEx++ | ||||
| 			wire |= (uint64(b) & 0x7F) << shift | ||||
| 			if b < 0x80 { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		fieldNum := int32(wire >> 3) | ||||
| 		wireType := int(wire & 0x7) | ||||
| 		switch fieldNum { | ||||
| 		case 1: | ||||
| 			if wireType != 2 { | ||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field TermsEntries", wireType) | ||||
| 			} | ||||
| 			var msglen int | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				msglen |= (int(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			postIndex := iNdEx + msglen | ||||
| 			if msglen < 0 { | ||||
| 				return ErrInvalidLengthUpsidedown | ||||
| 			} | ||||
| 			if postIndex > l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			m.TermsEntries = append(m.TermsEntries, &BackIndexTermsEntry{}) | ||||
| 			if err := m.TermsEntries[len(m.TermsEntries)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			iNdEx = postIndex | ||||
| 		case 2: | ||||
| 			if wireType != 2 { | ||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field StoredEntries", wireType) | ||||
| 			} | ||||
| 			var msglen int | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				msglen |= (int(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			postIndex := iNdEx + msglen | ||||
| 			if msglen < 0 { | ||||
| 				return ErrInvalidLengthUpsidedown | ||||
| 			} | ||||
| 			if postIndex > l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			m.StoredEntries = append(m.StoredEntries, &BackIndexStoreEntry{}) | ||||
| 			if err := m.StoredEntries[len(m.StoredEntries)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			iNdEx = postIndex | ||||
| 		default: | ||||
| 			var sizeOfWire int | ||||
| 			for { | ||||
| 				sizeOfWire++ | ||||
| 				wire >>= 7 | ||||
| 				if wire == 0 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			iNdEx -= sizeOfWire | ||||
| 			skippy, err := skipUpsidedown(data[iNdEx:]) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if skippy < 0 { | ||||
| 				return ErrInvalidLengthUpsidedown | ||||
| 			} | ||||
| 			if (iNdEx + skippy) > l { | ||||
| 				return io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			m.XXX_unrecognized = append(m.XXX_unrecognized, data[iNdEx:iNdEx+skippy]...) | ||||
| 			iNdEx += skippy | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
| func skipUpsidedown(data []byte) (n int, err error) { | ||||
| 	l := len(data) | ||||
| 	iNdEx := 0 | ||||
| 	for iNdEx < l { | ||||
| 		var wire uint64 | ||||
| 		for shift := uint(0); ; shift += 7 { | ||||
| 			if iNdEx >= l { | ||||
| 				return 0, io.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			b := data[iNdEx] | ||||
| 			iNdEx++ | ||||
| 			wire |= (uint64(b) & 0x7F) << shift | ||||
| 			if b < 0x80 { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		wireType := int(wire & 0x7) | ||||
| 		switch wireType { | ||||
| 		case 0: | ||||
| 			for { | ||||
| 				if iNdEx >= l { | ||||
| 					return 0, io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				iNdEx++ | ||||
| 				if data[iNdEx-1] < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			return iNdEx, nil | ||||
| 		case 1: | ||||
| 			iNdEx += 8 | ||||
| 			return iNdEx, nil | ||||
| 		case 2: | ||||
| 			var length int | ||||
| 			for shift := uint(0); ; shift += 7 { | ||||
| 				if iNdEx >= l { | ||||
| 					return 0, io.ErrUnexpectedEOF | ||||
| 				} | ||||
| 				b := data[iNdEx] | ||||
| 				iNdEx++ | ||||
| 				length |= (int(b) & 0x7F) << shift | ||||
| 				if b < 0x80 { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			iNdEx += length | ||||
| 			if length < 0 { | ||||
| 				return 0, ErrInvalidLengthUpsidedown | ||||
| 			} | ||||
| 			return iNdEx, nil | ||||
| 		case 3: | ||||
| 			for { | ||||
| 				var innerWire uint64 | ||||
| 				var start int = iNdEx | ||||
| 				for shift := uint(0); ; shift += 7 { | ||||
| 					if iNdEx >= l { | ||||
| 						return 0, io.ErrUnexpectedEOF | ||||
| 					} | ||||
| 					b := data[iNdEx] | ||||
| 					iNdEx++ | ||||
| 					innerWire |= (uint64(b) & 0x7F) << shift | ||||
| 					if b < 0x80 { | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
| 				innerWireType := int(innerWire & 0x7) | ||||
| 				if innerWireType == 4 { | ||||
| 					break | ||||
| 				} | ||||
| 				next, err := skipUpsidedown(data[start:]) | ||||
| 				if err != nil { | ||||
| 					return 0, err | ||||
| 				} | ||||
| 				iNdEx = start + next | ||||
| 			} | ||||
| 			return iNdEx, nil | ||||
| 		case 4: | ||||
| 			return iNdEx, nil | ||||
| 		case 5: | ||||
| 			iNdEx += 4 | ||||
| 			return iNdEx, nil | ||||
| 		default: | ||||
| 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) | ||||
| 		} | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	ErrInvalidLengthUpsidedown = fmt.Errorf("proto: negative length found during unmarshaling") | ||||
| ) | ||||
|  | ||||
| func (m *BackIndexTermsEntry) Size() (n int) { | ||||
| 	var l int | ||||
| 	_ = l | ||||
| 	if m.Field != nil { | ||||
| 		n += 1 + sovUpsidedown(uint64(*m.Field)) | ||||
| 	} | ||||
| 	if len(m.Terms) > 0 { | ||||
| 		for _, s := range m.Terms { | ||||
| 			l = len(s) | ||||
| 			n += 1 + l + sovUpsidedown(uint64(l)) | ||||
| 		} | ||||
| 	} | ||||
| 	if m.XXX_unrecognized != nil { | ||||
| 		n += len(m.XXX_unrecognized) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (m *BackIndexStoreEntry) Size() (n int) { | ||||
| 	var l int | ||||
| 	_ = l | ||||
| 	if m.Field != nil { | ||||
| 		n += 1 + sovUpsidedown(uint64(*m.Field)) | ||||
| 	} | ||||
| 	if len(m.ArrayPositions) > 0 { | ||||
| 		for _, e := range m.ArrayPositions { | ||||
| 			n += 1 + sovUpsidedown(uint64(e)) | ||||
| 		} | ||||
| 	} | ||||
| 	if m.XXX_unrecognized != nil { | ||||
| 		n += len(m.XXX_unrecognized) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (m *BackIndexRowValue) Size() (n int) { | ||||
| 	var l int | ||||
| 	_ = l | ||||
| 	if len(m.TermsEntries) > 0 { | ||||
| 		for _, e := range m.TermsEntries { | ||||
| 			l = e.Size() | ||||
| 			n += 1 + l + sovUpsidedown(uint64(l)) | ||||
| 		} | ||||
| 	} | ||||
| 	if len(m.StoredEntries) > 0 { | ||||
| 		for _, e := range m.StoredEntries { | ||||
| 			l = e.Size() | ||||
| 			n += 1 + l + sovUpsidedown(uint64(l)) | ||||
| 		} | ||||
| 	} | ||||
| 	if m.XXX_unrecognized != nil { | ||||
| 		n += len(m.XXX_unrecognized) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func sovUpsidedown(x uint64) (n int) { | ||||
| 	for { | ||||
| 		n++ | ||||
| 		x >>= 7 | ||||
| 		if x == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
| func sozUpsidedown(x uint64) (n int) { | ||||
| 	return sovUpsidedown(uint64((x << 1) ^ uint64((int64(x) >> 63)))) | ||||
| } | ||||
| func (m *BackIndexTermsEntry) Marshal() (data []byte, err error) { | ||||
| 	size := m.Size() | ||||
| 	data = make([]byte, size) | ||||
| 	n, err := m.MarshalTo(data) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return data[:n], nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexTermsEntry) MarshalTo(data []byte) (n int, err error) { | ||||
| 	var i int | ||||
| 	_ = i | ||||
| 	var l int | ||||
| 	_ = l | ||||
| 	if m.Field == nil { | ||||
| 		return 0, new(github_com_golang_protobuf_proto.RequiredNotSetError) | ||||
| 	} else { | ||||
| 		data[i] = 0x8 | ||||
| 		i++ | ||||
| 		i = encodeVarintUpsidedown(data, i, uint64(*m.Field)) | ||||
| 	} | ||||
| 	if len(m.Terms) > 0 { | ||||
| 		for _, s := range m.Terms { | ||||
| 			data[i] = 0x12 | ||||
| 			i++ | ||||
| 			l = len(s) | ||||
| 			for l >= 1<<7 { | ||||
| 				data[i] = uint8(uint64(l)&0x7f | 0x80) | ||||
| 				l >>= 7 | ||||
| 				i++ | ||||
| 			} | ||||
| 			data[i] = uint8(l) | ||||
| 			i++ | ||||
| 			i += copy(data[i:], s) | ||||
| 		} | ||||
| 	} | ||||
| 	if m.XXX_unrecognized != nil { | ||||
| 		i += copy(data[i:], m.XXX_unrecognized) | ||||
| 	} | ||||
| 	return i, nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexStoreEntry) Marshal() (data []byte, err error) { | ||||
| 	size := m.Size() | ||||
| 	data = make([]byte, size) | ||||
| 	n, err := m.MarshalTo(data) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return data[:n], nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexStoreEntry) MarshalTo(data []byte) (n int, err error) { | ||||
| 	var i int | ||||
| 	_ = i | ||||
| 	var l int | ||||
| 	_ = l | ||||
| 	if m.Field == nil { | ||||
| 		return 0, new(github_com_golang_protobuf_proto.RequiredNotSetError) | ||||
| 	} else { | ||||
| 		data[i] = 0x8 | ||||
| 		i++ | ||||
| 		i = encodeVarintUpsidedown(data, i, uint64(*m.Field)) | ||||
| 	} | ||||
| 	if len(m.ArrayPositions) > 0 { | ||||
| 		for _, num := range m.ArrayPositions { | ||||
| 			data[i] = 0x10 | ||||
| 			i++ | ||||
| 			i = encodeVarintUpsidedown(data, i, uint64(num)) | ||||
| 		} | ||||
| 	} | ||||
| 	if m.XXX_unrecognized != nil { | ||||
| 		i += copy(data[i:], m.XXX_unrecognized) | ||||
| 	} | ||||
| 	return i, nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexRowValue) Marshal() (data []byte, err error) { | ||||
| 	size := m.Size() | ||||
| 	data = make([]byte, size) | ||||
| 	n, err := m.MarshalTo(data) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return data[:n], nil | ||||
| } | ||||
|  | ||||
| func (m *BackIndexRowValue) MarshalTo(data []byte) (n int, err error) { | ||||
| 	var i int | ||||
| 	_ = i | ||||
| 	var l int | ||||
| 	_ = l | ||||
| 	if len(m.TermsEntries) > 0 { | ||||
| 		for _, msg := range m.TermsEntries { | ||||
| 			data[i] = 0xa | ||||
| 			i++ | ||||
| 			i = encodeVarintUpsidedown(data, i, uint64(msg.Size())) | ||||
| 			n, err := msg.MarshalTo(data[i:]) | ||||
| 			if err != nil { | ||||
| 				return 0, err | ||||
| 			} | ||||
| 			i += n | ||||
| 		} | ||||
| 	} | ||||
| 	if len(m.StoredEntries) > 0 { | ||||
| 		for _, msg := range m.StoredEntries { | ||||
| 			data[i] = 0x12 | ||||
| 			i++ | ||||
| 			i = encodeVarintUpsidedown(data, i, uint64(msg.Size())) | ||||
| 			n, err := msg.MarshalTo(data[i:]) | ||||
| 			if err != nil { | ||||
| 				return 0, err | ||||
| 			} | ||||
| 			i += n | ||||
| 		} | ||||
| 	} | ||||
| 	if m.XXX_unrecognized != nil { | ||||
| 		i += copy(data[i:], m.XXX_unrecognized) | ||||
| 	} | ||||
| 	return i, nil | ||||
| } | ||||
|  | ||||
| func encodeFixed64Upsidedown(data []byte, offset int, v uint64) int { | ||||
| 	data[offset] = uint8(v) | ||||
| 	data[offset+1] = uint8(v >> 8) | ||||
| 	data[offset+2] = uint8(v >> 16) | ||||
| 	data[offset+3] = uint8(v >> 24) | ||||
| 	data[offset+4] = uint8(v >> 32) | ||||
| 	data[offset+5] = uint8(v >> 40) | ||||
| 	data[offset+6] = uint8(v >> 48) | ||||
| 	data[offset+7] = uint8(v >> 56) | ||||
| 	return offset + 8 | ||||
| } | ||||
| func encodeFixed32Upsidedown(data []byte, offset int, v uint32) int { | ||||
| 	data[offset] = uint8(v) | ||||
| 	data[offset+1] = uint8(v >> 8) | ||||
| 	data[offset+2] = uint8(v >> 16) | ||||
| 	data[offset+3] = uint8(v >> 24) | ||||
| 	return offset + 4 | ||||
| } | ||||
| func encodeVarintUpsidedown(data []byte, offset int, v uint64) int { | ||||
| 	for v >= 1<<7 { | ||||
| 		data[offset] = uint8(v&0x7f | 0x80) | ||||
| 		v >>= 7 | ||||
| 		offset++ | ||||
| 	} | ||||
| 	data[offset] = uint8(v) | ||||
| 	return offset + 1 | ||||
| } | ||||
							
								
								
									
										14
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/upsidedown.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/blevesearch/bleve/v2/index/upsidedown/upsidedown.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| message BackIndexTermsEntry { | ||||
|   required uint32 field = 1; | ||||
| 	repeated string terms = 2; | ||||
| } | ||||
|  | ||||
| message BackIndexStoreEntry { | ||||
| 	required uint32 field = 1; | ||||
| 	repeated uint64 arrayPositions = 2; | ||||
| } | ||||
|  | ||||
| message BackIndexRowValue { | ||||
| 	repeated BackIndexTermsEntry termsEntries = 1; | ||||
| 	repeated BackIndexStoreEntry storedEntries = 2; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 anthonyrawlins
					anthonyrawlins