Loading src/catdata/aql/Query.java +59 −7 Changes for src/catdata/aql/Query.java: 59 added lines, 7 removed lines. Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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()) { Loading Loading @@ -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()); } } Loading @@ -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<>(); Loading Loading @@ -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(); } Loading @@ -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(); } Loading Loading @@ -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); } } src/catdata/aql/exp/AqlParser.java +1 −1 Changes for src/catdata/aql/exp/AqlParser.java: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -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", Loading src/catdata/aql/exp/CombinatorParser.java +3 −3 Changes for src/catdata/aql/exp/CombinatorParser.java: 3 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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; } Loading src/catdata/aql/exp/QueryExpRaw.java +34 −4 Changes for src/catdata/aql/exp/QueryExpRaw.java: 34 added lines, 4 removed lines. Original line number Diff line number Diff line Loading @@ -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<>(); Loading Loading @@ -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()); Loading Loading @@ -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; } Loading Loading @@ -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()); Loading Loading @@ -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)); } Loading Loading @@ -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, Loading src/catdata/aql/fdm/CoEvalInstance.java +4 −2 Changes for src/catdata/aql/fdm/CoEvalInstance.java: 4 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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 Loading
src/catdata/aql/Query.java +59 −7 Changes for src/catdata/aql/Query.java: 59 added lines, 7 removed lines. Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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()) { Loading Loading @@ -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()); } } Loading @@ -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<>(); Loading Loading @@ -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(); } Loading @@ -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(); } Loading Loading @@ -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); } }
src/catdata/aql/exp/AqlParser.java +1 −1 Changes for src/catdata/aql/exp/AqlParser.java: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -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", Loading
src/catdata/aql/exp/CombinatorParser.java +3 −3 Changes for src/catdata/aql/exp/CombinatorParser.java: 3 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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; } Loading
src/catdata/aql/exp/QueryExpRaw.java +34 −4 Changes for src/catdata/aql/exp/QueryExpRaw.java: 34 added lines, 4 removed lines. Original line number Diff line number Diff line Loading @@ -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<>(); Loading Loading @@ -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()); Loading Loading @@ -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; } Loading Loading @@ -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()); Loading Loading @@ -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)); } Loading Loading @@ -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, Loading
src/catdata/aql/fdm/CoEvalInstance.java +4 −2 Changes for src/catdata/aql/fdm/CoEvalInstance.java: 4 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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