use of catdata.aql.exp.SchExpRaw.En in project fql by CategoricalData.
the class MapExpRaw method eval.
@Override
public Mapping<Ty, En, Sym, Fk, Att, En, Fk, Att> eval(AqlEnv env) {
Schema<Ty, En, Sym, Fk, Att> src0 = src.eval(env);
Schema<Ty, En, Sym, Fk, Att> dst0 = dst.eval(env);
// Collage<String, String, String, String, String, Void, Void> scol =
// new Collage<>(src0);
Collage<Ty, En, Sym, Fk, Att, Void, Void> dcol = new Collage<>(dst0.collage());
Map<En, En> ens0 = new HashMap<>();
// Map<String, Pair<String, List<String>>> fks0 = new HashMap<>();
Map<Att, Triple<Var, En, Term<Ty, En, Sym, Fk, Att, Void, Void>>> atts0 = new HashMap<>();
Map<Fk, Pair<En, List<Fk>>> fksX = new HashMap<>();
for (String k : imports) {
@SuppressWarnings("unchecked") Mapping<Ty, En, Sym, Fk, Att, En, Fk, Att> v = env.defs.maps.get(k);
Util.putAllSafely(ens0, v.ens.map);
Util.putAllSafely(fksX, v.fks.map);
Util.putAllSafely(atts0, v.atts.map);
}
Util.putAllSafely(ens0, Util.toMapSafely(ens.stream().map(x -> new Pair<>(new En(x.first), new En(x.second))).collect(Collectors.toList())));
for (En k : ens0.keySet()) {
if (!dst0.ens.contains(ens0.get(k))) {
throw new LocException(find("entities", new Pair<>(k, ens0.get(k))), "The mapping for " + k + ", namely " + ens0.get(k) + ", does not appear in the target schema");
} else if (!src0.ens.contains(k)) {
throw new LocException(find("entities", new Pair<>(k, ens0.get(k))), k + " does not appear in the source schema");
}
}
for (Pair<Pair<String, String>, List<String>> p : this.fks) {
Fk theFk = new Fk(new En(p.first.first), p.first.second);
if (!src0.fks.containsKey(theFk)) {
throw new RuntimeException("Not a foreign key in source: " + theFk.en + "." + theFk.str);
}
try {
En start_en_fixed = ens0.get(new En(p.first.first));
En start_en = ens0.get(new En(p.first.first));
List<Fk> r = new LinkedList<>();
for (String o : p.second) {
if (ens0.containsValue(new En(o))) {
if (fksX.containsKey(new Fk(start_en, o))) {
throw new RuntimeException(o + " is both a target foreign key and a target entity, so the path is ambiguous");
}
// if (start_en == null) {
// start_en = new En(p.second.get(0));
// }
} else {
/*
* if (start_en == null) { Pair<En, En> j =
* dst0.fks.get(new Fk(o)); if (j == null) { throw new
* RuntimeException(p.second.get(0) +
* " is not a foreign key in the target"); } start_en =
* j.first; }
*/
// }
r.add(new Fk(start_en, o));
start_en = dst0.fks.get(new Fk(start_en, o)).second;
}
}
// if (start_en == null) {
// throw new RuntimeException("Anomaly: please report");
// }
fksX.put(new Fk(new En(p.first.first), p.first.second), new Pair<>(start_en_fixed, r));
} catch (RuntimeException ex) {
ex.printStackTrace();
throw new LocException(fkPos.get(new Fk(new En(p.first.first), p.first.second)), "In foreign key mapping " + p.first + " -> " + Util.sep(p.second, ".") + ", " + ex.getMessage());
}
}
for (Pair<Pair<String, String>, Triple<String, String, RawTerm>> att : atts) {
try {
String var = att.second.first;
String var_en = att.second.second;
RawTerm term = att.second.third;
Pair<En, Ty> p = src0.atts.map.get(new Att(new En(att.first.first), att.first.second));
if (p == null) {
throw new RuntimeException(att.first + " is not a source attribute.");
}
En src_att_dom_en = p.first;
En dst_att_dom_en = ens0.get(src_att_dom_en);
if (dst_att_dom_en == null) {
throw new RuntimeException("no entity mapping for " + src_att_dom_en + " , required for domain for " + att.first);
}
if (var_en != null && !new En(var_en).equals(dst_att_dom_en)) {
throw new RuntimeException("the given source entity for the variable, " + var_en + ", is not " + dst_att_dom_en + " as expected.");
}
Ty src_att_cod_ty = p.second;
if (!dst0.typeSide.tys.contains(src_att_cod_ty)) {
throw new RuntimeException("type " + p.second + " does not exist in target typeside.");
}
Chc<Ty, En> proposed_ty2 = Chc.inLeft(src_att_cod_ty);
Chc<Ty, En> var_en2 = Chc.inRight(dst_att_dom_en);
Map<String, Chc<Ty, En>> ctx = Util.singMap(var, var_en2);
Term<Ty, En, Sym, Fk, Att, Gen, Sk> term0 = RawTerm.infer1x(ctx, term, null, proposed_ty2, dcol.convert(), "", src0.typeSide.js).second;
Util.putSafely(atts0, new Att(new En(att.first.first), att.first.second), new Triple<>(new Var(var), dst_att_dom_en, term0.convert()));
} catch (RuntimeException ex) {
ex.printStackTrace();
throw new LocException(attPos.get(new Att(new En(att.first.first), att.first.second)), "in mapping for " + att.first + ", " + ex.getMessage());
}
}
AqlOptions ops = new AqlOptions(options, null, env.defaults);
Mapping<Ty, En, Sym, Fk, Att, En, Fk, Att> ret = new Mapping<>(ens0, atts0, fksX, src0, dst0, (Boolean) ops.getOrDefault(AqlOption.dont_validate_unsafe));
return ret;
}
use of catdata.aql.exp.SchExpRaw.En in project fql by CategoricalData.
the class QueryExpRaw method processBlock.
public static void processBlock(Map<String, String> options, AqlEnv env, Schema<Ty, En, Sym, Fk, Att> src0, Ctx<En, Triple<Ctx<Var, En>, Collection<Eq<Ty, En, Sym, Fk, Att, Var, Var>>, AqlOptions>> ens0, Ctx<En, Collage<Ty, En, Sym, Fk, Att, Var, Var>> cols, Block p, Ctx<String, String> params) {
// p.second.gens);
Ctx<Var, En> ctx = new Ctx<Var, En>(Util.toMapSafely(p.gens));
for (Var v : ctx.map.keySet()) {
En en = ctx.get(v);
if (!src0.ens.contains(en)) {
throw new RuntimeException("from clause contains " + v + ":" + en + ", but " + en + " is not a source entity");
}
}
Collage<Ty, En, Sym, Fk, Att, Var, Var> col = new Collage<>(src0.collage());
Ctx<String, Chc<Ty, En>> ctx0 = unVar(ctx.inRight());
col.gens.putAll(ctx.map);
for (String q : params.keySet()) {
ctx0.put(q, Chc.inLeft(new Ty(params.get(q))));
col.sks.put(new Var(q), new Ty(params.get(q)));
}
cols.put(p.en, col);
Collection<Eq<Ty, En, Sym, Fk, Att, Var, Var>> eqs = new HashSet<>();
for (Pair<RawTerm, RawTerm> eq : p.eqs) {
Triple<Ctx<Var, Chc<catdata.aql.exp.TyExpRaw.Ty, catdata.aql.exp.SchExpRaw.En>>, 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<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>> x = RawTerm.infer1x(ctx0.map, eq.first, eq.second, null, col.convert(), "In equation " + eq.first + " = " + eq.second + ", ", src0.typeSide.js).first3();
eqs.add(new Eq<>(new Ctx<>(), freeze(x.second.convert(), params), freeze(x.third.convert(), params)));
}
Map<String, String> uu = new HashMap<>(options);
uu.putAll(p.options);
AqlOptions theops = new AqlOptions(uu, null, env.defaults);
Triple<Ctx<Var, En>, Collection<Eq<Ty, En, Sym, Fk, Att, Var, Var>>, AqlOptions> b = new Triple<>(ctx, eqs, theops);
ens0.put(p.en, b);
}
use of catdata.aql.exp.SchExpRaw.En in project fql by CategoricalData.
the class ToJdbcPragmaTransform method execute.
@Override
public void execute() {
try {
Connection conn = DriverManager.getConnection(jdbcString);
deleteThenCreate(conn);
int s1 = (int) options1.getOrDefault(AqlOption.start_ids_at);
int s2 = (int) options2.getOrDefault(AqlOption.start_ids_at);
Pair<Map<X1, Integer>, Map<Integer, X1>> I = h.src().algebra().intifyX(s1);
Pair<Map<X2, Integer>, Map<Integer, X2>> J = h.dst().algebra().intifyX(s2);
for (En en : h.src().schema().ens) {
for (X1 x : h.src().algebra().en(en)) {
storeMyRecord(I, J, conn, x, prefix + enToString(en));
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
use of catdata.aql.exp.SchExpRaw.En in project fql by CategoricalData.
the class ToJdbcPragmaTransform method deleteThenCreate.
private void deleteThenCreate(Connection conn) throws SQLException {
for (En en : h.src().schema().ens) {
Statement stmt = conn.createStatement();
stmt.execute("DROP TABLE IF EXISTS " + prefix + enToString(en));
String str = "src" + idCol + " " + colTy + " PRIMARY KEY NOT NULL";
str += ", dst" + idCol + " " + colTy + " NOT NULL";
stmt.execute("CREATE TABLE " + prefix + enToString(en) + "(" + str + ")");
}
}
Aggregations