use of catdata.aql.exp.QueryExpRaw.Block in project fql by CategoricalData.
the class QueryExpRawSimple method eval.
// TODO aql merge with queryexpraw
@Override
public Query<Ty, En, Sym, Fk, Att, En, Fk, Att> eval(AqlEnv env) {
Schema<Ty, En, Sym, Fk, Att> src0 = src.eval(env);
Collage<Ty, En, Sym, Fk, Att, Void, Void> srcCol = src0.collage();
En En = new En("Q");
AqlOptions ops = new AqlOptions(block.options, null, env.defaults);
boolean doNotCheckEqs = (Boolean) ops.getOrDefault(AqlOption.dont_validate_unsafe);
boolean elimRed = (Boolean) ops.getOrDefault(AqlOption.query_remove_redundancy);
boolean checkJava = !(Boolean) ops.getOrDefault(AqlOption.allow_java_eqs_unsafe);
Ctx<En, Triple<Ctx<Var, En>, Collection<Eq<Ty, En, Sym, Fk, Att, Var, Var>>, AqlOptions>> ens0 = new Ctx<>();
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<En, Collage<Ty, En, Sym, Fk, Att, Var, Var>> cols = new Ctx<>();
QueryExpRaw.processBlock(block.options, env, src0, ens0, cols, block, new Ctx<>());
Collage<Ty, En, Sym, Fk, Att, Void, Void> colForDst = new Collage<>(src0.typeSide.collage());
colForDst.ens.add(En);
for (Pair<Att, RawTerm> p : block.atts) {
Map<String, Chc<Ty, En>> s = QueryExpRaw.unVar(cols.get(En).gens).<Ty>inRight().map;
Term<Ty, catdata.aql.exp.SchExpRaw.En, Sym, Fk, Att, Gen, Sk> term = RawTerm.infer1x(s, p.second, p.second, null, srcCol.convert(), "", src0.typeSide.js).second;
Chc<Ty, En> ty = srcCol.type(new Ctx<>(s).map((k, v) -> new Pair<>(new Var(k), v)), term.convert());
if (!ty.left) {
throw new LocException(find("attributes", p), "In return clause for " + p.first + ", the type is " + ty.r + ", which is an entity.");
}
colForDst.atts.put(p.first, new Pair<>(En, ty.l));
}
DP<Ty, En, Sym, Fk, Att, Void, Void> dp = AqlProver.create(ops, colForDst, src0.typeSide.js);
Schema<Ty, En, Sym, Fk, Att> dst0 = new Schema<Ty, En, Sym, Fk, Att>(src0.typeSide, colForDst.ens, colForDst.atts.map, colForDst.fks.map, new HashSet<>(), dp, checkJava);
for (Pair<Att, RawTerm> p : block.atts) {
try {
QueryExpRaw.processAtt(src0, dst0, ens0, atts0, cols, p, new Ctx<>());
} catch (RuntimeException ex) {
ex.printStackTrace();
throw new LocException(find("attributes", p), "In return clause for " + p.first + ", " + ex.getMessage());
}
}
// TODO aql
return Query.makeQuery(ens0, atts0, fks0, src0, dst0, doNotCheckEqs, elimRed);
}
Aggregations