Search in sources :

Example 11 with OplInst

use of catdata.opl.OplExp.OplInst in project fql by CategoricalData.

the class SqlToOpl method convertCnf.

// : code formatter should not wrap lines ever
private static Pair<OplSchema<Chc<SqlType, SqlTable>, Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, OplInst<Chc<SqlType, SqlTable>, Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String, String>> convertCnf(SqlSchema info, SqlInstance inst, String S0, String I0) {
    if (!info.isCnf()) {
        throw new RuntimeException("Schema not in categorical normal form");
    }
    Set<Chc<SqlType, SqlTable>> sorts = new HashSet<>();
    Set<Chc<SqlType, SqlTable>> entities = new HashSet<>();
    Map<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, Pair<List<Chc<SqlType, SqlTable>>, Chc<SqlType, SqlTable>>> symbols = new HashMap<>();
    List<Triple<OplCtx<Chc<SqlType, SqlTable>, String>, OplTerm<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, OplTerm<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>>> equations = new LinkedList<>();
    for (SqlType type : info.types) {
        sorts.add(Chc.inLeft(type));
    }
    for (SqlTable table : info.tables) {
        sorts.add(Chc.inRight(table));
        entities.add(Chc.inRight(table));
        for (SqlColumn col : table.columns) {
            if (col.equals(table.getCnfId())) {
                continue;
            }
            if (isFk(info, table, col)) {
                continue;
            }
            symbols.put(Chc.inRight(Chc.inLeft(col)), new Pair<>(Util.singList(Chc.inRight(table)), Chc.inLeft(col.type)));
        }
    }
    for (SqlForeignKey fk : info.fks) {
        symbols.put(Chc.inRight(Chc.inRight(fk)), new Pair<>(Util.singList(Chc.inRight(fk.source)), Chc.inRight(fk.target)));
    }
    OplSchema<Chc<SqlType, SqlTable>, Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String> sch = new OplSchema<>(S0, entities);
    OplSig<Chc<SqlType, SqlTable>, Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String> sig = new OplSig<>(VIt.vit, new HashMap<>(), sorts, symbols, equations);
    sch.validate(sig);
    OplInst<Chc<SqlType, SqlTable>, Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String, String> I = new OplInst<>(S0, I0, "none");
    Map<String, Chc<SqlType, SqlTable>> gens = new HashMap<>();
    List<Pair<OplTerm<Chc<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, String>, OplTerm<Chc<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, String>>> eqs = new LinkedList<>();
    int fr = 0;
    if (inst != null) {
        Map<SqlTable, Map<Object, String>> iso1 = new HashMap<>();
        for (SqlTable table : info.tables) {
            Set<Map<SqlColumn, Optional<Object>>> tuples = inst.get(table);
            Map<Object, String> i1 = new HashMap<>();
            // Map<String, Object> i2 = new HashMap<>();
            for (Map<SqlColumn, Optional<Object>> tuple : tuples) {
                String i = "v" + (fr++);
                if (!tuple.get(table.getCnfId()).isPresent()) {
                    throw new RuntimeException("Anomly: please report");
                }
                i1.put(tuple.get(table.getCnfId()).get(), i);
                // i2.put(i, tuple.get(table.getCnfId()).get());
                gens.put(i, Chc.inRight(table));
                for (SqlColumn col : table.columns) {
                    if (col.equals(table.getCnfId())) {
                        continue;
                    }
                    if (isFk(info, table, col)) {
                        continue;
                    }
                    SqlType ty = col.type;
                    Optional<Object> val = tuple.get(col);
                    if (!val.isPresent()) {
                        continue;
                    }
                    symbols.put(Chc.inLeft(val.get()), new Pair<>(new LinkedList<>(), Chc.inLeft(ty)));
                    OplTerm<Chc<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, String> rhs = new OplTerm<>(Chc.inLeft(Chc.inLeft(val.get())), new LinkedList<>());
                    OplTerm<Chc<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, String> lhs = new OplTerm<>(Chc.inLeft(Chc.inRight(Chc.inLeft(col))), Util.singList(new OplTerm<>(Chc.inRight(i), new LinkedList<>())));
                    eqs.add(new Pair<>(lhs, rhs));
                }
            }
            iso1.put(table, i1);
        // iso2.put(table, i2);
        }
        for (SqlForeignKey fk : info.fks) {
            for (Map<SqlColumn, Optional<Object>> in : inst.get(fk.source)) {
                Map<SqlColumn, Optional<Object>> out = inst.follow(in, fk);
                if (!out.get(fk.target.getCnfId()).isPresent() || !in.get(fk.source.getCnfId()).isPresent()) {
                    throw new RuntimeException("Anomaly: please report");
                }
                String tgen = iso1.get(fk.target).get(out.get(fk.target.getCnfId()).get());
                String sgen = iso1.get(fk.source).get(in.get(fk.source.getCnfId()).get());
                OplTerm<Chc<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, String> rhs = new OplTerm<>(Chc.inRight(tgen), new LinkedList<>());
                OplTerm<Chc<Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String>, String> lhs = new OplTerm<>(Chc.inLeft(Chc.inRight(Chc.inRight(fk))), Util.singList(new OplTerm<>(Chc.inRight(sgen), new LinkedList<>())));
                eqs.add(new Pair<>(lhs, rhs));
            }
        }
    }
    OplPres<Chc<SqlType, SqlTable>, Chc<Object, Chc<SqlColumn, SqlForeignKey>>, String, String> P = new OplPres<>(new HashMap<>(), S0, sig, gens, eqs);
    P.toSig();
    I.validate(sch, P, null);
    return new Pair<>(sch, I);
}
Also used : HashMap(java.util.HashMap) OplSchema(catdata.opl.OplExp.OplSchema) OplInst(catdata.opl.OplExp.OplInst) OplPres(catdata.opl.OplExp.OplPres) SqlType(catdata.sql.SqlType) HashSet(java.util.HashSet) Pair(catdata.Pair) Optional(java.util.Optional) OplSig(catdata.opl.OplExp.OplSig) LinkedList(java.util.LinkedList) Triple(catdata.Triple) SqlForeignKey(catdata.sql.SqlForeignKey) SqlTable(catdata.sql.SqlTable) SqlColumn(catdata.sql.SqlColumn) HashMap(java.util.HashMap) Map(java.util.Map) Chc(catdata.Chc)

Example 12 with OplInst

use of catdata.opl.OplExp.OplInst in project fql by CategoricalData.

the class OplChase method chaseParallel.

static OplInst chaseParallel(OplInst I, List EDs, int limit) {
    OplInst ret = I;
    for (int i = 0; i < limit; i++) {
        boolean changed = false;
        OplInst ret2 = (OplInst) stepParallel(ret, EDs).pushout().first;
        if (ret2 != null) {
            ret = ret2;
            changed = true;
        }
        if (!changed) {
            return ret;
        }
    }
    throw new RuntimeException("Limit exceeded, last instance:\n\n" + ret);
}
Also used : OplInst(catdata.opl.OplExp.OplInst)

Aggregations

OplInst (catdata.opl.OplExp.OplInst)12 OplPres (catdata.opl.OplExp.OplPres)7 OplSchema (catdata.opl.OplExp.OplSchema)5 HashMap (java.util.HashMap)5 LinkedList (java.util.LinkedList)5 Pair (catdata.Pair)4 Triple (catdata.Triple)4 OplSig (catdata.opl.OplExp.OplSig)4 HashSet (java.util.HashSet)4 Chc (catdata.Chc)3 OplInst0 (catdata.opl.OplExp.OplInst0)3 OplPresTrans (catdata.opl.OplExp.OplPresTrans)3 Map (java.util.Map)3 OplGround (catdata.opl.OplExp.OplGround)2 OplMapping (catdata.opl.OplExp.OplMapping)2 OplPushout (catdata.opl.OplExp.OplPushout)2 OplSCHEMA0 (catdata.opl.OplExp.OplSCHEMA0)2 OplTyMapping (catdata.opl.OplExp.OplTyMapping)2 SqlColumn (catdata.sql.SqlColumn)2 SqlForeignKey (catdata.sql.SqlForeignKey)2