git » hoplite.git » commit c95fceb

Back out buggy aggs

author Alan Dipert
2021-06-25 03:05:55 UTC
committer Alan Dipert
2021-06-25 03:05:55 UTC
parent dcec772a0ccec99ea34f2885f4e50c9c90f87608

Back out buggy aggs

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));
   }
 }