package org.basex.query.up.primitives;
import org.basex.data.Data;
import org.basex.query.QueryException;
import org.basex.query.item.DBNode;
import org.basex.query.up.NamePool;
import org.basex.util.InputInfo;
/**
* Base class for all update primitives.
*
* @author BaseX Team 2005-12, BSD License
* @author Lukas Kircher
*/
public abstract class UpdatePrimitive implements Comparable<UpdatePrimitive> {
/** Primitive Type. */
public final PrimitiveType type;
/** Target pre value. */
public final int pre;
/** Target data reference. */
public final Data data;
/** Input info. */
public final InputInfo input;
/**
* Constructor.
* @param t primitive type
* @param p target pre value
* @param d target data reference
* @param info input info
*/
UpdatePrimitive(final PrimitiveType t, final int p, final Data d,
final InputInfo info) {
pre = p;
data = d;
input = info;
type = t;
}
/**
* Creates a {@link DBNode} instance from the target node information.
* @return DBNode
*/
public final DBNode targetNode() {
return new DBNode(data, pre);
}
@Override
public final int compareTo(final UpdatePrimitive p) {
return type.ordinal() - p.type.ordinal();
}
/**
* Merges two update primitives, as they have the same target node.
* @param p primitive to merge with
* @throws QueryException exception
*/
public abstract void merge(final UpdatePrimitive p) throws QueryException;
/**
* Applies this update primitive to the corresponding database.
* @throws QueryException exception
*/
public abstract void apply() throws QueryException;
/**
* Updates the name pool, which is used to find duplicate attributes
* and namespace conflicts.
* @param pool name pool
*/
@SuppressWarnings("unused")
public void update(final NamePool pool) { }
/**
* Returns the total number of node operations.
* @return number of updates
*/
public abstract int size();
}