package org.basex.query.path;
import org.basex.query.QueryContext;
import org.basex.query.item.ANode;
import org.basex.query.item.NodeType;
import org.basex.query.item.QNm;
import org.basex.util.Util;
/**
* Node test.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public abstract class Test {
/** Static text node test. */
public static final Test TXT = new KindTest(NodeType.TXT);
/** Static PI node test. */
public static final Test PI = new KindTest(NodeType.PI);
/** Static element node test. */
private static final Test ELM = new KindTest(NodeType.ELM);
/** Static document node test. */
public static final Test DOC = new KindTest(NodeType.DOC);
/** Static attribute node test. */
private static final Test ATT = new KindTest(NodeType.ATT);
/** Static comment node test. */
public static final Test COM = new KindTest(NodeType.COM);
/** Static node test. */
public static final Test NOD = new Test() {
@Override
public boolean eval(final ANode node) { return true; }
@Override
public String toString() { return NodeType.NOD.toString(); }
};
/** Name test types. */
public enum Name {
/** Accept all nodes (*). */ ALL,
/** Test names (*:tag). */ NAME,
/** Test namespaces (pre:*). */ NS,
/** Test all nodes (pre:tag). */ STD
}
/** Type of node test. */
public NodeType type;
/** Type of name test. Set to {@code null} for other kind tests. */
public Name test;
/** Name test. Set to {@code null} for other kind tests. */
public QNm name;
/** Mutable QName instance. */
final QNm tmpq = new QNm();
/**
* Returns a test instance.
* @param t node type
* @return kind test
*/
public static Test get(final NodeType t) {
switch(t) {
case TXT: return TXT;
case PI: return PI;
case ELM: return ELM;
case DOC: return DOC;
case ATT: return ATT;
case COM: return COM;
case NOD: return NOD;
default: throw Util.notexpected();
}
}
/**
* Optimizes and compiles the expression.
* @param ctx query context
* @return false if test always returns false
*/
@SuppressWarnings("unused")
public boolean comp(final QueryContext ctx) {
return true;
}
/**
* Tests the specified node.
* @param node temporary node
* @return result of check
*/
public abstract boolean eval(final ANode node);
/**
* Checks the current and specified test for equality.
* @param t test to be compared
* @return result of check
*/
public final boolean sameAs(final Test t) {
return test == t.test && type == t.type &&
(name == t.name || name.eq(t.name));
}
}