@thi.ng/rstream-query
Version:
@thi.ng/rstream based triple store & reactive query engine
40 lines (39 loc) • 1.08 kB
JavaScript
import { isString } from "@thi.ng/checks/is-string";
const AUTO_QVAR_PREFIX = "?__q";
let AUTO_QVAR_ID = 0;
const isQVar = (x) => isString(x) && x.charAt(0) === "?";
const isAutoQVar = (x) => isString(x) && x.indexOf(AUTO_QVAR_PREFIX) == 0;
const autoQVar = () => AUTO_QVAR_PREFIX + (AUTO_QVAR_ID++).toString(36);
const qvarName = (x) => x.substring(1);
const qvarResolver = (vs, vp, vo, s, p, o) => {
const type = vs << 2 | vp << 1 | vo;
let ss = vs && qvarName(s);
let pp = vp && qvarName(p);
let oo = vo && qvarName(o);
switch (type) {
case 0:
default:
return;
case 1:
return (f) => ({ [oo]: f[2] });
case 2:
return (f) => ({ [pp]: f[1] });
case 3:
return (f) => ({ [pp]: f[1], [oo]: f[2] });
case 4:
return (f) => ({ [ss]: f[0] });
case 5:
return (f) => ({ [ss]: f[0], [oo]: f[2] });
case 6:
return (f) => ({ [ss]: f[0], [pp]: f[1] });
case 7:
return (f) => ({ [ss]: f[0], [pp]: f[1], [oo]: f[2] });
}
};
export {
autoQVar,
isAutoQVar,
isQVar,
qvarName,
qvarResolver
};