package org.basex.query.up.primitives; import org.basex.data.Data; /** * <p>Update primitive type enumeration.</p> * * <p>The type order corresponds to the order updates are carried out node-wise. * The XQuery Update Facility specification proposes the following order:</p> * * <ul> * <li> INSERTINTO, INSERTATTR, REPLACEVALUE, RENAMENODE</li> * <li> INSERTBEFORE, INSERTAFTER, INSERTINTOFIRST, INSERTINTOLAST</li> * <li> REPLACENODE</li> * <li> REPLACEELEMCONT</li> * <li> DELETE</li> * <li> PUT</li> * </ul> * * <p>Why does it differ from the specification?</p> * * <p>We apply the order to each single target node instead of a document (like * stated in the specification). The result stays the same.</p> * * <p>Put is executed before replace, delete and insert before as the node * to be serialized has already been updated and applying replace, delete * or insert before would change its pre value or kill its identity.</p> * * <p>For all other operations, concerning the order the following rule applies: * Updates are applied from bottom to top regarding the data table. This * means the update primitive which affects the highest pre value comes * first, etc.</p> * * <p>'Insert into as last' is carried out after 'insert into' as we have to * make sure that location modifiers are correctly applied.</p> * * <p>'Replace element content' must be executed after 'insert into as first' * to replace nodes inserted by 'insert into as first'.</p> * * <p>The following list shows the affected pre value for each primitive type * relative to its target node pre value P. An 'S' in the first column * means that the corresponding primitive could lead to structural changes * of the table -> a shift of pre values.</p> * * <p>P: target pre value<br/> * S: may lead to structural change<br/> * size(), attSize() -> see {@link Data}</p> * * <pre> * Primitive Affected Pre * ---------------------------------------- * S insert after P + size(P) * S insert into P + size(P) * S insert into as last P + size(P) * S insert attribute P + attSize(P) * S insert into as first P + attSize(P) * S replace elm content P + attSize(P) //attributes not affected * S replace value P //inserting empty txt node -> S * rename P * put P * S replace P * S delete P * S insert before P * </pre> * * @author BaseX Team 2005-12, BSD License * @author Lukas Kircher */ public enum PrimitiveType { /* TREAT ORDER OF PRIMITIVES WITH CARE AS CHANGES WILL MOST PROBABLY * AFFECT OTHER PARTS OF THE XQUP MODULE (EG TEXT MERGING). */ /** Insert after. */ INSERTAFTER, /** Insert into. */ INSERTINTO, /** Insert into as last. */ INSERTINTOLAST, /** Insert attribute. */ INSERTATTR, /** Insert into as first. */ INSERTINTOFIRST, /** Replace element content. */ REPLACEELEMCONT, /** Replace value. */ REPLACEVALUE, /** Rename. */ RENAMENODE, /** Put. */ PUT, /** Replace node. */ REPLACENODE, /** Delete. */ DELETENODE, /** Insert before. */ INSERTBEFORE, /** DBSTORE. */ DBSTORE, /** DBRename. */ DBRENAME, /** DBDelete. */ DBDELETE, /** DBOptimize. */ DBOPTIMIZE }