79 lines
1.2 KiB
JavaScript
79 lines
1.2 KiB
JavaScript
|
|
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;
|
|
}
|
|
});
|
|
|