Deletes a node and its descendants. @param pre PRE value of the node to be deleted
(final int pre)
| 670 | * @param pre PRE value of the node to be deleted |
| 671 | */ |
| 672 | public final void delete(final int pre) { |
| 673 | meta.update(); |
| 674 | |
| 675 | // delete references in document index |
| 676 | int kind = kind(pre); |
| 677 | final int size = size(pre, kind); |
| 678 | |
| 679 | // delete entries in value indexes |
| 680 | indexDelete(pre, id(pre), size); |
| 681 | |
| 682 | /// delete textual values |
| 683 | if(kind != DOC && kind != ELEM) delete(pre, kind != ATTR); |
| 684 | |
| 685 | // reduce size of ancestors |
| 686 | int par = pre; |
| 687 | // check if we are an attribute (different size counters) |
| 688 | if(kind == ATTR) { |
| 689 | par = parent(par, ATTR); |
| 690 | attSize(par, ELEM, attSize(par, ELEM) - 1); |
| 691 | size(par, ELEM, size(par, ELEM) - 1); |
| 692 | kind = kind(par); |
| 693 | } |
| 694 | |
| 695 | // delete namespace nodes and propagate PRE value shifts (before node sizes are touched!) |
| 696 | nspaces.delete(pre, size, this); |
| 697 | |
| 698 | // reduce size of ancestors |
| 699 | while(par > 0 && kind != DOC) { |
| 700 | par = parent(par, kind); |
| 701 | kind = kind(par); |
| 702 | size(par, kind, size(par, kind) - size); |
| 703 | } |
| 704 | |
| 705 | // preserve empty root node |
| 706 | if(kind(pre) == DOC) --meta.ndocs; |
| 707 | |
| 708 | // delete node from table structure and reduce document size |
| 709 | table.delete(pre, size); |
| 710 | |
| 711 | updateDist(pre, -size); |
| 712 | } |
| 713 | |
| 714 | /** |
| 715 | * Inserts standalone attributes (without root element). |