@graffy/pg 0.15.7 → 0.15.8-alpha.4
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/index.cjs +20 -0
- package/index.mjs +20 -0
- package/package.json +10 -6
- package/types/Db.d.ts +2 -2
- package/types/sql/getArgSql.d.ts +1 -1
- package/cjs/Db.js +0 -373
- package/cjs/filter/filterObject.js +0 -66
- package/cjs/filter/getAst.js +0 -226
- package/cjs/filter/getSql.js +0 -100
- package/cjs/filter/index.js +0 -14
- package/cjs/index.js +0 -73
- package/cjs/link/index.js +0 -132
- package/cjs/sql/clauses.js +0 -92
- package/cjs/sql/getArgSql.js +0 -168
- package/cjs/sql/getMeta.js +0 -44
- package/cjs/sql/index.js +0 -25
- package/cjs/sql/select.js +0 -50
- package/cjs/sql/upsert.js +0 -80
- package/cjs/test/expectSql.js +0 -26
- package/cjs/test/setup.js +0 -101
package/index.cjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";var e=Object.defineProperty,t=Object.defineProperties,r=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable,i=(t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,$=(e,t)=>{for(var r in t||(t={}))a.call(t,r)&&i(e,r,t[r]);if(n)for(var r of n(t))o.call(t,r)&&i(e,r,t[r]);return e},s=(e,n)=>t(e,r(n)),l=(e,t)=>{var r={};for(var i in e)a.call(e,i)&&t.indexOf(i)<0&&(r[i]=e[i]);if(null!=e&&n)for(var i of n(e))t.indexOf(i)<0&&o.call(e,i)&&(r[i]=e[i]);return r};Object.defineProperty(exports,"__esModule",{value:!0}),exports[Symbol.toStringTag]="Module";var u=require("pg"),c=require("@graffy/common"),f=require("@graffy/testing"),d=require("debug"),p=require("sql-template-tag");function w(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var h=w(d),g=w(p);const b=h.default("graffy:pg:link");function y(e,t){return e.map((function e(r){if("string"==typeof r&&"$"===r[0]&&"$"===r[1])return c.unwrapObject(t,c.encodePath(r.slice(2)));if(Array.isArray(r))return r.map(e);if("object"==typeof r&&r){const t={};for(const n in r)t[n]=e(r[n]);return t}return r}))}function j(e,t,{links:r}){const n=[];for(let a in r){const o=c.encodePath(a),i=c.unwrap(t,o);if(i)for(const t of e){const e=y(r[a],t),[l,u]=c.splitRef(e);if(l){const r=[];c.mergeObject(t,c.wrapObject(r,o));const a=i.map((t=>{const[n,a]=c.splitArgs(c.decodeArgs(t)),o=$($({},u),a);return r.push({$key:c.isEmpty(a)?"":s($({},a),{$all:!0}),$ref:e.slice(0,-1).concat([s($({},o),{$all:!0})])}),n?s($({},c.encodeArgs(o)),{children:[t],version:t.version,prefix:!0}):$($({},t),c.encodeArgs(o))}));c.add(n,c.wrap(a,c.encodePath(e.slice(0,-1))))}else c.mergeObject(t,c.wrapObject({$ref:e},o)),c.add(n,c.wrap(i,c.encodePath(e)))}}return b("Linked Result",JSON.stringify(e,null,2),f.format(n)),n}const m={$eq:!0,$lt:!0,$gt:!0,$lte:!0,$gte:!0,$re:!0,$ire:!0,$text:!0,$and:!0,$or:!0,$any:!0,$all:!0,$has:!0},O={$eq:"$neq",$neq:"$eq",$in:"$nin",$nin:"$in",$lt:"$gte",$gte:"$lt",$gt:"$lte",$lte:"$gt"};function E(e){return q=0,N(_(e))}let q;function _(e,t,r){if(!e||"object"!=typeof e){if(r&&t)return[r,t,e];if(t)return["$eq",t,e];throw Error("pgast.expected_prop_before:"+JSON.stringify(e))}return Array.isArray(e)?["$or",e.map((e=>_(e,t,r)))]:["$and",Object.entries(e).map((([e,n])=>{if("$or"===e||"$and"===e)return[e,_(n,t,r)[1]];if("$not"===e)return[e,_(n,t,r)];if("$any"===e||"$all"===e){const r="el$"+q++;return[e,t,r,_(n,r)]}if("$has"===e){const r="el$"+q++;return[e,t,r,_(n,r)[1]]}if("$"===e[0]){if(!m[e])throw Error("pgast.invalid_op:"+e);if(r)throw Error("pgast.unexpected_op:"+r+" before:"+e);if(!t)throw Error("pgast.expected_prop_before:"+e);return _(n,t,e)}if(t){if("."===e[0])return _(n,t+e);throw Error("pgast.unexpected_prop",e)}return _(n,e)}))]}function N(e){const t=e[0];if("$and"===t||"$or"===t?e[1]=e[1].map((e=>N(e))):"$not"===t?e[1]=N(e[1]):"$all"===t||"$any"===t?e[3]=N(e[3]):"$has"===t&&(e[3]=e[3].map((e=>N(e)))),"$or"===t){const{eqmap:t,noneq:r,change:n}=e[1].reduce(((e,t)=>{if("$eq"!==t[0])e.noneq.push(t);else{if(e.eqmap[t[1]])return e.change=!0,e.eqmap[t[1]].push(t[2]),e;e.eqmap[t[1]]=[t[2]]}return e}),{eqmap:{},noneq:[],change:!1});n&&(e[1]=[...r,...Object.entries(t).map((([e,t])=>t.length>1?["$in",e,t]:["$eq",e,t[0]]))])}if("$and"===t||"$or"===t){if(!e[1].length)throw Error("pgast.expected_children:"+t);return 1===e[1].length?e[1][0]:e}if("$not"===t){const[t,...r]=e[1],n=O[t];return n?[n,...r]:e}if("$any"===t||"$all"===t){const[r,n,a,o]=e,[i,$,s]=o;return"$eq"!==i&&"$in"!==i||a!==$?e:["$any"===t?"$ovl":"$ctd",n,"$eq"===i?[s]:s]}if("$has"===t){const[t,r,n,a]=e;return a.every((([e,t])=>"$eq"===e&&t===n))?["$cts",r,a.map((([e,t,r])=>r))]:e}return e}const S=g.default`cast(extract(epoch from now()) as integer)`,v=e=>{const t=p.join(Object.entries(e).map((([e,t])=>g.default`'${p.raw(e)}', ${t}`)));return g.default`jsonb_build_object(${t})`},C=e=>g.default`to_jsonb("${p.raw(e)}")`,A=({idCol:e})=>v({$key:g.default`"${p.raw(e)}"`,$ver:S});function R(e,t){var r=e,{$first:n,$last:a,$after:o,$before:i,$since:$,$until:s,$all:u,$cursor:f}=r,d=l(r,["$first","$last","$after","$before","$since","$until","$all","$cursor"]);const w=d,{$order:h}=w,b=l(w,["$order"]),{prefix:y,idCol:j}=t,m=e=>{const[t,...r]=c.encodePath(e);return r.length?g.default`"${p.raw(t)}" #>> '{"${r.join('","')}"}'`:g.default`"${p.raw(t)}"`},O=e=>((e,t,r)=>v({$key:e,$ref:g.default`jsonb_build_array(${p.join(t.map((e=>g.default`${e}::text`)))}, "${p.raw(r)}")`,$ver:S}))(e,y,j),q=i||o||$||s||n||a||u||h;let _;const N=[];if(c.isEmpty(b)||(N.push(function(e,t){function r(e){return"el$"===e.substr(0,3)?g.default`"${p.raw(e)}"`:t(e)}return function e(t){switch(t[0]){case"$eq":return null===t[2]?g.default`${r(t[1])} IS NULL`:g.default`${r(t[1])} = ${t[2]}`;case"$neq":return null===t[2]?g.default`${r(t[1])} IS NOT NULL`:g.default`${r(t[1])} <> ${t[2]}`;case"$lt":return g.default`${r(t[1])} < ${t[2]}`;case"$lte":return g.default`${r(t[1])} <= ${t[2]}`;case"$gt":return g.default`${r(t[1])} > ${t[2]}`;case"$gte":return g.default`${r(t[1])} >= ${t[2]}`;case"$re":return g.default`${r(t[1])} ~ ${t[2]}`;case"$ire":return g.default`${r(t[1])} ~* ${t[2]}`;case"$in":return g.default`${r(t[1])} IN (${p.join(t[2])})`;case"$nin":return g.default`${r(t[1])} NOT IN (${p.join(t[2])})`;case"$cts":return g.default`${r(t[1])} @> ${t[2]}`;case"$ctd":return g.default`${r(t[1])} <@ ${t[2]}`;case"$ovp":return g.default`${r(t[1])} && ${t[2]}`;case"$and":return g.default`(${p.join(t[1].map((t=>e(t))),") AND (")})`;case"$or":return g.default`(${p.join(t[1].map((t=>e(t))),") OR (")})`;case"$not":return g.default`NOT (${e(t[1])})`;case"$any":return g.default`(SELECT bool_or(${e(t[3])}) FROM UNNEST(${r(t[1])}) ${r(t[2])})`;case"$all":return g.default`(SELECT bool_and(${e(t[3])}) FROM UNNEST(${r(t[1])}) ${r(t[2])})`;case"$has":return g.default`(SELECT bool_or(${p.join(t[3].map((t=>e(t))),") AND bool_or(")}) FROM UNNEST(${r(t[1])}) ${r(t[2])})`;default:throw Error("pg.getSql_unknown_operator: "+t[0])}}(E(e))}(b,m)),_=g.default`${JSON.stringify(b)}::jsonb`),!q)return{meta:O(_),where:N,limit:1};if(c.isEmpty(d))throw Error("pg_arg.pagination_only_unsupported in "+y);const C=(h||[j]).map(m);Object.entries({$after:o,$before:i,$since:$,$until:s}).forEach((([e,t])=>{t&&N.push(T(C,t,e))}));const A=h&&v({$order:g.default`${JSON.stringify(h)}::jsonb`}),R=v({$cursor:g.default`jsonb_build_array(${p.join(C)})`});return _=g.default`(${p.join([_,A,R].filter(Boolean)," || ")})`,{meta:O(_),where:N,order:p.join(C.map((e=>g.default`${e} ${a?g.default`DESC`:g.default`ASC`}`)),", "),limit:n||a}}function T(e,t,r){if(!Array.isArray(t))throw Error("pg_arg.bad_query bound : "+JSON.stringify(t));const n=e[0],a=t[0];if(e.length>1&&t.length>1){const o=T(e.slice(1),t.slice(1),r);switch(r){case"$after":case"$since":return g.default`${n} > ${a} OR ${n} = ${a} AND (${o})`;case"$before":case"$until":return g.default`${n} < ${a} OR ${n} = ${a} AND (${o})`}}else switch(r){case"$after":return g.default`${n} > ${a}`;case"$since":return g.default`${n} >= ${a}`;case"$before":return g.default`${n} < ${a}`;case"$until":return g.default`${n} <= ${a}`}}function x(e,t,r){const{table:n,idCol:a}=r,{where:o,meta:i}=c.isPlainObject(t)?R(t,r):{where:[g.default`"${p.raw(a)}" = ${t}`],meta:A(r)};if(!o||!o.length)throw Error("pg_write.no_condition");const $=e;return g.default`
|
|
2
|
+
UPDATE "${p.raw(n)}" SET ${((e,t)=>p.join(Object.entries(e).filter((([e])=>e!==t.idCol&&"$"!==e[0])).map((([e,t])=>g.default`"${p.raw(e)}" = ${"object"==typeof t&&t?g.default`"${p.raw(e)}" || ${t}`:t}`)).concat(g.default`"${p.raw(t.verCol)}" = ${S}`),", "))($,r)}
|
|
3
|
+
WHERE ${p.join(o," AND ")}
|
|
4
|
+
LIMIT 1
|
|
5
|
+
RETURNING (${C(n)} || ${i})`}function P(e,t,r){const{idCol:n,table:a}=r,o=e;let i,$;c.isPlainObject(t)?(({meta:i}=R(t,r)),$=p.join(Object.keys(t).map((e=>g.default`"${p.raw(e)}"`)))):(i=A(r),$=g.default`"${p.raw(n)}"`);const{cols:s,vals:l}=((e,t)=>{const r=[],n=[];return Object.entries(e).filter((([e])=>e!==t.verCol&&"$"!==e[0])).concat([[t.verCol,S]]).forEach((([e,t])=>{r.push(g.default`"${p.raw(e)}"`),n.push(t)})),{cols:p.join(r,", "),vals:p.join(n,", ")}})(o,r);return g.default`
|
|
6
|
+
INSERT INTO "${p.raw(a)}" (${s}) VALUES (${l})
|
|
7
|
+
ON CONFLICT (${$}) DO UPDATE SET (${s}) = (${l})
|
|
8
|
+
RETURNING (${C(a)} || ${i})`}const D=h.default("graffy:pg:db");class I{constructor(e){"object"==typeof e&&e&&(e instanceof u.Pool||e instanceof u.Client)?this.client=e:this.client=new u.Pool(e)}async query(e){e.rowMode="array",D("Making SQL query: "+e.text,e.values);try{return await this.client.query(e)}catch(t){throw Error("pg.sql_error "+t.message+" in "+e.text+" with "+e.values)}}async readSql(e){let t=await this.query(e);return t=t.rows.flat(),D("Read result",t),t}async writeSql(e){let t=await this.query(e);if(D("Rows written",t.rowCount),!t.rowCount)throw Error("pg.nothing_written "+e.text+" with "+e.values);return t.rows[0][0]}async read(e,t){const r={},n=[],a=[],o=[],{idCol:i,prefix:s}=t,l=async(e,r)=>{const n=await this.readSql(function(e,t){const{table:r}=t,{where:n,order:a,limit:o,meta:i}=R(e,t),$=Math.min(4096,o||4096);return g.default`
|
|
9
|
+
SELECT
|
|
10
|
+
${C(r)} || ${i}
|
|
11
|
+
FROM "${p.raw(r)}"
|
|
12
|
+
${n.length?g.default`WHERE ${p.join(n," AND ")}`:p.empty}
|
|
13
|
+
${a?g.default`ORDER BY ${a}`:p.empty}
|
|
14
|
+
LIMIT ${$}
|
|
15
|
+
`}(e,t));c.add(o,j(n,r,t));const i=c.encodeGraph(c.wrapObject(n,s));D("getByArgs",i),c.merge(a,i)},u=c.unwrap(e,s);for(const f of u){const e=c.decodeArgs(f);if(c.isPlainObject(e))if(f.prefix)for(const t of f.children){const r=c.decodeArgs(t);n.push(l($($({},e),r),t.children))}else n.push(l(e,f.children));else r[f.key]=f.children}return c.isEmpty(r)||n.push((async()=>{(await this.readSql(function(e,t){const{table:r,idCol:n}=t;return g.default`
|
|
16
|
+
SELECT
|
|
17
|
+
${C(r)} || ${A(t)}
|
|
18
|
+
FROM "${p.raw(r)}"
|
|
19
|
+
WHERE "${p.raw(n)}" IN (${p.join(e)})
|
|
20
|
+
`}(Object.keys(r),t))).forEach((e=>{const n=e[i],$=r[n];c.add(o,j([e],$,t));const l=c.encodeGraph(c.wrapObject(e,s));D("getByIds",l),c.merge(a,l)}))})()),await Promise.all(n),D("dbRead",e,a),c.slice(c.finalize(a,e),e).known||[]}async write(e,t){const r=[],n=e=>r.push(e),{prefix:a}=t,o=c.unwrap(e,a);for(const $ of o){if(c.isRange($))throw Error($.key===$.end?"pg_write.delete_unsupported":"pg_write.write_range_unsupported");const e=c.decodeArgs($),r=c.decodeGraph($.children);if(c.isPlainObject(e)?c.mergeObject(r,e):r.id=e,r.$put&&!0!==r.$put)throw Error("pg_write.partial_put_unsupported");r.$put?n(P(r,e,t)):n(x(r,e,t))}const i=[];return await Promise.all(r.map((e=>this.writeSql(e).then((e=>{c.merge(i,c.encodeGraph(c.wrapObject(e,a)))}))))),D("dbWrite",e,i),i}}exports.pg=({table:e,idCol:t,verCol:r,links:n,connection:a})=>o=>{o.on("read",(function(e,t){const r=t,{transactionDb:n=s}=r,a=l(r,["transactionDb"]);return n.read(e,$,a)})),o.on("write",(function(e,t){const r=t,{transactionDb:n=s}=r,a=l(r,["transactionDb"]);return n.write(e,$,a)}));const i=o.path,$={prefix:i,table:e||i[i.length-1]||"default",idCol:t||"id",verCol:r||"updatedAt",links:n||{}},s=new I(a)};
|
package/index.mjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var r=Object.defineProperty,e=Object.defineProperties,t=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable,i=(e,t,n)=>t in e?r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,a=(r,e)=>{for(var t in e||(e={}))o.call(e,t)&&i(r,t,e[t]);if(n)for(var t of n(e))$.call(e,t)&&i(r,t,e[t]);return r},s=(r,n)=>e(r,t(n)),c=(r,e)=>{var t={};for(var i in r)o.call(r,i)&&e.indexOf(i)<0&&(t[i]=r[i]);if(null!=r&&n)for(var i of n(r))e.indexOf(i)<0&&$.call(r,i)&&(t[i]=r[i]);return t};import{Pool as l,Client as u}from"pg";import{encodePath as f,unwrap as p,splitRef as h,mergeObject as d,wrapObject as g,splitArgs as b,decodeArgs as y,isEmpty as w,encodeArgs as m,add as E,wrap as O,unwrapObject as _,isPlainObject as q,slice as N,finalize as S,isRange as j,decodeGraph as v,merge as C,encodeGraph as R}from"@graffy/common";import{format as T}from"@graffy/testing";import x from"debug";import A,{join as D,raw as I,empty as k}from"sql-template-tag";const L=x("graffy:pg:link");function M(r,e){return r.map((function r(t){if("string"==typeof t&&"$"===t[0]&&"$"===t[1])return _(e,f(t.slice(2)));if(Array.isArray(t))return t.map(r);if("object"==typeof t&&t){const e={};for(const n in t)e[n]=r(t[n]);return e}return t}))}function U(r,e,{links:t}){const n=[];for(let o in t){const $=f(o),i=p(e,$);if(i)for(const e of r){const r=M(t[o],e),[c,l]=h(r);if(c){const t=[];d(e,g(t,$));const o=i.map((e=>{const[n,o]=b(y(e)),$=a(a({},l),o);return t.push({$key:w(o)?"":s(a({},o),{$all:!0}),$ref:r.slice(0,-1).concat([s(a({},$),{$all:!0})])}),n?s(a({},m($)),{children:[e],version:e.version,prefix:!0}):a(a({},e),m($))}));E(n,O(o,f(r.slice(0,-1))))}else d(e,g({$ref:r},$)),E(n,O(i,f(r)))}}return L("Linked Result",JSON.stringify(r,null,2),T(n)),n}const P={$eq:!0,$lt:!0,$gt:!0,$lte:!0,$gte:!0,$re:!0,$ire:!0,$text:!0,$and:!0,$or:!0,$any:!0,$all:!0,$has:!0},F={$eq:"$neq",$neq:"$eq",$in:"$nin",$nin:"$in",$lt:"$gte",$gte:"$lt",$gt:"$lte",$lte:"$gt"};function J(r){return B=0,H(W(r))}let B;function W(r,e,t){if(!r||"object"!=typeof r){if(t&&e)return[t,e,r];if(e)return["$eq",e,r];throw Error("pgast.expected_prop_before:"+JSON.stringify(r))}return Array.isArray(r)?["$or",r.map((r=>W(r,e,t)))]:["$and",Object.entries(r).map((([r,n])=>{if("$or"===r||"$and"===r)return[r,W(n,e,t)[1]];if("$not"===r)return[r,W(n,e,t)];if("$any"===r||"$all"===r){const t="el$"+B++;return[r,e,t,W(n,t)]}if("$has"===r){const t="el$"+B++;return[r,e,t,W(n,t)[1]]}if("$"===r[0]){if(!P[r])throw Error("pgast.invalid_op:"+r);if(t)throw Error("pgast.unexpected_op:"+t+" before:"+r);if(!e)throw Error("pgast.expected_prop_before:"+r);return W(n,e,r)}if(e){if("."===r[0])return W(n,e+r);throw Error("pgast.unexpected_prop",r)}return W(n,r)}))]}function H(r){const e=r[0];if("$and"===e||"$or"===e?r[1]=r[1].map((r=>H(r))):"$not"===e?r[1]=H(r[1]):"$all"===e||"$any"===e?r[3]=H(r[3]):"$has"===e&&(r[3]=r[3].map((r=>H(r)))),"$or"===e){const{eqmap:e,noneq:t,change:n}=r[1].reduce(((r,e)=>{if("$eq"!==e[0])r.noneq.push(e);else{if(r.eqmap[e[1]])return r.change=!0,r.eqmap[e[1]].push(e[2]),r;r.eqmap[e[1]]=[e[2]]}return r}),{eqmap:{},noneq:[],change:!1});n&&(r[1]=[...t,...Object.entries(e).map((([r,e])=>e.length>1?["$in",r,e]:["$eq",r,e[0]]))])}if("$and"===e||"$or"===e){if(!r[1].length)throw Error("pgast.expected_children:"+e);return 1===r[1].length?r[1][0]:r}if("$not"===e){const[e,...t]=r[1],n=F[e];return n?[n,...t]:r}if("$any"===e||"$all"===e){const[t,n,o,$]=r,[i,a,s]=$;return"$eq"!==i&&"$in"!==i||o!==a?r:["$any"===e?"$ovl":"$ctd",n,"$eq"===i?[s]:s]}if("$has"===e){const[e,t,n,o]=r;return o.every((([r,e])=>"$eq"===r&&e===n))?["$cts",t,o.map((([r,e,t])=>t))]:r}return r}const G=A`cast(extract(epoch from now()) as integer)`,Q=r=>{const e=D(Object.entries(r).map((([r,e])=>A`'${I(r)}', ${e}`)));return A`jsonb_build_object(${e})`},V=r=>A`to_jsonb("${I(r)}")`,Y=({idCol:r})=>Q({$key:A`"${I(r)}"`,$ver:G});function z(r,e){var t=r,{$first:n,$last:o,$after:$,$before:i,$since:a,$until:s,$all:l,$cursor:u}=t,p=c(t,["$first","$last","$after","$before","$since","$until","$all","$cursor"]);const h=p,{$order:d}=h,g=c(h,["$order"]),{prefix:b,idCol:y}=e,m=r=>{const[e,...t]=f(r);return t.length?A`"${I(e)}" #>> '{"${t.join('","')}"}'`:A`"${I(e)}"`},E=r=>((r,e,t)=>Q({$key:r,$ref:A`jsonb_build_array(${D(e.map((r=>A`${r}::text`)))}, "${I(t)}")`,$ver:G}))(r,b,y),O=i||$||a||s||n||o||l||d;let _;const q=[];if(w(g)||(q.push(function(r,e){function t(r){return"el$"===r.substr(0,3)?A`"${I(r)}"`:e(r)}return function r(e){switch(e[0]){case"$eq":return null===e[2]?A`${t(e[1])} IS NULL`:A`${t(e[1])} = ${e[2]}`;case"$neq":return null===e[2]?A`${t(e[1])} IS NOT NULL`:A`${t(e[1])} <> ${e[2]}`;case"$lt":return A`${t(e[1])} < ${e[2]}`;case"$lte":return A`${t(e[1])} <= ${e[2]}`;case"$gt":return A`${t(e[1])} > ${e[2]}`;case"$gte":return A`${t(e[1])} >= ${e[2]}`;case"$re":return A`${t(e[1])} ~ ${e[2]}`;case"$ire":return A`${t(e[1])} ~* ${e[2]}`;case"$in":return A`${t(e[1])} IN (${D(e[2])})`;case"$nin":return A`${t(e[1])} NOT IN (${D(e[2])})`;case"$cts":return A`${t(e[1])} @> ${e[2]}`;case"$ctd":return A`${t(e[1])} <@ ${e[2]}`;case"$ovp":return A`${t(e[1])} && ${e[2]}`;case"$and":return A`(${D(e[1].map((e=>r(e))),") AND (")})`;case"$or":return A`(${D(e[1].map((e=>r(e))),") OR (")})`;case"$not":return A`NOT (${r(e[1])})`;case"$any":return A`(SELECT bool_or(${r(e[3])}) FROM UNNEST(${t(e[1])}) ${t(e[2])})`;case"$all":return A`(SELECT bool_and(${r(e[3])}) FROM UNNEST(${t(e[1])}) ${t(e[2])})`;case"$has":return A`(SELECT bool_or(${D(e[3].map((e=>r(e))),") AND bool_or(")}) FROM UNNEST(${t(e[1])}) ${t(e[2])})`;default:throw Error("pg.getSql_unknown_operator: "+e[0])}}(J(r))}(g,m)),_=A`${JSON.stringify(g)}::jsonb`),!O)return{meta:E(_),where:q,limit:1};if(w(p))throw Error("pg_arg.pagination_only_unsupported in "+b);const N=(d||[y]).map(m);Object.entries({$after:$,$before:i,$since:a,$until:s}).forEach((([r,e])=>{e&&q.push(K(N,e,r))}));const S=d&&Q({$order:A`${JSON.stringify(d)}::jsonb`}),j=Q({$cursor:A`jsonb_build_array(${D(N)})`});return _=A`(${D([_,S,j].filter(Boolean)," || ")})`,{meta:E(_),where:q,order:D(N.map((r=>A`${r} ${o?A`DESC`:A`ASC`}`)),", "),limit:n||o}}function K(r,e,t){if(!Array.isArray(e))throw Error("pg_arg.bad_query bound : "+JSON.stringify(e));const n=r[0],o=e[0];if(r.length>1&&e.length>1){const $=K(r.slice(1),e.slice(1),t);switch(t){case"$after":case"$since":return A`${n} > ${o} OR ${n} = ${o} AND (${$})`;case"$before":case"$until":return A`${n} < ${o} OR ${n} = ${o} AND (${$})`}}else switch(t){case"$after":return A`${n} > ${o}`;case"$since":return A`${n} >= ${o}`;case"$before":return A`${n} < ${o}`;case"$until":return A`${n} <= ${o}`}}function X(r,e,t){const{table:n,idCol:o}=t,{where:$,meta:i}=q(e)?z(e,t):{where:[A`"${I(o)}" = ${e}`],meta:Y(t)};if(!$||!$.length)throw Error("pg_write.no_condition");const a=r;return A`
|
|
2
|
+
UPDATE "${I(n)}" SET ${((r,e)=>D(Object.entries(r).filter((([r])=>r!==e.idCol&&"$"!==r[0])).map((([r,e])=>A`"${I(r)}" = ${"object"==typeof e&&e?A`"${I(r)}" || ${e}`:e}`)).concat(A`"${I(e.verCol)}" = ${G}`),", "))(a,t)}
|
|
3
|
+
WHERE ${D($," AND ")}
|
|
4
|
+
LIMIT 1
|
|
5
|
+
RETURNING (${V(n)} || ${i})`}function Z(r,e,t){const{idCol:n,table:o}=t,$=r;let i,a;q(e)?(({meta:i}=z(e,t)),a=D(Object.keys(e).map((r=>A`"${I(r)}"`)))):(i=Y(t),a=A`"${I(n)}"`);const{cols:s,vals:c}=((r,e)=>{const t=[],n=[];return Object.entries(r).filter((([r])=>r!==e.verCol&&"$"!==r[0])).concat([[e.verCol,G]]).forEach((([r,e])=>{t.push(A`"${I(r)}"`),n.push(e)})),{cols:D(t,", "),vals:D(n,", ")}})($,t);return A`
|
|
6
|
+
INSERT INTO "${I(o)}" (${s}) VALUES (${c})
|
|
7
|
+
ON CONFLICT (${a}) DO UPDATE SET (${s}) = (${c})
|
|
8
|
+
RETURNING (${V(o)} || ${i})`}const rr=x("graffy:pg:db");class er{constructor(r){this.client="object"==typeof r&&r&&(r instanceof l||r instanceof u)?r:new l(r)}async query(r){r.rowMode="array",rr("Making SQL query: "+r.text,r.values);try{return await this.client.query(r)}catch(e){throw Error("pg.sql_error "+e.message+" in "+r.text+" with "+r.values)}}async readSql(r){let e=await this.query(r);return e=e.rows.flat(),rr("Read result",e),e}async writeSql(r){let e=await this.query(r);if(rr("Rows written",e.rowCount),!e.rowCount)throw Error("pg.nothing_written "+r.text+" with "+r.values);return e.rows[0][0]}async read(r,e){const t={},n=[],o=[],$=[],{idCol:i,prefix:s}=e,c=async(r,t)=>{const n=await this.readSql(function(r,e){const{table:t}=e,{where:n,order:o,limit:$,meta:i}=z(r,e),a=Math.min(4096,$||4096);return A`
|
|
9
|
+
SELECT
|
|
10
|
+
${V(t)} || ${i}
|
|
11
|
+
FROM "${I(t)}"
|
|
12
|
+
${n.length?A`WHERE ${D(n," AND ")}`:k}
|
|
13
|
+
${o?A`ORDER BY ${o}`:k}
|
|
14
|
+
LIMIT ${a}
|
|
15
|
+
`}(r,e));E($,U(n,t,e));const i=R(g(n,s));rr("getByArgs",i),C(o,i)},l=p(r,s);for(const u of l){const r=y(u);if(q(r))if(u.prefix)for(const e of u.children){const t=y(e);n.push(c(a(a({},r),t),e.children))}else n.push(c(r,u.children));else t[u.key]=u.children}return w(t)||n.push((async()=>{(await this.readSql(function(r,e){const{table:t,idCol:n}=e;return A`
|
|
16
|
+
SELECT
|
|
17
|
+
${V(t)} || ${Y(e)}
|
|
18
|
+
FROM "${I(t)}"
|
|
19
|
+
WHERE "${I(n)}" IN (${D(r)})
|
|
20
|
+
`}(Object.keys(t),e))).forEach((r=>{const n=r[i],a=t[n];E($,U([r],a,e));const c=R(g(r,s));rr("getByIds",c),C(o,c)}))})()),await Promise.all(n),rr("dbRead",r,o),N(S(o,r),r).known||[]}async write(r,e){const t=[],n=r=>t.push(r),{prefix:o}=e,$=p(r,o);for(const a of $){if(j(a))throw Error(a.key===a.end?"pg_write.delete_unsupported":"pg_write.write_range_unsupported");const r=y(a),t=v(a.children);if(q(r)?d(t,r):t.id=r,t.$put&&!0!==t.$put)throw Error("pg_write.partial_put_unsupported");t.$put?n(Z(t,r,e)):n(X(t,r,e))}const i=[];return await Promise.all(t.map((r=>this.writeSql(r).then((r=>{C(i,R(g(r,o)))}))))),rr("dbWrite",r,i),i}}const tr=({table:r,idCol:e,verCol:t,links:n,connection:o})=>$=>{$.on("read",(function(r,e){const t=e,{transactionDb:n=s}=t,o=c(t,["transactionDb"]);return n.read(r,a,o)})),$.on("write",(function(r,e){const t=e,{transactionDb:n=s}=t,o=c(t,["transactionDb"]);return n.write(r,a,o)}));const i=$.path,a={prefix:i,table:r||i[i.length-1]||"default",idCol:e||"id",verCol:t||"updatedAt",links:n||{}},s=new er(o)};export{tr as pg};
|
package/package.json
CHANGED
|
@@ -2,8 +2,13 @@
|
|
|
2
2
|
"name": "@graffy/pg",
|
|
3
3
|
"description": "The standard Postgres module for Graffy. Each instance this module mounts a Postgres table as a Graffy subtree.",
|
|
4
4
|
"author": "aravind (https://github.com/aravindet)",
|
|
5
|
-
"version": "0.15.
|
|
6
|
-
"main": "./
|
|
5
|
+
"version": "0.15.8-alpha.4",
|
|
6
|
+
"main": "./index.cjs",
|
|
7
|
+
"exports": {
|
|
8
|
+
"import": "./index.mjs",
|
|
9
|
+
"require": "./index.cjs"
|
|
10
|
+
},
|
|
11
|
+
"module": "./index.mjs",
|
|
7
12
|
"types": "./types/index.d.ts",
|
|
8
13
|
"repository": {
|
|
9
14
|
"type": "git",
|
|
@@ -11,11 +16,10 @@
|
|
|
11
16
|
},
|
|
12
17
|
"license": "Apache-2.0",
|
|
13
18
|
"dependencies": {
|
|
14
|
-
"@babel/runtime-corejs3": "^7.15.3",
|
|
15
19
|
"pg": "^8.7.1",
|
|
16
|
-
"@graffy/common": "0.15.
|
|
20
|
+
"@graffy/common": "0.15.8-alpha.4",
|
|
21
|
+
"@graffy/testing": "0.15.8-alpha.4",
|
|
17
22
|
"debug": "^4.3.2",
|
|
18
|
-
"sql-template-tag": "^4.0.0"
|
|
19
|
-
"@graffy/testing": "0.15.7"
|
|
23
|
+
"sql-template-tag": "^4.0.0"
|
|
20
24
|
}
|
|
21
25
|
}
|
package/types/Db.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export default class Db {
|
|
2
2
|
constructor(connection: any);
|
|
3
3
|
client: any;
|
|
4
|
-
query(
|
|
4
|
+
query(sql: any): Promise<any>;
|
|
5
5
|
readSql(sql: any): Promise<any>;
|
|
6
6
|
writeSql(sql: any): Promise<any>;
|
|
7
7
|
read(rootQuery: any, tableOptions: any): Promise<any>;
|
|
8
|
-
write(rootChange: any, tableOptions: any): Promise<any>;
|
|
8
|
+
write(rootChange: any, tableOptions: any): Promise<any[]>;
|
|
9
9
|
}
|
package/types/sql/getArgSql.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
@typedef { import('sql-template-tag').Sql } Sql
|
|
8
8
|
@return {{ meta: Sql, where: Sql[], order?: Sql, limit: number }}
|
|
9
9
|
*/
|
|
10
|
-
export default function getArgSql({ $first, $last, $after, $before, $since, $until, $cursor: _, ...rest }: object, options: object): {
|
|
10
|
+
export default function getArgSql({ $first, $last, $after, $before, $since, $until, $all, $cursor: _, ...rest }: object, options: object): {
|
|
11
11
|
meta: Sql;
|
|
12
12
|
where: Sql[];
|
|
13
13
|
order?: Sql;
|
package/cjs/Db.js
DELETED
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");
|
|
4
|
-
|
|
5
|
-
var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");
|
|
6
|
-
|
|
7
|
-
var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");
|
|
8
|
-
|
|
9
|
-
var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");
|
|
10
|
-
|
|
11
|
-
var _bindInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/bind");
|
|
12
|
-
|
|
13
|
-
var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");
|
|
14
|
-
|
|
15
|
-
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
|
16
|
-
|
|
17
|
-
exports.__esModule = true;
|
|
18
|
-
exports.default = void 0;
|
|
19
|
-
|
|
20
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
|
|
21
|
-
|
|
22
|
-
var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));
|
|
23
|
-
|
|
24
|
-
var _flat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flat"));
|
|
25
|
-
|
|
26
|
-
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
|
27
|
-
|
|
28
|
-
var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
|
|
29
|
-
|
|
30
|
-
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
|
|
31
|
-
|
|
32
|
-
var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
|
|
33
|
-
|
|
34
|
-
var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
|
|
35
|
-
|
|
36
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
|
|
37
|
-
|
|
38
|
-
var _pg = require("pg");
|
|
39
|
-
|
|
40
|
-
var _common = require("@graffy/common");
|
|
41
|
-
|
|
42
|
-
var _index = require("./link/index.js");
|
|
43
|
-
|
|
44
|
-
var _select = require("./sql/select");
|
|
45
|
-
|
|
46
|
-
var _index2 = require("./sql/index.js");
|
|
47
|
-
|
|
48
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
49
|
-
|
|
50
|
-
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var _context12; var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (it) return _bindInstanceProperty(_context12 = (it = it.call(o)).next).call(_context12, it); if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
51
|
-
|
|
52
|
-
function _unsupportedIterableToArray(o, minLen) { var _context11; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context11 = Object.prototype.toString.call(o)).call(_context11, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
53
|
-
|
|
54
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
55
|
-
|
|
56
|
-
var log = (0, _debug.default)('graffy:pg:dbwrap');
|
|
57
|
-
|
|
58
|
-
var Db = /*#__PURE__*/function () {
|
|
59
|
-
function Db(connection) {
|
|
60
|
-
if (typeof connection === 'object' && connection && (connection instanceof _pg.Pool || connection instanceof _pg.Client)) {
|
|
61
|
-
this.client = connection;
|
|
62
|
-
} else {
|
|
63
|
-
this.client = new _pg.Pool(connection);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
var _proto = Db.prototype;
|
|
68
|
-
|
|
69
|
-
_proto.query = /*#__PURE__*/function () {
|
|
70
|
-
var _query = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(sqlQuery) {
|
|
71
|
-
var start, res, duration;
|
|
72
|
-
return _regenerator.default.wrap(function _callee$(_context) {
|
|
73
|
-
while (1) {
|
|
74
|
-
switch (_context.prev = _context.next) {
|
|
75
|
-
case 0:
|
|
76
|
-
start = (0, _now.default)();
|
|
77
|
-
sqlQuery.rowMode = 'array';
|
|
78
|
-
_context.next = 4;
|
|
79
|
-
return this.client.query(sqlQuery);
|
|
80
|
-
|
|
81
|
-
case 4:
|
|
82
|
-
res = _context.sent;
|
|
83
|
-
duration = (0, _now.default)() - start;
|
|
84
|
-
log('query', {
|
|
85
|
-
query: sqlQuery.text,
|
|
86
|
-
duration: duration,
|
|
87
|
-
res: res
|
|
88
|
-
});
|
|
89
|
-
return _context.abrupt("return", res);
|
|
90
|
-
|
|
91
|
-
case 8:
|
|
92
|
-
case "end":
|
|
93
|
-
return _context.stop();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}, _callee, this);
|
|
97
|
-
}));
|
|
98
|
-
|
|
99
|
-
function query(_x) {
|
|
100
|
-
return _query.apply(this, arguments);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return query;
|
|
104
|
-
}();
|
|
105
|
-
|
|
106
|
-
_proto.readSql = /*#__PURE__*/function () {
|
|
107
|
-
var _readSql = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(sql) {
|
|
108
|
-
var _context2;
|
|
109
|
-
|
|
110
|
-
var result;
|
|
111
|
-
return _regenerator.default.wrap(function _callee2$(_context3) {
|
|
112
|
-
while (1) {
|
|
113
|
-
switch (_context3.prev = _context3.next) {
|
|
114
|
-
case 0:
|
|
115
|
-
_context3.next = 2;
|
|
116
|
-
return this.query(sql);
|
|
117
|
-
|
|
118
|
-
case 2:
|
|
119
|
-
result = _context3.sent;
|
|
120
|
-
// Each row is an array, as there is only one column returned.
|
|
121
|
-
result = (0, _flat.default)(_context2 = result.rows).call(_context2);
|
|
122
|
-
log('Read result', result);
|
|
123
|
-
return _context3.abrupt("return", result);
|
|
124
|
-
|
|
125
|
-
case 6:
|
|
126
|
-
case "end":
|
|
127
|
-
return _context3.stop();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}, _callee2, this);
|
|
131
|
-
}));
|
|
132
|
-
|
|
133
|
-
function readSql(_x2) {
|
|
134
|
-
return _readSql.apply(this, arguments);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return readSql;
|
|
138
|
-
}();
|
|
139
|
-
|
|
140
|
-
_proto.writeSql = /*#__PURE__*/function () {
|
|
141
|
-
var _writeSql = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(sql) {
|
|
142
|
-
var res;
|
|
143
|
-
return _regenerator.default.wrap(function _callee3$(_context4) {
|
|
144
|
-
while (1) {
|
|
145
|
-
switch (_context4.prev = _context4.next) {
|
|
146
|
-
case 0:
|
|
147
|
-
_context4.next = 2;
|
|
148
|
-
return this.query(sql);
|
|
149
|
-
|
|
150
|
-
case 2:
|
|
151
|
-
res = _context4.sent;
|
|
152
|
-
log('Rows written', res.rowCount);
|
|
153
|
-
return _context4.abrupt("return", res.rowCount);
|
|
154
|
-
|
|
155
|
-
case 5:
|
|
156
|
-
case "end":
|
|
157
|
-
return _context4.stop();
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}, _callee3, this);
|
|
161
|
-
}));
|
|
162
|
-
|
|
163
|
-
function writeSql(_x3) {
|
|
164
|
-
return _writeSql.apply(this, arguments);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return writeSql;
|
|
168
|
-
}();
|
|
169
|
-
|
|
170
|
-
_proto.read = /*#__PURE__*/function () {
|
|
171
|
-
var _read = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(rootQuery, tableOptions) {
|
|
172
|
-
var _this = this;
|
|
173
|
-
|
|
174
|
-
var idQueries, promises, results, refQuery, idCol, prefix, getByArgs, getByIds, query, _iterator, _step, node, args;
|
|
175
|
-
|
|
176
|
-
return _regenerator.default.wrap(function _callee6$(_context9) {
|
|
177
|
-
while (1) {
|
|
178
|
-
switch (_context9.prev = _context9.next) {
|
|
179
|
-
case 0:
|
|
180
|
-
idQueries = {};
|
|
181
|
-
promises = [];
|
|
182
|
-
results = [];
|
|
183
|
-
refQuery = [];
|
|
184
|
-
idCol = tableOptions.idCol, prefix = tableOptions.prefix;
|
|
185
|
-
|
|
186
|
-
getByArgs = /*#__PURE__*/function () {
|
|
187
|
-
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(args, subQuery) {
|
|
188
|
-
var _context5;
|
|
189
|
-
|
|
190
|
-
var result, wrappedQuery, wrappedGraph;
|
|
191
|
-
return _regenerator.default.wrap(function _callee4$(_context6) {
|
|
192
|
-
while (1) {
|
|
193
|
-
switch (_context6.prev = _context6.next) {
|
|
194
|
-
case 0:
|
|
195
|
-
_context6.next = 2;
|
|
196
|
-
return _this.readSql((0, _select.selectByArgs)(args, tableOptions));
|
|
197
|
-
|
|
198
|
-
case 2:
|
|
199
|
-
result = _context6.sent;
|
|
200
|
-
(0, _common.add)(refQuery, (0, _index.linkResult)(result, subQuery, tableOptions));
|
|
201
|
-
wrappedQuery = (0, _common.wrap)(subQuery, (0, _concat.default)(_context5 = []).call(_context5, prefix, [args]));
|
|
202
|
-
wrappedGraph = (0, _common.encodeGraph)((0, _common.wrapObject)(result, prefix));
|
|
203
|
-
log('getByArgs', wrappedGraph, wrappedQuery, (0, _common.finalize)(wrappedGraph, wrappedQuery));
|
|
204
|
-
(0, _common.merge)(results, (0, _common.finalize)(wrappedGraph, wrappedQuery));
|
|
205
|
-
|
|
206
|
-
case 8:
|
|
207
|
-
case "end":
|
|
208
|
-
return _context6.stop();
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}, _callee4);
|
|
212
|
-
}));
|
|
213
|
-
|
|
214
|
-
return function getByArgs(_x6, _x7) {
|
|
215
|
-
return _ref.apply(this, arguments);
|
|
216
|
-
};
|
|
217
|
-
}();
|
|
218
|
-
|
|
219
|
-
getByIds = /*#__PURE__*/function () {
|
|
220
|
-
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
|
|
221
|
-
var result;
|
|
222
|
-
return _regenerator.default.wrap(function _callee5$(_context8) {
|
|
223
|
-
while (1) {
|
|
224
|
-
switch (_context8.prev = _context8.next) {
|
|
225
|
-
case 0:
|
|
226
|
-
_context8.next = 2;
|
|
227
|
-
return _this.readSql((0, _select.selectByIds)((0, _keys.default)(idQueries), tableOptions));
|
|
228
|
-
|
|
229
|
-
case 2:
|
|
230
|
-
result = _context8.sent;
|
|
231
|
-
(0, _forEach.default)(result).call(result, function (object) {
|
|
232
|
-
var _context7;
|
|
233
|
-
|
|
234
|
-
var id = object[idCol];
|
|
235
|
-
var subQuery = idQueries[id];
|
|
236
|
-
(0, _common.add)(refQuery, (0, _index.linkResult)([object], subQuery, tableOptions));
|
|
237
|
-
var wrappedQuery = (0, _common.wrap)(subQuery, (0, _concat.default)(_context7 = []).call(_context7, prefix, [id]));
|
|
238
|
-
var wrappedGraph = (0, _common.encodeGraph)((0, _common.wrapObject)(object, prefix));
|
|
239
|
-
log('getByIds', wrappedGraph, wrappedQuery, (0, _common.finalize)(wrappedGraph, wrappedQuery));
|
|
240
|
-
(0, _common.merge)(results, (0, _common.finalize)(wrappedGraph, wrappedQuery));
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
case 4:
|
|
244
|
-
case "end":
|
|
245
|
-
return _context8.stop();
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}, _callee5);
|
|
249
|
-
}));
|
|
250
|
-
|
|
251
|
-
return function getByIds() {
|
|
252
|
-
return _ref2.apply(this, arguments);
|
|
253
|
-
};
|
|
254
|
-
}();
|
|
255
|
-
|
|
256
|
-
query = (0, _common.unwrap)(rootQuery, prefix);
|
|
257
|
-
|
|
258
|
-
for (_iterator = _createForOfIteratorHelperLoose(query); !(_step = _iterator()).done;) {
|
|
259
|
-
node = _step.value;
|
|
260
|
-
args = (0, _common.decodeArgs)(node);
|
|
261
|
-
|
|
262
|
-
if ((0, _common.isPlainObject)(args)) {
|
|
263
|
-
promises.push(getByArgs(args, node.children));
|
|
264
|
-
} else {
|
|
265
|
-
idQueries[node.key] = node.children;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (!(0, _common.isEmpty)(idQueries)) promises.push(getByIds());
|
|
270
|
-
_context9.next = 12;
|
|
271
|
-
return _promise.default.all(promises);
|
|
272
|
-
|
|
273
|
-
case 12:
|
|
274
|
-
log('dbRead', rootQuery, results);
|
|
275
|
-
return _context9.abrupt("return", (0, _sliceInstanceProperty(_common))(results, rootQuery).known || []);
|
|
276
|
-
|
|
277
|
-
case 14:
|
|
278
|
-
case "end":
|
|
279
|
-
return _context9.stop();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}, _callee6);
|
|
283
|
-
}));
|
|
284
|
-
|
|
285
|
-
function read(_x4, _x5) {
|
|
286
|
-
return _read.apply(this, arguments);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return read;
|
|
290
|
-
}();
|
|
291
|
-
|
|
292
|
-
_proto.write = /*#__PURE__*/function () {
|
|
293
|
-
var _write = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(rootChange, tableOptions) {
|
|
294
|
-
var _this2 = this;
|
|
295
|
-
|
|
296
|
-
var sqls, addToQuery, prefix, change, _iterator2, _step2, node, object, arg;
|
|
297
|
-
|
|
298
|
-
return _regenerator.default.wrap(function _callee7$(_context10) {
|
|
299
|
-
while (1) {
|
|
300
|
-
switch (_context10.prev = _context10.next) {
|
|
301
|
-
case 0:
|
|
302
|
-
sqls = [];
|
|
303
|
-
|
|
304
|
-
addToQuery = function addToQuery(sql) {
|
|
305
|
-
return sqls.push(sql);
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
prefix = tableOptions.prefix;
|
|
309
|
-
change = (0, _common.unwrap)(rootChange, prefix);
|
|
310
|
-
_iterator2 = _createForOfIteratorHelperLoose(change);
|
|
311
|
-
|
|
312
|
-
case 5:
|
|
313
|
-
if ((_step2 = _iterator2()).done) {
|
|
314
|
-
_context10.next = 16;
|
|
315
|
-
break;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
node = _step2.value;
|
|
319
|
-
|
|
320
|
-
if (!(0, _common.isRange)(node)) {
|
|
321
|
-
_context10.next = 9;
|
|
322
|
-
break;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
throw Error(node.key === node.end ? 'pg_write.delete_unsupported' : 'pg_write.write_range_unsupported');
|
|
326
|
-
|
|
327
|
-
case 9:
|
|
328
|
-
object = (0, _common.decodeGraph)(node.children);
|
|
329
|
-
arg = (0, _common.decodeArgs)(node);
|
|
330
|
-
|
|
331
|
-
if (!(object.$put && object.$put !== true)) {
|
|
332
|
-
_context10.next = 13;
|
|
333
|
-
break;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
throw Error('pg_write.partial_put_unsupported');
|
|
337
|
-
|
|
338
|
-
case 13:
|
|
339
|
-
object.$put ? addToQuery((0, _index2.put)(object, arg, tableOptions)) : addToQuery((0, _index2.patch)(object, arg, tableOptions));
|
|
340
|
-
|
|
341
|
-
case 14:
|
|
342
|
-
_context10.next = 5;
|
|
343
|
-
break;
|
|
344
|
-
|
|
345
|
-
case 16:
|
|
346
|
-
_context10.next = 18;
|
|
347
|
-
return _promise.default.all((0, _map.default)(sqls).call(sqls, function (sql) {
|
|
348
|
-
return _this2.writeSql(sql);
|
|
349
|
-
}));
|
|
350
|
-
|
|
351
|
-
case 18:
|
|
352
|
-
return _context10.abrupt("return", rootChange);
|
|
353
|
-
|
|
354
|
-
case 19:
|
|
355
|
-
case "end":
|
|
356
|
-
return _context10.stop();
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}, _callee7);
|
|
360
|
-
}));
|
|
361
|
-
|
|
362
|
-
function write(_x8, _x9) {
|
|
363
|
-
return _write.apply(this, arguments);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
return write;
|
|
367
|
-
}();
|
|
368
|
-
|
|
369
|
-
return Db;
|
|
370
|
-
}();
|
|
371
|
-
|
|
372
|
-
exports.default = Db;
|
|
373
|
-
module.exports = exports.default;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
exports.__esModule = true;
|
|
6
|
-
exports.default = filterObject;
|
|
7
|
-
|
|
8
|
-
var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));
|
|
9
|
-
|
|
10
|
-
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
|
|
11
|
-
|
|
12
|
-
var _common = require("@graffy/common");
|
|
13
|
-
|
|
14
|
-
var _getAst = _interopRequireDefault(require("./getAst.js"));
|
|
15
|
-
|
|
16
|
-
function filterObject(filter, object) {
|
|
17
|
-
function lookup(path) {
|
|
18
|
-
return (0, _common.unwrapObject)(object, (0, _common.encodePath)(path));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function checkNode(ast) {
|
|
22
|
-
var _context, _context2;
|
|
23
|
-
|
|
24
|
-
switch (ast[0]) {
|
|
25
|
-
case '$eq':
|
|
26
|
-
return lookup(ast[1]) === ast[2];
|
|
27
|
-
|
|
28
|
-
case '$ne':
|
|
29
|
-
return lookup(ast[1]) !== ast[2];
|
|
30
|
-
|
|
31
|
-
case '$lt':
|
|
32
|
-
return lookup(ast[1]) < ast[2];
|
|
33
|
-
|
|
34
|
-
case '$lte':
|
|
35
|
-
return lookup(ast[1]) <= ast[2];
|
|
36
|
-
|
|
37
|
-
case '$gt':
|
|
38
|
-
return lookup(ast[1]) > ast[2];
|
|
39
|
-
|
|
40
|
-
case '$gte':
|
|
41
|
-
return lookup(ast[1]) >= ast[2];
|
|
42
|
-
|
|
43
|
-
case '$in':
|
|
44
|
-
return (0, _isArray.default)(ast[2]) && (0, _includes.default)(_context = ast[2]).call(_context, lookup(ast[1]));
|
|
45
|
-
|
|
46
|
-
case '$nin':
|
|
47
|
-
return !(0, _isArray.default)(ast[2]) || !(0, _includes.default)(_context2 = ast[2]).call(_context2, lookup(ast[1]));
|
|
48
|
-
|
|
49
|
-
case '$cts':
|
|
50
|
-
case '$ctd':
|
|
51
|
-
case '$ovp':
|
|
52
|
-
case '$and':
|
|
53
|
-
case '$or':
|
|
54
|
-
case '$not':
|
|
55
|
-
case '$any':
|
|
56
|
-
case '$all':
|
|
57
|
-
case '$has':
|
|
58
|
-
throw Error('pgfilter.unimplemented');
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
var rootAst = (0, _getAst.default)(filter);
|
|
63
|
-
return checkNode(rootAst);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
module.exports = exports.default;
|