use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class TreeModel method getChild.
@Override
public Object getChild(final Object pParent, final int pIndex) {
final Node parentNode = (Node) pParent;
final long parentNodeKey = parentNode.getNodeKey();
mRtx.moveTo(parentNodeKey);
switch(parentNode.getKind()) {
case DOCUMENT:
assert pIndex == 0;
mRtx.moveToFirstChild();
return mRtx.getNode();
case ELEMENT:
// Namespaces.
final int namespCount = mRtx.getNamespaceCount();
if (pIndex < namespCount) {
if (!mRtx.moveToNamespace(pIndex).hasMoved()) {
throw new IllegalStateException("No namespace with index " + pIndex + " found!");
}
return mRtx.getNode();
}
// Attributes.
final int attCount = mRtx.getAttributeCount();
if (pIndex < (namespCount + attCount)) {
if (!mRtx.moveToAttribute(pIndex - namespCount).hasMoved()) {
throw new IllegalStateException("No attribute with index " + pIndex + " found!");
}
return mRtx.getNode();
}
// Children.
final long childCount = mRtx.getChildCount();
if (pIndex < (namespCount + attCount + childCount)) {
if (!mRtx.moveToFirstChild().hasMoved()) {
throw new IllegalStateException("No node with index " + pIndex + " found!");
}
final long upper = pIndex - namespCount - attCount;
for (long i = 0; i < upper; i++) {
if (!mRtx.moveToRightSibling().hasMoved()) {
throw new IllegalStateException("No node with index " + pIndex + " found!");
}
}
return mRtx.getNode();
} else {
throw new IllegalStateException("May not happen: node with " + pIndex + " not found!");
}
default:
return null;
}
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class TreeView method refreshUpdate.
@Override
public void refreshUpdate(final Optional<VisualItemAxis> pAxis) {
// Use our sirix model and renderer.
dispose();
final ReadDB db = mGUI.getReadDB();
mTree.setModel(new TreeModel(db));
mTree.setCellRenderer(new TreeCellRenderer(db));
if (mTree.getTreeSelectionListeners().length == 0) {
// Listen for when the selection changes.
mTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(final TreeSelectionEvent paramE) {
if (paramE.getNewLeadSelectionPath() != null && paramE.getNewLeadSelectionPath() != paramE.getOldLeadSelectionPath()) {
/*
* Returns the last path element of the selection. This method is
* useful only when the selection model allows a single selection.
*/
final Node node = (Node) paramE.getNewLeadSelectionPath().getLastPathComponent();
db.setKey(node.getNodeKey());
mNotifier.update(mView, Optional.<VisualItemAxis>absent());
}
}
});
}
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class AVLTreeReader method moveTo.
@Override
public Move<AVLTreeReader<K, V>> moveTo(final long nodeKey) {
assertNotClosed();
if (nodeKey == Fixed.NULL_NODE_KEY.getStandardProperty()) {
return Move.notMoved();
}
// Remember old node and fetch new one.
final Node oldNode = mCurrentNode;
Optional<? extends Node> newNode;
try {
// Immediately return node from item list if node key negative.
@SuppressWarnings("unchecked") final Optional<? extends Node> node = (Optional<? extends Node>) mPageReadTrx.getRecord(nodeKey, mPageKind, mIndex);
newNode = node;
} catch (final SirixIOException e) {
newNode = Optional.empty();
}
if (newNode.isPresent()) {
mCurrentNode = newNode.get();
return Move.moved(this);
} else {
mCurrentNode = oldNode;
return Move.notMoved();
}
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class AVLTreeWriter method rotateRight.
/**
* Right rotation.
*
* @param node node to be rotated
* @throws SirixIOException if an I/O error occurs
*/
@SuppressWarnings({ "unchecked" })
private void rotateRight(AVLNode<K, V> node) throws SirixIOException {
moveTo(node.getNodeKey());
AVLNode<K, V> leftChild = ((AVLTreeReader<K, V>) moveToFirstChild().get()).getAVLNode();
node = (AVLNode<K, V>) mPageWriteTrx.prepareEntryForModification(node.getNodeKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
node.setLeftChildKey(leftChild.getRightChildKey());
if (leftChild.hasRightChild()) {
final Node leftRightChild = (Node) mPageWriteTrx.prepareEntryForModification(leftChild.getRightChildKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
leftRightChild.setParentKey(node.getNodeKey());
}
leftChild = (AVLNode<K, V>) mPageWriteTrx.prepareEntryForModification(leftChild.getNodeKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
leftChild.setParentKey(node.getParentKey());
if (node.getParentKey() == Fixed.DOCUMENT_NODE_KEY.getStandardProperty()) {
final DocumentRootNode parent = (DocumentRootNode) mPageWriteTrx.prepareEntryForModification(Fixed.DOCUMENT_NODE_KEY.getStandardProperty(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
parent.setFirstChildKey(leftChild.getNodeKey());
} else if (moveTo(node.getParentKey()).hasMoved() && mAVLTreeReader.getAVLNode().getRightChildKey() == node.getNodeKey()) {
final AVLNode<K, V> parent = (AVLNode<K, V>) mPageWriteTrx.prepareEntryForModification(mAVLTreeReader.getNodeKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
parent.setRightChildKey(leftChild.getNodeKey());
} else {
final AVLNode<K, V> parent = (AVLNode<K, V>) mPageWriteTrx.prepareEntryForModification(mAVLTreeReader.getNodeKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
parent.setLeftChildKey(leftChild.getNodeKey());
}
leftChild = (AVLNode<K, V>) mPageWriteTrx.prepareEntryForModification(leftChild.getNodeKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
leftChild.setRightChildKey(node.getNodeKey());
node = (AVLNode<K, V>) mPageWriteTrx.prepareEntryForModification(node.getNodeKey(), mAVLTreeReader.mPageKind, mAVLTreeReader.mIndex, Optional.<UnorderedKeyValuePage>empty());
node.setParentKey(leftChild.getNodeKey());
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class XdmNodeWriterTrxImpl method rollingUpdate.
/**
* Adapting the structure with a rolling hash for all ancestors only with update.
*
* @param oldHash pOldHash to be removed
* @throws SirixIOException if anything weird happened
*/
private void rollingUpdate(final long oldHash) throws SirixIOException {
final ImmutableNode newNode = getCurrentNode();
final long hash = newNode.hashCode();
final long newNodeHash = hash;
long resultNew = hash;
// go the path to the root
do {
final Node node = (Node) getPageTransaction().prepareEntryForModification(mNodeReader.getCurrentNode().getNodeKey(), PageKind.RECORDPAGE, -1, Optional.<UnorderedKeyValuePage>empty());
if (node.getNodeKey() == newNode.getNodeKey()) {
resultNew = node.getHash() - oldHash;
resultNew = resultNew + newNodeHash;
} else {
resultNew = node.getHash() - oldHash * PRIME;
resultNew = resultNew + newNodeHash * PRIME;
}
node.setHash(resultNew);
} while (moveTo(mNodeReader.getCurrentNode().getParentKey()).hasMoved());
mNodeReader.setCurrentNode(newNode);
}
Aggregations