use of catdata.fql.sql.PSM in project fql by CategoricalData.
the class JDBCBridge method run.
public static Triple<Map<String, Set<Map<Object, Object>>>, String, List<Throwable>> run(FQLProgram prog) {
Map<String, Set<Map<Object, Object>>> ret = new HashMap<>();
List<Throwable> exns = new LinkedList<>();
InstOps ops = new InstOps(prog);
PSMInterp interp = new PSMInterp();
Connection Conn;
Statement Stmt = null;
List<PSM> sqls = new LinkedList<>();
try {
switch(DefunctGlobalOptions.debug.fql.sqlKind) {
case H2:
Class.forName("org.h2.Driver");
Conn = DriverManager.getConnection("jdbc:h2:mem:");
Stmt = Conn.createStatement();
Stmt.execute("SET @GUID = 0");
break;
case JDBC:
Class.forName(DefunctGlobalOptions.debug.fql.jdbcClass);
Conn = DriverManager.getConnection(DefunctGlobalOptions.debug.fql.jdbcUrl);
Stmt = Conn.createStatement();
String[] prel = DefunctGlobalOptions.debug.fql.prelude.split(";");
for (String s : prel) {
Stmt.execute(s);
}
break;
case NATIVE:
break;
default:
throw new RuntimeException();
}
for (String k : prog.order) {
InstExp v1 = prog.insts.get(k);
TransExp v2 = prog.transforms.get(k);
try {
if (v1 != null) {
sqls.addAll(maybeExecInstance(ops, prog, Stmt, k, v1, interp, ret));
} else if (v2 != null) {
sqls.addAll(maybeExecTransform(ops, prog, Stmt, k, v2, interp, ret));
}
} catch (Throwable re) {
String thing = (v1 == null) ? "transform" : "instance";
re.printStackTrace();
LineException exn = new LineException(re.getLocalizedMessage(), k, thing);
if (DefunctGlobalOptions.debug.fql.continue_on_error) {
exns.add(exn);
} else {
if (DefunctGlobalOptions.debug.fql.sqlKind == SQLKIND.JDBC) {
String[] prel0 = DefunctGlobalOptions.debug.fql.afterlude.split(";");
for (String s : prel0) {
if (!s.trim().isEmpty()) {
if (Stmt == null) {
throw new RuntimeException("Anomaly: please report");
}
Stmt.execute(s);
}
}
}
throw exn;
}
}
}
List<PSM> drops = Driver.computeDrops(prog);
if (DefunctGlobalOptions.debug.fql.sqlKind == SQLKIND.JDBC) {
for (PSM dr : drops) {
if (Stmt == null) {
throw new RuntimeException("Anomaly: please report");
}
Stmt.execute(dr.toPSM());
}
String[] prel0 = DefunctGlobalOptions.debug.fql.afterlude.split(";");
for (String s : prel0) {
if (!s.trim().isEmpty()) {
if (Stmt == null) {
throw new RuntimeException("Anomaly: please report");
}
Stmt.execute(s);
}
}
}
String str;
try {
str = DefunctGlobalOptions.debug.fql.prelude + "\n\n" + PSMGen.prettyPrint(sqls) + "\n\n" + (drops.isEmpty() ? "" : PSMGen.prettyPrint(drops) + "\n\n") + DefunctGlobalOptions.debug.fql.afterlude + "\n\n";
} catch (RuntimeException re) {
str = re.getLocalizedMessage();
}
return new Triple<>(ret, str, exns);
} catch (Exception exception) {
if (exception instanceof LineException) {
throw ((LineException) exception);
}
exception.printStackTrace();
throw new RuntimeException(exception.getLocalizedMessage());
}
}
use of catdata.fql.sql.PSM in project fql by CategoricalData.
the class JDBCBridge method maybeExecInstance.
private static List<PSM> maybeExecInstance(InstOps ops, FQLProgram prog, Statement Stmt, String k, InstExp v, PSMInterp interp, Map<String, Set<Map<Object, Object>>> ret) throws SQLException {
List<PSM> psm = new LinkedList<>();
psm.addAll(PSMGen.makeTables(k, v.type(prog).toSig(prog), false));
switch(DefunctGlobalOptions.debug.fql.sqlKind) {
case NATIVE:
psm.addAll(v.accept(k, ops).first);
interp.interpX(psm, ret);
break;
case H2:
case JDBC:
default:
if (v instanceof InstExp.FullSigma) {
List<PSM> xxx = v.accept(k, ops).first;
if (xxx.size() != 1) {
throw new RuntimeException();
}
FullSigma yyy = (FullSigma) xxx.get(0);
int theguid = getGuid(Stmt);
interp.guid = theguid;
yyy.exec(interp, ret);
Stmt.execute("SET @guid = " + interp.guid);
psm.addAll(makeInserts(k, ret, v.type(prog).toSig(prog), ((InstExp.FullSigma) v).F.toMap(prog).source));
} else if (v instanceof Exp) {
List<PSM> xxx = v.accept(k, ops).first;
if (xxx.size() != 1) {
throw new RuntimeException();
}
ExpPSM yyy = (ExpPSM) xxx.get(0);
int theguid = getGuid(Stmt);
interp.guid = theguid;
yyy.exec(interp, ret);
Stmt.execute("SET @guid = " + interp.guid);
psm.addAll(makeInserts(k, ret, v.type(prog).toSig(prog), null));
} else if (v instanceof Two) {
List<PSM> xxx = v.accept(k, ops).first;
if (xxx.size() != 1) {
throw new RuntimeException();
}
PropPSM yyy = (PropPSM) xxx.get(0);
int theguid = getGuid(Stmt);
interp.guid = theguid;
yyy.exec(interp, ret);
Stmt.execute("SET @guid = " + interp.guid);
psm.addAll(makeInserts(k, ret, v.type(prog).toSig(prog), null));
} else if (v instanceof Kernel) {
List<PSM> xxx = v.accept(k, ops).first;
if (xxx.size() != 1) {
throw new RuntimeException();
}
PSMUnChi yyy = (PSMUnChi) xxx.get(0);
int theguid = getGuid(Stmt);
interp.guid = theguid;
yyy.exec(interp, ret);
Stmt.execute("SET @guid = " + interp.guid);
psm.addAll(makeInserts(k, ret, v.type(prog).toSig(prog), null));
Signature ooo = v.type(prog).toSig(prog);
for (Node n : ooo.nodes) {
psm.add(new SimpleCreateTable(k + "_trans_" + n.string, PSM.VARCHAR(), false));
}
for (Edge n : ooo.edges) {
psm.add(new SimpleCreateTable(k + "_trans_" + n.name, PSM.VARCHAR(), false));
}
for (Attribute<Node> n : ooo.attrs) {
psm.add(new SimpleCreateTable(k + "_trans_" + n.name, n.target.psm(), false));
}
psm.addAll(makeInserts(k + "_trans", ret, v.type(prog).toSig(prog), null));
} else if (v instanceof External && DefunctGlobalOptions.debug.fql.sqlKind == SQLKIND.H2) {
} else {
psm.addAll(v.accept(k, ops).first);
}
for (PSM sql : psm) {
Stmt.execute(sql.toPSM());
}
if (!(v instanceof InstExp.FullSigma) && !(v instanceof Exp) && !(v instanceof Two) && !(v instanceof Kernel)) {
gatherInstance(prog, ret, Stmt, k, v);
}
if (v instanceof Delta) {
gatherSubstInv(prog, ret, Stmt, k, v);
} else if (v instanceof Times) {
gatherTransform(prog, ret, Stmt, k + "_fst", v.type(prog).toConst(prog));
gatherTransform(prog, ret, Stmt, k + "_snd", v.type(prog).toConst(prog));
} else if (v instanceof One) {
gatherSubstInv2(prog, ret, Stmt, k, v);
}
break;
}
return psm;
}
use of catdata.fql.sql.PSM in project fql by CategoricalData.
the class JDBCBridge method maybeExec.
private static void maybeExec(List<PSM> sqls, Statement stmt, Map<String, Set<Map<Object, Object>>> state, PSMInterp interp, Signature s) throws SQLException {
for (PSM sql : sqls) {
String k = sql.isSql();
if (k == null) {
stmt.execute(sql.toPSM());
} else {
sql.exec(interp, state);
List<PSM> yyy = makeInserts(k, state, s, null);
for (PSM y : yyy) {
stmt.execute(y.toPSM());
}
}
}
}
use of catdata.fql.sql.PSM in project fql by CategoricalData.
the class JDBCBridge method maybeExecTransform.
private static List<PSM> maybeExecTransform(InstOps ops, FQLProgram prog, Statement Stmt, String k, TransExp v, PSMInterp interp, Map<String, Set<Map<Object, Object>>> ret) throws SQLException {
List<PSM> psm = new LinkedList<>();
Pair<String, String> val = prog.transforms.get(k).type(prog);
InstExp i = prog.insts.get(val.first);
Const ss = i.type(prog).toConst(prog);
Signature s = ss.toSig(prog);
psm.addAll(PSMGen.makeTables(k, s, false));
switch(DefunctGlobalOptions.debug.fql.sqlKind) {
case NATIVE:
psm.addAll(v.accept(k, ops));
interp.interpX(psm, ret);
break;
case H2:
case JDBC:
default:
if (v instanceof TransExp.External && DefunctGlobalOptions.debug.fql.sqlKind == SQLKIND.H2) {
} else {
psm.addAll(v.accept(k, ops));
}
maybeExec(psm, Stmt, ret, interp, s);
if (v.gather()) {
gatherTransform(prog, ret, Stmt, k, ss);
// have non SQL transform output into temps, so can gather them like any other
}
break;
}
return psm;
}
use of catdata.fql.sql.PSM in project fql by CategoricalData.
the class InstOps method visit.
@Override
public List<PSM> visit(String dst, Inl e) {
List<PSM> ret = new LinkedList<>();
InstExp k = prog.insts.get(e.obj);
Signature t = k.type(prog).toSig(prog);
for (Node n : t.nodes) {
ret.add(new InsertSQL(dst + "_" + n.string, new CopyFlower(e.obj + "_inl_" + n.string, "c0", "c1"), "c0", "c1"));
}
return ret;
}
Aggregations