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

/**
 * The equivalent of a SQL filter expression. It allows to automatically build
 * SQL filters based on lot parameters.
 */
module.exports = new Class({
	Extends: Operation
	,Tag: 'sql-filter'

	/**
	 * Checks if any of filters childs are ready.
	 */
	,isReady: function(params) {
		var exprs = this.exprs;
		for (var i = exprs.length; i--;)
		if (exprs[i].isReady(params))
			return true;

		return false;
	}

	/**
	 * Renders the filter as an SQL expression. If any of its childs isn't
	 * ready is ommitted from the expression. If all of its childs aren't ready
	 * renders the TRUE expression.
	 */
	,render: function(params) {
		var newOp;
		var newExprs = [];

		this.exprs.forEach(function(expr) {
			if (expr.isReady(params))
				newExprs.push(expr);
		})
	
		if (newExprs.length > 0)
			newOp = new Operation({
				type: this.type,
				exprs: newExprs
			});
		else
			newOp = new Value({value: true});
			
		return newOp.render(params);
	}
});