package eu.dnetlib.dlms.jdbc.server;

import java.sql.SQLException;

import eu.dnetlib.dlms.jdbc.ExecutorContext;
import eu.dnetlib.dlms.jdbc.ast.Call;
import eu.dnetlib.dlms.jdbc.ast.CollectionNode;
import eu.dnetlib.dlms.jdbc.ast.DateLit;
import eu.dnetlib.dlms.jdbc.ast.Inst;
import eu.dnetlib.dlms.jdbc.ast.IntegerLit;
import eu.dnetlib.dlms.jdbc.ast.NumberLit;
import eu.dnetlib.dlms.jdbc.ast.Parameter;
import eu.dnetlib.dlms.jdbc.ast.Ref;
import eu.dnetlib.dlms.jdbc.ast.SelectOneExpression;
import eu.dnetlib.dlms.jdbc.ast.StringLit;
import eu.dnetlib.dlms.jdbc.ast.Struct;

/**
 * Interface for Expression executors.
 * 
 * @author alessia
 * 
 */
public interface IExpressionExecutor {
	/**
	 * Evaluates NumberLit instances.
	 * 
	 * @param num
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 */
	Object evaluate(NumberLit num, ExecutorContext context);

	/**
	 * Evaluates IntegerLit instances.
	 * 
	 * @param num
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 */
	Object evaluate(IntegerLit num, ExecutorContext context);

	/**
	 * Evaluates DateLit instances.
	 * 
	 * @param dateLit
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 */
	Object evaluate(DateLit dateLit, ExecutorContext context);

	/**
	 * Evaluates StringLit instances.
	 * 
	 * @param str
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 */
	Object evaluate(StringLit str, ExecutorContext context);

	/**
	 * Evaluates CollectionNode instances.
	 * 
	 * @param collNode
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 * @throws SQLException
	 *             problems during evaluation
	 */
	Object evaluate(CollectionNode collNode, ExecutorContext context) throws SQLException;

	/**
	 * Evaluates Ref instances.
	 * 
	 * @param reference
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 * @throws SQLException
	 *             problems during evaluation
	 */
	Object evaluate(Ref reference, ExecutorContext context) throws SQLException;

	/**
	 * Evaluates Parameter instances.
	 * 
	 * @param param
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 */
	Object evaluate(Parameter param, ExecutorContext context);

	/**
	 * Evaluates Struct instances.
	 * 
	 * @param structDefinition
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 * @throws SQLException
	 *             problems during evaluation
	 */
	Object evaluate(Struct structDefinition, ExecutorContext context) throws SQLException;

	/**
	 * Evaluates Call instances.
	 * 
	 * @param call
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 * @throws SQLException
	 *             problems during evaluation
	 */
	Object evaluate(Call call, ExecutorContext context) throws SQLException;

	/**
	 * Evaluates Inst instances.
	 * 
	 * @param inst
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 * @throws SQLException
	 *             problems during evaluation
	 */
	Object evaluate(Inst inst, ExecutorContext context) throws SQLException;

	/**
	 * Evaluates SelectOneExpression instances.
	 * 
	 * @param selectOne
	 *            node to evaluate
	 * @param context
	 *            current context
	 * @return the result of evaluation
	 * @throws SQLException
	 *             problems during evaluation
	 */
	Object evaluate(SelectOneExpression selectOne, ExecutorContext context) throws SQLException;

}
