@uwdata/mosaic-sql 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mosaic-sql.js +85 -2
- package/dist/mosaic-sql.min.js +1 -1
- package/package.json +2 -2
- package/src/datetime.js +1 -2
- package/src/index.js +4 -0
- package/src/scales.js +93 -0
package/dist/mosaic-sql.js
CHANGED
|
@@ -506,8 +506,7 @@ var castInteger = (expr) => cast(expr, "INTEGER");
|
|
|
506
506
|
|
|
507
507
|
// src/datetime.js
|
|
508
508
|
var epoch_ms = (expr) => {
|
|
509
|
-
|
|
510
|
-
return sql`(1000 * (epoch(${d}) - second(${d})) + millisecond(${d}))::DOUBLE`;
|
|
509
|
+
return sql`epoch_ms(${asColumn(expr)})`;
|
|
511
510
|
};
|
|
512
511
|
var dateMonth = (expr) => {
|
|
513
512
|
const d = asColumn(expr);
|
|
@@ -928,6 +927,89 @@ function isDoubleQuoted(s) {
|
|
|
928
927
|
return s[0] === '"' && s[s.length - 1] === '"';
|
|
929
928
|
}
|
|
930
929
|
|
|
930
|
+
// src/scales.js
|
|
931
|
+
var identity = (x2) => x2;
|
|
932
|
+
function scaleLinear() {
|
|
933
|
+
return {
|
|
934
|
+
apply: identity,
|
|
935
|
+
invert: identity,
|
|
936
|
+
sqlApply: asColumn,
|
|
937
|
+
sqlInvert: identity
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
function scaleLog({ base } = {}) {
|
|
941
|
+
if (base == null || base === Math.E) {
|
|
942
|
+
return {
|
|
943
|
+
apply: Math.log,
|
|
944
|
+
invert: Math.exp,
|
|
945
|
+
sqlApply: (c) => sql`LN(${asColumn(c)})`,
|
|
946
|
+
sqlInvert: (c) => sql`EXP(${c})`
|
|
947
|
+
};
|
|
948
|
+
} else if (base === 10) {
|
|
949
|
+
return {
|
|
950
|
+
apply: Math.log10,
|
|
951
|
+
invert: (x2) => Math.pow(10, x2),
|
|
952
|
+
sqlApply: (c) => sql`LOG(${asColumn(c)})`,
|
|
953
|
+
sqlInvert: (c) => sql`POW(10, ${c})`
|
|
954
|
+
};
|
|
955
|
+
} else {
|
|
956
|
+
const b = +base;
|
|
957
|
+
return {
|
|
958
|
+
apply: (x2) => Math.log(x2) / Math.log(b),
|
|
959
|
+
invert: (x2) => Math.pow(b, x2),
|
|
960
|
+
sqlApply: (c) => sql`LN(${asColumn(c)}) / LN(${b})`,
|
|
961
|
+
sqlInvert: (c) => sql`POW(${b}, ${c})`
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
function scaleSymlog({ constant = 1 } = {}) {
|
|
966
|
+
const _ = +constant;
|
|
967
|
+
return {
|
|
968
|
+
apply: (x2) => Math.sign(x2) * Math.log1p(Math.abs(x2)),
|
|
969
|
+
invert: (x2) => Math.sign(x2) * Math.exp(Math.abs(x2) - _),
|
|
970
|
+
sqlApply: (c) => (c = asColumn(c), sql`SIGN(${c}) * LN(${_} + ABS(${c}))`),
|
|
971
|
+
sqlInvert: (c) => sql`SIGN(${c}) * (EXP(ABS(${c})) - ${_})`
|
|
972
|
+
};
|
|
973
|
+
}
|
|
974
|
+
function scaleSqrt() {
|
|
975
|
+
return {
|
|
976
|
+
apply: (x2) => Math.sign(x2) * Math.sqrt(Math.abs(x2)),
|
|
977
|
+
invert: (x2) => Math.sign(x2) * x2 * x2,
|
|
978
|
+
sqlApply: (c) => (c = asColumn(c), sql`SIGN(${c}) * SQRT(ABS(${c}))`),
|
|
979
|
+
sqlInvert: (c) => sql`SIGN(${c}) * (${c}) ** 2`
|
|
980
|
+
};
|
|
981
|
+
}
|
|
982
|
+
function scalePow({ exponent = 1 } = {}) {
|
|
983
|
+
const e = +exponent;
|
|
984
|
+
return {
|
|
985
|
+
apply: (x2) => Math.sign(x2) * Math.pow(Math.abs(x2), e),
|
|
986
|
+
invert: (x2) => Math.sign(x2) * Math.pow(Math.abs(x2), 1 / e),
|
|
987
|
+
sqlApply: (c) => (c = asColumn(c), sql`SIGN(${c}) * POW(ABS(${c}), ${e})`),
|
|
988
|
+
sqlInvert: (c) => sql`SIGN(${c}) * POW(ABS(${c}), 1/${e})`
|
|
989
|
+
};
|
|
990
|
+
}
|
|
991
|
+
function scaleTime() {
|
|
992
|
+
return {
|
|
993
|
+
apply: (x2) => +x2,
|
|
994
|
+
invert: (x2) => new Date(x2),
|
|
995
|
+
sqlApply: (c) => c instanceof Date ? +c : epoch_ms(asColumn(c)),
|
|
996
|
+
sqlInvert: identity
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
var scales = {
|
|
1000
|
+
linear: scaleLinear,
|
|
1001
|
+
log: scaleLog,
|
|
1002
|
+
symlog: scaleSymlog,
|
|
1003
|
+
sqrt: scaleSqrt,
|
|
1004
|
+
pow: scalePow,
|
|
1005
|
+
time: scaleTime,
|
|
1006
|
+
utc: scaleTime
|
|
1007
|
+
};
|
|
1008
|
+
function scaleTransform(options) {
|
|
1009
|
+
const scale = scales[options.type];
|
|
1010
|
+
return scale ? { ...options, ...scale(options) } : null;
|
|
1011
|
+
}
|
|
1012
|
+
|
|
931
1013
|
// src/load/create.js
|
|
932
1014
|
function create(name, query, {
|
|
933
1015
|
replace = false,
|
|
@@ -1113,6 +1195,7 @@ export {
|
|
|
1113
1195
|
regrSlope,
|
|
1114
1196
|
relation,
|
|
1115
1197
|
row_number,
|
|
1198
|
+
scaleTransform,
|
|
1116
1199
|
skewness,
|
|
1117
1200
|
sql,
|
|
1118
1201
|
stddev,
|
package/dist/mosaic-sql.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var N=class{constructor(t,e){t&&(this.table=String(t)),e&&(this.column=e)}get columns(){return this.column?[this.column]:[]}toString(){let{table:t,column:e}=this;if(e){let n=e.startsWith("*")?e:`"${e}"`;return`${t?`${Q(t)}.`:""}${n}`}else return t?Q(t):"NULL"}};function Q(r){return r.split(".").map(e=>`"${e}"`).join(".")}function V(r,t){return r instanceof N&&r.column===t}function l(r){return typeof r=="string"?H(r):r}function I(r){return typeof r=="string"?k(r):r}function k(r){return new N(r)}function H(r,t){return arguments.length===1&&(t=r,r=null),new N(r,t)}function it(r){return new N(r,"*")}function ct(r){return typeof r=="string"?`"${r}"`:E(r)}function E(r){switch(typeof r){case"boolean":return r?"TRUE":"FALSE";case"string":return`'${r}'`;case"number":return Number.isFinite(r)?String(r):"NULL";default:if(r==null)return"NULL";if(r instanceof Date){let t=+r;if(Number.isNaN(t))return"NULL";let e=r.getUTCFullYear(),n=r.getUTCMonth(),o=r.getUTCDate();return t===Date.UTC(e,n,o)?`MAKE_DATE(${e}, ${n+1}, ${o})`:`EPOCH_MS(${t})`}else return r instanceof RegExp?`'${r.source}'`:String(r)}}var R=r=>typeof r?.addEventListener=="function";function _(r){return r instanceof S}var S=class{constructor(t,e,n){this._expr=Array.isArray(t)?t:[t],this._deps=e||[],this.annotate(n);let o=this._expr.filter(s=>R(s));o.length>0?(this._params=Array.from(new Set(o)),this._params.forEach(s=>{s.addEventListener("value",()=>at(this,this.map?.get("value")))})):this.addEventListener=void 0}get value(){return this}get columns(){let{_params:t,_deps:e}=this;if(t){let n=new Set(t.flatMap(o=>{let s=o.value?.columns;return Array.isArray(s)?s:[]}));if(n.size){let o=new Set(e);return n.forEach(s=>o.add(s)),Array.from(o)}}return e}get column(){return this._deps.length?this._deps[0]:this.columns[0]}annotate(...t){return Object.assign(this,...t)}toString(){return this._expr.map(t=>R(t)&&!_(t)?E(t.value):t).join("")}addEventListener(t,e){let n=this.map||(this.map=new Map);(n.get(t)||(n.set(t,new Set),n.get(t))).add(e)}};function at(r,t){if(t?.size)return Promise.allSettled(Array.from(t,e=>e(r)))}function M(r,t){let e=[r[0]],n=new Set,o=t.length;for(let s=0,i=0;s<o;){let c=t[s];R(c)?e[++i]=c:(Array.isArray(c?.columns)&&c.columns.forEach(x=>n.add(x)),e[i]+=typeof c=="string"?c:E(c));let p=r[++s];R(e[i])?e[++i]=p:e[i]+=p}return{spans:e,cols:Array.from(n)}}function u(r,...t){let{spans:e,cols:n}=M(r,t);return new S(e,n)}function ut(r){let t=l(r);return u`${t} DESC NULLS LAST`.annotate({label:t?.label,desc:!0})}var lt=r=>({value:r,toString:()=>E(r)});function D(r){r(this.op,this),this.children?.forEach(t=>t.visit(r))}function K(r,t){let e=t.filter(o=>o!=null).map(l),n=e.map((o,s)=>s?` ${r} `:"");return e.length===1?n.push(""):e.length>1&&(n[0]="(",n.push(")")),u(n,...e).annotate({op:r,children:e,visit:D})}var pt=(...r)=>K("AND",r.flat()),ft=(...r)=>K("OR",r.flat()),ht=r=>t=>u`(${r} ${l(t)})`.annotate({op:r,a:t,visit:D}),mt=ht("NOT"),v=r=>t=>u`(${l(t)} ${r})`.annotate({op:r,a:t,visit:D}),gt=v("IS NULL"),xt=v("IS NOT NULL"),w=r=>(t,e)=>u`(${l(t)} ${r} ${l(e)})`.annotate({op:r,a:t,b:e,visit:D}),dt=w("="),Et=w("<>"),$t=w("<"),yt=w(">"),Nt=w("<="),St=w(">="),wt=w("IS DISTINCT FROM"),At=w("IS NOT DISTINCT FROM");function z(r,t,e,n){t=l(t);let o=r.startsWith("NOT ")?"NOT ":"";return(e?n?u`${o}(${e[0]} <= ${t} AND ${t} < ${e[1]})`:u`(${t} ${r} ${e[0]} AND ${e[1]})`:u``).annotate({op:r,visit:D,field:t,range:e})}var Rt=(r,t,e)=>z("BETWEEN",r,t,e),Tt=(r,t,e)=>z("NOT BETWEEN",r,t,e);function T(r,t){return Array.from({length:r},()=>t)}function m(r,t){return(...e)=>{let n=e.map(l),o=t?`::${t}`:"";return(n.length?u([`${r}(`,...T(n.length-1,", "),`)${o}`],...n):u`${r}()${o}`).annotate({func:r,args:n})}}var bt=m("REGEXP_MATCHES"),Lt=m("CONTAINS"),Ot=m("PREFIX"),qt=m("SUFFIX"),It=m("LOWER"),Dt=m("UPPER"),Ct=m("LENGTH"),_t=m("ISNAN"),Ft=m("ISFINITE"),Pt=m("ISINF");var C=class r extends S{constructor(t,e,n,o,s="",i="",c=""){let p;if(o&&!(s||i||c))p=o?u`${e} OVER "${o}"`:u`${e} OVER ()`;else{let L=s&&i?" ":"",O=(s||i)&&c?" ":"";p=u`${e} OVER (${o?`"${o}" `:""}${s}${L}${i}${O}${c})`}n&&(p=u`(${p})::${n}`);let{_expr:y,_deps:A}=p;super(y,A,{window:t,func:e,type:n,name:o,group:s,order:i,frame:c})}get basis(){return this.column}get label(){let{func:t}=this;return t.label??t.toString()}over(t){let{window:e,func:n,type:o,group:s,order:i,frame:c}=this;return new r(e,n,o,t,s,i,c)}partitionby(...t){let e=t.flat().filter(y=>y).map(l),n=u(["PARTITION BY ",T(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:c,order:p,frame:x}=this;return new r(o,s,i,c,n,p,x)}orderby(...t){let e=t.flat().filter(y=>y).map(l),n=u(["ORDER BY ",T(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:c,group:p,frame:x}=this;return new r(o,s,i,c,p,n,x)}rows(t){let e=J("ROWS",t),{window:n,func:o,type:s,name:i,group:c,order:p}=this;return new r(n,o,s,i,c,p,e)}range(t){let e=J("RANGE",t),{window:n,func:o,type:s,name:i,group:c,order:p}=this;return new r(n,o,s,i,c,p,e)}};function J(r,t){if(R(t)){let e=u`${t}`;return e.toString=()=>`${r} ${Z(t.value)}`,e}return`${r} ${Z(t)}`}function Z(r){let[t,e]=r,n=t===0?"CURRENT ROW":Number.isFinite(t)?`${Math.abs(t)} PRECEDING`:"UNBOUNDED PRECEDING",o=e===0?"CURRENT ROW":Number.isFinite(e)?`${Math.abs(e)} FOLLOWING`:"UNBOUNDED FOLLOWING";return`BETWEEN ${n} AND ${o}`}function $(r,t){return(...e)=>{let n=m(r)(...e);return new C(r,n,t)}}var Ut=$("ROW_NUMBER","INTEGER"),jt=$("RANK","INTEGER"),Gt=$("DENSE_RANK","INTEGER"),Mt=$("PERCENT_RANK"),Yt=$("CUME_DIST"),Wt=$("NTILE"),Xt=$("LAG"),Bt=$("LEAD"),Qt=$("FIRST_VALUE"),Vt=$("LAST_VALUE"),kt=$("NTH_VALUE");function Ht(r,...t){return u(r,...t).annotate({aggregate:!0})}var Y=class r extends S{constructor(t,e,n,o,s){e=(e||[]).map(l);let{strings:i,exprs:c}=Kt(t,e,n,o,s),{spans:p,cols:x}=M(i,c);super(p,x,{aggregate:t,args:e,type:n,isDistinct:o,filter:s})}get basis(){return this.column}get label(){let{aggregate:t,args:e,isDistinct:n}=this,o=n?"DISTINCT"+(e.length?" ":""):"",s=e.length?`(${o}${e.map(vt).join(", ")})`:"";return`${t.toLowerCase()}${s}`}distinct(){let{aggregate:t,args:e,type:n,filter:o}=this;return new r(t,e,n,!0,o)}where(t){let{aggregate:e,args:n,type:o,isDistinct:s}=this;return new r(e,n,o,s,t)}window(){let{aggregate:t,args:e,type:n,isDistinct:o}=this,s=new r(t,e,null,o);return new C(t,s,n)}partitionby(...t){return this.window().partitionby(...t)}orderby(...t){return this.window().orderby(...t)}rows(t,e){return this.window().rows(t,e)}range(t,e){return this.window().range(t,e)}};function Kt(r,t,e,n,o){let s=`)${e?`::${e}`:""}`,i=[`${r}(${n?"DISTINCT ":""}`],c=[];return t.length?(i=i.concat([...T(t.length-1,", "),`${s}${o?" FILTER (WHERE ":""}`,...o?[")"]:[]]),c=[...t,...o?[o]:[]]):i[0]+="*"+s,{exprs:c,strings:i}}function vt(r){let t=E(r);return t&&t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t}function a(r,t){return(...e)=>new Y(r,e,t)}var zt=a("COUNT","INTEGER"),Jt=a("AVG"),Zt=a("AVG"),te=a("MAD"),ee=a("MAX"),re=a("MIN"),ne=a("SUM","DOUBLE"),oe=a("PRODUCT"),se=a("MEDIAN"),ie=a("QUANTILE"),ce=a("MODE"),ae=a("VARIANCE"),ue=a("STDDEV"),le=a("SKEWNESS"),pe=a("KURTOSIS"),fe=a("ENTROPY"),he=a("VAR_POP"),me=a("STDDEV_POP"),ge=a("CORR"),xe=a("COVAR_POP"),de=a("REGR_INTERCEPT"),Ee=a("REGR_SLOPE"),$e=a("REGR_COUNT"),ye=a("REGR_R2"),Ne=a("REGR_SYY"),Se=a("REGR_SXX"),we=a("REGR_SXY"),Ae=a("REGR_AVGX"),Re=a("REGR_AVGY"),Te=a("FIRST"),be=a("LAST"),Le=a("ARG_MIN"),Oe=a("ARG_MAX"),qe=a("STRING_AGG"),Ie=a("ARRAY_AGG");function W(r,t){let e=l(r),n=u`CAST(${e} AS ${t})`;return Object.defineProperty(n,"label",{enumerable:!0,get(){return r.label}}),Object.defineProperty(n,"aggregate",{enumerable:!0,get(){return r.aggregate||!1}}),n}var De=r=>W(r,"DOUBLE"),Ce=r=>W(r,"INTEGER");var _e=r=>{let t=l(r);return u`(1000 * (epoch(${t}) - second(${t})) + millisecond(${t}))::DOUBLE`},Fe=r=>{let t=l(r);return u`MAKE_DATE(2012, MONTH(${t}), 1)`.annotate({label:"month"})},Pe=r=>{let t=l(r);return u`MAKE_DATE(2012, MONTH(${t}), DAY(${t}))`.annotate({label:"date"})},Ue=r=>{let t=l(r);return u`MAKE_DATE(2012, 1, DAY(${t}))`.annotate({label:"date"})};var je=m("ST_AsGeoJSON"),tt=m("ST_X"),et=m("ST_Y"),X=m("ST_CENTROID"),Ge=r=>tt(X(r)),Me=r=>et(X(r));var U=class r{static select(...t){return new r().select(...t)}static from(...t){return new r().from(...t)}static with(...t){return new r().with(...t)}static union(...t){return new b("UNION",t.flat())}static unionAll(...t){return new b("UNION ALL",t.flat())}static intersect(...t){return new b("INTERSECT",t.flat())}static except(...t){return new b("EXCEPT",t.flat())}constructor(){this.query={with:[],select:[],from:[],where:[],groupby:[],having:[],window:[],qualify:[],orderby:[]}}clone(){let t=new r;return t.query={...this.query},t}with(...t){let{query:e}=this;if(t.length===0)return e.with;{let n=[],o=(s,i)=>{let c=i.clone();c.cteFor=this,n.push({as:s,query:c})};return t.flat().forEach(s=>{if(s!=null)if(s.as&&s.query)o(s.as,s.query);else for(let i in s)o(i,s[i])}),e.with=e.with.concat(n),this}}select(...t){let{query:e}=this;if(t.length===0)return e.select;{let n=[];for(let o of t.flat())if(o!=null)if(typeof o=="string")n.push({as:o,expr:l(o)});else if(o instanceof N)n.push({as:o.column,expr:o});else if(Array.isArray(o))n.push({as:o[0],expr:o[1]});else for(let s in o)n.push({as:F(s),expr:l(o[s])});return e.select=e.select.concat(n),this}}$select(...t){return this.query.select=[],this.select(...t)}distinct(t=!0){return this.query.distinct=!!t,this}from(...t){let{query:e}=this;if(t.length===0)return e.from;{let n=[];return t.flat().forEach(o=>{if(o!=null)if(typeof o=="string")n.push({as:o,from:I(o)});else if(o instanceof N)n.push({as:o.table,from:o});else if(P(o)||_(o))n.push({from:o});else if(Array.isArray(o))n.push({as:F(o[0]),from:I(o[1])});else for(let s in o)n.push({as:F(s),from:I(o[s])})}),e.from=e.from.concat(n),this}}$from(...t){return this.query.from=[],this.from(...t)}sample(t,e){let{query:n}=this;if(arguments.length===0)return n.sample;{let o=t;return typeof t=="number"&&(o=t>0&&t<1?{perc:100*t,method:e}:{rows:Math.round(t),method:e}),n.sample=o,this}}where(...t){let{query:e}=this;return t.length===0?e.where:(e.where=e.where.concat(t.flat().filter(n=>n)),this)}$where(...t){return this.query.where=[],this.where(...t)}groupby(...t){let{query:e}=this;return t.length===0?e.groupby:(e.groupby=e.groupby.concat(t.flat().filter(n=>n).map(l)),this)}$groupby(...t){return this.query.groupby=[],this.groupby(...t)}having(...t){let{query:e}=this;return t.length===0?e.having:(e.having=e.having.concat(t.flat().filter(n=>n)),this)}window(...t){let{query:e}=this;if(t.length===0)return e.window;{let n=[];return t.flat().forEach(o=>{if(o!=null)for(let s in o)n.push({as:F(s),expr:o[s]})}),e.window=e.window.concat(n),this}}qualify(...t){let{query:e}=this;return t.length===0?e.qualify:(e.qualify=e.qualify.concat(t.flat().filter(n=>n)),this)}orderby(...t){let{query:e}=this;return t.length===0?e.orderby:(e.orderby=e.orderby.concat(t.flat().filter(n=>n).map(l)),this)}limit(t){let{query:e}=this;return arguments.length===0?e.limit:(e.limit=Number.isFinite(t)?t:void 0,this)}offset(t){let{query:e}=this;return arguments.length===0?e.offset:(e.offset=Number.isFinite(t)?t:void 0,this)}get subqueries(){let{query:t,cteFor:e}=this,o=(e?.query||t).with?.reduce((i,{as:c,query:p})=>(i[c]=p,i),{}),s=[];return t.from.forEach(({from:i})=>{if(P(i))s.push(i);else if(o[i.table]){let c=o[i.table];s.push(c)}}),s}toString(){let{select:t,distinct:e,from:n,sample:o,where:s,groupby:i,having:c,window:p,qualify:x,orderby:y,limit:A,offset:L,with:O}=this.query,g=[];if(O.length){let f=O.map(({as:h,query:d})=>`"${h}" AS (${d})`);g.push(`WITH ${f.join(", ")}`)}let nt=t.map(({as:f,expr:h})=>V(h,f)&&!h.table?`${h}`:`${h} AS "${f}"`);if(g.push(`SELECT${e?" DISTINCT":""} ${nt.join(", ")}`),n.length){let f=n.map(({as:h,from:d})=>{let q=P(d)?`(${d})`:`${d}`;return!h||h===d.table?q:`${q} AS "${h}"`});g.push(`FROM ${f.join(", ")}`)}if(s.length){let f=s.map(String).filter(h=>h).join(" AND ");f&&g.push(`WHERE ${f}`)}if(o){let{rows:f,perc:h,method:d,seed:q}=o,ot=f?`${f} ROWS`:`${h} PERCENT`,st=d?` (${d}${q!=null?`, ${q}`:""})`:"";g.push(`USING SAMPLE ${ot}${st}`)}if(i.length&&g.push(`GROUP BY ${i.join(", ")}`),c.length){let f=c.map(String).filter(h=>h).join(" AND ");f&&g.push(`HAVING ${f}`)}if(p.length){let f=p.map(({as:h,expr:d})=>`"${h}" AS (${d})`);g.push(`WINDOW ${f.join(", ")}`)}if(x.length){let f=x.map(String).filter(h=>h).join(" AND ");f&&g.push(`QUALIFY ${f}`)}return y.length&&g.push(`ORDER BY ${y.join(", ")}`),Number.isFinite(A)&&g.push(`LIMIT ${A}`),Number.isFinite(L)&&g.push(`OFFSET ${L}`),g.join(" ")}},b=class r{constructor(t,e){this.op=t,this.queries=e.map(n=>n.clone()),this.query={orderby:[]}}clone(){let t=new r(this.op,this.queries);return t.query={...this.query},t}orderby(...t){let{query:e}=this;return t.length===0?e.orderby:(e.orderby=e.orderby.concat(t.flat().filter(n=>n).map(l)),this)}limit(t){let{query:e}=this;return arguments.length===0?e.limit:(e.limit=Number.isFinite(t)?t:void 0,this)}offset(t){let{query:e}=this;return arguments.length===0?e.offset:(e.offset=Number.isFinite(t)?t:void 0,this)}get subqueries(){let{queries:t,cteFor:e}=this;return e&&t.forEach(n=>n.cteFor=e),t}toString(){let{op:t,queries:e,query:{orderby:n,limit:o,offset:s}}=this,i=[e.join(` ${t} `)];return n.length&&i.push(`ORDER BY ${n.join(", ")}`),Number.isFinite(o)&&i.push(`LIMIT ${o}`),Number.isFinite(s)&&i.push(`OFFSET ${s}`),i.join(" ")}};function P(r){return r instanceof U||r instanceof b}function F(r){return Ye(r)?r.slice(1,-1):r}function Ye(r){return r[0]==='"'&&r[r.length-1]==='"'}function j(r,t,{replace:e=!1,temp:n=!0,view:o=!1}={}){return"CREATE"+(e?" OR REPLACE ":" ")+(n?"TEMP ":"")+(o?"VIEW":"TABLE")+(e?" ":" IF NOT EXISTS ")+r+" AS "+t}function We(r){return`INSTALL ${r}; LOAD ${r}`}function rt(r,{columns:t=Object.keys(r?.[0]||{})}={}){let e=[];if(Array.isArray(t)?(e=t,t=e.reduce((o,s)=>(o[s]=s,o),{})):t&&(e=Object.keys(t)),!e.length)throw new Error("Can not create table from empty column set.");let n=[];for(let o of r){let s=e.map(i=>`${E(o[i])} AS "${t[i]}"`);n.push(`(SELECT ${s.join(", ")})`)}return n.join(" UNION ALL ")}function G(r,t,e,n={},o={}){let{select:s=["*"],where:i,view:c,temp:p,replace:x,...y}=n,A=He({...o,...y}),L=`${r}('${e}'${A?", "+A:""})`,O=i?` WHERE ${i}`:"",g=`SELECT ${s.join(", ")} FROM ${L}${O}`;return j(t,g,{view:c,temp:p,replace:x})}function Xe(r,t,e){return G("read_csv",r,t,e,{auto_detect:!0,sample_size:-1})}function Be(r,t,e){return G("read_json",r,t,e,{auto_detect:!0,json_format:"auto"})}function Qe(r,t,e){return G("read_parquet",r,t,e)}function Ve(r,t,e={}){let{options:n,...o}=e;if(n){let s=Array.isArray(n)?n.join(", "):typeof n=="string"?n:Object.entries(n).map(([i,c])=>`${i}=${c}`).join(", ");o.open_options=s.toUpperCase()}return G("st_read",r,t,o)}function ke(r,t,e={}){let{select:n=["*"],...o}=e,s=rt(t),i=n.length===1&&n[0]==="*"?s:`SELECT ${n} FROM ${s}`;return j(r,i,o)}function He(r){return Object.entries(r).map(([t,e])=>`${t}=${B(e)}`).join(", ")}function B(r){switch(typeof r){case"boolean":return String(r);case"string":return`'${r}'`;case"undefined":case"object":return r==null?"NULL":Array.isArray(r)?"["+r.map(t=>B(t)).join(", ")+"]":"{"+Object.entries(r).map(([t,e])=>`'${t}': ${B(e)}`).join(", ")+"}";default:return r}}export{U as Query,N as Ref,Ht as agg,it as all,pt as and,Oe as argmax,Le as argmin,Ie as arrayAgg,l as asColumn,I as asRelation,Jt as avg,W as cast,De as castDouble,Ce as castInteger,X as centroid,Ge as centroidX,Me as centroidY,H as column,Lt as contains,ge as corr,zt as count,xe as covarPop,j as create,Yt as cume_dist,Ue as dateDay,Fe as dateMonth,Pe as dateMonthDay,Gt as dense_rank,ut as desc,fe as entropy,_e as epoch_ms,dt as eq,Te as first,Qt as first_value,je as geojson,yt as gt,St as gte,Rt as isBetween,wt as isDistinct,Ft as isFinite,Pt as isInfinite,_t as isNaN,Tt as isNotBetween,At as isNotDistinct,xt as isNotNull,gt as isNull,R as isParamLike,P as isQuery,_ as isSQLExpression,pe as kurtosis,Xt as lag,be as last,Vt as last_value,Bt as lead,Ct as length,lt as literal,E as literalToSQL,Xe as loadCSV,We as loadExtension,Be as loadJSON,ke as loadObjects,Qe as loadParquet,Ve as loadSpatial,It as lower,$t as lt,Nt as lte,te as mad,ee as max,Zt as mean,se as median,re as min,ce as mode,Et as neq,mt as not,kt as nth_value,Wt as ntile,ft as or,Mt as percent_rank,Ot as prefix,oe as product,ie as quantile,jt as rank,bt as regexp_matches,Ae as regrAvgX,Re as regrAvgY,$e as regrCount,de as regrIntercept,ye as regrR2,Se as regrSXX,we as regrSXY,Ne as regrSYY,Ee as regrSlope,k as relation,Ut as row_number,le as skewness,u as sql,ue as stddev,me as stddevPop,qe as stringAgg,qt as suffix,ne as sum,ct as toSQL,Dt as upper,he as varPop,ae as variance,tt as x,et as y};
|
|
1
|
+
var N=class{constructor(t,e){t&&(this.table=String(t)),e&&(this.column=e)}get columns(){return this.column?[this.column]:[]}toString(){let{table:t,column:e}=this;if(e){let n=e.startsWith("*")?e:`"${e}"`;return`${t?`${V(t)}.`:""}${n}`}else return t?V(t):"NULL"}};function V(r){return r.split(".").map(e=>`"${e}"`).join(".")}function k(r,t){return r instanceof N&&r.column===t}function u(r){return typeof r=="string"?K(r):r}function O(r){return typeof r=="string"?H(r):r}function H(r){return new N(r)}function K(r,t){return arguments.length===1&&(t=r,r=null),new N(r,t)}function ut(r){return new N(r,"*")}function lt(r){return typeof r=="string"?`"${r}"`:$(r)}function $(r){switch(typeof r){case"boolean":return r?"TRUE":"FALSE";case"string":return`'${r}'`;case"number":return Number.isFinite(r)?String(r):"NULL";default:if(r==null)return"NULL";if(r instanceof Date){let t=+r;if(Number.isNaN(t))return"NULL";let e=r.getUTCFullYear(),n=r.getUTCMonth(),o=r.getUTCDate();return t===Date.UTC(e,n,o)?`MAKE_DATE(${e}, ${n+1}, ${o})`:`EPOCH_MS(${t})`}else return r instanceof RegExp?`'${r.source}'`:String(r)}}var T=r=>typeof r?.addEventListener=="function";function M(r){return r instanceof S}var S=class{constructor(t,e,n){this._expr=Array.isArray(t)?t:[t],this._deps=e||[],this.annotate(n);let o=this._expr.filter(s=>T(s));o.length>0?(this._params=Array.from(new Set(o)),this._params.forEach(s=>{s.addEventListener("value",()=>pt(this,this.map?.get("value")))})):this.addEventListener=void 0}get value(){return this}get columns(){let{_params:t,_deps:e}=this;if(t){let n=new Set(t.flatMap(o=>{let s=o.value?.columns;return Array.isArray(s)?s:[]}));if(n.size){let o=new Set(e);return n.forEach(s=>o.add(s)),Array.from(o)}}return e}get column(){return this._deps.length?this._deps[0]:this.columns[0]}annotate(...t){return Object.assign(this,...t)}toString(){return this._expr.map(t=>T(t)&&!M(t)?$(t.value):t).join("")}addEventListener(t,e){let n=this.map||(this.map=new Map);(n.get(t)||(n.set(t,new Set),n.get(t))).add(e)}};function pt(r,t){if(t?.size)return Promise.allSettled(Array.from(t,e=>e(r)))}function W(r,t){let e=[r[0]],n=new Set,o=t.length;for(let s=0,i=0;s<o;){let a=t[s];T(a)?e[++i]=a:(Array.isArray(a?.columns)&&a.columns.forEach(d=>n.add(d)),e[i]+=typeof a=="string"?a:$(a));let p=r[++s];T(e[i])?e[++i]=p:e[i]+=p}return{spans:e,cols:Array.from(n)}}function c(r,...t){let{spans:e,cols:n}=W(r,t);return new S(e,n)}function ft(r){let t=u(r);return c`${t} DESC NULLS LAST`.annotate({label:t?.label,desc:!0})}var ht=r=>({value:r,toString:()=>$(r)});function D(r){r(this.op,this),this.children?.forEach(t=>t.visit(r))}function z(r,t){let e=t.filter(o=>o!=null).map(u),n=e.map((o,s)=>s?` ${r} `:"");return e.length===1?n.push(""):e.length>1&&(n[0]="(",n.push(")")),c(n,...e).annotate({op:r,children:e,visit:D})}var mt=(...r)=>z("AND",r.flat()),gt=(...r)=>z("OR",r.flat()),dt=r=>t=>c`(${r} ${u(t)})`.annotate({op:r,a:t,visit:D}),xt=dt("NOT"),J=r=>t=>c`(${u(t)} ${r})`.annotate({op:r,a:t,visit:D}),$t=J("IS NULL"),Et=J("IS NOT NULL"),w=r=>(t,e)=>c`(${u(t)} ${r} ${u(e)})`.annotate({op:r,a:t,b:e,visit:D}),yt=w("="),Nt=w("<>"),St=w("<"),wt=w(">"),At=w("<="),Tt=w(">="),Rt=w("IS DISTINCT FROM"),qt=w("IS NOT DISTINCT FROM");function Z(r,t,e,n){t=u(t);let o=r.startsWith("NOT ")?"NOT ":"";return(e?n?c`${o}(${e[0]} <= ${t} AND ${t} < ${e[1]})`:c`(${t} ${r} ${e[0]} AND ${e[1]})`:c``).annotate({op:r,visit:D,field:t,range:e})}var bt=(r,t,e)=>Z("BETWEEN",r,t,e),It=(r,t,e)=>Z("NOT BETWEEN",r,t,e);function R(r,t){return Array.from({length:r},()=>t)}function m(r,t){return(...e)=>{let n=e.map(u),o=t?`::${t}`:"";return(n.length?c([`${r}(`,...R(n.length-1,", "),`)${o}`],...n):c`${r}()${o}`).annotate({func:r,args:n})}}var Lt=m("REGEXP_MATCHES"),Ot=m("CONTAINS"),Dt=m("PREFIX"),_t=m("SUFFIX"),Mt=m("LOWER"),Ct=m("UPPER"),Pt=m("LENGTH"),Ft=m("ISNAN"),Gt=m("ISFINITE"),Ut=m("ISINF");var _=class r extends S{constructor(t,e,n,o,s="",i="",a=""){let p;if(o&&!(s||i||a))p=o?c`${e} OVER "${o}"`:c`${e} OVER ()`;else{let b=s&&i?" ":"",I=(s||i)&&a?" ":"";p=c`${e} OVER (${o?`"${o}" `:""}${s}${b}${i}${I}${a})`}n&&(p=c`(${p})::${n}`);let{_expr:y,_deps:A}=p;super(y,A,{window:t,func:e,type:n,name:o,group:s,order:i,frame:a})}get basis(){return this.column}get label(){let{func:t}=this;return t.label??t.toString()}over(t){let{window:e,func:n,type:o,group:s,order:i,frame:a}=this;return new r(e,n,o,t,s,i,a)}partitionby(...t){let e=t.flat().filter(y=>y).map(u),n=c(["PARTITION BY ",R(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:a,order:p,frame:d}=this;return new r(o,s,i,a,n,p,d)}orderby(...t){let e=t.flat().filter(y=>y).map(u),n=c(["ORDER BY ",R(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:a,group:p,frame:d}=this;return new r(o,s,i,a,p,n,d)}rows(t){let e=tt("ROWS",t),{window:n,func:o,type:s,name:i,group:a,order:p}=this;return new r(n,o,s,i,a,p,e)}range(t){let e=tt("RANGE",t),{window:n,func:o,type:s,name:i,group:a,order:p}=this;return new r(n,o,s,i,a,p,e)}};function tt(r,t){if(T(t)){let e=c`${t}`;return e.toString=()=>`${r} ${et(t.value)}`,e}return`${r} ${et(t)}`}function et(r){let[t,e]=r,n=t===0?"CURRENT ROW":Number.isFinite(t)?`${Math.abs(t)} PRECEDING`:"UNBOUNDED PRECEDING",o=e===0?"CURRENT ROW":Number.isFinite(e)?`${Math.abs(e)} FOLLOWING`:"UNBOUNDED FOLLOWING";return`BETWEEN ${n} AND ${o}`}function E(r,t){return(...e)=>{let n=m(r)(...e);return new _(r,n,t)}}var jt=E("ROW_NUMBER","INTEGER"),Wt=E("RANK","INTEGER"),Yt=E("DENSE_RANK","INTEGER"),vt=E("PERCENT_RANK"),Bt=E("CUME_DIST"),Xt=E("NTILE"),Qt=E("LAG"),Vt=E("LEAD"),kt=E("FIRST_VALUE"),Ht=E("LAST_VALUE"),Kt=E("NTH_VALUE");function zt(r,...t){return c(r,...t).annotate({aggregate:!0})}var Y=class r extends S{constructor(t,e,n,o,s){e=(e||[]).map(u);let{strings:i,exprs:a}=Jt(t,e,n,o,s),{spans:p,cols:d}=W(i,a);super(p,d,{aggregate:t,args:e,type:n,isDistinct:o,filter:s})}get basis(){return this.column}get label(){let{aggregate:t,args:e,isDistinct:n}=this,o=n?"DISTINCT"+(e.length?" ":""):"",s=e.length?`(${o}${e.map(Zt).join(", ")})`:"";return`${t.toLowerCase()}${s}`}distinct(){let{aggregate:t,args:e,type:n,filter:o}=this;return new r(t,e,n,!0,o)}where(t){let{aggregate:e,args:n,type:o,isDistinct:s}=this;return new r(e,n,o,s,t)}window(){let{aggregate:t,args:e,type:n,isDistinct:o}=this,s=new r(t,e,null,o);return new _(t,s,n)}partitionby(...t){return this.window().partitionby(...t)}orderby(...t){return this.window().orderby(...t)}rows(t,e){return this.window().rows(t,e)}range(t,e){return this.window().range(t,e)}};function Jt(r,t,e,n,o){let s=`)${e?`::${e}`:""}`,i=[`${r}(${n?"DISTINCT ":""}`],a=[];return t.length?(i=i.concat([...R(t.length-1,", "),`${s}${o?" FILTER (WHERE ":""}`,...o?[")"]:[]]),a=[...t,...o?[o]:[]]):i[0]+="*"+s,{exprs:a,strings:i}}function Zt(r){let t=$(r);return t&&t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t}function l(r,t){return(...e)=>new Y(r,e,t)}var te=l("COUNT","INTEGER"),ee=l("AVG"),re=l("AVG"),ne=l("MAD"),oe=l("MAX"),se=l("MIN"),ie=l("SUM","DOUBLE"),ce=l("PRODUCT"),ae=l("MEDIAN"),ue=l("QUANTILE"),le=l("MODE"),pe=l("VARIANCE"),fe=l("STDDEV"),he=l("SKEWNESS"),me=l("KURTOSIS"),ge=l("ENTROPY"),de=l("VAR_POP"),xe=l("STDDEV_POP"),$e=l("CORR"),Ee=l("COVAR_POP"),ye=l("REGR_INTERCEPT"),Ne=l("REGR_SLOPE"),Se=l("REGR_COUNT"),we=l("REGR_R2"),Ae=l("REGR_SYY"),Te=l("REGR_SXX"),Re=l("REGR_SXY"),qe=l("REGR_AVGX"),be=l("REGR_AVGY"),Ie=l("FIRST"),Le=l("LAST"),Oe=l("ARG_MIN"),De=l("ARG_MAX"),_e=l("STRING_AGG"),Me=l("ARRAY_AGG");function v(r,t){let e=u(r),n=c`CAST(${e} AS ${t})`;return Object.defineProperty(n,"label",{enumerable:!0,get(){return r.label}}),Object.defineProperty(n,"aggregate",{enumerable:!0,get(){return r.aggregate||!1}}),n}var Ce=r=>v(r,"DOUBLE"),Pe=r=>v(r,"INTEGER");var B=r=>c`epoch_ms(${u(r)})`,Fe=r=>{let t=u(r);return c`MAKE_DATE(2012, MONTH(${t}), 1)`.annotate({label:"month"})},Ge=r=>{let t=u(r);return c`MAKE_DATE(2012, MONTH(${t}), DAY(${t}))`.annotate({label:"date"})},Ue=r=>{let t=u(r);return c`MAKE_DATE(2012, 1, DAY(${t}))`.annotate({label:"date"})};var je=m("ST_AsGeoJSON"),rt=m("ST_X"),nt=m("ST_Y"),X=m("ST_CENTROID"),We=r=>rt(X(r)),Ye=r=>nt(X(r));var F=class r{static select(...t){return new r().select(...t)}static from(...t){return new r().from(...t)}static with(...t){return new r().with(...t)}static union(...t){return new q("UNION",t.flat())}static unionAll(...t){return new q("UNION ALL",t.flat())}static intersect(...t){return new q("INTERSECT",t.flat())}static except(...t){return new q("EXCEPT",t.flat())}constructor(){this.query={with:[],select:[],from:[],where:[],groupby:[],having:[],window:[],qualify:[],orderby:[]}}clone(){let t=new r;return t.query={...this.query},t}with(...t){let{query:e}=this;if(t.length===0)return e.with;{let n=[],o=(s,i)=>{let a=i.clone();a.cteFor=this,n.push({as:s,query:a})};return t.flat().forEach(s=>{if(s!=null)if(s.as&&s.query)o(s.as,s.query);else for(let i in s)o(i,s[i])}),e.with=e.with.concat(n),this}}select(...t){let{query:e}=this;if(t.length===0)return e.select;{let n=[];for(let o of t.flat())if(o!=null)if(typeof o=="string")n.push({as:o,expr:u(o)});else if(o instanceof N)n.push({as:o.column,expr:o});else if(Array.isArray(o))n.push({as:o[0],expr:o[1]});else for(let s in o)n.push({as:C(s),expr:u(o[s])});return e.select=e.select.concat(n),this}}$select(...t){return this.query.select=[],this.select(...t)}distinct(t=!0){return this.query.distinct=!!t,this}from(...t){let{query:e}=this;if(t.length===0)return e.from;{let n=[];return t.flat().forEach(o=>{if(o!=null)if(typeof o=="string")n.push({as:o,from:O(o)});else if(o instanceof N)n.push({as:o.table,from:o});else if(P(o)||M(o))n.push({from:o});else if(Array.isArray(o))n.push({as:C(o[0]),from:O(o[1])});else for(let s in o)n.push({as:C(s),from:O(o[s])})}),e.from=e.from.concat(n),this}}$from(...t){return this.query.from=[],this.from(...t)}sample(t,e){let{query:n}=this;if(arguments.length===0)return n.sample;{let o=t;return typeof t=="number"&&(o=t>0&&t<1?{perc:100*t,method:e}:{rows:Math.round(t),method:e}),n.sample=o,this}}where(...t){let{query:e}=this;return t.length===0?e.where:(e.where=e.where.concat(t.flat().filter(n=>n)),this)}$where(...t){return this.query.where=[],this.where(...t)}groupby(...t){let{query:e}=this;return t.length===0?e.groupby:(e.groupby=e.groupby.concat(t.flat().filter(n=>n).map(u)),this)}$groupby(...t){return this.query.groupby=[],this.groupby(...t)}having(...t){let{query:e}=this;return t.length===0?e.having:(e.having=e.having.concat(t.flat().filter(n=>n)),this)}window(...t){let{query:e}=this;if(t.length===0)return e.window;{let n=[];return t.flat().forEach(o=>{if(o!=null)for(let s in o)n.push({as:C(s),expr:o[s]})}),e.window=e.window.concat(n),this}}qualify(...t){let{query:e}=this;return t.length===0?e.qualify:(e.qualify=e.qualify.concat(t.flat().filter(n=>n)),this)}orderby(...t){let{query:e}=this;return t.length===0?e.orderby:(e.orderby=e.orderby.concat(t.flat().filter(n=>n).map(u)),this)}limit(t){let{query:e}=this;return arguments.length===0?e.limit:(e.limit=Number.isFinite(t)?t:void 0,this)}offset(t){let{query:e}=this;return arguments.length===0?e.offset:(e.offset=Number.isFinite(t)?t:void 0,this)}get subqueries(){let{query:t,cteFor:e}=this,o=(e?.query||t).with?.reduce((i,{as:a,query:p})=>(i[a]=p,i),{}),s=[];return t.from.forEach(({from:i})=>{if(P(i))s.push(i);else if(o[i.table]){let a=o[i.table];s.push(a)}}),s}toString(){let{select:t,distinct:e,from:n,sample:o,where:s,groupby:i,having:a,window:p,qualify:d,orderby:y,limit:A,offset:b,with:I}=this.query,g=[];if(I.length){let f=I.map(({as:h,query:x})=>`"${h}" AS (${x})`);g.push(`WITH ${f.join(", ")}`)}let it=t.map(({as:f,expr:h})=>k(h,f)&&!h.table?`${h}`:`${h} AS "${f}"`);if(g.push(`SELECT${e?" DISTINCT":""} ${it.join(", ")}`),n.length){let f=n.map(({as:h,from:x})=>{let L=P(x)?`(${x})`:`${x}`;return!h||h===x.table?L:`${L} AS "${h}"`});g.push(`FROM ${f.join(", ")}`)}if(s.length){let f=s.map(String).filter(h=>h).join(" AND ");f&&g.push(`WHERE ${f}`)}if(o){let{rows:f,perc:h,method:x,seed:L}=o,ct=f?`${f} ROWS`:`${h} PERCENT`,at=x?` (${x}${L!=null?`, ${L}`:""})`:"";g.push(`USING SAMPLE ${ct}${at}`)}if(i.length&&g.push(`GROUP BY ${i.join(", ")}`),a.length){let f=a.map(String).filter(h=>h).join(" AND ");f&&g.push(`HAVING ${f}`)}if(p.length){let f=p.map(({as:h,expr:x})=>`"${h}" AS (${x})`);g.push(`WINDOW ${f.join(", ")}`)}if(d.length){let f=d.map(String).filter(h=>h).join(" AND ");f&&g.push(`QUALIFY ${f}`)}return y.length&&g.push(`ORDER BY ${y.join(", ")}`),Number.isFinite(A)&&g.push(`LIMIT ${A}`),Number.isFinite(b)&&g.push(`OFFSET ${b}`),g.join(" ")}},q=class r{constructor(t,e){this.op=t,this.queries=e.map(n=>n.clone()),this.query={orderby:[]}}clone(){let t=new r(this.op,this.queries);return t.query={...this.query},t}orderby(...t){let{query:e}=this;return t.length===0?e.orderby:(e.orderby=e.orderby.concat(t.flat().filter(n=>n).map(u)),this)}limit(t){let{query:e}=this;return arguments.length===0?e.limit:(e.limit=Number.isFinite(t)?t:void 0,this)}offset(t){let{query:e}=this;return arguments.length===0?e.offset:(e.offset=Number.isFinite(t)?t:void 0,this)}get subqueries(){let{queries:t,cteFor:e}=this;return e&&t.forEach(n=>n.cteFor=e),t}toString(){let{op:t,queries:e,query:{orderby:n,limit:o,offset:s}}=this,i=[e.join(` ${t} `)];return n.length&&i.push(`ORDER BY ${n.join(", ")}`),Number.isFinite(o)&&i.push(`LIMIT ${o}`),Number.isFinite(s)&&i.push(`OFFSET ${s}`),i.join(" ")}};function P(r){return r instanceof F||r instanceof q}function C(r){return ve(r)?r.slice(1,-1):r}function ve(r){return r[0]==='"'&&r[r.length-1]==='"'}var G=r=>r;function Be(){return{apply:G,invert:G,sqlApply:u,sqlInvert:G}}function Xe({base:r}={}){if(r==null||r===Math.E)return{apply:Math.log,invert:Math.exp,sqlApply:t=>c`LN(${u(t)})`,sqlInvert:t=>c`EXP(${t})`};if(r===10)return{apply:Math.log10,invert:t=>Math.pow(10,t),sqlApply:t=>c`LOG(${u(t)})`,sqlInvert:t=>c`POW(10, ${t})`};{let t=+r;return{apply:e=>Math.log(e)/Math.log(t),invert:e=>Math.pow(t,e),sqlApply:e=>c`LN(${u(e)}) / LN(${t})`,sqlInvert:e=>c`POW(${t}, ${e})`}}}function Qe({constant:r=1}={}){let t=+r;return{apply:e=>Math.sign(e)*Math.log1p(Math.abs(e)),invert:e=>Math.sign(e)*Math.exp(Math.abs(e)-t),sqlApply:e=>(e=u(e),c`SIGN(${e}) * LN(${t} + ABS(${e}))`),sqlInvert:e=>c`SIGN(${e}) * (EXP(ABS(${e})) - ${t})`}}function Ve(){return{apply:r=>Math.sign(r)*Math.sqrt(Math.abs(r)),invert:r=>Math.sign(r)*r*r,sqlApply:r=>(r=u(r),c`SIGN(${r}) * SQRT(ABS(${r}))`),sqlInvert:r=>c`SIGN(${r}) * (${r}) ** 2`}}function ke({exponent:r=1}={}){let t=+r;return{apply:e=>Math.sign(e)*Math.pow(Math.abs(e),t),invert:e=>Math.sign(e)*Math.pow(Math.abs(e),1/t),sqlApply:e=>(e=u(e),c`SIGN(${e}) * POW(ABS(${e}), ${t})`),sqlInvert:e=>c`SIGN(${e}) * POW(ABS(${e}), 1/${t})`}}function ot(){return{apply:r=>+r,invert:r=>new Date(r),sqlApply:r=>r instanceof Date?+r:B(u(r)),sqlInvert:G}}var He={linear:Be,log:Xe,symlog:Qe,sqrt:Ve,pow:ke,time:ot,utc:ot};function Ke(r){let t=He[r.type];return t?{...r,...t(r)}:null}function U(r,t,{replace:e=!1,temp:n=!0,view:o=!1}={}){return"CREATE"+(e?" OR REPLACE ":" ")+(n?"TEMP ":"")+(o?"VIEW":"TABLE")+(e?" ":" IF NOT EXISTS ")+r+" AS "+t}function ze(r){return`INSTALL ${r}; LOAD ${r}`}function st(r,{columns:t=Object.keys(r?.[0]||{})}={}){let e=[];if(Array.isArray(t)?(e=t,t=e.reduce((o,s)=>(o[s]=s,o),{})):t&&(e=Object.keys(t)),!e.length)throw new Error("Can not create table from empty column set.");let n=[];for(let o of r){let s=e.map(i=>`${$(o[i])} AS "${t[i]}"`);n.push(`(SELECT ${s.join(", ")})`)}return n.join(" UNION ALL ")}function j(r,t,e,n={},o={}){let{select:s=["*"],where:i,view:a,temp:p,replace:d,...y}=n,A=nr({...o,...y}),b=`${r}('${e}'${A?", "+A:""})`,I=i?` WHERE ${i}`:"",g=`SELECT ${s.join(", ")} FROM ${b}${I}`;return U(t,g,{view:a,temp:p,replace:d})}function Je(r,t,e){return j("read_csv",r,t,e,{auto_detect:!0,sample_size:-1})}function Ze(r,t,e){return j("read_json",r,t,e,{auto_detect:!0,json_format:"auto"})}function tr(r,t,e){return j("read_parquet",r,t,e)}function er(r,t,e={}){let{options:n,...o}=e;if(n){let s=Array.isArray(n)?n.join(", "):typeof n=="string"?n:Object.entries(n).map(([i,a])=>`${i}=${a}`).join(", ");o.open_options=s.toUpperCase()}return j("st_read",r,t,o)}function rr(r,t,e={}){let{select:n=["*"],...o}=e,s=st(t),i=n.length===1&&n[0]==="*"?s:`SELECT ${n} FROM ${s}`;return U(r,i,o)}function nr(r){return Object.entries(r).map(([t,e])=>`${t}=${Q(e)}`).join(", ")}function Q(r){switch(typeof r){case"boolean":return String(r);case"string":return`'${r}'`;case"undefined":case"object":return r==null?"NULL":Array.isArray(r)?"["+r.map(t=>Q(t)).join(", ")+"]":"{"+Object.entries(r).map(([t,e])=>`'${t}': ${Q(e)}`).join(", ")+"}";default:return r}}export{F as Query,N as Ref,zt as agg,ut as all,mt as and,De as argmax,Oe as argmin,Me as arrayAgg,u as asColumn,O as asRelation,ee as avg,v as cast,Ce as castDouble,Pe as castInteger,X as centroid,We as centroidX,Ye as centroidY,K as column,Ot as contains,$e as corr,te as count,Ee as covarPop,U as create,Bt as cume_dist,Ue as dateDay,Fe as dateMonth,Ge as dateMonthDay,Yt as dense_rank,ft as desc,ge as entropy,B as epoch_ms,yt as eq,Ie as first,kt as first_value,je as geojson,wt as gt,Tt as gte,bt as isBetween,Rt as isDistinct,Gt as isFinite,Ut as isInfinite,Ft as isNaN,It as isNotBetween,qt as isNotDistinct,Et as isNotNull,$t as isNull,T as isParamLike,P as isQuery,M as isSQLExpression,me as kurtosis,Qt as lag,Le as last,Ht as last_value,Vt as lead,Pt as length,ht as literal,$ as literalToSQL,Je as loadCSV,ze as loadExtension,Ze as loadJSON,rr as loadObjects,tr as loadParquet,er as loadSpatial,Mt as lower,St as lt,At as lte,ne as mad,oe as max,re as mean,ae as median,se as min,le as mode,Nt as neq,xt as not,Kt as nth_value,Xt as ntile,gt as or,vt as percent_rank,Dt as prefix,ce as product,ue as quantile,Wt as rank,Lt as regexp_matches,qe as regrAvgX,be as regrAvgY,Se as regrCount,ye as regrIntercept,we as regrR2,Te as regrSXX,Re as regrSXY,Ae as regrSYY,Ne as regrSlope,H as relation,jt as row_number,Ke as scaleTransform,he as skewness,c as sql,fe as stddev,xe as stddevPop,_e as stringAgg,_t as suffix,ie as sum,lt as toSQL,Ct as upper,de as varPop,pe as variance,rt as x,nt as y};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uwdata/mosaic-sql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "SQL query construction and analysis.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sql",
|
|
@@ -25,5 +25,5 @@
|
|
|
25
25
|
"test": "mocha 'test/**/*-test.js'",
|
|
26
26
|
"prepublishOnly": "npm run test && npm run lint && npm run build"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "51517b28e916e355f4ce0dc6e98aef3a1db3f7b2"
|
|
29
29
|
}
|
package/src/datetime.js
CHANGED
|
@@ -2,8 +2,7 @@ import { sql } from './expression.js';
|
|
|
2
2
|
import { asColumn } from './ref.js';
|
|
3
3
|
|
|
4
4
|
export const epoch_ms = expr => {
|
|
5
|
-
|
|
6
|
-
return sql`(1000 * (epoch(${d}) - second(${d})) + millisecond(${d}))::DOUBLE`;
|
|
5
|
+
return sql`epoch_ms(${asColumn(expr)})`;
|
|
7
6
|
};
|
|
8
7
|
|
|
9
8
|
export const dateMonth = expr => {
|
package/src/index.js
CHANGED
package/src/scales.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { epoch_ms } from './datetime.js';
|
|
2
|
+
import { sql } from './expression.js';
|
|
3
|
+
import { asColumn } from './ref.js';
|
|
4
|
+
|
|
5
|
+
const identity = x => x;
|
|
6
|
+
|
|
7
|
+
function scaleLinear() {
|
|
8
|
+
return {
|
|
9
|
+
apply: identity,
|
|
10
|
+
invert: identity,
|
|
11
|
+
sqlApply: asColumn,
|
|
12
|
+
sqlInvert: identity
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function scaleLog({ base } = {}) {
|
|
17
|
+
if (base == null || base === Math.E) {
|
|
18
|
+
return {
|
|
19
|
+
apply: Math.log,
|
|
20
|
+
invert: Math.exp,
|
|
21
|
+
sqlApply: c => sql`LN(${asColumn(c)})`,
|
|
22
|
+
sqlInvert: c => sql`EXP(${c})`
|
|
23
|
+
};
|
|
24
|
+
} else if (base === 10) {
|
|
25
|
+
return {
|
|
26
|
+
apply: Math.log10,
|
|
27
|
+
invert: x => Math.pow(10, x),
|
|
28
|
+
sqlApply: c => sql`LOG(${asColumn(c)})`,
|
|
29
|
+
sqlInvert: c => sql`POW(10, ${c})`
|
|
30
|
+
};
|
|
31
|
+
} else {
|
|
32
|
+
const b = +base;
|
|
33
|
+
return {
|
|
34
|
+
apply: x => Math.log(x) / Math.log(b),
|
|
35
|
+
invert: x => Math.pow(b, x),
|
|
36
|
+
sqlApply: c => sql`LN(${asColumn(c)}) / LN(${b})`,
|
|
37
|
+
sqlInvert: c => sql`POW(${b}, ${c})`
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function scaleSymlog({ constant = 1 } = {}) {
|
|
43
|
+
const _ = +constant;
|
|
44
|
+
return {
|
|
45
|
+
apply: x => Math.sign(x) * Math.log1p(Math.abs(x)),
|
|
46
|
+
invert: x => Math.sign(x) * Math.exp(Math.abs(x) - _),
|
|
47
|
+
sqlApply: c => (c = asColumn(c), sql`SIGN(${c}) * LN(${_} + ABS(${c}))`),
|
|
48
|
+
sqlInvert: c => sql`SIGN(${c}) * (EXP(ABS(${c})) - ${_})`
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function scaleSqrt() {
|
|
53
|
+
return {
|
|
54
|
+
apply: x => Math.sign(x) * Math.sqrt(Math.abs(x)),
|
|
55
|
+
invert: x => Math.sign(x) * x * x,
|
|
56
|
+
sqlApply: c => (c = asColumn(c), sql`SIGN(${c}) * SQRT(ABS(${c}))`),
|
|
57
|
+
sqlInvert: c => sql`SIGN(${c}) * (${c}) ** 2`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function scalePow({ exponent = 1 } = {}) {
|
|
62
|
+
const e = +exponent;
|
|
63
|
+
return {
|
|
64
|
+
apply: x => Math.sign(x) * Math.pow(Math.abs(x), e),
|
|
65
|
+
invert: x => Math.sign(x) * Math.pow(Math.abs(x), 1/e),
|
|
66
|
+
sqlApply: c => (c = asColumn(c), sql`SIGN(${c}) * POW(ABS(${c}), ${e})`),
|
|
67
|
+
sqlInvert: c => sql`SIGN(${c}) * POW(ABS(${c}), 1/${e})`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function scaleTime() {
|
|
72
|
+
return {
|
|
73
|
+
apply: x => +x,
|
|
74
|
+
invert: x => new Date(x),
|
|
75
|
+
sqlApply: c => c instanceof Date ? +c : epoch_ms(asColumn(c)),
|
|
76
|
+
sqlInvert: identity
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const scales = {
|
|
81
|
+
linear: scaleLinear,
|
|
82
|
+
log: scaleLog,
|
|
83
|
+
symlog: scaleSymlog,
|
|
84
|
+
sqrt: scaleSqrt,
|
|
85
|
+
pow: scalePow,
|
|
86
|
+
time: scaleTime,
|
|
87
|
+
utc: scaleTime
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export function scaleTransform(options) {
|
|
91
|
+
const scale = scales[options.type];
|
|
92
|
+
return scale ? { ...options, ...scale(options) } : null;
|
|
93
|
+
}
|