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  }