private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
boolean nextNodeNeedsCopy = true; if (BTree.getKeyEnd(nextNode) > BTree.MINIMAL_NODE_SIZE) node = copyIfNeeded(node, needsCopy); else if (i > 0 && BTree.getKeyEnd((Object[]) node[keyEnd + i - 1]) > BTree.MINIMAL_NODE_SIZE) node = copyIfNeeded(node, needsCopy); final Object[] leftNeighbour = (Object[]) node[keyEnd + i - 1]; index++; if (!BTree.isLeaf(leftNeighbour)) index += BTree.size((Object[])leftNeighbour[BTree.getChildEnd(leftNeighbour) - 1]); nextNode = rotateLeft(node, i); node = copyIfNeeded(node, needsCopy); nextNode = rotateRight(node, i); node = keyEnd == 1 ? null : copyWithKeyAndChildRemoved(node, i - 1, i - 1, false); nextNode = merge(leftNeighbour, nextNode, nodeKey); i = i - 1; index += BTree.size(leftNeighbour) + 1; node = keyEnd == 1 ? null : copyWithKeyAndChildRemoved(node, i, i, false); nextNode = merge(nextNode, rightNeighbour, nodeKey); copyKeys(node, newLeaf, 0, index); if (prevNode != null) prevNode[prevI] = newLeaf;
private static Object[] rotateLeft(final Object[] node, final int i) { final int keyEnd = BTree.getBranchKeyEnd(node); final Object[] nextNode = (Object[]) node[keyEnd + i]; final Object[] leftNeighbour = (Object[]) node[keyEnd + i - 1]; final int leftNeighbourEndKey = BTree.getKeyEnd(leftNeighbour); final boolean leaves = BTree.isLeaf(nextNode); final Object[] newChild = leaves ? null : (Object[]) leftNeighbour[BTree.getChildEnd(leftNeighbour) - 1]; final Object[] newNextNode = copyWithKeyAndChildInserted(nextNode, 0, node[i - 1], 0, newChild); node[i - 1] = leftNeighbour[leftNeighbourEndKey - 1]; node[keyEnd + i - 1] = copyWithKeyAndChildRemoved(leftNeighbour, leftNeighbourEndKey - 1, leftNeighbourEndKey, true); BTree.getSizeMap(node)[i - 1] -= leaves ? 1 : 1 + BTree.getSizeMap(newNextNode)[0]; return newNextNode; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
/** * Returns the equivalent of those columns but with the provided column removed. * * @param column the column to remove. * * @return newly allocated columns containing all the columns of {@code this} expect * for {@code column}. */ public Columns without(ColumnDefinition column) { if (!contains(column)) return this; Object[] newColumns = BTreeRemoval.<ColumnDefinition>remove(columns, Comparator.naturalOrder(), column); return new Columns(newColumns); }
Object[] result = removeFromLeaf(btree, index); if (elemToSwap != null) BTree.replaceInSitu(result, index, elemToSwap);
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
/** * Returns the equivalent of those columns but with the provided column removed. * * @param column the column to remove. * * @return newly allocated columns containing all the columns of {@code this} expect * for {@code column}. */ public Columns without(ColumnDefinition column) { if (!contains(column)) return this; Object[] newColumns = BTreeRemoval.<ColumnDefinition>remove(columns, Comparator.naturalOrder(), column); return new Columns(newColumns); }
Object[] result = removeFromLeaf(btree, index); if (elemToSwap != null) BTree.replaceInSitu(result, index, elemToSwap);
boolean nextNodeNeedsCopy = true; if (BTree.getKeyEnd(nextNode) > BTree.MINIMAL_NODE_SIZE) node = copyIfNeeded(node, needsCopy); else if (i > 0 && BTree.getKeyEnd((Object[]) node[keyEnd + i - 1]) > BTree.MINIMAL_NODE_SIZE) node = copyIfNeeded(node, needsCopy); final Object[] leftNeighbour = (Object[]) node[keyEnd + i - 1]; index++; if (!BTree.isLeaf(leftNeighbour)) index += BTree.size((Object[])leftNeighbour[BTree.getChildEnd(leftNeighbour) - 1]); nextNode = rotateLeft(node, i); node = copyIfNeeded(node, needsCopy); nextNode = rotateRight(node, i); node = keyEnd == 1 ? null : copyWithKeyAndChildRemoved(node, i - 1, i - 1, false); nextNode = merge(leftNeighbour, nextNode, nodeKey); i = i - 1; index += BTree.size(leftNeighbour) + 1; node = keyEnd == 1 ? null : copyWithKeyAndChildRemoved(node, i, i, false); nextNode = merge(nextNode, rightNeighbour, nodeKey); copyKeys(node, newLeaf, 0, index); if (prevNode != null) prevNode[prevI] = newLeaf;
private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
private static Object[] rotateLeft(final Object[] node, final int i) { final int keyEnd = BTree.getBranchKeyEnd(node); final Object[] nextNode = (Object[]) node[keyEnd + i]; final Object[] leftNeighbour = (Object[]) node[keyEnd + i - 1]; final int leftNeighbourEndKey = BTree.getKeyEnd(leftNeighbour); final boolean leaves = BTree.isLeaf(nextNode); final Object[] newChild = leaves ? null : (Object[]) leftNeighbour[BTree.getChildEnd(leftNeighbour) - 1]; final Object[] newNextNode = copyWithKeyAndChildInserted(nextNode, 0, node[i - 1], 0, newChild); node[i - 1] = leftNeighbour[leftNeighbourEndKey - 1]; node[keyEnd + i - 1] = copyWithKeyAndChildRemoved(leftNeighbour, leftNeighbourEndKey - 1, leftNeighbourEndKey, true); BTree.getSizeMap(node)[i - 1] -= leaves ? 1 : 1 + BTree.getSizeMap(newNextNode)[0]; return newNextNode; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
/** * Returns the equivalent of those columns but with the provided column removed. * * @param column the column to remove. * * @return newly allocated columns containing all the columns of {@code this} expect * for {@code column}. */ public Columns without(ColumnDefinition column) { if (!contains(column)) return this; Object[] newColumns = BTreeRemoval.<ColumnDefinition>remove(columns, Comparator.naturalOrder(), column); return new Columns(newColumns); }
Object[] result = removeFromLeaf(btree, index); if (elemToSwap != null) BTree.replaceInSitu(result, index, elemToSwap);
boolean nextNodeNeedsCopy = true; if (BTree.getKeyEnd(nextNode) > BTree.MINIMAL_NODE_SIZE) node = copyIfNeeded(node, needsCopy); else if (i > 0 && BTree.getKeyEnd((Object[]) node[keyEnd + i - 1]) > BTree.MINIMAL_NODE_SIZE) node = copyIfNeeded(node, needsCopy); final Object[] leftNeighbour = (Object[]) node[keyEnd + i - 1]; index++; if (!BTree.isLeaf(leftNeighbour)) index += BTree.size((Object[])leftNeighbour[BTree.getChildEnd(leftNeighbour) - 1]); nextNode = rotateLeft(node, i); node = copyIfNeeded(node, needsCopy); nextNode = rotateRight(node, i); node = keyEnd == 1 ? null : copyWithKeyAndChildRemoved(node, i - 1, i - 1, false); nextNode = merge(leftNeighbour, nextNode, nodeKey); i = i - 1; index += BTree.size(leftNeighbour) + 1; node = keyEnd == 1 ? null : copyWithKeyAndChildRemoved(node, i, i, false); nextNode = merge(nextNode, rightNeighbour, nodeKey); copyKeys(node, newLeaf, 0, index); if (prevNode != null) prevNode[prevI] = newLeaf;
private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
private static Object[] rotateLeft(final Object[] node, final int i) { final int keyEnd = BTree.getBranchKeyEnd(node); final Object[] nextNode = (Object[]) node[keyEnd + i]; final Object[] leftNeighbour = (Object[]) node[keyEnd + i - 1]; final int leftNeighbourEndKey = BTree.getKeyEnd(leftNeighbour); final boolean leaves = BTree.isLeaf(nextNode); final Object[] newChild = leaves ? null : (Object[]) leftNeighbour[BTree.getChildEnd(leftNeighbour) - 1]; final Object[] newNextNode = copyWithKeyAndChildInserted(nextNode, 0, node[i - 1], 0, newChild); node[i - 1] = leftNeighbour[leftNeighbourEndKey - 1]; node[keyEnd + i - 1] = copyWithKeyAndChildRemoved(leftNeighbour, leftNeighbourEndKey - 1, leftNeighbourEndKey, true); BTree.getSizeMap(node)[i - 1] -= leaves ? 1 : 1 + BTree.getSizeMap(newNextNode)[0]; return newNextNode; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
/** * Returns the equivalent of those columns but with the provided column removed. * * @param column the column to remove. * * @return newly allocated columns containing all the columns of {@code this} expect * for {@code column}. */ public Columns without(ColumnDefinition column) { if (!contains(column)) return this; Object[] newColumns = BTreeRemoval.<ColumnDefinition>remove(columns, Comparator.naturalOrder(), column); return new Columns(newColumns); }