/*
 * Copyright (C) 2012 - Juan Ferrer Toribio
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef SQL_OPERATION_H
#define SQL_OPERATION_H

#include "sql-expr.h"

#define SQL_TYPE_OPERATION		(sql_operation_get_type ())
#define SQL_OPERATION(obj)		(G_TYPE_CHECK_INSTANCE_CAST (obj, SQL_TYPE_OPERATION, SqlOperation))
#define SQL_IS_OPERATION(obj)	(G_TYPE_CHECK_INSTANCE_TYPE (obj, SQL_TYPE_OPERATION))

#define SQL_TYPE_OPERATION_TYPE	(sql_operation_type_get_type ())

typedef struct _SqlOperation SqlOperation;
typedef struct _SqlOperationClass SqlOperationClass;

typedef enum
{
	// Unary
	 SQL_OPERATION_TYPE_NOT
	,SQL_OPERATION_TYPE_MINUS
	,SQL_OPERATION_TYPE_PLUS

	// Binary
	,SQL_OPERATION_TYPE_MULTIPLICATION
	,SQL_OPERATION_TYPE_DIVISION
	,SQL_OPERATION_TYPE_SUM
	,SQL_OPERATION_TYPE_SUBTRACTION
	,SQL_OPERATION_TYPE_IS
	,SQL_OPERATION_TYPE_EQUAL
	,SQL_OPERATION_TYPE_NOT_EQUAL
	,SQL_OPERATION_TYPE_GREATER_EQUAL
	,SQL_OPERATION_TYPE_GREATER
	,SQL_OPERATION_TYPE_LOWER_EQUAL
	,SQL_OPERATION_TYPE_LOWER
	,SQL_OPERATION_TYPE_LIKE
	,SQL_OPERATION_TYPE_AND
	,SQL_OPERATION_TYPE_OR
	,SQL_OPERATION_TYPE_XOR
	,SQL_OPERATION_TYPE_MOD
	,SQL_OPERATION_TYPE_IN
	,SQL_OPERATION_TYPE_COUNT
}
SqlOperationType;

/**
 * SqlOperation:
 * @expr: (element-type Sql.Expr): list of #SqlExpr
 * @type: the type of operation. See #SqlOperationType for the possible values
 **/
struct _SqlOperation
{
	SqlExpr parent;
	SqlList * operands;	 // List of SqlExpr
	SqlOperationType type;
};

struct _SqlOperationClass
{
	/* <private> */
	SqlExprClass parent;
};

GType				sql_operation_get_type		();
GType				sql_operation_type_get_type	();

SqlObject *			sql_operation_new			(SqlOperationType type);
SqlList *			sql_operation_get_operands  (SqlOperation * self);
void				sql_operation_set_operands  (SqlOperation * self, SqlList * operands);
SqlOperationType	sql_operation_get_operator  (SqlOperation * self);
void				sql_operation_set_operator  (SqlOperation * self, SqlOperationType type);

#endif