Class BTree
- java.lang.Object
-
- org.apache.cassandra.utils.btree.BTree
-
public class BTree extends java.lang.Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classBTree.Builder<V>static classBTree.DirRepresents the direction of iteration.static classBTree.FastBuilder<V>A pooled builder for constructing a tree in-order, and without needing any reconciliation.
-
Field Summary
Fields Modifier and Type Field Description static intBRANCH_SHIFTTheBRANCH_FACTORis defined as the maximum number of children of each branch, with between BRANCH_FACTOR/2-1 and BRANCH_FACTOR-1 keys being stored in every node.static intMAX_KEYSstatic intMIN_KEYS
-
Constructor Summary
Constructors Constructor Description BTree()
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static <V,A>
longaccumulate(java.lang.Object[] btree, BiLongAccumulator<A,V> accumulator, A arg, long initialValue)static <V,A>
longaccumulate(java.lang.Object[] btree, BiLongAccumulator<A,V> accumulator, A arg, java.util.Comparator<V> comparator, V from, long initialValue)Walk the btree and accumulate a long value using the supplied accumulator function.static <V> longaccumulate(java.lang.Object[] btree, LongAccumulator<V> accumulator, long initialValue)static <V> longaccumulate(java.lang.Object[] btree, LongAccumulator<V> accumulator, java.util.Comparator<V> comparator, V from, long initialValue)static <V,A>
voidapply(java.lang.Object[] btree, java.util.function.BiConsumer<A,V> function, A argument)Simple method to walk the btree forwards and apply a function till a stop condition is reachedstatic <V> voidapply(java.lang.Object[] btree, java.util.function.Consumer<V> function)Simple method to walk the btree forwards and apply a function till a stop condition is reachedstatic <V,A>
voidapplyLeaf(java.lang.Object[] btree, java.util.function.BiConsumer<A,V> function, A argument)static <C,K extends C,V extends C>
java.lang.Object[]build(java.util.Collection<K> source)Deprecated.static <C,K extends C,V extends C>
java.lang.Object[]build(java.util.Collection<K> source, UpdateFunction<K,V> updateF)Deprecated.static <C,I extends C,O extends C>
java.lang.Object[]build(BulkIterator<I> source, int size, UpdateFunction<I,O> updateF)static <V> BTree.Builder<V>builder(java.util.Comparator<? super V> comparator)static <V> BTree.Builder<V>builder(java.util.Comparator<? super V> comparator, int initialCapacity)static <V> Vceil(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static <V> intceilIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static intdepth(java.lang.Object[] tree)static java.lang.Object[]empty()Returns an empty BTreestatic booleanequals(java.lang.Object[] a, java.lang.Object[] b)static <V> BTree.FastBuilder<V>fastBuilder()Build a tree of unknown size, in order.static <V> Vfind(java.lang.Object[] node, java.util.Comparator<? super V> comparator, V find)static <V> VfindByIndex(java.lang.Object[] tree, int index)static <V> intfindIndex(java.lang.Object[] node, java.util.Comparator<? super V> comparator, V find)Honours result semantics ofArrays.binarySearch(long[], long), as though it were performed on the tree flattened into an arraystatic <V> Vfloor(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static <V> intfloorIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static inthashCode(java.lang.Object[] btree)static intheight(java.lang.Object[] tree)static <V> Vhigher(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static <V> inthigherIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static booleanisEmpty(java.lang.Object[] tree)static booleanisLeaf(java.lang.Object[] node)Checks is the node is a leaf.static booleanisWellFormed(java.lang.Object[] btree, java.util.Comparator<?> cmp)static <V> java.lang.Iterable<V>iterable(java.lang.Object[] btree)static <V> java.lang.Iterable<V>iterable(java.lang.Object[] btree, int lb, int ub, BTree.Dir dir)static <V> java.lang.Iterable<V>iterable(java.lang.Object[] btree, BTree.Dir dir)static <V> java.util.Iterator<V>iterator(java.lang.Object[] btree)static <V> java.util.Iterator<V>iterator(java.lang.Object[] btree, int lb, int ub, BTree.Dir dir)static <V> java.util.Iterator<V>iterator(java.lang.Object[] btree, BTree.Dir dir)static <V> Vlower(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static <V> intlowerIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)static <V> voidreplaceInSitu(java.lang.Object[] tree, int index, V replace)Modifies the provided btree directly.static <V> voidreplaceInSitu(java.lang.Object[] node, java.util.Comparator<? super V> comparator, V find, V replace)Modifies the provided btree directly.static voidreverseInSitu(java.lang.Object[] tree)static java.lang.Object[]singleton(java.lang.Object value)Create a BTree containing only the specified objectstatic intsize(java.lang.Object[] tree)static longsizeOfStructureOnHeap(java.lang.Object[] tree)static longsizeOnHeapOf(java.lang.Object[] tree)static <K,V extends K>
BTreeSearchIterator<K,V>slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, int startIndex, int endIndex, BTree.Dir dir)static <K,V extends K>
BTreeSearchIterator<K,V>slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, K start, boolean startInclusive, K end, boolean endInclusive, BTree.Dir dir)static <K,V extends K>
BTreeSearchIterator<K,V>slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, K start, K end, BTree.Dir dir)static <K,V>
BTreeSearchIterator<K,V>slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, BTree.Dir dir)Returns an Iterator over the entire treestatic inttoArray(java.lang.Object[] tree, int treeStart, int treeEnd, java.lang.Object[] target, int targetOffset)static inttoArray(java.lang.Object[] tree, java.lang.Object[] target, int targetOffset)Fill the target array with the contents of the provided subtree, in ascending order, starting at targetOffsetstatic java.lang.StringtoString(java.lang.Object[] btree)static <I,O>
java.lang.Object[]transform(java.lang.Object[] tree, java.util.function.Function<? super I,? extends O> function)Takes a tree and transforms it using the provided function.static <I,I2,O>
java.lang.Object[]transformAndFilter(java.lang.Object[] tree, java.util.function.BiFunction<? super I,? super I2,? extends O> apply, I2 param)Takes a tree and transforms it using the provided function, filtering out any null results.static <I,O>
java.lang.Object[]transformAndFilter(java.lang.Object[] tree, java.util.function.Function<? super I,? extends O> apply)Takes a tree and transforms it using the provided function, filtering out any null results.static inttreeIndexOfBranchKey(java.lang.Object[] root, int keyIndex)static inttreeIndexOffsetOfChild(java.lang.Object[] root, int childIndex)static inttreeIndexOfKey(java.lang.Object[] root, int keyIndex)tree index => index of key wrt all items in the tree laid out seriallystatic inttreeIndexOfLeafKey(int keyIndex)static <Compare> java.lang.Object[]update(java.lang.Object[] toUpdate, java.lang.Object[] insert, java.util.Comparator<? super Compare> comparator)static <Compare,Existing extends Compare,Insert extends Compare>
java.lang.Object[]update(java.lang.Object[] toUpdate, java.lang.Object[] insert, java.util.Comparator<? super Compare> comparator, UpdateFunction<Insert,Existing> updateF)Insertsinsertintoupdate, applyingupdateFto each new item ininsert, as well as any matched items inupdate.static <Compare,Existing extends Compare,Insert extends Compare>
java.lang.Object[]updateLeaves(java.lang.Object[] unode, java.lang.Object[] inode, java.util.Comparator<? super Compare> comparator, UpdateFunction<Insert,Existing> updateF)A fast tight-loop variant of updating one btree with another, when both are leaves.
-
-
-
Field Detail
-
BRANCH_SHIFT
public static final int BRANCH_SHIFT
TheBRANCH_FACTORis defined as the maximum number of children of each branch, with between BRANCH_FACTOR/2-1 and BRANCH_FACTOR-1 keys being stored in every node. This yields a minimum tree size of(BRANCH_FACTOR/2)^height - 1and a maximum tree size ofBRANCH_FACTOR^height - 1.Branches differ from leaves only in that they contain a suffix region containing the child nodes that occur either side of the keys, and a sizeMap in the last position, permitting seeking by index within the tree. Nodes are disambiguated by the length of the array that represents them: an even number is a branch, odd a leaf.
Leaf Nodes are represented by an odd-length array of keys, with the final element possibly null, i.e. Object[V1, V2, ...,null?]
Branch nodes: Object[V1, V2, ..., child[<V1.key], child[<V2.key], ..., child[< Inf], sizeMap] Each child is either a branch or leaf, i.e., always an Object[]. The key elements in a branch node occupy the first half of the array (minus one)
BTrees are immutable; updating one returns a new tree that reuses unmodified nodes.
There are no references back to a parent node from its children (this would make it impossible to re-use subtrees when modifying the tree, since the modified tree would need new parent references). Instead, we store these references in a Path as needed when navigating the tree.
-
MIN_KEYS
public static final int MIN_KEYS
-
MAX_KEYS
public static final int MAX_KEYS
-
-
Method Detail
-
empty
public static java.lang.Object[] empty()
Returns an empty BTree- Returns:
- an empty BTree
-
singleton
public static java.lang.Object[] singleton(java.lang.Object value)
Create a BTree containing only the specified object- Returns:
- an new BTree containing only the specified object
-
build
@Deprecated public static <C,K extends C,V extends C> java.lang.Object[] build(java.util.Collection<K> source)
Deprecated.
-
build
@Deprecated public static <C,K extends C,V extends C> java.lang.Object[] build(java.util.Collection<K> source, UpdateFunction<K,V> updateF)Deprecated.
-
build
public static <C,I extends C,O extends C> java.lang.Object[] build(BulkIterator<I> source, int size, UpdateFunction<I,O> updateF)
-
update
public static <Compare> java.lang.Object[] update(java.lang.Object[] toUpdate, java.lang.Object[] insert, java.util.Comparator<? super Compare> comparator)
-
update
public static <Compare,Existing extends Compare,Insert extends Compare> java.lang.Object[] update(java.lang.Object[] toUpdate, java.lang.Object[] insert, java.util.Comparator<? super Compare> comparator, UpdateFunction<Insert,Existing> updateF)Insertsinsertintoupdate, applyingupdateFto each new item ininsert, as well as any matched items inupdate.Note that
UpdateFunction.noOpis assumed to indicate a lack of interest in which value survives.
-
updateLeaves
public static <Compare,Existing extends Compare,Insert extends Compare> java.lang.Object[] updateLeaves(java.lang.Object[] unode, java.lang.Object[] inode, java.util.Comparator<? super Compare> comparator, UpdateFunction<Insert,Existing> updateF)A fast tight-loop variant of updating one btree with another, when both are leaves.
-
reverseInSitu
public static void reverseInSitu(java.lang.Object[] tree)
-
iterator
public static <V> java.util.Iterator<V> iterator(java.lang.Object[] btree)
-
iterator
public static <V> java.util.Iterator<V> iterator(java.lang.Object[] btree, BTree.Dir dir)
-
iterator
public static <V> java.util.Iterator<V> iterator(java.lang.Object[] btree, int lb, int ub, BTree.Dir dir)
-
iterable
public static <V> java.lang.Iterable<V> iterable(java.lang.Object[] btree)
-
iterable
public static <V> java.lang.Iterable<V> iterable(java.lang.Object[] btree, BTree.Dir dir)
-
iterable
public static <V> java.lang.Iterable<V> iterable(java.lang.Object[] btree, int lb, int ub, BTree.Dir dir)
-
slice
public static <K,V> BTreeSearchIterator<K,V> slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, BTree.Dir dir)
Returns an Iterator over the entire tree- Type Parameters:
V-- Parameters:
btree- the tree to iterate overdir- direction of iteration- Returns:
-
slice
public static <K,V extends K> BTreeSearchIterator<K,V> slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, K start, K end, BTree.Dir dir)
- Parameters:
btree- the tree to iterate overcomparator- the comparator that defines the ordering over the items in the treestart- the beginning of the range to return, inclusive (in ascending order)end- the end of the range to return, exclusive (in ascending order)dir- if false, the iterator will start at the last item and move backwards- Returns:
- an Iterator over the defined sub-range of the tree
-
slice
public static <K,V extends K> BTreeSearchIterator<K,V> slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, int startIndex, int endIndex, BTree.Dir dir)
- Parameters:
btree- the tree to iterate overcomparator- the comparator that defines the ordering over the items in the treestartIndex- the start index of the range to return, inclusiveendIndex- the end index of the range to return, inclusivedir- if false, the iterator will start at the last item and move backwards- Returns:
- an Iterator over the defined sub-range of the tree
-
slice
public static <K,V extends K> BTreeSearchIterator<K,V> slice(java.lang.Object[] btree, java.util.Comparator<? super K> comparator, K start, boolean startInclusive, K end, boolean endInclusive, BTree.Dir dir)
- Parameters:
btree- the tree to iterate overcomparator- the comparator that defines the ordering over the items in the treestart- low bound of the rangestartInclusive- inclusivity of lower boundend- high bound of the rangeendInclusive- inclusivity of higher bounddir- direction of iteration- Returns:
- an Iterator over the defined sub-range of the tree
-
find
public static <V> V find(java.lang.Object[] node, java.util.Comparator<? super V> comparator, V find)- Returns:
- the item in the tree that sorts as equal to the search argument, or null if no such item
-
replaceInSitu
public static <V> void replaceInSitu(java.lang.Object[] tree, int index, V replace)Modifies the provided btree directly. THIS SHOULD NOT BE USED WITHOUT EXTREME CARE as BTrees are meant to be immutable. Finds and replaces the item provided by index in the tree.
-
replaceInSitu
public static <V> void replaceInSitu(java.lang.Object[] node, java.util.Comparator<? super V> comparator, V find, V replace)Modifies the provided btree directly. THIS SHOULD NOT BE USED WITHOUT EXTREME CARE as BTrees are meant to be immutable. Finds and replaces the provided item in the tree. Both should sort as equal to each other (although this is not enforced)
-
findIndex
public static <V> int findIndex(java.lang.Object[] node, java.util.Comparator<? super V> comparator, V find)Honours result semantics ofArrays.binarySearch(long[], long), as though it were performed on the tree flattened into an array- Returns:
- index of item in tree, or (-(insertion point) - 1) if not present
-
findByIndex
public static <V> V findByIndex(java.lang.Object[] tree, int index)- Returns:
- the value at the index'th position in the tree, in tree order
-
lowerIndex
public static <V> int lowerIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
lower
public static <V> V lower(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
floorIndex
public static <V> int floorIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
floor
public static <V> V floor(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
higherIndex
public static <V> int higherIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
higher
public static <V> V higher(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
ceilIndex
public static <V> int ceilIndex(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
ceil
public static <V> V ceil(java.lang.Object[] btree, java.util.Comparator<? super V> comparator, V find)
-
size
public static int size(java.lang.Object[] tree)
-
sizeOfStructureOnHeap
public static long sizeOfStructureOnHeap(java.lang.Object[] tree)
-
isLeaf
public static boolean isLeaf(java.lang.Object[] node)
Checks is the node is a leaf.- Returns:
trueif the provided node is a leaf,falseif it is a branch.
-
isEmpty
public static boolean isEmpty(java.lang.Object[] tree)
-
depth
public static int depth(java.lang.Object[] tree)
-
toArray
public static int toArray(java.lang.Object[] tree, java.lang.Object[] target, int targetOffset)Fill the target array with the contents of the provided subtree, in ascending order, starting at targetOffset- Parameters:
tree- sourcetarget- arraytargetOffset- offset in target array- Returns:
- number of items copied (size of tree)
-
toArray
public static int toArray(java.lang.Object[] tree, int treeStart, int treeEnd, java.lang.Object[] target, int targetOffset)
-
transformAndFilter
public static <I,I2,O> java.lang.Object[] transformAndFilter(java.lang.Object[] tree, java.util.function.BiFunction<? super I,? super I2,? extends O> apply, I2 param)Takes a tree and transforms it using the provided function, filtering out any null results. The result of any transformation must sort identically as their originals, wrt other results.If no modifications are made, the original is returned. NOTE: codewise *identical* to
transformAndFilter(Object[], Function)
-
transformAndFilter
public static <I,O> java.lang.Object[] transformAndFilter(java.lang.Object[] tree, java.util.function.Function<? super I,? extends O> apply)Takes a tree and transforms it using the provided function, filtering out any null results. The result of any transformation must sort identically as their originals, wrt other results.If no modifications are made, the original is returned.
An efficient transformAndFilter implementation suitable for a tree consisting of a single leaf root NOTE: codewise *identical* to
transformAndFilter(Object[], BiFunction, Object)
-
transform
public static <I,O> java.lang.Object[] transform(java.lang.Object[] tree, java.util.function.Function<? super I,? extends O> function)Takes a tree and transforms it using the provided function. The result of any transformation must sort identically as their originals, wrt other results.If no modifications are made, the original is returned.
-
equals
public static boolean equals(java.lang.Object[] a, java.lang.Object[] b)
-
hashCode
public static int hashCode(java.lang.Object[] btree)
-
toString
public static java.lang.String toString(java.lang.Object[] btree)
-
treeIndexOfKey
public static int treeIndexOfKey(java.lang.Object[] root, int keyIndex)tree index => index of key wrt all items in the tree laid out seriallyThis version of the method permits requesting out-of-bounds indexes, -1 and size
- Parameters:
root- to calculate tree index withinkeyIndex- root-local index of key to calculate tree-index- Returns:
- the number of items preceding the key in the whole tree of root
-
treeIndexOfLeafKey
public static int treeIndexOfLeafKey(int keyIndex)
- Parameters:
keyIndex- node-local index of the key to calculate index of- Returns:
- keyIndex; this method is here only for symmetry and clarity
-
treeIndexOfBranchKey
public static int treeIndexOfBranchKey(java.lang.Object[] root, int keyIndex)- Parameters:
root- to calculate tree-index withinkeyIndex- root-local index of key to calculate tree-index of- Returns:
- the number of items preceding the key in the whole tree of root
-
treeIndexOffsetOfChild
public static int treeIndexOffsetOfChild(java.lang.Object[] root, int childIndex)- Parameters:
root- to calculate tree-index withinchildIndex- root-local index of *child* to calculate tree-index of- Returns:
- the number of items preceding the child in the whole tree of root
-
builder
public static <V> BTree.Builder<V> builder(java.util.Comparator<? super V> comparator)
-
builder
public static <V> BTree.Builder<V> builder(java.util.Comparator<? super V> comparator, int initialCapacity)
-
applyLeaf
public static <V,A> void applyLeaf(java.lang.Object[] btree, java.util.function.BiConsumer<A,V> function, A argument)
-
apply
public static <V,A> void apply(java.lang.Object[] btree, java.util.function.BiConsumer<A,V> function, A argument)Simple method to walk the btree forwards and apply a function till a stop condition is reachedPrivate method
- Parameters:
btree-function-
-
apply
public static <V> void apply(java.lang.Object[] btree, java.util.function.Consumer<V> function)Simple method to walk the btree forwards and apply a function till a stop condition is reachedPrivate method
- Parameters:
btree-function-
-
accumulate
public static <V,A> long accumulate(java.lang.Object[] btree, BiLongAccumulator<A,V> accumulator, A arg, java.util.Comparator<V> comparator, V from, long initialValue)Walk the btree and accumulate a long value using the supplied accumulator function. Iteration will stop if the accumulator function returns the sentinel values Long.MIN_VALUE or Long.MAX_VALUEIf the optional from argument is not null, iteration will start from that value (or the one after it's insertion point if an exact match isn't found)
-
accumulate
public static <V> long accumulate(java.lang.Object[] btree, LongAccumulator<V> accumulator, java.util.Comparator<V> comparator, V from, long initialValue)
-
accumulate
public static <V> long accumulate(java.lang.Object[] btree, LongAccumulator<V> accumulator, long initialValue)
-
accumulate
public static <V,A> long accumulate(java.lang.Object[] btree, BiLongAccumulator<A,V> accumulator, A arg, long initialValue)
-
height
public static int height(java.lang.Object[] tree)
- Returns:
- the actual height of
tree
-
sizeOnHeapOf
public static long sizeOnHeapOf(java.lang.Object[] tree)
-
isWellFormed
public static boolean isWellFormed(java.lang.Object[] btree, java.util.Comparator<?> cmp)
-
fastBuilder
public static <V> BTree.FastBuilder<V> fastBuilder()
Build a tree of unknown size, in order.Can be used with
reverseInSitu(java.lang.Object[])to build a tree in reverse.
-
-