github.com/pingcap/badger@v1.5.1-0.20230103063557-828f39b09b6d/surf/surf.go (about)

     1  package surf
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  )
     7  
     8  type SuRF struct {
     9  	ld loudsDense
    10  	ls loudsSparse
    11  }
    12  
    13  // Get returns the values mapped by the key, may return value for keys doesn't in SuRF.
    14  func (s *SuRF) Get(key []byte) ([]byte, bool) {
    15  	cont, depth, value, ok := s.ld.Get(key)
    16  	if !ok || cont < 0 {
    17  		return value, ok
    18  	}
    19  	return s.ls.Get(key, depth, uint32(cont))
    20  }
    21  
    22  // HasOverlap returns does SuRF overlap with [start, end].
    23  func (s *SuRF) HasOverlap(start, end []byte, includeEnd bool) bool {
    24  	if s.ld.height == 0 && s.ls.height == 0 {
    25  		return false
    26  	}
    27  	it := s.NewIterator()
    28  	it.Seek(start)
    29  	if !it.Valid() {
    30  		return false
    31  	}
    32  
    33  	cmp := it.compare(end)
    34  	if cmp == couldBePositive {
    35  		cmp = -1
    36  	}
    37  	if includeEnd {
    38  		return cmp <= 0
    39  	}
    40  	return cmp < 0
    41  }
    42  
    43  // MarshalSize returns the size of SuRF after serialization.
    44  func (s *SuRF) MarshalSize() int64 {
    45  	return s.ld.MarshalSize() + s.ls.MarshalSize() + s.ld.values.MarshalSize() + s.ls.values.MarshalSize()
    46  }
    47  
    48  // Marshal returns the serialized SuRF.
    49  func (s *SuRF) Marshal() []byte {
    50  	w := bytes.NewBuffer(make([]byte, 0, s.MarshalSize()))
    51  	_ = s.WriteTo(w)
    52  	return w.Bytes()
    53  }
    54  
    55  // WriteTo serialize SuRF to writer.
    56  func (s *SuRF) WriteTo(w io.Writer) error {
    57  	if err := s.ld.WriteTo(w); err != nil {
    58  		return err
    59  	}
    60  	if err := s.ls.WriteTo(w); err != nil {
    61  		return err
    62  	}
    63  	if err := s.ld.values.WriteTo(w); err != nil {
    64  		return err
    65  	}
    66  	if err := s.ls.values.WriteTo(w); err != nil {
    67  		return err
    68  	}
    69  	return nil
    70  }
    71  
    72  // Unmarshal deserialize SuRF from bytes.
    73  func (s *SuRF) Unmarshal(b []byte) {
    74  	b = s.ld.Unmarshal(b)
    75  	b = s.ls.Unmarshal(b)
    76  	b = s.ld.values.Unmarshal(b)
    77  	s.ls.values.Unmarshal(b)
    78  }
    79  
    80  // Iterator is iterator of SuRF.
    81  type Iterator struct {
    82  	denseIter  denseIter
    83  	sparseIter sparseIter
    84  	keyBuf     []byte
    85  }
    86  
    87  // NewIterator returns a new SuRF iterator.
    88  func (s *SuRF) NewIterator() *Iterator {
    89  	iter := new(Iterator)
    90  	iter.denseIter.Init(&s.ld)
    91  	iter.sparseIter.Init(&s.ls)
    92  	return iter
    93  }
    94  
    95  // Valid returns the valid status of iterator.
    96  func (it *Iterator) Valid() bool {
    97  	if it.denseIter.ld.height == 0 {
    98  		return it.sparseIter.valid
    99  	}
   100  	return it.denseIter.valid && (it.denseIter.IsComplete() || it.sparseIter.valid)
   101  }
   102  
   103  // Next move the iterator to next key.
   104  func (it *Iterator) Next() {
   105  	if it.incrSparseIter() {
   106  		return
   107  	}
   108  	it.incrDenseIter()
   109  }
   110  
   111  // Prev move the iterator to previous key.
   112  func (it *Iterator) Prev() {
   113  	if it.decrSparseIter() {
   114  		return
   115  	}
   116  	it.decrDenseIter()
   117  }
   118  
   119  // Seek move the iterator to the first greater or equals to key.
   120  func (it *Iterator) Seek(key []byte) bool {
   121  	var fp bool
   122  	it.Reset()
   123  
   124  	if it.sparseIter.ls.height == 0 && it.denseIter.ld.height == 0 {
   125  		return false
   126  	}
   127  
   128  	fp = it.denseIter.Seek(key)
   129  	if !it.denseIter.valid || it.denseIter.IsComplete() {
   130  		return fp
   131  	}
   132  
   133  	if !it.denseIter.searchComp {
   134  		it.passToSparse()
   135  		fp = it.sparseIter.Seek(key)
   136  		if !it.sparseIter.valid {
   137  			it.incrDenseIter()
   138  		}
   139  		return fp
   140  	} else if !it.denseIter.leftComp {
   141  		it.passToSparse()
   142  		it.sparseIter.MoveToLeftMostKey()
   143  		return fp
   144  	}
   145  
   146  	panic("invalid state")
   147  }
   148  
   149  // SeekToFirst move the iterator to the first key in SuRF.
   150  func (it *Iterator) SeekToFirst() {
   151  	it.Reset()
   152  	if it.denseIter.ld.height > 0 {
   153  		it.denseIter.SetToFirstInRoot()
   154  		it.denseIter.MoveToLeftMostKey()
   155  		if it.denseIter.leftComp {
   156  			return
   157  		}
   158  		it.passToSparse()
   159  		it.sparseIter.MoveToLeftMostKey()
   160  	} else if it.sparseIter.ls.height > 0 {
   161  		it.sparseIter.SetToFirstInRoot()
   162  		it.sparseIter.MoveToLeftMostKey()
   163  	}
   164  }
   165  
   166  // SeekToLast move the iterator to the last key in SuRF.
   167  func (it *Iterator) SeekToLast() {
   168  	it.Reset()
   169  	if it.denseIter.ld.height > 0 {
   170  		it.denseIter.SetToLastInRoot()
   171  		it.denseIter.MoveToRightMostKey()
   172  		if it.denseIter.rightComp {
   173  			return
   174  		}
   175  		it.passToSparse()
   176  		it.sparseIter.MoveToRightMostKey()
   177  	} else if it.sparseIter.ls.height > 0 {
   178  		it.sparseIter.SetToLastInRoot()
   179  		it.sparseIter.MoveToRightMostKey()
   180  	}
   181  }
   182  
   183  // Key returns the key where the iterator at.
   184  func (it *Iterator) Key() []byte {
   185  	if it.denseIter.IsComplete() {
   186  		return it.denseIter.Key()
   187  	}
   188  	it.keyBuf = append(it.keyBuf[:0], it.denseIter.Key()...)
   189  	return append(it.keyBuf, it.sparseIter.Key()...)
   190  }
   191  
   192  // Value returns the value where the iterator at.
   193  func (it *Iterator) Value() []byte {
   194  	if it.denseIter.IsComplete() {
   195  		return it.denseIter.Value()
   196  	}
   197  	return it.sparseIter.Value()
   198  }
   199  
   200  // Reset rest iterator's states and buffers.
   201  func (it *Iterator) Reset() {
   202  	it.denseIter.Reset()
   203  	it.sparseIter.Reset()
   204  }
   205  
   206  func (it *Iterator) passToSparse() {
   207  	it.sparseIter.startNodeID = it.denseIter.sendOutNodeID
   208  	it.sparseIter.startDepth = it.denseIter.sendOutDepth
   209  }
   210  
   211  func (it *Iterator) incrDenseIter() bool {
   212  	if !it.denseIter.valid {
   213  		return false
   214  	}
   215  
   216  	it.denseIter.Next()
   217  	if !it.denseIter.valid {
   218  		return false
   219  	}
   220  	if it.denseIter.leftComp {
   221  		return true
   222  	}
   223  
   224  	it.passToSparse()
   225  	it.sparseIter.MoveToLeftMostKey()
   226  	return true
   227  }
   228  
   229  func (it *Iterator) incrSparseIter() bool {
   230  	if !it.sparseIter.valid {
   231  		return false
   232  	}
   233  	it.sparseIter.Next()
   234  	return it.sparseIter.valid
   235  }
   236  
   237  func (it *Iterator) decrDenseIter() bool {
   238  	if !it.denseIter.valid {
   239  		return false
   240  	}
   241  
   242  	it.denseIter.Prev()
   243  	if !it.denseIter.valid {
   244  		return false
   245  	}
   246  	if it.denseIter.rightComp {
   247  		return true
   248  	}
   249  
   250  	it.passToSparse()
   251  	it.sparseIter.MoveToRightMostKey()
   252  	return true
   253  }
   254  
   255  func (it *Iterator) decrSparseIter() bool {
   256  	if !it.sparseIter.valid {
   257  		return false
   258  	}
   259  	it.sparseIter.Prev()
   260  	return it.sparseIter.valid
   261  }
   262  
   263  func (it *Iterator) compare(key []byte) int {
   264  	cmp := it.denseIter.Compare(key)
   265  	if it.denseIter.IsComplete() || cmp != 0 {
   266  		return cmp
   267  	}
   268  	return it.sparseIter.Compare(key)
   269  }