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);
}
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);
}
Aggregations