github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/binary_search_tree_multi.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package lsmkv 13 14 import ( 15 "bytes" 16 17 "github.com/weaviate/weaviate/adapters/repos/db/lsmkv/rbtree" 18 "github.com/weaviate/weaviate/entities/lsmkv" 19 ) 20 21 type binarySearchTreeMulti struct { 22 root *binarySearchNodeMulti 23 } 24 25 type value struct { 26 value []byte 27 tombstone bool 28 } 29 30 func (t *binarySearchTreeMulti) insert(key []byte, values []value) { 31 if t.root == nil { 32 t.root = &binarySearchNodeMulti{ 33 key: key, 34 values: values, 35 colourIsRed: false, // root node is always black 36 } 37 return 38 } 39 40 if newRoot := t.root.insert(key, values); newRoot != nil { 41 t.root = newRoot 42 } 43 t.root.colourIsRed = false // Can be flipped in the process of balancing, but root is always black 44 } 45 46 func (t *binarySearchTreeMulti) get(key []byte) ([]value, error) { 47 if t.root == nil { 48 return nil, lsmkv.NotFound 49 } 50 51 return t.root.get(key) 52 } 53 54 // // set Tombstone for the entire entry, i.e. all values for this key 55 // func (t *binarySearchTreeMulti) setTombstone(key []byte) { 56 // if t.root == nil { 57 // // we need to actively insert a node with a tombstone, even if this node is 58 // // not present because we still need to propagate the delete into the disk 59 // // segments. It could refer to an entity which was created in a previous 60 // // segment and is thus unknown to this memtable 61 // t.root = &binarySearchNodeMulti{ 62 // key: key, 63 // value: nil, 64 // tombstone: true, 65 // } 66 // } 67 68 // t.root.setTombstone(key) 69 // } 70 71 func (t *binarySearchTreeMulti) flattenInOrder() []*binarySearchNodeMulti { 72 if t.root == nil { 73 return nil 74 } 75 76 return t.root.flattenInOrder() 77 } 78 79 type binarySearchNodeMulti struct { 80 key []byte 81 values []value 82 left *binarySearchNodeMulti 83 right *binarySearchNodeMulti 84 parent *binarySearchNodeMulti 85 colourIsRed bool 86 } 87 88 func (n *binarySearchNodeMulti) Parent() rbtree.Node { 89 if n == nil { 90 return nil 91 } 92 return n.parent 93 } 94 95 func (n *binarySearchNodeMulti) SetParent(parent rbtree.Node) { 96 if n == nil { 97 addNewSearchNodeMultiReceiver(&n) 98 } 99 100 if parent == nil { 101 n.parent = nil 102 return 103 } 104 105 n.parent = parent.(*binarySearchNodeMulti) 106 } 107 108 func (n *binarySearchNodeMulti) Left() rbtree.Node { 109 if n == nil { 110 return nil 111 } 112 return n.left 113 } 114 115 func (n *binarySearchNodeMulti) SetLeft(left rbtree.Node) { 116 if n == nil { 117 addNewSearchNodeMultiReceiver(&n) 118 } 119 120 if left == nil { 121 n.left = nil 122 return 123 } 124 125 n.left = left.(*binarySearchNodeMulti) 126 } 127 128 func (n *binarySearchNodeMulti) Right() rbtree.Node { 129 if n == nil { 130 return nil 131 } 132 return n.right 133 } 134 135 func (n *binarySearchNodeMulti) SetRight(right rbtree.Node) { 136 if n == nil { 137 addNewSearchNodeMultiReceiver(&n) 138 } 139 140 if right == nil { 141 n.right = nil 142 return 143 } 144 145 n.right = right.(*binarySearchNodeMulti) 146 } 147 148 func (n *binarySearchNodeMulti) IsRed() bool { 149 if n == nil { 150 return false 151 } 152 return n.colourIsRed 153 } 154 155 func (n *binarySearchNodeMulti) SetRed(isRed bool) { 156 n.colourIsRed = isRed 157 } 158 159 func (n *binarySearchNodeMulti) IsNil() bool { 160 return n == nil 161 } 162 163 func addNewSearchNodeMultiReceiver(nodePtr **binarySearchNodeMulti) { 164 *nodePtr = &binarySearchNodeMulti{} 165 } 166 167 func (n *binarySearchNodeMulti) insert(key []byte, values []value) *binarySearchNodeMulti { 168 if bytes.Equal(key, n.key) { 169 n.values = append(n.values, values...) 170 return nil 171 } 172 173 if bytes.Compare(key, n.key) < 0 { 174 if n.left != nil { 175 return n.left.insert(key, values) 176 } else { 177 n.left = &binarySearchNodeMulti{ 178 key: key, 179 values: values, 180 parent: n, 181 colourIsRed: true, 182 } 183 return binarySearchNodeMultiFromRB(rbtree.Rebalance(n.left)) 184 } 185 } else { 186 if n.right != nil { 187 return n.right.insert(key, values) 188 } else { 189 n.right = &binarySearchNodeMulti{ 190 key: key, 191 values: values, 192 parent: n, 193 colourIsRed: true, 194 } 195 return binarySearchNodeMultiFromRB(rbtree.Rebalance(n.right)) 196 } 197 } 198 } 199 200 func (n *binarySearchNodeMulti) get(key []byte) ([]value, error) { 201 if bytes.Equal(n.key, key) { 202 return n.values, nil 203 } 204 205 if bytes.Compare(key, n.key) < 0 { 206 if n.left == nil { 207 return nil, lsmkv.NotFound 208 } 209 210 return n.left.get(key) 211 } else { 212 if n.right == nil { 213 return nil, lsmkv.NotFound 214 } 215 216 return n.right.get(key) 217 } 218 } 219 220 func binarySearchNodeMultiFromRB(rbNode rbtree.Node) (bsNode *binarySearchNodeMulti) { 221 if rbNode == nil { 222 bsNode = nil 223 return 224 } 225 bsNode = rbNode.(*binarySearchNodeMulti) 226 return 227 } 228 229 // func (n *binarySearchNodeMulti) setTombstone(key []byte) { 230 // if bytes.Equal(n.key, key) { 231 // n.value = nil 232 // n.tombstone = true 233 // } 234 235 // if bytes.Compare(key, n.key) < 0 { 236 // if n.left == nil { 237 // n.left = &binarySearchNodeMulti{ 238 // key: key, 239 // value: nil, 240 // tombstone: true, 241 // } 242 // return 243 // } 244 245 // n.left.setTombstone(key) 246 // return 247 // } else { 248 // if n.right == nil { 249 // n.right = &binarySearchNodeMulti{ 250 // key: key, 251 // value: nil, 252 // tombstone: true, 253 // } 254 // return 255 // } 256 257 // n.right.setTombstone(key) 258 // return 259 // } 260 // } 261 262 func (n *binarySearchNodeMulti) flattenInOrder() []*binarySearchNodeMulti { 263 var left []*binarySearchNodeMulti 264 var right []*binarySearchNodeMulti 265 266 if n.left != nil { 267 left = n.left.flattenInOrder() 268 } 269 270 if n.right != nil { 271 right = n.right.flattenInOrder() 272 } 273 274 right = append([]*binarySearchNodeMulti{n}, right...) 275 return append(left, right...) 276 }