Skip to content

Instantly share code, notes, and snippets.

@nikhedonia
Last active August 29, 2015 14:27
Show Gist options
  • Save nikhedonia/c2037def42c224efaaf0 to your computer and use it in GitHub Desktop.
Save nikhedonia/c2037def42c224efaaf0 to your computer and use it in GitHub Desktop.
ES7SQL
function extend(...args) {
let obj = this||{};
const l = args.length;
for (let i=0; i < l; i++) {
for (let k in args[i]) {
obj[k] = args[i][k];
}
}
return obj;
}
function get(x){
return (obj,i)=>obj[x][i];
}
function As(as){
if(typeof(this)=='function'){
return {[as]:this};
}
return {[as]:get(this)};
}
function Select(...args){
const def= args.map(a=>(typeof(a)=='object')?a:({[a]:get(a)}));
const e=extend(...def);
return function(){
let i=0;
let T={};
const rkeys = Object.keys(e);
const okeys = Object.keys(this);
const N= Math.max(...okeys.map(k=>this[k].length));
rkeys.forEach(k=>{
T[k]=[];
});
for (let i=0; i<N; ++i) {
rkeys.forEach(k=>{
T[k].push( e[k](this,i) );
});
}
return T;
}
}
function From(...Tables){
const Selector = this;
const Table = cartesian(...Tables);
return [Selector,Table];
}
function Where(...cond){
const [Selector,Table] = this;
var T={};
const keys =Object.keys(Table);
const N= Math.max(...keys.map(k=>Table[k].length));
keys.forEach(k=>{
T[k]=[];
});
for (let i=0; i<N; ++i) {
let c=cond.map((c)=>c(Table,i)).reduce( (a,b)=>(a&&b) , 1);
c&&keys.forEach(k=>{
T[k].push( Table[k][i] );
})
}
return [Selector,T];
}
function cartesian(left,right,...next){
if(!right){ return left; }
const lkeys=Object.keys(left);
const rkeys=Object.keys(right).filter( k=>lkeys.indexOf(k)==-1 );
const keys=[...lkeys,...rkeys];
const N= Math.max(...lkeys.map(k=>left[k].length));
const M= Math.max(...rkeys.map(k=>right[k].length));
var T={};
keys.forEach(k=>{
T[k]=[];
});
var i=0,j=0;
var checker = this||All();
for(let i=0,j=0; i<N; i+= !(j=(1+j)%M) ){
const c = checker( extend( Row(left,i), Row(right,j) ) );
c.forEach( (c,l) =>{
const keys = [lkeys,rkeys][l%2];
const obj = [left,right][l%2];
const idx = [i,j][l%2];
keys.forEach(k=>{
T[k].push( c( obj[k][idx] ) );
});
});
}
return this::cartesian(T,...next);
}
function Sum(k){
return function (o){
return o[k].reduce( (a,b)=>a+b,0);
}
}
function OrderBy(k,o='asc'){
var dir=1;
if(o.toLowerCase()=='desc'){ dir=-1 }
const keys = Object.keys(this);
const sorted = this[k].map( (_,i)=>i ).sort( (a,b)=>{
if(this[k][a]<this[k][b]){ return 1*dir;}
if(this[k][a]>this[k][b]){ return -1*dir;}
return 0;
});
keys.forEach( k=>{
this[k]= sorted.map( i=> this[k][i] );
})
return this;
}
const Id=(x=>x);
const Null=(_=>null)
function Row($,i){
return (this||Id)(Object.keys($).map((k)=>({[k]:$[k][i]})).reduce(extend,{}))
}
function Exec(){
return this[1]::this[0]();
}
function All(){
return [this[0],this[1],_=>_=>{
return [Id,Id];
}]
}
function Left(){
return [this[0],this[1],cond=>a=>{
if( cond(a) ) { return [Id,Null]; }
return [Id,Id];
}]
}
function Inner(){
return [this[0],this[1],cond=>a=>{
if( cond(a) ) { return [Id,Id]; }
return [];
}]
}
function Outer(){
return [this[0],this[1],cond=>a=>{
if( cond(a) ) { return [Id,Id]; }
return [Id,Null,Null,Id];
}]
}
function Right(){
return [this[0],this[1],cond=>a=>{
if( cond(a) ) { return [Null,Id]; }
return [Id,Id];
}]
}
function Join(right){
return [this[0],[this[1],right],this[2]||[]::Inner()[2]];
}
function On(cond){
return [this[0], this[2](cond)::cartesian(...this[1]) ];
}
function prefix(p){
return Object.keys(this)
.map(k=>[k,p+k])
.map(x=>({[x[1]]:this[x[0]]}))
.reduce((a,b)=> extend(a,b) );
}
var Table={
x:[5,4,3],
y:[3,2,1],
z:[5,1,1]
};
var newTable = Select(
'T1_x',
'T2_x',
)
::From(Table::prefix('T1_'))
::Outer()::Join(Table::prefix('T2_'))
::On( ($=>$.T1_x==$.T2_x) )
::Where(
// ($=>$.x<5)::Row
)
::Exec();
console.log(newTable);
/*
https://babeljs.io/repl/#?experimental=true&evaluate=true&loose=true&spec=false&code=function%20extend(...args)%20%7B%0A%20%20let%20obj%20%3D%20this%7C%7C%7B%7D%3B%0A%20%20const%20l%20%3D%20args.length%3B%0A%20%20for%20(let%20i%3D0%3B%20i%20%3C%20l%3B%20i%2B%2B)%20%7B%0A%20%20%20%20for%20(let%20k%20in%20args%5Bi%5D)%20%7B%0A%20%20%20%20%20%20obj%5Bk%5D%20%3D%20args%5Bi%5D%5Bk%5D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20return%20obj%3B%0A%7D%0A%0Afunction%20get(x)%7B%0A%20%20return%20(obj%2Ci)%3D%3Eobj%5Bx%5D%5Bi%5D%3B%0A%7D%0A%0Afunction%20As(as)%7B%0A%20%20if(typeof(this)%3D%3D'function')%7B%0A%20%20%20%20return%20%7B%5Bas%5D%3Athis%7D%3B%20%0A%20%20%7D%0A%20%20return%20%7B%5Bas%5D%3Aget(this)%7D%3B%0A%7D%0A%0Afunction%20Select(...args)%7B%0A%20%20const%20def%3D%20args.map(a%3D%3E(typeof(a)%3D%3D'object')%3Fa%3A(%7B%5Ba%5D%3Aget(a)%7D))%3B%0A%20%20const%20e%3Dextend(...def)%3B%0A%20%20return%20function()%7B%0A%20%20%20%20let%20i%3D0%3B%0A%20%20%20%20let%20T%3D%7B%7D%3B%0A%0A%20%20%20%20const%20rkeys%20%3D%20Object.keys(e)%3B%0A%20%20%20%20const%20okeys%20%3D%20Object.keys(this)%3B%0A%20%20%20%20const%20N%3D%20Math.max(...okeys.map(k%3D%3Ethis%5Bk%5D.length))%3B%0A%0A%20%20%20%20rkeys.forEach(k%3D%3E%7B%0A%20%20%20%20%20%20T%5Bk%5D%3D%5B%5D%3B%0A%20%20%20%20%7D)%3B%20%20%20%0A%20%20%20%20%20%20%0A%20%20%20%20for%20(let%20i%3D0%3B%20i%3CN%3B%20%2B%2Bi)%20%7B%0A%20%20%20%20%20%20rkeys.forEach(k%3D%3E%7B%0A%20%20%20%20%20%20%20%20T%5Bk%5D.push(%20e%5Bk%5D(this%2Ci)%20)%3B%0A%20%20%20%20%20%20%7D)%3B%20%20%0A%20%20%20%20%7D%0A%20%20%20%20return%20T%3B%0A%20%20%7D%0A%7D%0A%0Afunction%20From(...Tables)%7B%0A%20%20const%20Selector%20%3D%20this%3B%0A%20%20const%20Table%20%3D%20cartesian(...Tables)%3B%0A%20%20return%20%5BSelector%2CTable%5D%3B%0A%7D%0A%0Afunction%20Where(...cond)%7B%0A%20%20const%20%5BSelector%2CTable%5D%20%3D%20this%3B%0A%20%20%0A%20%20var%20T%3D%7B%7D%3B%0A%20%20const%20keys%20%3DObject.keys(Table)%3B%0A%20%20const%20N%3D%20Math.max(...keys.map(k%3D%3ETable%5Bk%5D.length))%3B%0A%20%20%20%20%0A%20%20keys.forEach(k%3D%3E%7B%0A%20%20%20%20T%5Bk%5D%3D%5B%5D%3B%0A%20%20%7D)%3B%20%20%20%0A%20%20%20%20%0A%20%20for%20(let%20i%3D0%3B%20i%3CN%3B%20%2B%2Bi)%20%7B%0A%20%20%20%20let%20c%3Dcond.map((c)%3D%3Ec(Table%2Ci)).reduce(%20(a%2Cb)%3D%3E(a%26%26b)%20%2C%201)%3B%0A%20%20%20%20c%26%26keys.forEach(k%3D%3E%7B%0A%20%20%20%20%20%20T%5Bk%5D.push(%20Table%5Bk%5D%5Bi%5D%20)%3B%0A%20%20%20%20%7D)%0A%20%20%7D%0A%0A%20%20return%20%5BSelector%2CT%5D%3B%0A%7D%0A%0Afunction%20cartesian(left%2Cright%2C...next)%7B%0A%20%20if(!right)%7B%20return%20left%3B%20%7D%0A%20%20const%20lkeys%3DObject.keys(left)%3B%0A%20%20const%20rkeys%3DObject.keys(right).filter(%20k%3D%3Elkeys.indexOf(k)%3D%3D-1%20)%3B%0A%20%20const%20keys%3D%5B...lkeys%2C...rkeys%5D%3B%0A%20%20const%20N%3D%20Math.max(...lkeys.map(k%3D%3Eleft%5Bk%5D.length))%3B%0A%20%20const%20M%3D%20Math.max(...rkeys.map(k%3D%3Eright%5Bk%5D.length))%3B%0A%20%20%0A%20%20var%20T%3D%7B%7D%3B%0A%20%20keys.forEach(k%3D%3E%7B%0A%20%20%20%20T%5Bk%5D%3D%5B%5D%3B%0A%20%20%7D)%3B%20%20%20%0A%20%20%0A%20%20var%20i%3D0%2Cj%3D0%3B%0A%20%20var%20checker%20%3D%20this%7C%7CAll()%3B%0A%20%20%20%20%20%20%0A%20%20for(let%20i%3D0%2Cj%3D0%3B%20i%3CN%3B%20%20i%2B%3D%20!(j%3D(1%2Bj)%25M)%20)%7B%0A%20%20%20%20%0A%20%20%20%20const%20c%20%3D%20checker(%20extend(%20Row(left%2Ci)%2C%20Row(right%2Cj)%20)%20)%3B%0A%20%20%20%20%0A%20%20%20%20c.forEach(%20(c%2Cl)%20%3D%3E%7B%0A%20%20%20%20%20%20const%20keys%20%3D%20%5Blkeys%2Crkeys%5D%5Bl%252%5D%3B%0A%20%20%20%20%20%20const%20obj%20%3D%20%5Bleft%2Cright%5D%5Bl%252%5D%3B%0A%20%20%20%20%20%20const%20idx%20%3D%20%5Bi%2Cj%5D%5Bl%252%5D%3B%0A%20%20%20%20%20%20keys.forEach(k%3D%3E%7B%0A%20%20%20%20%20%20%20%20T%5Bk%5D.push(%20c(%20obj%5Bk%5D%5Bidx%5D%20)%20)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D)%3B%0A%20%20%20%20%0A%20%20%7D%0A%20%20%20%20%0A%20%20return%20this%3A%3Acartesian(T%2C...next)%3B%0A%7D%0A%0A%0Afunction%20Sum(k)%7B%0A%20%20return%20function%20(o)%7B%0A%20%20%20%20return%20o%5Bk%5D.reduce(%20(a%2Cb)%3D%3Ea%2Bb%2C0)%3B%0A%20%20%7D%20%0A%7D%0A%0Afunction%20OrderBy(k%2Co%3D'asc')%7B%0A%20%20var%20dir%3D1%3B%0A%20%20if(o.toLowerCase()%3D%3D'desc')%7B%20dir%3D-1%20%7D%0A%20%20const%20keys%20%3D%20Object.keys(this)%3B%0A%20%20const%20sorted%20%3D%20this%5Bk%5D.map(%20(_%2Ci)%3D%3Ei%20).sort(%20(a%2Cb)%3D%3E%7B%0A%20%20%20%20if(this%5Bk%5D%5Ba%5D%3Cthis%5Bk%5D%5Bb%5D)%7B%20return%201*dir%3B%7D%0A%20%20%20%20if(this%5Bk%5D%5Ba%5D%3Ethis%5Bk%5D%5Bb%5D)%7B%20return%20-1*dir%3B%7D%0A%20%20%20%20return%200%3B%0A%20%20%7D)%3B%0A%20%20%0A%20%20keys.forEach(%20k%3D%3E%7B%0A%20%20%20%20this%5Bk%5D%3D%20sorted.map(%20i%3D%3E%20this%5Bk%5D%5Bi%5D%20)%3B%0A%20%20%7D)%0A%20%20%0A%20%20return%20this%3B%0A%0A%7D%0A%0Aconst%20Id%3D(x%3D%3Ex)%3B%0Aconst%20Null%3D(_%3D%3Enull)%0A%0Afunction%20Row(%24%2Ci)%7B%0A%20%20return%20(this%7C%7CId)(Object.keys(%24).map((k)%3D%3E(%7B%5Bk%5D%3A%24%5Bk%5D%5Bi%5D%7D)).reduce(extend%2C%7B%7D))%0A%7D%0A%0A%0Afunction%20Exec()%7B%0A%20%20return%20this%5B1%5D%3A%3Athis%5B0%5D()%3B%0A%7D%0A%0Afunction%20All()%7B%0A%20%20return%20%5Bthis%5B0%5D%2Cthis%5B1%5D%2C_%3D%3E_%3D%3E%7B%0A%20%20%20%20return%20%5BId%2CId%5D%3B%0A%20%20%7D%5D%0A%7D%0A%0Afunction%20Left()%7B%0A%20%20return%20%5Bthis%5B0%5D%2Cthis%5B1%5D%2Ccond%3D%3Ea%3D%3E%7B%0A%20%20%20%20%20%20if(%20cond(a)%20)%20%7B%20return%20%5BId%2CNull%5D%3B%20%7D%0A%20%20%20%20%20%20return%20%5BId%2CId%5D%3B%0A%20%20%7D%5D%0A%7D%0A%0Afunction%20Inner()%7B%0A%20%20return%20%5Bthis%5B0%5D%2Cthis%5B1%5D%2Ccond%3D%3Ea%3D%3E%7B%0A%20%20%20%20%20%20if(%20cond(a)%20)%20%7B%20return%20%5BId%2CId%5D%3B%20%7D%0A%20%20%20%20%20%20return%20%5B%5D%3B%0A%20%20%7D%5D%0A%7D%0A%0Afunction%20Outer()%7B%0A%20%20return%20%5Bthis%5B0%5D%2Cthis%5B1%5D%2Ccond%3D%3Ea%3D%3E%7B%0A%20%20%20%20%20%20if(%20cond(a)%20)%20%7B%20return%20%5BId%2CId%5D%3B%20%7D%0A%20%20%20%20%20%20return%20%5BId%2CNull%2CNull%2CId%5D%3B%0A%20%20%7D%5D%0A%7D%0A%0Afunction%20Right()%7B%0A%20%20return%20%5Bthis%5B0%5D%2Cthis%5B1%5D%2Ccond%3D%3Ea%3D%3E%7B%0A%20%20%20%20%20%20if(%20cond(a)%20)%20%7B%20return%20%5BNull%2CId%5D%3B%20%7D%0A%20%20%20%20%20%20return%20%5BId%2CId%5D%3B%0A%20%20%7D%5D%0A%7D%0A%0A%0Afunction%20Join(right)%7B%0A%20%20return%20%5Bthis%5B0%5D%2C%5Bthis%5B1%5D%2Cright%5D%2Cthis%5B2%5D%7C%7C%5B%5D%3A%3AInner()%5B2%5D%5D%3B%0A%7D%0A%0Afunction%20On(cond)%7B%0A%20%20return%20%5Bthis%5B0%5D%2C%20this%5B2%5D(cond)%3A%3Acartesian(...this%5B1%5D)%20%5D%3B%0A%7D%0A%0Afunction%20prefix(p)%7B%0A%20%20return%20Object.keys(this)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.map(k%3D%3E%5Bk%2Cp%2Bk%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.map(x%3D%3E(%7B%5Bx%5B1%5D%5D%3Athis%5Bx%5B0%5D%5D%7D))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.reduce((a%2Cb)%3D%3E%20extend(a%2Cb)%20)%3B%0A%7D%0A%0Avar%20Table%3D%7B%0A%20%20x%3A%5B5%2C4%2C3%5D%2C%0A%20%20y%3A%5B3%2C2%2C1%5D%2C%0A%20%20z%3A%5B5%2C1%2C1%5D%0A%7D%3B%0A%0Avar%20newTable%20%3D%20Select(%0A%20%20'T1_x'%2C%0A%20%20'T2_x'%2C%0A)%0A%3A%3AFrom(Table%3A%3Aprefix('T1_'))%0A%3A%3AOuter()%3A%3AJoin(Table%3A%3Aprefix('T2_'))%0A%20%20%3A%3AOn(%20(%24%3D%3E%24.T1_x%3D%3D%24.T2_x)%20)%0A%3A%3AWhere(%0A%20%2F%2F%20(%24%3D%3E%24.x%3C5)%3A%3ARow%20%20%0A)%0A%3A%3AExec()%3B%0A%0Aconsole.log(newTable)%3B%0A%0A
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment