/**
 *
 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
 *
 * This library 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.1 of the License, or (at your option) any later version.
 * 
 * This library 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 library.  If not, see <http://www.gnu.org/licenses/>.
 * 
 **/
package lucee.runtime.sql.exp.op;

import lucee.runtime.sql.exp.Expression;
import lucee.runtime.sql.exp.ExpressionSupport;

public class Operation2 extends ExpressionSupport implements Operation {

	private Expression left;
	private Expression right;
	private int operator;


	public Operation2(Expression left, Expression right,int operator) {
		this.left=left;
		this.right=right;
		this.operator=operator;
	}


	public static String toString(int operator) {
		switch(operator) {
		case Operation.OPERATION2_DIVIDE: return "/";
		case Operation.OPERATION2_MINUS: return "-";
		case Operation.OPERATION2_MULTIPLY: return "*";
		case Operation.OPERATION2_PLUS: return "+";
		case Operation.OPERATION2_EXP: return "^";
		case Operation.OPERATION2_MOD: return "%";
		
		case Operation.OPERATION2_AND: return "and";
		case Operation.OPERATION2_OR: return "or";
		case Operation.OPERATION2_XOR: return "xor";

		case Operation.OPERATION2_EQ: return "=";
		case Operation.OPERATION2_GT: return ">";
		case Operation.OPERATION2_GTE: return "=>";
		case Operation.OPERATION2_LT: return "<";
		case Operation.OPERATION2_LTE: return "<=";
		case Operation.OPERATION2_LTGT: return "<>";
		case Operation.OPERATION2_NEQ: return "!=";
		case Operation.OPERATION2_NOT_LIKE: return "not like";
		case Operation.OPERATION2_LIKE: return "like";

		case Operation.OPERATION1_PLUS: return "+";
		case Operation.OPERATION1_MINUS: return "-";
		case Operation.OPERATION1_NOT: return "not";
		case Operation.OPERATION1_IS_NOT_NULL: return "is not null";
		case Operation.OPERATION1_IS_NULL: return "is null";
		}
		return null;
	}


	public String toString(boolean noAlias) {
		if(noAlias || getIndex()==0)return left.toString(true)+" "+toString(operator)+" "+right.toString(true);
		return toString(true)+" as "+getAlias();
	}


	/**
	 * @return the left
	 */
	public Expression getLeft() {
		return left;
	}


	/**
	 * @return the operator
	 */
	public int getOperator() {
		return operator;
	}


	/**
	 * @return the right
	 */
	public Expression getRight() {
		return right;
	}
	
}
