var Expr = require ('./expr');

/**
 * The equivalent of a SQL operation between exprs.
 *
 * @param {Array#Sql.Expr} expr Array with the exprs
 * @param {Sql..Operation.Type} type The type of the operation
 */
var Operation = new Class ();
module.exports = Operation;

var Type =
{
	 EQUAL  : 0
	,LIKE   : 1
	,AND    : 2
	,OR     : 3
	,REGEXP : 4
};

var Operators =
[
	 '='
	,'LIKE'
	,'AND'
	,'OR'
	,'REGEXP'
];

Operation.extend
({
	Type: Type
	,Operators: Operators
});

Operation.implement
({
	Extends: Expr
	,Tag: 'sql-operation'
	,Properties:
	{
		type:
		{
			enumType: Type
			,value: -1
		}
	}

	,initialize: function (props)
	{
		this.parent (props);
		this.link ({exprs: new Sql.List ()}, {'changed': this.onListChange});
	}
	
	,appendChild: function (child)
	{
		this.exprs.add (child);
	}

	,onListChange: function ()
	{
		this.signalEmit ('changed');
	}

	,isReady: function ()
	{	
		return this.exprs.isReady ();
	}

	,render: function (batch)
	{
		var sql = '(';
		var operator = ' '+ Operators[this.type] +' ';
		var e = this.exprs.getArray ();

		for (var i = 0; i < e.length; i++)
		{
			if (i > 0)
				sql += operator;

			sql += e[i].render (batch);
		}
		
		sql += ')';
		
		return sql;
	}
});