@uwdata/mosaic-sql 0.2.0 → 0.3.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.
@@ -649,7 +649,7 @@ var Query = class {
649
649
  } else {
650
650
  let spec = value;
651
651
  if (typeof value === "number") {
652
- spec = value > 0 && value < 1 ? { perc: 100 * value, method } : { rows: Math.round(value, method) };
652
+ spec = value > 0 && value < 1 ? { perc: 100 * value, method } : { rows: Math.round(value), method };
653
653
  }
654
654
  query.sample = spec;
655
655
  return this;
@@ -681,6 +681,10 @@ var Query = class {
681
681
  return this;
682
682
  }
683
683
  }
684
+ $groupby(...expr) {
685
+ this.query.groupby = [];
686
+ return this.groupby(...expr);
687
+ }
684
688
  having(...expr) {
685
689
  const { query } = this;
686
690
  if (expr.length === 0) {
@@ -909,43 +913,12 @@ function isDoubleQuoted(s) {
909
913
  }
910
914
 
911
915
  // src/load/create.js
912
- function create(name, query, options = {}) {
913
- const { temp, replace, type = "TABLE" } = options;
914
- const create2 = `CREATE${replace ? " OR REPLACE" : ""}`;
915
- const spec = `${temp ? "TEMP " : ""}${type}${replace ? "" : " IF NOT EXISTS"}`;
916
- return `${create2} ${spec} ${name} AS ${query}`;
917
- }
918
-
919
- // src/load/parameters.js
920
- function parameters(options) {
921
- return Object.entries(options).map(([key, value]) => {
922
- const t = typeof value;
923
- const v = t === "boolean" ? String(value) : t === "string" ? `'${value}'` : value;
924
- return `${key}=${v}`;
925
- }).join(", ");
926
- }
927
-
928
- // src/load/csv.js
929
- function loadCSV(tableName, fileName, options = {}) {
930
- const { select = ["*"], temp, replace, ...csvOptions } = options;
931
- const params = parameters({ auto_detect: true, sample_size: -1, ...csvOptions });
932
- const query = `SELECT ${select.join(", ")} FROM read_csv('${fileName}', ${params})`;
933
- return create(tableName, query, { temp, replace });
934
- }
935
-
936
- // src/load/json.js
937
- function loadJSON(tableName, fileName, options = {}) {
938
- const { select = ["*"], temp, replace, ...jsonOptions } = options;
939
- const params = parameters({ auto_detect: true, json_format: "auto", ...jsonOptions });
940
- const query = `SELECT ${select.join(", ")} FROM read_json('${fileName}', ${params})`;
941
- return create(tableName, query, { temp, replace });
942
- }
943
-
944
- // src/load/parquet.js
945
- function loadParquet(tableName, fileName, options = {}) {
946
- const { select = ["*"], ...tableOptions } = options;
947
- const query = `SELECT ${select.join(", ")} FROM read_parquet('${fileName}')`;
948
- return create(tableName, query, tableOptions);
916
+ function create(name, query, {
917
+ replace = false,
918
+ temp = true,
919
+ view = false
920
+ } = {}) {
921
+ return "CREATE" + (replace ? " OR REPLACE " : " ") + (temp ? "TEMP " : "") + (view ? "VIEW" : "TABLE") + (replace ? " " : " IF NOT EXISTS ") + name + " AS " + query;
949
922
  }
950
923
 
951
924
  // src/load/sql-from.js
@@ -969,6 +942,38 @@ function sqlFrom(data, {
969
942
  }
970
943
  return subq.join(" UNION ALL ");
971
944
  }
945
+
946
+ // src/load/load.js
947
+ function load(method, tableName, fileName, options = {}, defaults = {}) {
948
+ const { select = ["*"], where, view, temp, replace, ...file } = options;
949
+ const params = parameters({ ...defaults, ...file });
950
+ const read = `${method}('${fileName}'${params ? ", " + params : ""})`;
951
+ const filter = where ? ` WHERE ${where}` : "";
952
+ const query = `SELECT ${select.join(", ")} FROM ${read}${filter}`;
953
+ return create(tableName, query, { view, temp, replace });
954
+ }
955
+ function loadCSV(tableName, fileName, options) {
956
+ return load("read_csv", tableName, fileName, options, { auto_detect: true, sample_size: -1 });
957
+ }
958
+ function loadJSON(tableName, fileName, options) {
959
+ return load("read_json", tableName, fileName, options, { auto_detect: true, json_format: "auto" });
960
+ }
961
+ function loadParquet(tableName, fileName, options) {
962
+ return load("read_parquet", tableName, fileName, options);
963
+ }
964
+ function loadObjects(tableName, data, options = {}) {
965
+ const { select = ["*"], ...opt } = options;
966
+ const values = sqlFrom(data);
967
+ const query = select.length === 1 && select[0] === "*" ? values : `SELECT ${select} FROM ${values}`;
968
+ return create(tableName, query, opt);
969
+ }
970
+ function parameters(options) {
971
+ return Object.entries(options).map(([key, value]) => {
972
+ const t = typeof value;
973
+ const v = t === "boolean" ? String(value) : t === "string" ? `'${value}'` : value;
974
+ return `${key}=${v}`;
975
+ }).join(", ");
976
+ }
972
977
  export {
973
978
  Query,
974
979
  Ref,
@@ -1025,6 +1030,7 @@ export {
1025
1030
  literalToSQL,
1026
1031
  loadCSV,
1027
1032
  loadJSON,
1033
+ loadObjects,
1028
1034
  loadParquet,
1029
1035
  lower,
1030
1036
  lt,
@@ -1059,7 +1065,6 @@ export {
1059
1065
  row_number,
1060
1066
  skewness,
1061
1067
  sql,
1062
- sqlFrom,
1063
1068
  stddev,
1064
1069
  stddevPop,
1065
1070
  stringAgg,
@@ -1 +1 @@
1
- var y=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?`"${t}".`:""}${n}`}else return t?`"${t}"`:"NULL"}};function X(r,t){return r instanceof y&&r.column===t}function l(r){return typeof r=="string"?W(r):r}function D(r){return typeof r=="string"?V(r):r}function V(r){return new y(r)}function W(r,t){return arguments.length===1&&(t=r,r=null),new y(r,t)}function tt(r){return new y(r,"*")}function et(r){return typeof r=="string"?`"${r}"`:d(r)}function d(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 b=r=>typeof r?.addEventListener=="function";function M(r){return r instanceof A}var A=class{constructor(t,e,n){this._expr=Array.isArray(t)?t:[t],this._deps=e||[],this.annotate(n);let o=this._expr.filter(s=>b(s));o.length>0?(this._params=Array.from(new Set(o)),this._params.forEach(s=>{s.addEventListener("value",()=>rt(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=>b(t)&&!M(t)?d(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 rt(r,t){if(t?.size)return Promise.allSettled(Array.from(t,e=>e(r)))}function Y(r,t){let e=[r[0]],n=new Set,o=t.length;for(let s=0,i=0;s<o;){let c=t[s];b(c)?e[++i]=c:(Array.isArray(c?.columns)&&c.columns.forEach(x=>n.add(x)),e[i]+=typeof c=="string"?c:d(c));let p=r[++s];b(e[i])?e[++i]=p:e[i]+=p}return{spans:e,cols:Array.from(n)}}function u(r,...t){let{spans:e,cols:n}=Y(r,t);return new A(e,n)}function nt(r){let t=l(r);return u`${t} DESC NULLS LAST`.annotate({label:t?.label,desc:!0})}var ot=r=>({value:r,toString:()=>d(r)});function C(r){r(this.op,this),this.children?.forEach(t=>t.visit(r))}function Q(r,t){let e=t.filter(o=>o!=null).map(l),n=e.map((o,s)=>s?` ${r} `:"");return t.length&&n.push(""),u(n,...e).annotate({op:r,children:e,visit:C})}var st=(...r)=>Q("AND",r.flat()),it=(...r)=>Q("OR",r.flat()),ct=r=>t=>u`(${r} ${l(t)})`.annotate({op:r,a:t,visit:C}),at=ct("NOT"),k=r=>t=>u`(${l(t)} ${r})`.annotate({op:r,a:t,visit:C}),ut=k("IS NULL"),lt=k("IS NOT NULL"),T=r=>(t,e)=>u`(${l(t)} ${r} ${l(e)})`.annotate({op:r,a:t,b:e,visit:C}),pt=T("="),ft=T("<>"),mt=T("<"),ht=T(">"),gt=T("<="),xt=T(">="),Et=T("IS DISTINCT FROM"),dt=T("IS NOT DISTINCT FROM");function v(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:C,field:t,range:e})}var $t=(r,t,e)=>v("BETWEEN",r,t,e),Nt=(r,t,e)=>v("NOT BETWEEN",r,t,e);function q(r,t){return Array.from({length:r},()=>t)}function g(r,t){return(...e)=>{let n=e.map(l),o=t?`::${t}`:"";return(n.length?u([`${r}(`,...q(n.length-1,", "),`)${o}`],...n):u`${r}()${o}`).annotate({func:r,args:n})}}var yt=g("REGEXP_MATCHES"),St=g("CONTAINS"),wt=g("PREFIX"),Rt=g("SUFFIX"),At=g("LOWER"),Tt=g("UPPER"),bt=g("LENGTH"),qt=g("ISNAN"),Lt=g("ISFINITE"),Ot=g("ISINF");var $=class extends A{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 P=s&&i?" ":"",U=(s||i)&&c?" ":"";p=u`${e} OVER (${o?`"${o}" `:""}${s}${P}${i}${U}${c})`}n&&(p=u`(${p})::${n}`);let{_expr:R,_deps:_}=p;super(R,_,{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 $(e,n,o,t,s,i,c)}partitionby(...t){let e=t.flat().filter(R=>R).map(l),n=u(["PARTITION BY ",q(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:c,order:p,frame:x}=this;return new $(o,s,i,c,n,p,x)}orderby(...t){let e=t.flat().filter(R=>R).map(l),n=u(["ORDER BY ",q(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:c,group:p,frame:x}=this;return new $(o,s,i,c,p,n,x)}rows(t){let e=H("ROWS",t),{window:n,func:o,type:s,name:i,group:c,order:p}=this;return new $(n,o,s,i,c,p,e)}range(t){let e=H("RANGE",t),{window:n,func:o,type:s,name:i,group:c,order:p}=this;return new $(n,o,s,i,c,p,e)}};function H(r,t){if(b(t)){let e=u`${t}`;return e.toString=()=>`${r} ${K(t.value)}`,e}return`${r} ${K(t)}`}function K(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 N(r,t){return(...e)=>{let n=g(r)(...e);return new $(r,n,t)}}var It=N("ROW_NUMBER","INTEGER"),Dt=N("RANK","INTEGER"),Ct=N("DENSE_RANK","INTEGER"),_t=N("PERCENT_RANK"),Pt=N("CUME_DIST"),Ut=N("NTILE"),Mt=N("LAG"),Ft=N("LEAD"),Gt=N("FIRST_VALUE"),jt=N("LAST_VALUE"),Yt=N("NTH_VALUE");function Bt(r,...t){return u(r,...t).annotate({aggregate:!0})}var L=class extends A{constructor(t,e,n,o,s){e=(e||[]).map(l);let{strings:i,exprs:c}=Xt(t,e,n,o,s),{spans:p,cols:x}=Y(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 L(t,e,n,!0,o)}where(t){let{aggregate:e,args:n,type:o,isDistinct:s}=this;return new L(e,n,o,s,t)}window(){let{aggregate:t,args:e,type:n,isDistinct:o}=this,s=new L(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 Xt(r,t,e,n,o){let s=`)${e?`::${e}`:""}`,i=[`${r}(${n?"DISTINCT ":""}`],c=[];return t.length?(i=i.concat([...q(t.length-1,", "),`${s}${o?" FILTER (WHERE ":""}`,...o?[")"]:[]]),c=[...t,...o?[o]:[]]):i[0]+="*"+s,{exprs:c,strings:i}}function Vt(r){let t=d(r);return t&&t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t}function a(r,t){return(...e)=>new L(r,e,t)}var Wt=a("COUNT","INTEGER"),Qt=a("AVG"),kt=a("AVG"),vt=a("MAD"),Ht=a("MAX"),Kt=a("MIN"),zt=a("SUM","DOUBLE"),Jt=a("PRODUCT"),Zt=a("MEDIAN"),te=a("QUANTILE"),ee=a("MODE"),re=a("VARIANCE"),ne=a("STDDEV"),oe=a("SKEWNESS"),se=a("KURTOSIS"),ie=a("ENTROPY"),ce=a("VAR_POP"),ae=a("STDDEV_POP"),ue=a("CORR"),le=a("COVAR_POP"),pe=a("REGR_INTERCEPT"),fe=a("REGR_SLOPE"),me=a("REGR_COUNT"),he=a("REGR_R2"),ge=a("REGR_SYY"),xe=a("REGR_SXX"),Ee=a("REGR_SXY"),de=a("REGR_AVGX"),$e=a("REGR_AVGY"),Ne=a("FIRST"),ye=a("LAST"),Se=a("ARG_MIN"),we=a("ARG_MAX"),Re=a("STRING_AGG"),Ae=a("ARRAY_AGG");function B(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 Te=r=>B(r,"DOUBLE"),be=r=>B(r,"INTEGER");var qe=r=>{let t=l(r);return u`(1000 * (epoch(${t}) - second(${t})) + millisecond(${t}))::DOUBLE`},Le=r=>{let t=l(r);return u`MAKE_DATE(2012, MONTH(${t}), 1)`.annotate({label:"month"})},Oe=r=>{let t=l(r);return u`MAKE_DATE(2012, MONTH(${t}), DAY(${t}))`.annotate({label:"date"})},Ie=r=>{let t=l(r);return u`MAKE_DATE(2012, 1, DAY(${t}))`.annotate({label:"date"})};var S=class{static select(...t){return new S().select(...t)}static from(...t){return new S().from(...t)}static with(...t){return new S().with(...t)}static union(...t){return new w("UNION",t.flat())}static unionAll(...t){return new w("UNION ALL",t.flat())}static intersect(...t){return new w("INTERSECT",t.flat())}static except(...t){return new w("EXCEPT",t.flat())}constructor(){this.query={with:[],select:[],from:[],where:[],groupby:[],having:[],window:[],qualify:[],orderby:[]}}clone(){let t=new S;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 y)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:D(o)});else if(o instanceof y)n.push({as:o.table,from:o});else if(G(o)||M(o))n.push({from:o});else if(Array.isArray(o))n.push({as:F(o[0]),from:D(o[1])});else for(let s in o)n.push({as:F(s),from:D(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,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)}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(G(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:R,limit:_,offset:P,with:U}=this.query,h=[];if(U.length){let f=U.map(({as:m,query:E})=>`"${m}" AS (${E})`);h.push(`WITH ${f.join(", ")}`)}let z=t.map(({as:f,expr:m})=>X(m,f)&&!m.table?`${m}`:`${m} AS "${f}"`);if(h.push(`SELECT${e?" DISTINCT":""} ${z.join(", ")}`),n.length){let f=n.map(({as:m,from:E})=>{let I=G(E)?`(${E})`:`${E}`;return!m||m===E.table?I:`${I} AS "${m}"`});h.push(`FROM ${f.join(", ")}`)}if(s.length){let f=s.map(String).filter(m=>m).join(" AND ");f&&h.push(`WHERE ${f}`)}if(o){let{rows:f,perc:m,method:E,seed:I}=o,J=f?`${f} ROWS`:`${m} PERCENT`,Z=E?` (${E}${I!=null?`, ${I}`:""})`:"";h.push(`USING SAMPLE ${J}${Z}`)}if(i.length&&h.push(`GROUP BY ${i.join(", ")}`),c.length){let f=c.map(String).filter(m=>m).join(" AND ");f&&h.push(`HAVING ${f}`)}if(p.length){let f=p.map(({as:m,expr:E})=>`"${m}" AS (${E})`);h.push(`WINDOW ${f.join(", ")}`)}if(x.length){let f=x.map(String).filter(m=>m).join(" AND ");f&&h.push(`QUALIFY ${f}`)}return R.length&&h.push(`ORDER BY ${R.join(", ")}`),Number.isFinite(_)&&h.push(`LIMIT ${_}`),Number.isFinite(P)&&h.push(`OFFSET ${P}`),h.join(" ")}},w=class{constructor(t,e){this.op=t,this.queries=e.map(n=>n.clone()),this.query={orderby:[]}}clone(){let t=new w(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 G(r){return r instanceof S||r instanceof w}function F(r){return De(r)?r.slice(1,-1):r}function De(r){return r[0]==='"'&&r[r.length-1]==='"'}function O(r,t,e={}){let{temp:n,replace:o,type:s="TABLE"}=e,i=`CREATE${o?" OR REPLACE":""}`,c=`${n?"TEMP ":""}${s}${o?"":" IF NOT EXISTS"}`;return`${i} ${c} ${r} AS ${t}`}function j(r){return Object.entries(r).map(([t,e])=>{let n=typeof e,o=n==="boolean"?String(e):n==="string"?`'${e}'`:e;return`${t}=${o}`}).join(", ")}function Ce(r,t,e={}){let{select:n=["*"],temp:o,replace:s,...i}=e,c=j({auto_detect:!0,sample_size:-1,...i}),p=`SELECT ${n.join(", ")} FROM read_csv('${t}', ${c})`;return O(r,p,{temp:o,replace:s})}function _e(r,t,e={}){let{select:n=["*"],temp:o,replace:s,...i}=e,c=j({auto_detect:!0,json_format:"auto",...i}),p=`SELECT ${n.join(", ")} FROM read_json('${t}', ${c})`;return O(r,p,{temp:o,replace:s})}function Pe(r,t,e={}){let{select:n=["*"],...o}=e,s=`SELECT ${n.join(", ")} FROM read_parquet('${t}')`;return O(r,s,o)}function Ue(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=>`${d(o[i])} AS "${t[i]}"`);n.push(`(SELECT ${s.join(", ")})`)}return n.join(" UNION ALL ")}export{S as Query,y as Ref,Bt as agg,tt as all,st as and,we as argmax,Se as argmin,Ae as arrayAgg,l as asColumn,D as asRelation,Qt as avg,B as cast,Te as castDouble,be as castInteger,W as column,St as contains,ue as corr,Wt as count,le as covarPop,O as create,Pt as cume_dist,Ie as dateDay,Le as dateMonth,Oe as dateMonthDay,Ct as dense_rank,nt as desc,ie as entropy,qe as epoch_ms,pt as eq,Ne as first,Gt as first_value,ht as gt,xt as gte,$t as isBetween,Et as isDistinct,Lt as isFinite,Ot as isInfinite,qt as isNaN,Nt as isNotBetween,dt as isNotDistinct,lt as isNotNull,ut as isNull,b as isParamLike,G as isQuery,M as isSQLExpression,se as kurtosis,Mt as lag,ye as last,jt as last_value,Ft as lead,bt as length,ot as literal,d as literalToSQL,Ce as loadCSV,_e as loadJSON,Pe as loadParquet,At as lower,mt as lt,gt as lte,vt as mad,Ht as max,kt as mean,Zt as median,Kt as min,ee as mode,ft as neq,at as not,Yt as nth_value,Ut as ntile,it as or,_t as percent_rank,wt as prefix,Jt as product,te as quantile,Dt as rank,yt as regexp_matches,de as regrAvgX,$e as regrAvgY,me as regrCount,pe as regrIntercept,he as regrR2,xe as regrSXX,Ee as regrSXY,ge as regrSYY,fe as regrSlope,V as relation,It as row_number,oe as skewness,u as sql,Ue as sqlFrom,ne as stddev,ae as stddevPop,Re as stringAgg,Rt as suffix,zt as sum,et as toSQL,Tt as upper,ce as varPop,re as variance};
1
+ var w=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?`"${t}".`:""}${n}`}else return t?`"${t}"`:"NULL"}};function B(r,t){return r instanceof w&&r.column===t}function l(r){return typeof r=="string"?X(r):r}function _(r){return typeof r=="string"?V(r):r}function V(r){return new w(r)}function X(r,t){return arguments.length===1&&(t=r,r=null),new w(r,t)}function et(r){return new w(r,"*")}function rt(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 q=r=>typeof r?.addEventListener=="function";function U(r){return r instanceof A}var A=class{constructor(t,e,n){this._expr=Array.isArray(t)?t:[t],this._deps=e||[],this.annotate(n);let o=this._expr.filter(s=>q(s));o.length>0?(this._params=Array.from(new Set(o)),this._params.forEach(s=>{s.addEventListener("value",()=>nt(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=>q(t)&&!U(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 nt(r,t){if(t?.size)return Promise.allSettled(Array.from(t,e=>e(r)))}function j(r,t){let e=[r[0]],n=new Set,o=t.length;for(let s=0,i=0;s<o;){let c=t[s];q(c)?e[++i]=c:(Array.isArray(c?.columns)&&c.columns.forEach(g=>n.add(g)),e[i]+=typeof c=="string"?c:E(c));let p=r[++s];q(e[i])?e[++i]=p:e[i]+=p}return{spans:e,cols:Array.from(n)}}function u(r,...t){let{spans:e,cols:n}=j(r,t);return new A(e,n)}function ot(r){let t=l(r);return u`${t} DESC NULLS LAST`.annotate({label:t?.label,desc:!0})}var st=r=>({value:r,toString:()=>E(r)});function P(r){r(this.op,this),this.children?.forEach(t=>t.visit(r))}function Q(r,t){let e=t.filter(o=>o!=null).map(l),n=e.map((o,s)=>s?` ${r} `:"");return t.length&&n.push(""),u(n,...e).annotate({op:r,children:e,visit:P})}var it=(...r)=>Q("AND",r.flat()),ct=(...r)=>Q("OR",r.flat()),at=r=>t=>u`(${r} ${l(t)})`.annotate({op:r,a:t,visit:P}),ut=at("NOT"),k=r=>t=>u`(${l(t)} ${r})`.annotate({op:r,a:t,visit:P}),lt=k("IS NULL"),pt=k("IS NOT NULL"),T=r=>(t,e)=>u`(${l(t)} ${r} ${l(e)})`.annotate({op:r,a:t,b:e,visit:P}),ft=T("="),ht=T("<>"),mt=T("<"),gt=T(">"),xt=T("<="),dt=T(">="),Et=T("IS DISTINCT FROM"),$t=T("IS NOT DISTINCT FROM");function v(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:P,field:t,range:e})}var Nt=(r,t,e)=>v("BETWEEN",r,t,e),yt=(r,t,e)=>v("NOT BETWEEN",r,t,e);function L(r,t){return Array.from({length:r},()=>t)}function x(r,t){return(...e)=>{let n=e.map(l),o=t?`::${t}`:"";return(n.length?u([`${r}(`,...L(n.length-1,", "),`)${o}`],...n):u`${r}()${o}`).annotate({func:r,args:n})}}var wt=x("REGEXP_MATCHES"),St=x("CONTAINS"),Rt=x("PREFIX"),At=x("SUFFIX"),Tt=x("LOWER"),bt=x("UPPER"),qt=x("LENGTH"),Lt=x("ISNAN"),Ot=x("ISFINITE"),It=x("ISINF");var $=class extends A{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 I=s&&i?" ":"",D=(s||i)&&c?" ":"";p=u`${e} OVER (${o?`"${o}" `:""}${s}${I}${i}${D}${c})`}n&&(p=u`(${p})::${n}`);let{_expr:y,_deps:b}=p;super(y,b,{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 $(e,n,o,t,s,i,c)}partitionby(...t){let e=t.flat().filter(y=>y).map(l),n=u(["PARTITION BY ",L(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:c,order:p,frame:g}=this;return new $(o,s,i,c,n,p,g)}orderby(...t){let e=t.flat().filter(y=>y).map(l),n=u(["ORDER BY ",L(e.length-1,", "),""],...e),{window:o,func:s,type:i,name:c,group:p,frame:g}=this;return new $(o,s,i,c,p,n,g)}rows(t){let e=H("ROWS",t),{window:n,func:o,type:s,name:i,group:c,order:p}=this;return new $(n,o,s,i,c,p,e)}range(t){let e=H("RANGE",t),{window:n,func:o,type:s,name:i,group:c,order:p}=this;return new $(n,o,s,i,c,p,e)}};function H(r,t){if(q(t)){let e=u`${t}`;return e.toString=()=>`${r} ${K(t.value)}`,e}return`${r} ${K(t)}`}function K(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 N(r,t){return(...e)=>{let n=x(r)(...e);return new $(r,n,t)}}var Dt=N("ROW_NUMBER","INTEGER"),Ct=N("RANK","INTEGER"),_t=N("DENSE_RANK","INTEGER"),Pt=N("PERCENT_RANK"),Ut=N("CUME_DIST"),Mt=N("NTILE"),Ft=N("LAG"),Gt=N("LEAD"),jt=N("FIRST_VALUE"),Yt=N("LAST_VALUE"),Wt=N("NTH_VALUE");function Bt(r,...t){return u(r,...t).annotate({aggregate:!0})}var O=class extends A{constructor(t,e,n,o,s){e=(e||[]).map(l);let{strings:i,exprs:c}=Vt(t,e,n,o,s),{spans:p,cols:g}=j(i,c);super(p,g,{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(Xt).join(", ")})`:"";return`${t.toLowerCase()}${s}`}distinct(){let{aggregate:t,args:e,type:n,filter:o}=this;return new O(t,e,n,!0,o)}where(t){let{aggregate:e,args:n,type:o,isDistinct:s}=this;return new O(e,n,o,s,t)}window(){let{aggregate:t,args:e,type:n,isDistinct:o}=this,s=new O(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 Vt(r,t,e,n,o){let s=`)${e?`::${e}`:""}`,i=[`${r}(${n?"DISTINCT ":""}`],c=[];return t.length?(i=i.concat([...L(t.length-1,", "),`${s}${o?" FILTER (WHERE ":""}`,...o?[")"]:[]]),c=[...t,...o?[o]:[]]):i[0]+="*"+s,{exprs:c,strings:i}}function Xt(r){let t=E(r);return t&&t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t}function a(r,t){return(...e)=>new O(r,e,t)}var Qt=a("COUNT","INTEGER"),kt=a("AVG"),vt=a("AVG"),Ht=a("MAD"),Kt=a("MAX"),zt=a("MIN"),Jt=a("SUM","DOUBLE"),Zt=a("PRODUCT"),te=a("MEDIAN"),ee=a("QUANTILE"),re=a("MODE"),ne=a("VARIANCE"),oe=a("STDDEV"),se=a("SKEWNESS"),ie=a("KURTOSIS"),ce=a("ENTROPY"),ae=a("VAR_POP"),ue=a("STDDEV_POP"),le=a("CORR"),pe=a("COVAR_POP"),fe=a("REGR_INTERCEPT"),he=a("REGR_SLOPE"),me=a("REGR_COUNT"),ge=a("REGR_R2"),xe=a("REGR_SYY"),de=a("REGR_SXX"),Ee=a("REGR_SXY"),$e=a("REGR_AVGX"),Ne=a("REGR_AVGY"),ye=a("FIRST"),we=a("LAST"),Se=a("ARG_MIN"),Re=a("ARG_MAX"),Ae=a("STRING_AGG"),Te=a("ARRAY_AGG");function Y(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 be=r=>Y(r,"DOUBLE"),qe=r=>Y(r,"INTEGER");var Le=r=>{let t=l(r);return u`(1000 * (epoch(${t}) - second(${t})) + millisecond(${t}))::DOUBLE`},Oe=r=>{let t=l(r);return u`MAKE_DATE(2012, MONTH(${t}), 1)`.annotate({label:"month"})},Ie=r=>{let t=l(r);return u`MAKE_DATE(2012, MONTH(${t}), DAY(${t}))`.annotate({label:"date"})},De=r=>{let t=l(r);return u`MAKE_DATE(2012, 1, DAY(${t}))`.annotate({label:"date"})};var S=class{static select(...t){return new S().select(...t)}static from(...t){return new S().from(...t)}static with(...t){return new S().with(...t)}static union(...t){return new R("UNION",t.flat())}static unionAll(...t){return new R("UNION ALL",t.flat())}static intersect(...t){return new R("INTERSECT",t.flat())}static except(...t){return new R("EXCEPT",t.flat())}constructor(){this.query={with:[],select:[],from:[],where:[],groupby:[],having:[],window:[],qualify:[],orderby:[]}}clone(){let t=new S;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 w)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:M(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:_(o)});else if(o instanceof w)n.push({as:o.table,from:o});else if(F(o)||U(o))n.push({from:o});else if(Array.isArray(o))n.push({as:M(o[0]),from:_(o[1])});else for(let s in o)n.push({as:M(s),from:_(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:M(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(F(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:g,orderby:y,limit:b,offset:I,with:D}=this.query,m=[];if(D.length){let f=D.map(({as:h,query:d})=>`"${h}" AS (${d})`);m.push(`WITH ${f.join(", ")}`)}let J=t.map(({as:f,expr:h})=>B(h,f)&&!h.table?`${h}`:`${h} AS "${f}"`);if(m.push(`SELECT${e?" DISTINCT":""} ${J.join(", ")}`),n.length){let f=n.map(({as:h,from:d})=>{let C=F(d)?`(${d})`:`${d}`;return!h||h===d.table?C:`${C} AS "${h}"`});m.push(`FROM ${f.join(", ")}`)}if(s.length){let f=s.map(String).filter(h=>h).join(" AND ");f&&m.push(`WHERE ${f}`)}if(o){let{rows:f,perc:h,method:d,seed:C}=o,Z=f?`${f} ROWS`:`${h} PERCENT`,tt=d?` (${d}${C!=null?`, ${C}`:""})`:"";m.push(`USING SAMPLE ${Z}${tt}`)}if(i.length&&m.push(`GROUP BY ${i.join(", ")}`),c.length){let f=c.map(String).filter(h=>h).join(" AND ");f&&m.push(`HAVING ${f}`)}if(p.length){let f=p.map(({as:h,expr:d})=>`"${h}" AS (${d})`);m.push(`WINDOW ${f.join(", ")}`)}if(g.length){let f=g.map(String).filter(h=>h).join(" AND ");f&&m.push(`QUALIFY ${f}`)}return y.length&&m.push(`ORDER BY ${y.join(", ")}`),Number.isFinite(b)&&m.push(`LIMIT ${b}`),Number.isFinite(I)&&m.push(`OFFSET ${I}`),m.join(" ")}},R=class{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 F(r){return r instanceof S||r instanceof R}function M(r){return Ce(r)?r.slice(1,-1):r}function Ce(r){return r[0]==='"'&&r[r.length-1]==='"'}function G(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 z(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 W(r,t,e,n={},o={}){let{select:s=["*"],where:i,view:c,temp:p,replace:g,...y}=n,b=Fe({...o,...y}),I=`${r}('${e}'${b?", "+b:""})`,D=i?` WHERE ${i}`:"",m=`SELECT ${s.join(", ")} FROM ${I}${D}`;return G(t,m,{view:c,temp:p,replace:g})}function _e(r,t,e){return W("read_csv",r,t,e,{auto_detect:!0,sample_size:-1})}function Pe(r,t,e){return W("read_json",r,t,e,{auto_detect:!0,json_format:"auto"})}function Ue(r,t,e){return W("read_parquet",r,t,e)}function Me(r,t,e={}){let{select:n=["*"],...o}=e,s=z(t),i=n.length===1&&n[0]==="*"?s:`SELECT ${n} FROM ${s}`;return G(r,i,o)}function Fe(r){return Object.entries(r).map(([t,e])=>{let n=typeof e,o=n==="boolean"?String(e):n==="string"?`'${e}'`:e;return`${t}=${o}`}).join(", ")}export{S as Query,w as Ref,Bt as agg,et as all,it as and,Re as argmax,Se as argmin,Te as arrayAgg,l as asColumn,_ as asRelation,kt as avg,Y as cast,be as castDouble,qe as castInteger,X as column,St as contains,le as corr,Qt as count,pe as covarPop,G as create,Ut as cume_dist,De as dateDay,Oe as dateMonth,Ie as dateMonthDay,_t as dense_rank,ot as desc,ce as entropy,Le as epoch_ms,ft as eq,ye as first,jt as first_value,gt,dt as gte,Nt as isBetween,Et as isDistinct,Ot as isFinite,It as isInfinite,Lt as isNaN,yt as isNotBetween,$t as isNotDistinct,pt as isNotNull,lt as isNull,q as isParamLike,F as isQuery,U as isSQLExpression,ie as kurtosis,Ft as lag,we as last,Yt as last_value,Gt as lead,qt as length,st as literal,E as literalToSQL,_e as loadCSV,Pe as loadJSON,Me as loadObjects,Ue as loadParquet,Tt as lower,mt as lt,xt as lte,Ht as mad,Kt as max,vt as mean,te as median,zt as min,re as mode,ht as neq,ut as not,Wt as nth_value,Mt as ntile,ct as or,Pt as percent_rank,Rt as prefix,Zt as product,ee as quantile,Ct as rank,wt as regexp_matches,$e as regrAvgX,Ne as regrAvgY,me as regrCount,fe as regrIntercept,ge as regrR2,de as regrSXX,Ee as regrSXY,xe as regrSYY,he as regrSlope,V as relation,Dt as row_number,se as skewness,u as sql,oe as stddev,ue as stddevPop,Ae as stringAgg,At as suffix,Jt as sum,rt as toSQL,bt as upper,ae as varPop,ne as variance};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uwdata/mosaic-sql",
3
- "version": "0.2.0",
3
+ "version": "0.3.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": "e53cd914c807f99aabe78dcbe618dd9543e2f438"
28
+ "gitHead": "a8dd23fed4c7a24c0a2ee5261d1aabe4239ce574"
29
29
  }
package/src/Query.js CHANGED
@@ -156,7 +156,7 @@ export class Query {
156
156
  if (typeof value === 'number') {
157
157
  spec = value > 0 && value < 1
158
158
  ? { perc: 100 * value, method }
159
- : { rows: Math.round(value, method) };
159
+ : { rows: Math.round(value), method };
160
160
  }
161
161
  query.sample = spec;
162
162
  return this;
@@ -192,6 +192,11 @@ export class Query {
192
192
  }
193
193
  }
194
194
 
195
+ $groupby(...expr) {
196
+ this.query.groupby = [];
197
+ return this.groupby(...expr);
198
+ }
199
+
195
200
  having(...expr) {
196
201
  const { query } = this;
197
202
  if (expr.length === 0) {
package/src/index.js CHANGED
@@ -129,7 +129,9 @@ export {
129
129
  } from './to-sql.js';
130
130
 
131
131
  export { create } from './load/create.js';
132
- export { loadCSV } from './load/csv.js';
133
- export { loadJSON } from './load/json.js';
134
- export { loadParquet } from './load/parquet.js';
135
- export { sqlFrom } from './load/sql-from.js';
132
+ export {
133
+ loadCSV,
134
+ loadJSON,
135
+ loadObjects,
136
+ loadParquet
137
+ } from './load/load.js';
@@ -1,6 +1,12 @@
1
- export function create(name, query, options = {}) {
2
- const { temp, replace, type = 'TABLE' } = options;
3
- const create = `CREATE${replace ? ' OR REPLACE' : ''}`;
4
- const spec = `${temp ? 'TEMP ' : ''}${type}${replace ? '' : ' IF NOT EXISTS'}`;
5
- return `${create} ${spec} ${name} AS ${query}`;
1
+ export function create(name, query, {
2
+ replace = false,
3
+ temp = true,
4
+ view = false
5
+ } = {}) {
6
+ return 'CREATE'
7
+ + (replace ? ' OR REPLACE ' : ' ')
8
+ + (temp ? 'TEMP ' : '')
9
+ + (view ? 'VIEW' : 'TABLE')
10
+ + (replace ? ' ' : ' IF NOT EXISTS ')
11
+ + name + ' AS ' + query;
6
12
  }
@@ -0,0 +1,44 @@
1
+ import { create } from './create.js';
2
+ import { sqlFrom } from './sql-from.js';
3
+
4
+ export function load(method, tableName, fileName, options = {}, defaults = {}) {
5
+ const { select = ['*'], where, view, temp, replace, ...file } = options;
6
+ const params = parameters({ ...defaults, ...file });
7
+ const read = `${method}('${fileName}'${params ? ', ' + params : ''})`;
8
+ const filter = where ? ` WHERE ${where}` : '';
9
+ const query = `SELECT ${select.join(', ')} FROM ${read}${filter}`;
10
+ return create(tableName, query, { view, temp, replace });
11
+ }
12
+
13
+ export function loadCSV(tableName, fileName, options) {
14
+ return load('read_csv', tableName, fileName, options, { auto_detect: true, sample_size: -1 });
15
+ }
16
+
17
+ export function loadJSON(tableName, fileName, options) {
18
+ return load('read_json', tableName, fileName, options, { auto_detect: true, json_format: 'auto' });
19
+ }
20
+
21
+ export function loadParquet(tableName, fileName, options) {
22
+ return load('read_parquet', tableName, fileName, options);
23
+ }
24
+
25
+ export function loadObjects(tableName, data, options = {}) {
26
+ const { select = ['*'], ...opt } = options;
27
+ const values = sqlFrom(data);
28
+ const query = select.length === 1 && select[0] === '*'
29
+ ? values
30
+ : `SELECT ${select} FROM ${values}`;
31
+ return create(tableName, query, opt);
32
+ }
33
+
34
+ function parameters(options) {
35
+ return Object.entries(options)
36
+ .map(([key, value]) => {
37
+ const t = typeof value;
38
+ const v = t === 'boolean' ? String(value)
39
+ : t === 'string' ? `'${value}'`
40
+ : value;
41
+ return `${key}=${v}`;
42
+ })
43
+ .join(', ');
44
+ }
package/src/load/csv.js DELETED
@@ -1,9 +0,0 @@
1
- import { create } from './create.js';
2
- import { parameters } from './parameters.js';
3
-
4
- export function loadCSV(tableName, fileName, options = {}) {
5
- const { select = ['*'], temp, replace, ...csvOptions } = options;
6
- const params = parameters({ auto_detect: true, sample_size: -1, ...csvOptions });
7
- const query = `SELECT ${select.join(', ')} FROM read_csv('${fileName}', ${params})`;
8
- return create(tableName, query, { temp, replace });
9
- }
package/src/load/json.js DELETED
@@ -1,9 +0,0 @@
1
- import { create } from './create.js';
2
- import { parameters } from './parameters.js';
3
-
4
- export function loadJSON(tableName, fileName, options = {}) {
5
- const { select = ['*'], temp, replace, ...jsonOptions } = options;
6
- const params = parameters({ auto_detect: true, json_format: 'auto', ...jsonOptions });
7
- const query = `SELECT ${select.join(', ')} FROM read_json('${fileName}', ${params})`;
8
- return create(tableName, query, { temp, replace });
9
- }
@@ -1,11 +0,0 @@
1
- export function parameters(options) {
2
- return Object.entries(options)
3
- .map(([key, value]) => {
4
- const t = typeof value;
5
- const v = t === 'boolean' ? String(value)
6
- : t === 'string' ? `'${value}'`
7
- : value;
8
- return `${key}=${v}`;
9
- })
10
- .join(', ');
11
- }
@@ -1,7 +0,0 @@
1
- import { create } from './create.js';
2
-
3
- export function loadParquet(tableName, fileName, options = {}) {
4
- const { select = ['*'], ...tableOptions } = options;
5
- const query = `SELECT ${select.join(', ')} FROM read_parquet('${fileName}')`;
6
- return create(tableName, query, tableOptions);
7
- }