UNPKG

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