Search in sources :

Example 1 with Node

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;
    }
}
Also used : Node(org.sirix.node.interfaces.Node)

Example 2 with Node

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());
                }
            }
        });
    }
}
Also used : VisualItemAxis(org.sirix.gui.view.VisualItemAxis) Node(org.sirix.node.interfaces.Node) TreeSelectionListener(javax.swing.event.TreeSelectionListener) TreeSelectionEvent(javax.swing.event.TreeSelectionEvent) ReadDB(org.sirix.gui.ReadDB)

Example 3 with Node

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();
    }
}
Also used : Optional(java.util.Optional) Node(org.sirix.node.interfaces.Node) NullNode(org.sirix.node.NullNode) ImmutableNode(org.sirix.node.interfaces.immutable.ImmutableNode) DocumentRootNode(org.sirix.node.DocumentRootNode) StructNode(org.sirix.node.interfaces.StructNode) SirixIOException(org.sirix.exception.SirixIOException)

Example 4 with Node

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());
}
Also used : DocumentRootNode(org.sirix.node.DocumentRootNode) Node(org.sirix.node.interfaces.Node) DocumentRootNode(org.sirix.node.DocumentRootNode) UnorderedKeyValuePage(org.sirix.page.UnorderedKeyValuePage)

Example 5 with Node

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);
}
Also used : ImmutableNode(org.sirix.node.interfaces.immutable.ImmutableNode) TextNode(org.sirix.node.TextNode) CommentNode(org.sirix.node.CommentNode) PINode(org.sirix.node.PINode) Node(org.sirix.node.interfaces.Node) ValueNode(org.sirix.node.interfaces.ValueNode) AttributeNode(org.sirix.node.AttributeNode) ImmutableNode(org.sirix.node.interfaces.immutable.ImmutableNode) StructNode(org.sirix.node.interfaces.StructNode) ElementNode(org.sirix.node.ElementNode) NamespaceNode(org.sirix.node.NamespaceNode) NameNode(org.sirix.node.interfaces.NameNode) UnorderedKeyValuePage(org.sirix.page.UnorderedKeyValuePage)

Aggregations

Node (org.sirix.node.interfaces.Node)22 StructNode (org.sirix.node.interfaces.StructNode)12 ImmutableNode (org.sirix.node.interfaces.immutable.ImmutableNode)12 AttributeNode (org.sirix.node.AttributeNode)11 CommentNode (org.sirix.node.CommentNode)11 ElementNode (org.sirix.node.ElementNode)11 NamespaceNode (org.sirix.node.NamespaceNode)11 PINode (org.sirix.node.PINode)11 TextNode (org.sirix.node.TextNode)11 NameNode (org.sirix.node.interfaces.NameNode)11 ValueNode (org.sirix.node.interfaces.ValueNode)11 UnorderedKeyValuePage (org.sirix.page.UnorderedKeyValuePage)11 SirixUsageException (org.sirix.exception.SirixUsageException)6 Optional (java.util.Optional)4 SirixDeweyID (org.sirix.node.SirixDeweyID)4 QNm (org.brackit.xquery.atomic.QNm)3 Record (org.sirix.node.interfaces.Record)3 SirixThreadedException (org.sirix.exception.SirixThreadedException)2 DocumentRootNode (org.sirix.node.DocumentRootNode)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1