protected void requireNodeDB() { if (!hasNodes()) { nodedb = tree.getNextNodeDB(); } }
/** * link this node (aliasing) to another node in the tree. they will share * children, but not meta-data. should only be called from within a * TreeNodeInitializer passed to getOrCreateEditableNode. */ @Override public boolean aliasTo(DataTreeNode node) { if (node.getClass() != NonConcurrentTreeNode.class) { return false; } if (hasNodes()) { return false; } ((NonConcurrentTreeNode) node).requireNodeDB(); nodedb = ((NonConcurrentTreeNode) node).nodedb; markAlias(); return true; }
/** * returns an iterator of read-only nodes */ public ClosableIterator<DataTreeNode> getNodeIterator(String from, String to) { if (!hasNodes()) { return new Iter(null); } return new Iter(tree.fetchNodeRange(nodedb, from, to)); }
/** * returns an iterator of read-only nodes */ public ClosableIterator<DataTreeNode> getNodeIterator() { return !hasNodes() ? new Iter(null) : new Iter(tree.fetchNodeRange(nodedb)); }
private void markForChildDeletion(final NonConcurrentTreeNode node) { assert node.hasNodes(); assert !node.isAlias(); long nodeDB = treeTrashNode.nodeDB(); int next = treeTrashNode.updateNodeCount(1); DBKey key = new DBKey(nodeDB, Raw.get(LessBytes.toBytes(next))); source.put(key, node); log.trace("[trash.mark] {} --> {}", next, treeTrashNode); }
boolean deleteNode(final NonConcurrentTreeNode parent, final String child) { log.trace("[node.delete] {} --> {}", parent, child); long nodedb = parent.nodeDB(); if (nodedb <= 0) { log.debug("parent has no children on delete : {} --> {}", parent, child); return false; } CacheKey key = new CacheKey(nodedb, child); NonConcurrentTreeNode node = source.remove(key.dbkey()); if (node != null) { parent.updateNodeCount(-1); if (node.hasNodes() && !node.isAlias()) { markForChildDeletion(node); } return true; } else { return false; } }
if (next.hasNodes() && !next.isAlias()) { deleteSubTree(next, totalCount, nodeCount, terminationCondition);