alasql
Version:
AlaSQL.js - JavaScript SQL database library for relational and graph data manipulation with support of localStorage, IndexedDB, and Excel
238 lines (221 loc) • 8.05 kB
JavaScript
/*
//
// Select compiler part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/
yy.Select.prototype.compileFrom = function(query) {
// console.log(1);
var self = this;
query.sources = [];
// var tableid = this.from[0].tableid;
// var as = '';
// if(self.from[0].as) as = this.from[0].as;
//console.log(this);
query.aliases = {};
if(!self.from) return;
//console.log(self.from);
self.from.forEach(function(tq){
//console.log(tq);
var alias = tq.as || tq.tableid;
// console.log(alias);
if(tq instanceof yy.Table) {
// console.log(tq, tq.databaseid, query);
query.aliases[alias] = {tableid: tq.tableid, databaseid: tq.databaseid || query.database.databaseid, type:'table'};
} else if(tq instanceof yy.Select) {
query.aliases[alias] = {type:'subquery'};
} else if(tq instanceof yy.Search) {
query.aliases[alias] = {type:'subsearch'};
} else if(tq instanceof yy.ParamValue) {
query.aliases[alias] = {type:'paramvalue'};
} else if(tq instanceof yy.FuncValue) {
query.aliases[alias] = {type:'funcvalue'};
} else if(tq instanceof yy.VarValue) {
query.aliases[alias] = {type:'varvalue'};
} else if(tq instanceof yy.FromData) {
query.aliases[alias] = {type:'fromdata'};
} else {
throw new Error('Wrong table at FROM');
}
var source = {
alias: alias,
databaseid: tq.databaseid || query.database.databaseid,
tableid: tq.tableid,
joinmode: 'INNER',
onmiddlefn: returnTrue,
srcwherefns: '', // for optimization
srcwherefn: returnTrue,
// columns: []
};
if(tq instanceof yy.Table) {
// Get columns from table
source.columns = alasql.databases[source.databaseid].tables[source.tableid].columns;
// console.log('test',alasql.options.autocommit);
// console.log(997,alasql.databases[source.databaseid].engineid);
// console.log(0,source.databaseid);
// console.log(1,alasql.databases[source.databaseid]);
// console.log(2,alasql.databases[source.databaseid].tables[source.tableid].view);
if(alasql.options.autocommit && alasql.databases[source.databaseid].engineid) {
// console.log(997,alasql.databases[source.databaseid].engineid);
// TODO -- make view for external engine
source.datafn = function(query,params,cb,idx, alasql) {
return alasql.engines[alasql.databases[source.databaseid].engineid].fromTable(
source.databaseid, source.tableid,cb,idx,query);
}
} else if(alasql.databases[source.databaseid].tables[source.tableid].view){
source.datafn = function(query,params,cb,idx, alasql) {
var res = alasql.databases[source.databaseid].tables[source.tableid].select(params);
if(cb) res = cb(res,idx,query);
return res;
}
} else {
// console.log('here');
// console.log(420,72,alasql.databases[source.databaseid].tables[source.tableid]);
source.datafn = function(query,params,cb,idx, alasql) {
// if(!query) console.log('query');
// if(!query.database) console.log('query');
// if(!query.database.tables) console.log('query');
// if(!source.tableid) console.log('query');
// if(!query.database.tables[source.tableid]) console.log(query);
// if(!query.database.tables[source.tableid].data) console.log('query');
var res = alasql.databases[source.databaseid].tables[source.tableid].data;
// console.log(500,res);
if(cb) res = cb(res,idx,query);
// console.log(600,res);
return res;
// return alasql.databases[source.databaseid].tables[source.tableid].data;
};
}
} else if(tq instanceof yy.Select) {
source.subquery = tq.compile(query.database.databaseid);
if(typeof source.subquery.query.modifier == 'undefined') {
source.subquery.query.modifier = 'RECORDSET'; // Subqueries always return recordsets
}
source.columns = source.subquery.query.columns;
// console.log(101,source.columns);
// tq.columns;
source.datafn = function(query, params, cb, idx, alasql) {
// return source.subquery(query.params, cb, idx, query);
var res;
source.subquery(query.params, function(data){
res = data.data;
if(cb) res = cb(res,idx,query);
return res;
// return data.data;
});
// console.log(515,res);
return res;
}
} else if(tq instanceof yy.Search) {
source.subsearch = tq;
source.columns = [];
//.compile(query.database.databaseid);
// if(typeof source.subquery.query.modifier == 'undefined') {
// source.subquery.query.modifier = 'RECORDSET'; // Subqueries always return recordsets
// }
// source.columns = source.subquery.query.columns;
// console.log(101,source.columns);
// tq.columns;
source.datafn = function(query, params, cb, idx, alasql) {
// return source.subquery(query.params, cb, idx, query);
var res;
source.subsearch.execute(query.database.databaseid,query.params,function(data){
res = data;
if(cb) res = cb(res,idx,query);
return res;
// return data.data;
});
// console.log(515,res);
return res;
}
} else if(tq instanceof yy.ParamValue) {
var ps = "var res = alasql.prepareFromData(params['"+tq.param+"']";
// console.log(tq);
if(tq.array) ps+=",true";
ps += ");if(cb)res=cb(res,idx,query);return res"
source.datafn = new Function('query,params,cb,idx,alasql',ps);
} else if(tq instanceof yy.VarValue) {
var ps = "var res = alasql.prepareFromData(alasql.vars['"+tq.variable+"']";
// console.log(tq);
if(tq.array) ps+=",true";
ps += ");if(cb)res=cb(res,idx,query);return res"
source.datafn = new Function('query,params,cb,idx,alasql',ps);
} else if(tq instanceof yy.FuncValue) {
var s = "var res=alasql.from['"+tq.funcid.toUpperCase()+"'](";
// if(tq.args && tq.args.length>0) {
// s += tq.args.map(function(arg){
// return arg.toJavaScript();
// }).concat('cb,idx,query').join(',');
// }
// if(tq.args && tq.args.length>0) {
// s += tq.args.map(function(arg){
// return arg.toJavaScript();
// }).concat().join(',');
// }
if(tq.args && tq.args.length>0) {
if(tq.args[0]) {
s += tq.args[0].toJavaScript('query.oldscope')+',';
} else {
s += 'null,';
};
if(tq.args[1]) {
s += tq.args[1].toJavaScript('query.oldscope')+',';
} else {
s += 'null,';
};
} else {
s += 'null,null,'
}
s += 'cb,idx,query';
s += ');/*if(cb)res=cb(res,idx,query);*/return res';
// console.log(s);
source.datafn = new Function('query, params, cb, idx, alasql',s);
} else if(tq instanceof yy.FromData) {
source.datafn = function(query,params,cb,idx, alasql) {
var res = tq.data;
if(cb) res = cb(res,idx,query);
return res;
}
} else {
throw new Error('Wrong table at FROM');
}
// source.data = alasql.databases[source.databaseid].tables[source.tableid].data;
query.sources.push(source);
});
// TODO Add joins
query.defaultTableid = query.sources[0].alias;
//console.log(query.defaultTableid);
};
alasql.prepareFromData = function(data,array) {
//console.log(177,data,array);
var res = data;
if(typeof data == "string") {
res = data.split(/\r?\n/);
if(array) {
for(var i=0, ilen=res.length; i<ilen;i++) {
res[i] = [res[i]];
}
}
} else if(array) {
res = [];
for(var i=0, ilen=data.length; i<ilen;i++) {
res.push([data[i]]);
}
// console.log(res);
} else if(typeof data == 'object' && !(data instanceof Array)) {
// } else if(typeof data == 'object' && !(typeof data.length == 'undefined')) {
if(typeof Mongo != 'undefined' && typeof Mongo.Collection != 'undefined'
&& data instanceof Mongo.Collection) {
res = data.find().fetch();
} else {
res = [];
for(var key in data) {
if(data.hasOwnProperty(key)) res.push([key,data[key]]);
};
}
// console.log(res);
};
// console.log(typeof data);
return res;
};