@thi.ng/rstream-query
Version:
@thi.ng/rstream based triple store & reactive query engine
33 lines (32 loc) • 911 B
JavaScript
import { repeatedly } from "@thi.ng/transducers/repeatedly";
import { autoQVar, isQVar, qvarName } from "./qvar.js";
const patternVarCount = (p) => {
let n = 0;
if (isQVar(p[0])) n++;
if (isQVar(p[1])) n++;
if (isQVar(p[2])) n++;
return n;
};
const patternVars = ([s, p, o]) => {
const vars = [];
isQVar(s) && vars.push(qvarName(s));
isQVar(p) && vars.push(qvarName(p));
isQVar(o) && vars.push(qvarName(o));
return vars;
};
const resolvePathPattern = ([s, p, o], maxLen = p.length) => {
const res = [];
const avars = [...repeatedly(autoQVar, maxLen - 1)];
for (let i = 0; i < maxLen; i++) {
res.push([s, p[i % p.length], s = avars[i]]);
}
res[res.length - 1][2] = o;
return [res, avars];
};
const sortPatterns = (patterns) => patterns.sort((a, b) => patternVarCount(a) - patternVarCount(b));
export {
patternVarCount,
patternVars,
resolvePathPattern,
sortPatterns
};