UNPKG

@thi.ng/rstream-query

Version:

@thi.ng/rstream based triple store & reactive query engine

33 lines (32 loc) 911 B
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 };