author | Alan Dipert
<alan@dipert.org> 2021-06-25 03:05:55 UTC |
committer | Alan Dipert
<alan@dipert.org> 2021-06-25 03:05:55 UTC |
parent | dcec772a0ccec99ea34f2885f4e50c9c90f87608 |
datalog.mjs | +25 | -36 |
diff --git a/datalog.mjs b/datalog.mjs index 42859ec..9b22760 100644 --- a/datalog.mjs +++ b/datalog.mjs @@ -184,27 +184,28 @@ function findAll(pred, xs) { return xs.reduce((xs, y, i) => pred(y) ? [...xs, i] : xs, []); } -function select(rel, find, by) { - let varIdxs = findAll(isVar, find), - aggIdxs = findAll(x => !isVar(x), find); - if (!rel.size()) { - return rel; - } else if (!aggIdxs.length) { - return new StupidTupleSet([...rel].map(rx => find.map(v => rx[v.description]))); - } else if (!varIdxs.length) { - return new StupidTupleSet(find.map(([op, sym]) => { - if (op === "min") { - return [ - [...rel].map(rx => rx[sym.description]).sort((a, b) => a - b)[0] - ]; - } else { - throw new Error(`Unsupported aggregation operator: ${op}`); - } - })); - } else { - // TODO agg + vars - throw new Error(`TODO grouping`) - } +function select(rel, vars) { + return new StupidTupleSet([...rel].map(rx => vars.map(v => rx[v]))); + // let varIdxs = findAll(isVar, find), + // aggIdxs = findAll(x => !isVar(x), find); + // if (!rel.size()) { + // return rel; + // } else if (!aggIdxs.length) { + // return new StupidTupleSet([...rel].map(rx => find.map(v => rx[v.description]))); + // } else if (!varIdxs.length) { + // return new StupidTupleSet(find.map(([op, sym]) => { + // if (op === "min") { + // return [ + // [...rel].map(rx => rx[sym.description]).sort((a, b) => a - b)[0] + // ]; + // } else { + // throw new Error(`Unsupported aggregation operator: ${op}`); + // } + // })); + // } else { + // // TODO agg + vars + // throw new Error(`TODO grouping`) + // } } function parseVals(use, vals) { @@ -290,11 +291,7 @@ function filterByPredicate(rel, predClause) { }, new Relation(rel.vars)); } -// find = :find -// by = :with -// use = :in -// where = :where -function query({find = [], by = [], use = [], where = []}, ...vals) { +function query({find = [], use = [], where = []}, ...vals) { let parsed = parseVals(use, vals); if (parsed.multipleSources) { let rels = [initRel(parsed.valueNames, parsed.values)]; @@ -304,11 +301,7 @@ function query({find = [], by = [], use = [], where = []}, ...vals) { .map(c => scan(parsed.namedSources[sourceName], c.slice(1))) .forEach(rel => rels.push(rel)); } - return select( - rels.reduce(join), - find, - by - ); + return select(rels.reduce(join), varNames(find)); } else { let rel = [ initRel(parsed.valueNames, parsed.values), @@ -320,11 +313,7 @@ function query({find = [], by = [], use = [], where = []}, ...vals) { if (preds.length) { rel = preds.reduce(filterByPredicate, rel); } - return select( - rel, - find, - by - ); + return select(rel, varNames(find)); } }