Last active
August 29, 2015 14:27
-
-
Save nikhedonia/c2037def42c224efaaf0 to your computer and use it in GitHub Desktop.
ES7SQL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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