
var Operation = require ('./operation');
var Value = require ('./value');
var Field = require ('./field');

/**
 * Objects to be used as an operands of @Sql.Filter. It represents a two
 * expressions basic operation composed by a table column, the operator and the
 * value extracted from the rendering paramerers.
 */
module.exports = new Class
({
	Extends: Operation
	,Tag: 'sql-filter-item'
	,Properties:
	{
		/**
		 * The column name.
		 */
		field:
		{
			type: String,
			value: null
		},
		/**
		 * The source table name or its alias if it has been specified.
		 */
		target:
		{
			type: String,
			value: null
		},
		/**
		 * The parameter name.
		 */
		param:
		{
			type: String,
			value: null
		}
	}

	/**
	 * Checks if parameter name haa been defined and if it has a value.
	 */
	,isReady: function (params)
	{
		return this.param != null && params != null && params[this.param] != null;
	}

	,render: function (params)
	{
		var op = new Operation ({type: this.type});

		var field = new Field ({
			name: this.field,
			target: this.target
		});
		op.appendChild (field);

		var value = params[this.param];

		if (this.type === Operation.Type.LIKE && typeof value == 'string')
		{
			value = value.replace (/[\%\?]/g, this._escapeChar);
			value = value.replace (/^|\s+|$/g, '%');
		}

		var sqlValue = new Value ({value: value});
		op.appendChild (sqlValue);
			
		return op.render (params);
	}

	,_escapeChar: function (char)
	{
		return '\\'+ char;
	}
});
