/*
 *  eXist Open Source Native XML Database
 *  Copyright (C) 2001-06 Wolfgang M. Meier
 *  wolfgang@exist-db.org
 *  http://exist.sourceforge.net
 *  
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *  
 *  $Id: Constants.java 2436 2006-01-07 21:47:15Z brihaye $
 */
package org.exist.xquery;

/**
 * Declares various constants and flags used by the query engine:
 * axis specifiers, operators.
 * 
 * @author wolf
 */
public interface Constants {

    //TODO : move this to a dedicated Axis class
    
	/** Axis names */
    public final static String[] AXISSPECIFIERS = {
						"ancestor",
					    "ancestor-or-self",
					    "parent",
					    "preceding",
					    "preceding-sibling",
					    "child",
					    "attribute",
					    "descendant",
					    "descendant-or-self",
					    "following",
					    "following-sibling",
					    "namespace",
					    "self",
					    "attribute-descendant"
	};    
    
    /**
     * XPath axis constants:
     */
    public final static int UNKNOWN_AXIS = -1;
    
    /** Reverse axes */
    public final static int ANCESTOR_AXIS = 0;
    public final static int ANCESTOR_SELF_AXIS = 1;
    public final static int PARENT_AXIS =  2;
    public final static int PRECEDING_AXIS = 3;
    public final static int PRECEDING_SIBLING_AXIS = 4;
    
    /** Forward axes */
    public final static int CHILD_AXIS = 5;
    public final static int ATTRIBUTE_AXIS = 6;
    public final static int DESCENDANT_AXIS = 7;
    public final static int DESCENDANT_SELF_AXIS = 8;
    public final static int FOLLOWING_AXIS = 9;
    public final static int FOLLOWING_SIBLING_AXIS = 10;
    public final static int NAMESPACE_AXIS = 11;
    public final static int SELF_AXIS = 12;
    //combines /descendant-or-self::node()/attribute:*
	public final static int DESCENDANT_ATTRIBUTE_AXIS = 13;
	
    /**
     * These constants represent the
     * different node types in <i>XPath</i>.
     */
    public final static String[] NODETYPES = {"node",
				       "root",
				       "*",
				       "text",
				       "attribute",
				       "namespace",
				       "comment",
				       "processing-instruction"};

    public final static short TYPE_UNKNOWN = -1;

    /**
     * Node types
     */
    
    public final static int NODE_TYPE = 0;
    public final static int ROOT_NODE = 1;
    public final static int ELEMENT_NODE = 2;
    public final static int TEXT_NODE = 3;
    public final static int ATTRIBUTE_NODE = 4;
    public final static int NAMESPACE_NODE = 5;
    public final static int COMMENT_NODE = 6;
    public final static int PROCESSING_NODE = 7;

    /**
     * Comparison operators
     */
    public final static int LT  = 0;
    public final static int GT  = 1;
    public final static int GTEQ = 2;
    public final static int LTEQ = 3;
    public final static int EQ  = 4;
    public final static int NEQ = 5;
    public final static int IN = 6;
    public final static int REGEXP = 7;

    /**
     * String truncation operators
     */
    public final static int TRUNC_NONE = -1;
    public final static int TRUNC_RIGHT = 0;
    public final static int TRUNC_LEFT = 1;
    public final static int TRUNC_BOTH = 2;

    /**
     * Arithmetic operators
     */
	public final static int PLUS = 8;
	public final static int MINUS = 9;
	public final static int MULT = 10;
	public final static int DIV = 11;
	public final static int MOD = 12;
	public final static int IDIV = 13;

	/**
	 * Identity operators
	 */
	public final static int IS = 14;
	public final static int ISNOT = 15;
	public final static int BEFORE = 16;
	public final static int AFTER = 17;
	
    public final static String[] OPS = 
    { "<", ">", ">=", "<=", "=", "!=", "IN" , "=~", "+", 
      "-", "*", "div", "mod", "idiv", "is", "isnot", "<<", ">>" };
    
    public final static String[] VOPS = 
    { "lt", "gt", "ge", "lt", "eq", "ne" };    

    public final static int KEEP_UNION = 0;
    public final static int KEEP_INTER = 1;
    public final static int KEEP_AFTER = 2;
    public final static int KEEP_BEFORE = 3;

    public final static int TYPE_ANY      = 0;
    public final static int TYPE_NODELIST = 1;
    public final static int TYPE_NODE     = 2;
    public final static int TYPE_STRING   = 3;
    public final static int TYPE_NUM      = 4;
    public final static int TYPE_BOOL     = 5;

    public final static int FULLTEXT_OR = 0;
    public final static int FULLTEXT_AND = 1;
    
    //TODO : move the following to an org.exist.utils.Constants.java file
    
    //The definitive missing constant in java.lang.String
    public final static int STRING_NOT_FOUND = -1;
    //The definitive missing constants in java.lang.Comparable
    public final static int INFERIOR = -1;
    public final static int EQUAL = 0;
    public final static int SUPERIOR = 1;
    //
    public final static int NO_SIZE_HINT = -1;
    
}