alasql
Version:
AlaSQL.js - JavaScript SQL database library for relational and graph data manipulation with support of localStorage, IndexedDB, and Excel
73 lines (65 loc) • 2.44 kB
JavaScript
yy.Select.prototype.compileOrder = function (query) {
var self = this;
if(this.order) {
// console.log(990, this.order);
if(this.order && this.order.length == 1 && this.order[0].expression
&& typeof this.order[0].expression == "function") {
// console.log(991, this.order[0]);
var func = this.order[0].expression;
// console.log(994, func);
return function(a,b){
var ra = func(a),rb = func(b);
if(ra>rb) return 1;
if(ra==rb) return 0;
return -1;
}
};
var s = '';
var sk = '';
this.order.forEach(function(ord,idx){
// console.log(ord instanceof yy.Expression);
// console.log(ord.toJavaScript('a',''));
// console.log(ord.expression instanceof yy.Column);
// Date conversion
var dg = '';
//console.log(ord.expression, ord.expression instanceof yy.NumValue);
if(ord.expression instanceof yy.NumValue) {
ord.expression = self.columns[ord.expression.value-1];
};
if(ord.expression instanceof yy.Column) {
var columnid = ord.expression.columnid;
if(query.xcolumns[columnid]) {
var dbtypeid = query.xcolumns[columnid].dbtypeid;
if( dbtypeid == 'DATE' || dbtypeid == 'DATETIME') dg = '.valueOf()';
// TODO Add other types mapping
} else {
if(alasql.options.valueof) dg = '.valueOf()'; // TODO Check
}
// COLLATE NOCASE
if(ord.nocase) dg += '.toUpperCase()';
s += 'if((a[\''+columnid+"']||'')"+dg+(ord.direction == 'ASC'?'>':'<')+'(b[\''+columnid+"']||'')"+dg+')return 1;';
s += 'if((a[\''+columnid+"']||'')"+dg+'==(b[\''+columnid+"']||'')"+dg+'){';
} else {
dg = '.valueOf()';
// COLLATE NOCASE
if(ord.nocase) dg += '.toUpperCase()';
s += 'if(('+ord.toJavaScript('a','')+"||'')"+dg+(ord.direction == 'ASC'?'>(':'<(')+ord.toJavaScript('b','')+"||'')"+dg+')return 1;';
s += 'if(('+ord.toJavaScript('a','')+"||'')"+dg+'==('+ord.toJavaScript('b','')+"||'')"+dg+'){';
}
// if(columnid == '_') {
// s += 'if(a'+dg+(ord.direction == 'ASC'?'>':'<')+'b'+dg+')return 1;';
// s += 'if(a'+dg+'==b'+dg+'){';
// } else {
// TODO Add date comparision
// s += 'if(a[\''+columnid+"']"+dg+(ord.direction == 'ASC'?'>':'<')+'b[\''+columnid+"']"+dg+')return 1;';
// s += 'if(a[\''+columnid+"']"+dg+'==b[\''+columnid+"']"+dg+'){';
// }
sk += '}';
});
s += 'return 0;';
s += sk+'return -1';
query.orderfns = s;
//console.log(s);
return new Function('a,b',s);
};
};