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 }