Class BTreeManager
- java.lang.Object
-
- org.apache.jackrabbit.commons.flat.BTreeManager
-
- All Implemented Interfaces:
TreeManager
public class BTreeManager extends Object implements TreeManager
ThisTreeManager
implementation provides B+-tree like behavior. That is items of a sequence (i.e.NodeSequence
orPropertySequence
) are mapped to a sub-tree in JCR in a way such that only leave nodes carry actual values, the sub-tree is always balanced and ordered. This implementation does in contrast to a full B+-tree implementation not join nodes after deletions. This does not affect the order of items and also leaves the tree balanced wrt. its depths. It might however result in a sparse tree. That is, the tree might get unbalanced wrt. its weights.The nodes in the JCR sub tree are arranged such that any node named
x
only contains child nodes with names greater or equal tox
. The implementation keeps the child nodes in the sub tree ordered if the respective node type supports ordering of child nodes. Ordering is always wrt. to aComparator
on the respective keys. For lexical order this arrangement corresponds to how words are arranged in a multi volume encyclopedia.Example usage:
// Create a new TreeManager instance rooted at node. Splitting of nodes takes place // when the number of children of a node exceeds 40 and is done such that each new // node has at least 40 child nodes. The keys are ordered according to the natural // order of java.lang.String. TreeManager treeManager = new BTreeManager(node, 20, 40, Rank.<String>comparableComparator(), true); // Create a new NodeSequence with that tree manager NodeSequence nodes = ItemSequence.createNodeSequence(treeManager); // Add nodes with key "jcr" and "day" nodes.addNode("jcr", NodeType.NT_UNSTRUCTURED); nodes.addNode("day", NodeType.NT_UNSTRUCTURED); // Iterate over the node in the sequence. // Prints "day jcr " for (Node n : nodes) { System.out.print(n.getName() + " "); } // Retrieve node with key "jcr" Node n = nodes.getItem("jcr"); // Remove node with key "day" nodes.removeNode("day");
-
-
Constructor Summary
Constructors Constructor Description BTreeManager(Node root, int minChildren, int maxChildren, Comparator<String> order, boolean autoSave)
Create a newBTreeManager
rooted at Noderoot
.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected Node
createIntermediateNode(Node parent, String name)
Creates and return an intermediate node for the givenname
as child node ofparent
.boolean
getAutoSave()
Whether to automatically save changes of the current session occurring from adding/removing nodes and properties.Set<String>
getIgnoredProperties()
Properties to ignore.protected SizedIterator<Node>
getNodes(Node node)
Returns aSizedIterator
of the child nodes ofnode
.Comparator<String>
getOrder()
Comparator
used for establishing the order of the keys in the sequence.protected SizedIterator<Property>
getProperties(Node node)
Node
getRoot()
protected <T> SizedIterator<T>
getSizedIterator(Iterator<T> iterator, long size)
boolean
isLeaf(Node node)
Returns!node.hasNodes()
boolean
isRoot(Node node)
Determined whether the givennode
is the root node of the JCR sub-tree.void
join(ItemSequence itemSequence, Node node, Node cause)
This implementation does not actually join any nodes.void
join(ItemSequence itemSequence, Node node, Property cause)
This implementation does not actually join any nodes.protected void
move(Node node, Node parent)
Movenode
to the newparent
.protected void
move(Property property, Node parent)
Moveproperty
to the newparent
.void
split(ItemSequence itemSequence, Node node, Node cause)
This implementations splitsnode
when its number of child nodes exceeds the maximum number specified in the constructor.void
split(ItemSequence itemSequence, Node node, Property cause)
This implementations splitsnode
when its number of properties exceeds the maximum number specified in the constructor.
-
-
-
Constructor Detail
-
BTreeManager
public BTreeManager(Node root, int minChildren, int maxChildren, Comparator<String> order, boolean autoSave) throws RepositoryException
Create a newBTreeManager
rooted at Noderoot
.- Parameters:
root
- the root of the JCR sub-tree where the items of the sequence are stored.minChildren
- minimal number of children for a node after splitting.maxChildren
- maximal number of children for a node after which splitting occurs.order
- order according to which the keys are storedautoSave
- determines whether the current session is saved after add/delete operations.- Throws:
RepositoryException
-
-
Method Detail
-
getIgnoredProperties
public Set<String> getIgnoredProperties()
Properties to ignore. The default set containsJcrConstants.JCR_PRIMARYTYPE
andJcrConstants.JCR_MIXINTYPES
.- Specified by:
getIgnoredProperties
in interfaceTreeManager
- Returns:
-
split
public void split(ItemSequence itemSequence, Node node, Node cause) throws RepositoryException
This implementations splitsnode
when its number of child nodes exceeds the maximum number specified in the constructor. Splitting is done such that after the split each of the new child nodes contains at least as many nodes as specified in the constructor.- Specified by:
split
in interfaceTreeManager
- Parameters:
itemSequence
- theItemSequence
where the new nodecause
has been inserted.node
- the parent node of the newly inserted nodecause
- the newly inserted node ornull
if not known.- Throws:
RepositoryException
- See Also:
TreeManager.split(org.apache.jackrabbit.commons.flat.ItemSequence, javax.jcr.Node, javax.jcr.Node)
-
split
public void split(ItemSequence itemSequence, Node node, Property cause) throws RepositoryException
This implementations splitsnode
when its number of properties exceeds the maximum number specified in the constructor. Splitting is done such that after the split each of the new child nodes contains at least as many nodes as specified in the constructor.- Specified by:
split
in interfaceTreeManager
- Parameters:
itemSequence
- theItemSequence
where the new propertycause
has been inserted.node
- the parent node of the newly inserted propertycause
- the newly inserted property ornull
if not known.- Throws:
RepositoryException
- See Also:
TreeManager.split(org.apache.jackrabbit.commons.flat.ItemSequence, javax.jcr.Node, javax.jcr.Property)
-
join
public void join(ItemSequence itemSequence, Node node, Node cause) throws RepositoryException
This implementation does not actually join any nodes. It does however deletenode
ifgetNodes(Node)
returns an empty iterator. It does further recursively delete any parent ofnode
which does not have any child node.- Specified by:
join
in interfaceTreeManager
- Parameters:
itemSequence
- theItemSequence
where the nodecause
has been deleted from.node
- the parent node from whichcause
has been deleted.cause
- the deleted node ornull
if not known. Note:cause
might be stale.- Throws:
RepositoryException
- See Also:
TreeManager.join(org.apache.jackrabbit.commons.flat.ItemSequence, javax.jcr.Node, javax.jcr.Node)
-
join
public void join(ItemSequence itemSequence, Node node, Property cause) throws RepositoryException
This implementation does not actually join any nodes. It does however deletenode
ifgetProperties(Node)
returns an empty iterator. It does further recursively delete any parent ofnode
which does not have any child node.- Specified by:
join
in interfaceTreeManager
- Parameters:
itemSequence
- theItemSequence
where the propertycause
has been deleted from.node
- the parent node from whichcause
has been deleted.cause
- the deleted property ornull
if not known. Note:cause
might be stale.- Throws:
RepositoryException
- See Also:
TreeManager.join(org.apache.jackrabbit.commons.flat.ItemSequence, javax.jcr.Node, javax.jcr.Property)
-
getRoot
public Node getRoot()
- Specified by:
getRoot
in interfaceTreeManager
- Returns:
- the root node of the JCR sub-tree where the items of the sequence are be mapped to.
-
isRoot
public boolean isRoot(Node node) throws RepositoryException
Description copied from interface:TreeManager
Determined whether the givennode
is the root node of the JCR sub-tree.- Specified by:
isRoot
in interfaceTreeManager
- Parameters:
node
- Node to test for root- Returns:
getRoot().isSame(node)
.- Throws:
RepositoryException
-
isLeaf
public boolean isLeaf(Node node) throws RepositoryException
Returns!node.hasNodes()
- Specified by:
isLeaf
in interfaceTreeManager
- Parameters:
node
- Node to test for leaf- Returns:
true
ifnode
is a leaf node,false
otherwise.- Throws:
RepositoryException
- See Also:
TreeManager.isLeaf(javax.jcr.Node)
-
getOrder
public Comparator<String> getOrder()
Description copied from interface:TreeManager
Comparator
used for establishing the order of the keys in the sequence.- Specified by:
getOrder
in interfaceTreeManager
- Returns:
- a
Comparator<String>
instance
-
getAutoSave
public boolean getAutoSave()
Description copied from interface:TreeManager
Whether to automatically save changes of the current session occurring from adding/removing nodes and properties.- Specified by:
getAutoSave
in interfaceTreeManager
- Returns:
true
if changes should be automatically saved,false
otherwiese.
-
getNodes
protected SizedIterator<Node> getNodes(Node node) throws RepositoryException
Returns aSizedIterator
of the child nodes ofnode
.- Throws:
RepositoryException
-
getProperties
protected SizedIterator<Property> getProperties(Node node) throws RepositoryException
- Throws:
RepositoryException
-
createIntermediateNode
protected Node createIntermediateNode(Node parent, String name) throws RepositoryException
Creates and return an intermediate node for the givenname
as child node ofparent
.- Throws:
RepositoryException
-
move
protected void move(Node node, Node parent) throws RepositoryException
Movenode
to the newparent
.- Throws:
RepositoryException
-
move
protected void move(Property property, Node parent) throws RepositoryException
Moveproperty
to the newparent
.- Throws:
RepositoryException
-
getSizedIterator
protected final <T> SizedIterator<T> getSizedIterator(Iterator<T> iterator, long size)
Wrapsiterator
into aSizedIterator
given asize
. The value of thesize
parameter must correctly reflect the number of items initerator
.
-
-