Search in sources :

Example 6 with Var

use of catdata.aql.Var 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);
}
Also used : Att(catdata.aql.exp.SchExpRaw.Att) AqlOptions(catdata.aql.AqlOptions) Ctx(catdata.Ctx) RawTerm(catdata.aql.RawTerm) En(catdata.aql.exp.SchExpRaw.En) Sym(catdata.aql.exp.TyExpRaw.Sym) Chc(catdata.Chc) Gen(catdata.aql.exp.InstExpRaw.Gen) AqlOption(catdata.aql.AqlOptions.AqlOption) AqlProver(catdata.aql.AqlProver) HashSet(java.util.HashSet) Map(java.util.Map) Collage(catdata.aql.Collage) DP(catdata.aql.DP) Eq(catdata.aql.Eq) Term(catdata.aql.Term) LinkedList(java.util.LinkedList) Pair(catdata.Pair) Fk(catdata.aql.exp.SchExpRaw.Fk) PreBlock(catdata.aql.exp.QueryExpRaw.PreBlock) Block(catdata.aql.exp.QueryExpRaw.Block) Collection(java.util.Collection) Kind(catdata.aql.Kind) Util(catdata.Util) Query(catdata.aql.Query) Att(catdata.aql.exp.SchExpRaw.Att) List(java.util.List) Schema(catdata.aql.Schema) Var(catdata.aql.Var) Sk(catdata.aql.exp.InstExpRaw.Sk) Triple(catdata.Triple) SchExpCod(catdata.aql.exp.SchExp.SchExpCod) Collections(java.util.Collections) Ty(catdata.aql.exp.TyExpRaw.Ty) Var(catdata.aql.Var) Ctx(catdata.Ctx) Schema(catdata.aql.Schema) En(catdata.aql.exp.SchExpRaw.En) Eq(catdata.aql.Eq) Pair(catdata.Pair) Ty(catdata.aql.exp.TyExpRaw.Ty) Fk(catdata.aql.exp.SchExpRaw.Fk) Sym(catdata.aql.exp.TyExpRaw.Sym) RawTerm(catdata.aql.RawTerm) Term(catdata.aql.Term) RawTerm(catdata.aql.RawTerm) Triple(catdata.Triple) Gen(catdata.aql.exp.InstExpRaw.Gen) Sk(catdata.aql.exp.InstExpRaw.Sk) AqlOptions(catdata.aql.AqlOptions) Collage(catdata.aql.Collage) Chc(catdata.Chc)

Example 7 with Var

use of catdata.aql.Var 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;
}
Also used : Att(catdata.aql.exp.SchExpRaw.Att) AqlOptions(catdata.aql.AqlOptions) Ctx(catdata.Ctx) RawTerm(catdata.aql.RawTerm) En(catdata.aql.exp.SchExpRaw.En) Sym(catdata.aql.exp.TyExpRaw.Sym) Chc(catdata.Chc) HashMap(java.util.HashMap) Gen(catdata.aql.exp.InstExpRaw.Gen) AqlOption(catdata.aql.AqlOptions.AqlOption) HashSet(java.util.HashSet) Mapping(catdata.aql.Mapping) Map(java.util.Map) Collage(catdata.aql.Collage) Term(catdata.aql.Term) LinkedList(java.util.LinkedList) Pair(catdata.Pair) Fk(catdata.aql.exp.SchExpRaw.Fk) Collection(java.util.Collection) Kind(catdata.aql.Kind) Util(catdata.Util) Set(java.util.Set) Att(catdata.aql.exp.SchExpRaw.Att) Collectors(java.util.stream.Collectors) List(java.util.List) Stream(java.util.stream.Stream) Schema(catdata.aql.Schema) Var(catdata.aql.Var) Sk(catdata.aql.exp.InstExpRaw.Sk) Entry(java.util.Map.Entry) Triple(catdata.Triple) Ty(catdata.aql.exp.TyExpRaw.Ty) HashMap(java.util.HashMap) Var(catdata.aql.Var) En(catdata.aql.exp.SchExpRaw.En) Mapping(catdata.aql.Mapping) LinkedList(java.util.LinkedList) List(java.util.List) Pair(catdata.Pair) Ty(catdata.aql.exp.TyExpRaw.Ty) Fk(catdata.aql.exp.SchExpRaw.Fk) Sym(catdata.aql.exp.TyExpRaw.Sym) RawTerm(catdata.aql.RawTerm) LinkedList(java.util.LinkedList) Triple(catdata.Triple) Gen(catdata.aql.exp.InstExpRaw.Gen) Sk(catdata.aql.exp.InstExpRaw.Sk) AqlOptions(catdata.aql.AqlOptions) Collage(catdata.aql.Collage) Chc(catdata.Chc)

Example 8 with Var

use of catdata.aql.Var 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);
}
Also used : Att(catdata.aql.exp.SchExpRaw.Att) HashMap(java.util.HashMap) Var(catdata.aql.Var) Ctx(catdata.Ctx) En(catdata.aql.exp.SchExpRaw.En) Eq(catdata.aql.Eq) HashSet(java.util.HashSet) Ty(catdata.aql.exp.TyExpRaw.Ty) Fk(catdata.aql.exp.SchExpRaw.Fk) Sym(catdata.aql.exp.TyExpRaw.Sym) RawTerm(catdata.aql.RawTerm) Term(catdata.aql.Term) RawTerm(catdata.aql.RawTerm) Triple(catdata.Triple) Collection(java.util.Collection) AqlOptions(catdata.aql.AqlOptions) Collage(catdata.aql.Collage) Chc(catdata.Chc)

Example 9 with Var

use of catdata.aql.Var in project fql by CategoricalData.

the class EvalAlgebra method fk.

@Override
public Row<En2, X> fk(Fk2 fk, Row<En2, X> row) {
    Transform<Ty, En1, Sym, Fk1, Att1, Var, Var, Var, Var, ID, Chc<Var, Pair<ID, Att1>>, ID, Chc<Var, Pair<ID, Att1>>> t = Q.fks.get(fk);
    Ctx<Var, X> ret = new Ctx<>();
    for (Var v : ens.get(Q.dst.fks.get(fk).second).first) {
        ret.put(v, trans2(row, t.gens().get(v)));
    }
    return Row.mkRow(ret, Q.dst.fks.get(fk).second);
}
Also used : Var(catdata.aql.Var) Ctx(catdata.Ctx) ID(catdata.aql.It.ID) Chc(catdata.Chc)

Example 10 with Var

use of catdata.aql.Var in project fql by CategoricalData.

the class EvalAlgebra method evalSql.

private Pair<List<Var>, Collection<Row<En2, X>>> evalSql(En2 en2, Frozen<Ty, En1, Sym, Fk1, Att1> q, Pair<Map<X, Integer>, Map<Integer, X>> I, Connection conn) {
    if (q.gens.isEmpty()) {
        Collection<Row<En2, X>> ret = new LinkedList<>();
        ret.add(new Row<>(en2));
        return new Pair<>(Collections.emptyList(), ret);
    }
    List<Var> order = new LinkedList<>(q.gens().keySet());
    try (Statement stmt = conn.createStatement()) {
        ResultSet rs = stmt.executeQuery(Q.toSQL().get(en2));
        Collection<Row<En2, X>> ret = new LinkedList<>();
        // ResultSetMetaData rsmd = rs.getMetaData();
        while (rs.next()) {
            Row<En2, X> r = new Row<>(en2);
            for (Var v : order) {
                X x = I.second.get(rs.getInt(v.var));
                if (x == null) {
                    stmt.close();
                    rs.close();
                    throw new RuntimeException("Encountered a NULL generator");
                }
                r = new Row<>(r, v, x);
            }
            ret.add(r);
        }
        rs.close();
        stmt.close();
        return new Pair<>(order, ret);
    } catch (SQLException ex) {
        ex.printStackTrace();
        throw new RuntimeException(ex);
    }
}
Also used : SQLException(java.sql.SQLException) Var(catdata.aql.Var) Statement(java.sql.Statement) LinkedList(java.util.LinkedList) ResultSet(java.sql.ResultSet) Row(catdata.aql.fdm.EvalAlgebra.Row) Pair(catdata.Pair)

Aggregations

Var (catdata.aql.Var)11 Ctx (catdata.Ctx)9 Pair (catdata.Pair)9 Chc (catdata.Chc)8 Triple (catdata.Triple)8 En (catdata.aql.exp.SchExpRaw.En)8 Sym (catdata.aql.exp.TyExpRaw.Sym)8 Ty (catdata.aql.exp.TyExpRaw.Ty)8 AqlOptions (catdata.aql.AqlOptions)7 Collage (catdata.aql.Collage)7 RawTerm (catdata.aql.RawTerm)7 Att (catdata.aql.exp.SchExpRaw.Att)7 Fk (catdata.aql.exp.SchExpRaw.Fk)7 LinkedList (java.util.LinkedList)7 Term (catdata.aql.Term)6 HashSet (java.util.HashSet)6 List (java.util.List)6 Collection (java.util.Collection)5 Eq (catdata.aql.Eq)4 Schema (catdata.aql.Schema)4