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; } });