Commit 2df5b37f authored by Ryan Wisnesky's avatar Ryan Wisnesky
Browse files

bindings for fred

parent 112f7b53
Loading
Loading
Loading
Loading
+59 −7
Changes for src/catdata/aql/Query.java: 59 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import catdata.Chc;
@@ -39,7 +40,7 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
	}

	public final Ctx<Var, Ty> params;
	//public final Ctx<Var, Term<Ty, Void, Sym, Void, Void, Void, Void>> consts = new Ctx<>();
	public final Ctx<Var, Term<Ty, Void, Sym, Void, Void, Void, Void>> consts;

	public final Ctx<En2, Frozen<Ty, En1, Sym, Fk1, Att1>> ens = new Ctx<>();
	public final Ctx<Att2, Term<Ty, En1, Sym, Fk1, Att1, Var, Var>> atts;
@@ -71,7 +72,8 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
		Blob<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> b = new Blob<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2>(conv1(ens),
				atts, conv2(), src, dst);
		b = unfoldNestedApplications(b);
		Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> p = new Query<>(params, new Ctx<>(), b.ens, b.atts, b.fks, src, dst, true);
		Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> p = new Query<>(params, consts, b.ens, b.atts, b.fks, src,
				dst, true);
		return p;
	}

@@ -367,6 +369,7 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
		this.src = src;
		this.dst = dst;
		this.params = new Ctx<>(params.map);
		this.consts = new Ctx<>(consts.map);
		totalityCheck(ens, atts, fks);

		for (En2 en2 : ens.keySet()) {
@@ -631,7 +634,9 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
		}

		public Collection<Eq<Ty, En1, Sym, Fk1, Att1, Var, Void>> eqsNoSks() {
			return eqs.stream().map(x -> new Eq<Ty, En1, Sym, Fk1, Att1, Var, Void>(new Ctx<>(), x.lhs.convert(), x.rhs.convert())).collect(Collectors.toList());
			return eqs.stream()
					.map(x -> new Eq<Ty, En1, Sym, Fk1, Att1, Var, Void>(new Ctx<>(), x.lhs.convert(), x.rhs.convert()))
					.collect(Collectors.toList());
		}

	}
@@ -641,11 +646,15 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
		String ret = "";

		if (!params.isEmpty()) {
			ret += "params " + Util.sep(params.map, ":", " ");
			ret += "params " + Util.sep(params.map, ":", " ") + "\n\n";
		}
		if (!consts.isEmpty()) {
			ret += "bindings " + Util.sep(consts.map, ":", " ") + "\n\n";
		}
		/* if (!consts.isEmpty()) {
			ret += "consts " + Util.sep(params.map, "=", " ");
		} */

		/*
		 * if (!consts.isEmpty()) { ret += "consts " + Util.sep(params.map, "=", " "); }
		 */

		Map<String, String> m1 = new HashMap<>();

@@ -883,6 +892,9 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
				newLhs = eq.lhs.gen + "." + idCol;
			} else if (eq.lhs.sk != null) {
				newLhs = "?";
				if (consts.containsKey(eq.lhs.sk)) {
					newLhs = quotePrim(consts.get(eq.lhs.sk).convert()).toString();
				}
			} else {
				newLhs = quotePrim(eq.lhs).toString();
			}
@@ -891,6 +903,9 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
				newRhs = eq.rhs.gen + "." + idCol;
			} else if (eq.rhs.sk != null) {
				newRhs = "?";
			if (consts.containsKey(eq.rhs.sk)) {
					newRhs = quotePrim(consts.get(eq.rhs.sk).convert()).toString();
				}
			} else {
				newRhs = quotePrim(eq.rhs).toString();
			}
@@ -940,4 +955,41 @@ public final class Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> implements Sem
		return new Query<>(new Ctx<>(), new Ctx<>(), ens0, atts0, fks0, S, S, true);
	}

	public Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> deParam() {

	//	Ctx<En2, Frozen<Ty, En1, Sym, Fk1, Att1>> ens2 = new Ctx<>();
		Ctx<Att2, Term<Ty, En1, Sym, Fk1, Att1, Var, Var>> atts2 = new Ctx<>();
		Function<Term<Ty, En1, Sym, Fk1, Att1, Var, Var>, Term<Ty, En1, Sym, Fk1, Att1, Var, Var>> f = x -> {
			for (Var var : consts.keySet()) {
				x = x.replace(Term.Sk(var), consts.get(var).convert());
			}
			return x;
		};
		Function<Set<Pair<Term<Ty, En1, Sym, Fk1, Att1, Var, Var>,Term<Ty, En1, Sym, Fk1, Att1, Var, Var>>>, 
		Set<Eq<Ty, En1, Sym, Fk1, Att1, Var, Var>>> g = x -> {
			Set<Eq<Ty, En1, Sym, Fk1, Att1, Var, Var>> ret = new HashSet<>();
			for (Pair<Term<Ty, En1, Sym, Fk1, Att1, Var, Var>, Term<Ty, En1, Sym, Fk1, Att1, Var, Var>> y : x) {
				ret.add(new Eq<>(new Ctx<>(), f.apply(y.first), f.apply(y.second)));
			}
			return ret;
		};
		
		for (Att2 att2 : atts.keySet()) {
			atts2.put(att2, f.apply(atts.get(att2)));
		}

		Ctx<En2, Triple<Ctx<Var, En1>, Collection<Eq<Ty, En1, Sym, Fk1, Att1, Var, Var>>, AqlOptions>> 
		ens2 = new Ctx<>();
		for (En2 en2 : ens.keySet()) {
			ens2.put(en2, new Triple<>(ens.get(en2).gens, g.apply(ens.get(en2).eqs()), ens.get(en2).options));
		}
		Ctx<Fk2, Pair<Ctx<Var, Term<Void, En1, Void, Fk1, Void, Var, Void>>, Boolean>> fks2 = new Ctx<>();
		for (Fk2 fk2 : fks.keySet()) {
			fks2.put(fk2, new Pair<>(fks.get(fk2).gens(), true));
		}
		
		return makeQuery(ens2, atts2, fks2 , src, dst, true, false);

	}

}
+1 −1
Changes for src/catdata/aql/exp/AqlParser.java: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ public abstract class AqlParser {
			"constraints", "getMapping", "getSchema", "typeside", "schema", "mapping", "instance", "transform", "query",
			"command", "graph", "exec_jdbc", "exec_js", "exec_cmdline", "literal", "add_to_classpath", 
			"identity", "match", "attributes", "empty", "imports", "types", "constants", "functions", "equations",
			"forall", "java_types", "multi_equations", "pi",
			"forall", "java_types", "multi_equations", "pi", "bindings", 
			"toQuery", "toCoQuery", "anonymize", "frozen",  "params", 
			"java_constants", "java_functions", "options", "entities", "src", "unique", "dst", "path_equations",
			"observation_equations", "generators", "rename", "remove", "modify",
+3 −3
Changes for src/catdata/aql/exp/CombinatorParser.java: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -1027,9 +1027,9 @@ public class CombinatorParser extends AqlParser {
	}

	private static Parser<QueryExpRaw> queryExpRaw() {
		Parser<List<catdata.Pair<LocStr, String>>> q = Parsers.tuple(token("params"), env(ident, ":")).map(x->x.b).optional();
		Parser<Pair<List<catdata.Pair<LocStr, String>>, List<catdata.Pair<LocStr, RawTerm>>>> q = Parsers.tuple(Parsers.tuple(token("params"), env(ident, ":")).map(x->x.b).optional(), Parsers.tuple(token("bindings"), env(term(), "=")).map(x->x.b).optional()) ;
		
		Parser<Tuple4<List<catdata.Pair<LocStr, String>>, List<LocStr>, List<catdata.Pair<LocStr, PreBlock>>, List<catdata.Pair<String, String>>>> pa = Parsers
		Parser<Tuple4<Pair<List<catdata.Pair<LocStr, String>>, List<catdata.Pair<LocStr, RawTerm>>>, List<LocStr>, List<catdata.Pair<LocStr, PreBlock>>, List<catdata.Pair<String, String>>>> pa = Parsers
				.tuple(q, imports, preblock(false).many(), options);

		Parser<Tuple5<Token, Token, SchExp<?, ?, ?, ?, ?>, SchExp<?, ?, ?, ?, ?>, Token>> l = Parsers.tuple(
@@ -1039,7 +1039,7 @@ public class CombinatorParser extends AqlParser {
			List<Pair<LocStr, PreBlock>> list, List<Pair<String, String>> options
 */
		Parser<QueryExpRaw> ret = Parsers.tuple(l, pa, token("}"))
				.map(x -> new QueryExpRaw(Util.newIfNull(x.b.a), x.a.c, x.a.d, x.b.b, Util.newIfNull(x.b.c), Util.newIfNull(x.b.d)));
				.map(x -> new QueryExpRaw(Util.newIfNull(x.b.a.a), Util.newIfNull(x.b.a.b), x.a.c, x.a.d, x.b.b, Util.newIfNull(x.b.c), Util.newIfNull(x.b.d)));

		return ret;
	}
+34 −4
Changes for src/catdata/aql/exp/QueryExpRaw.java: 34 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ public class QueryExpRaw extends QueryExp<Ty, En, Sym, Fk, Att, En, Fk, Att> imp
	private final Set<Block> blocks;

	public final Ctx<String, String> params;
//	public final Ctx<String, RawTerm> consts = new Ctx<>();
	public final Ctx<String, RawTerm>  consts;

	private final Ctx<En, Integer> b1 = new Ctx<>();
	private final Ctx<Fk, Integer> b2 = new Ctx<>();
@@ -383,6 +383,8 @@ public class QueryExpRaw extends QueryExp<Ty, En, Sym, Fk, Att, En, Fk, Att> imp
	public int hashCode() {
		int prime = 31;
		int result = 1;
		result = prime * result + ((params == null) ? 0 : params.hashCode());
		result = prime * result + ((consts == null) ? 0 : consts.hashCode());
		result = prime * result + ((blocks == null) ? 0 : blocks.hashCode());
		result = prime * result + ((dst == null) ? 0 : dst.hashCode());
		result = prime * result + ((imports == null) ? 0 : imports.hashCode());
@@ -425,6 +427,16 @@ public class QueryExpRaw extends QueryExp<Ty, En, Sym, Fk, Att, En, Fk, Att> imp
				return false;
		} else if (!src.equals(other.src))
			return false;
		if (params == null) {
			if (other.params != null)
				return false;
		} else if (!params.equals(other.params))
			return false;
		if (consts == null) {
			if (other.consts != null)
				return false;
		} else if (!consts.equals(other.consts))
			return false;
		return true;
	}

@@ -467,12 +479,13 @@ public class QueryExpRaw extends QueryExp<Ty, En, Sym, Fk, Att, En, Fk, Att> imp
		return "literal : " + src + " -> " + dst + " {\n" + toString + "}";
	}

	public QueryExpRaw(List<Pair<LocStr, String>> params, SchExp<?, ?, ?, ?, ?> c, SchExp<?, ?, ?, ?, ?> d, List<LocStr> imports,
	public QueryExpRaw(List<Pair<LocStr, String>> params, List<Pair<LocStr, RawTerm>> consts, SchExp<?, ?, ?, ?, ?> c, SchExp<?, ?, ?, ?, ?> d, List<LocStr> imports,
			List<Pair<LocStr, PreBlock>> list, List<Pair<String, String>> options) {
		this.src = (SchExp<Ty, En, Sym, Fk, Att>) c;
		this.dst = (SchExp<Ty, En, Sym, Fk, Att>) d;
		this.imports = LocStr.set1(imports);
		this.options = Util.toMapSafely(options);
		this.consts = new Ctx<>(Util.toMapSafely(LocStr.set2(consts)));
		this.params = new Ctx<>(Util.toMapSafely(LocStr.set2(params)));
		this.blocks = Util.toSetSafely(list).stream().map(x -> new Block(x.second, x.first))
				.collect(Collectors.toSet());
@@ -541,9 +554,19 @@ public class QueryExpRaw extends QueryExp<Ty, En, Sym, Fk, Att, En, Fk, Att> imp
		Ctx<Att, Term<Ty, En, Sym, Fk, Att, Var, Var>> atts0 = new Ctx<>();
		Ctx<Fk, Pair<Ctx<Var, Term<Void, En, Void, Fk, Void, Var, Void>>, Boolean>> fks0 = new Ctx<>();

		Ctx<Var, Ty> xxx = new Ctx<>();
		Ctx<Var, Term<Ty, Void, Sym, Void, Void, Void, Void>> yyy = new Ctx<>();
		
		for (String k : imports) {
			@SuppressWarnings("unchecked")
			Query<Ty, En, Sym, Fk, Att, En, Fk, Att> v = env.defs.qs.get(k);
			
			for (Var var : v.params.keySet()) {
				xxx.map.put(var, v.params.get(var)); //allow benign collisions
			}
			for (Var var : v.consts.keySet()) {
				yyy.map.put(var, v.consts.get(var));
			}
			for (En En : v.ens.keySet()) {
				ens0.put(En, new Triple<>(v.ens.get(En).gens, v.ens.get(En).eqs, v.ens.get(En).options));
			}
@@ -613,11 +636,18 @@ public class QueryExpRaw extends QueryExp<Ty, En, Sym, Fk, Att, En, Fk, Att> imp
		boolean elimRed = (Boolean) new AqlOptions(options, null, env.defaults)
				.getOrDefault(AqlOption.query_remove_redundancy);

		Ctx<Var, Ty> xxx = new Ctx<>();
		for (String s : params.keySet()) {
			xxx.put(new Var(s), new Ty(params.get(s)));
		}
		return Query.makeQuery2(xxx, new Ctx<>(), ens0, atts0, fks0, src0, dst0, doNotCheckEqs, elimRed);
		for (String s : consts.keySet()) {
			Chc<Ty, En> required = Chc.inLeft(xxx.get(new Var(s)));
			Term<catdata.aql.exp.TyExpRaw.Ty, catdata.aql.exp.SchExpRaw.En, catdata.aql.exp.TyExpRaw.Sym, catdata.aql.exp.SchExpRaw.Fk, catdata.aql.exp.SchExpRaw.Att, Gen, Sk> term = RawTerm
					.infer1x(new HashMap<>(), consts.get(s), null, required, src0.collage().convert(), "", src0.typeSide.js).second;
			
			yyy.put(new Var(s), term.convert());
		}

		return Query.makeQuery2(xxx, yyy, ens0, atts0, fks0, src0, dst0, doNotCheckEqs, elimRed);
	}

	public static void processAtt(Schema<Ty, En, Sym, Fk, Att> src0, Schema<Ty, En, Sym, Fk, Att> dst0,
+4 −2
Changes for src/catdata/aql/fdm/CoEvalInstance.java: 4 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -35,8 +35,10 @@ extends Instance<Ty, En1, Sym, Fk1, Att1, Pair<Var,X>, Y, ID, Chc<Y, Pair<ID, At
	public CoEvalInstance(Query<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2> Q, Instance<Ty, En2, Sym, Fk2, Att2, Gen, Sk, X, Y> J, AqlOptions options) {
		if (!Q.dst.equals(J.schema())) {
			throw new RuntimeException("In co-eval instance, target of query is " + Q.dst + ", but instance has type " + J.schema());
		} else if (!Q.params.isEmpty()) {
			throw new RuntimeException("Coeval with params not implemented yet"); //TODO aql
		} else if (!Q.consts.keySet().containsAll(Q.params.keySet())) {
			throw new RuntimeException("Missing bindings: " + Util.sep(Util.diff(Q.params.keySet(), Q.consts.keySet()), ",")); //TODO aql
		} else if (!Q.consts.keySet().isEmpty()) {
			Q = Q.deParam();
		}
		

Loading