Loading src/catdata/aql/Chase.java +10 −6 Changes for src/catdata/aql/Chase.java: 10 added lines, 6 removed lines. Original line number Diff line number Diff line package catdata.aql; import java.lang.ref.Reference; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; Loading @@ -12,7 +11,6 @@ import catdata.BinRelMap; import catdata.Chc; import catdata.Ctx; import catdata.Pair; import catdata.Ref; import catdata.Triple; import catdata.Util; import catdata.graph.UnionFind; Loading Loading @@ -181,6 +179,11 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { } return s; } @Override public String toString() { return "Content [ens=" + ens + ", fks=" + fks + ", us=" + us + "]"; } } public Content T; Loading Loading @@ -218,6 +221,7 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { } private boolean step() { Content toAdd = new Content(); Ctx<En2, UnionFind<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>>> ufs = new Ctx<>(); for (En2 en : F.dst.ens) { Loading @@ -236,7 +240,6 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { T.addAll(toAdd); makeFunctional(ufs, changed); // System.out.println("E " + changed); if (!changed[0]) { return false; Loading @@ -244,8 +247,10 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { T = T.merge(ufs); return true; } static int x = 0; public void makeFunctional(Ctx<En2, UnionFind<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>>> ufs, Boolean[] changed) { Loading Loading @@ -307,7 +312,7 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { N = M; } if (!N.equals(Util.singSet(lhs))) { if (!N.contains(lhs)) { Lineage<Void, En2, Void, Fk2, Void, Gen, Void> n = initial; Lineage<Void, En2, Void, Fk2, Void, Gen, Void> m = initial; for (Fk2 fk : F.fks.get(a).second) { Loading Loading @@ -335,7 +340,6 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { List<Fk2> lhs = eq.second.toFkList(); List<Fk2> rhs = eq.third.toFkList(); Set<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>> active = new HashSet<>(); for (Pair<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>, Lineage<Void, En2, Void, Fk2, Void, Gen, Void>> x : T.ens .get(src)) { Lineage<Void, En2, Void, Fk2, Void, Gen, Void> initial = x.first; Loading Loading @@ -365,7 +369,7 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { N2 = M; } if (!N.equals(N2)) { if (Util.isect(N, N2).isEmpty()) { changed[0] = true; Lineage<Void, En2, Void, Fk2, Void, Gen, Void> n = initial; Lineage<Void, En2, Void, Fk2, Void, Gen, Void> m = initial; Loading src/catdata/aql/exp/InstExpRandom.java +55 −27 Changes for src/catdata/aql/exp/InstExpRandom.java: 55 added lines, 27 removed lines. Original line number Diff line number Diff line package catdata.aql.exp; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; Loading @@ -13,21 +12,22 @@ import catdata.Pair; import catdata.Util; import catdata.aql.AqlOptions; import catdata.aql.AqlOptions.AqlOption; import catdata.aql.DP; import catdata.aql.ImportAlgebra; import catdata.aql.Instance; import catdata.aql.It.ID; import catdata.aql.Kind; import catdata.aql.RawTerm; import catdata.aql.Schema; import catdata.aql.exp.InstExpRaw.Gen; import catdata.aql.exp.InstExpRaw.Sk; import catdata.aql.Term; import catdata.aql.Var; import catdata.aql.exp.SchExpRaw.Att; import catdata.aql.exp.SchExpRaw.En; import catdata.aql.exp.SchExpRaw.Fk; import catdata.aql.exp.TyExpRaw.Sym; import catdata.aql.exp.TyExpRaw.Ty; import catdata.aql.fdm.SaturatedInstance; public final class InstExpRandom extends InstExp<Ty,En,Sym,Fk,Att,Gen,Sk,ID,Chc<Sk,Pair<ID,Att>>> implements Raw { extends InstExp<Ty,En,Sym,Fk,Att,Pair<Integer,En>, Pair<Integer, Att>,Pair<Integer,En>,Pair<Integer,Att>> implements Raw { private Ctx<String, List<InteriorLabel<Object>>> raw = new Ctx<>(); Loading Loading @@ -119,40 +119,68 @@ extends InstExp<Ty,En,Sym,Fk,Att,Gen,Sk,ID,Chc<Sk,Pair<ID,Att>>> implements Raw //not exactly the smartest way @Override public Instance<Ty, En, Sym, Fk, Att, Gen, Sk, ID, Chc<Sk, Pair<ID, Att>>> eval(AqlEnv env) { public SaturatedInstance<Ty, En, Sym, Fk, Att, Pair<Integer, En>, Pair<Integer, Att>, Pair<Integer, En>, Pair<Integer, Att>> eval(AqlEnv env) { int seed = (Integer) new AqlOptions(options, null, env.defaults).getOrDefault(AqlOption.random_seed); Random rand = new Random(seed); List<Pair<LocStr, String>> gens = new LinkedList<>(); List<Pair<Integer, Pair<RawTerm, RawTerm>>> eqs = new LinkedList<>(); Schema<Ty, En, Sym, Fk, Att> schema = sch.eval(env); Ctx<En, Collection<Pair<Integer,En>>> ens0 = new Ctx<>(); Ctx<Ty, Collection<Pair<Integer,Att>>> tys = new Ctx<>(); Ctx<Pair<Integer, En>, Ctx<Fk, Pair<Integer, En>>> fks = new Ctx<>(); Ctx<Pair<Integer,En>, Ctx<Att, Term<Ty, Void, Sym, Void, Void, Void, Pair<Integer, Att>>>> atts = new Ctx<>(); for (Ty ty : schema.typeSide.tys) { tys.put(ty, new LinkedList<>()); } for (String en : ens.keySet()) { List<Pair<Integer,En>> l = new LinkedList<>(); int size = ens.get(en); for (int i = 0; i < size; i++) { String src = en + i; gens.add(new Pair<>(new LocStr(0, src), en)); for (Fk fk : schema.fksFrom(new En(en))) { En dst_en = schema.fks.get(fk).second; int dst_size = ens.containsKey(dst_en.str) ? ens.get(dst_en.str) : 0; if (dst_size == 0) { continue; } String dst = dst_en.toString() + rand.nextInt(dst_size); eqs.add(new Pair<>(0, new Pair<>(new RawTerm(fk.toString(), Util.singList(new RawTerm(src))), new RawTerm(dst)))); l.add(new Pair<>(i,new En(en))); Ctx<Att, Term<Ty, Void, Sym, Void, Void, Void, Pair<Integer, Att>>> ctx = new Ctx<>(); for (Att att : schema.atts.keySet()) { ctx.put(att, Term.Sk(new Pair<>(i, att))); tys.get(schema.atts.get(att).second).add(new Pair<>(i, att)); } for (Att att : schema.attsFrom(new En(en))) { Ty dst_ty = schema.atts.get(att).second; int dst_size = ens.containsKey(dst_ty.str) ? ens.get(dst_ty.str) : 0; atts.put(new Pair<>(i,new En(en)), ctx); if (dst_size == 0) { continue; Ctx<Fk, Pair<Integer, En>> ctx0 = new Ctx<>(); for (Fk fk : schema.fks.keySet()) { int size0 = ens.get(schema.fks.get(fk).second.str); Integer k = rand.nextInt(size0); ctx0.put(fk, new Pair<>(k, schema.fks.get(fk).second)); } String dst = dst_ty.toString() + rand.nextInt(dst_size); eqs.add(new Pair<>(0, new Pair<>(new RawTerm(att.toString(), Util.singList(new RawTerm(src))), new RawTerm(dst)))); fks.put(new Pair<>(i,new En(en)), ctx0); } ens0.put(new En(en), l); } ImportAlgebra<Ty, En, Sym, Fk, Att, Pair<Integer, En>, Pair<Integer, Att>> alg = new ImportAlgebra<Ty, En, Sym, Fk, Att, Pair<Integer, En>, Pair<Integer, Att>> (schema, ens0, tys, fks, atts, x->x.toString(), x->x.toString() , true); DP<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>> dp = new DP<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>>() { @Override public String toStringProver() { return "Random"; } @Override public boolean eq(Ctx<Var, Chc<Ty, En>> ctx, Term<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>> lhs, Term<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>> rhs) { if (!ctx.isEmpty()) { Util.anomaly(); } return lhs.equals(rhs); } return new InstExpRaw(sch, Collections.emptyList(), gens, eqs, Util.toList(options)).eval(env); //inherits options }; return new SaturatedInstance <Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>, Pair<Integer,En>, Pair<Integer, Att>> (alg, dp, false, true, false, new Ctx<>()); } Loading src/catdata/aql/fdm/EvalAlgebra.java +1 −1 Changes for src/catdata/aql/fdm/EvalAlgebra.java: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -313,7 +313,7 @@ public class EvalAlgebra<Ty, En1, Sym, Fk1, Att1, Gen, Sk, En2, Fk2, Att2, X, Y> } Connection conn = null; boolean safe = (I.algebra().talg().sks.isEmpty() && I.algebra().talg().eqs.isEmpty()) || allowUnsafeSql(); boolean useSql = I.size() >= minSizeForSql() && safe && (I.schema().typeSide instanceof SqlTypeSide); boolean useSql = I.size() >= minSizeForSql() && safe && (SqlTypeSide.tys().containsAll(I.schema().typeSide.tys)); int vlen = (int) options.getOrDefault(AqlOption.varchar_length); if (useSql) { this.Q = q.unnest(); Loading Loading
src/catdata/aql/Chase.java +10 −6 Changes for src/catdata/aql/Chase.java: 10 added lines, 6 removed lines. Original line number Diff line number Diff line package catdata.aql; import java.lang.ref.Reference; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; Loading @@ -12,7 +11,6 @@ import catdata.BinRelMap; import catdata.Chc; import catdata.Ctx; import catdata.Pair; import catdata.Ref; import catdata.Triple; import catdata.Util; import catdata.graph.UnionFind; Loading Loading @@ -181,6 +179,11 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { } return s; } @Override public String toString() { return "Content [ens=" + ens + ", fks=" + fks + ", us=" + us + "]"; } } public Content T; Loading Loading @@ -218,6 +221,7 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { } private boolean step() { Content toAdd = new Content(); Ctx<En2, UnionFind<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>>> ufs = new Ctx<>(); for (En2 en : F.dst.ens) { Loading @@ -236,7 +240,6 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { T.addAll(toAdd); makeFunctional(ufs, changed); // System.out.println("E " + changed); if (!changed[0]) { return false; Loading @@ -244,8 +247,10 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { T = T.merge(ufs); return true; } static int x = 0; public void makeFunctional(Ctx<En2, UnionFind<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>>> ufs, Boolean[] changed) { Loading Loading @@ -307,7 +312,7 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { N = M; } if (!N.equals(Util.singSet(lhs))) { if (!N.contains(lhs)) { Lineage<Void, En2, Void, Fk2, Void, Gen, Void> n = initial; Lineage<Void, En2, Void, Fk2, Void, Gen, Void> m = initial; for (Fk2 fk : F.fks.get(a).second) { Loading Loading @@ -335,7 +340,6 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { List<Fk2> lhs = eq.second.toFkList(); List<Fk2> rhs = eq.third.toFkList(); Set<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>> active = new HashSet<>(); for (Pair<Lineage<Void, En2, Void, Fk2, Void, Gen, Void>, Lineage<Void, En2, Void, Fk2, Void, Gen, Void>> x : T.ens .get(src)) { Lineage<Void, En2, Void, Fk2, Void, Gen, Void> initial = x.first; Loading Loading @@ -365,7 +369,7 @@ public class Chase<Ty, En1, Sym, Fk1, Att1, En2, Fk2, Att2, Gen, Sk, X, Y> { N2 = M; } if (!N.equals(N2)) { if (Util.isect(N, N2).isEmpty()) { changed[0] = true; Lineage<Void, En2, Void, Fk2, Void, Gen, Void> n = initial; Lineage<Void, En2, Void, Fk2, Void, Gen, Void> m = initial; Loading
src/catdata/aql/exp/InstExpRandom.java +55 −27 Changes for src/catdata/aql/exp/InstExpRandom.java: 55 added lines, 27 removed lines. Original line number Diff line number Diff line package catdata.aql.exp; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; Loading @@ -13,21 +12,22 @@ import catdata.Pair; import catdata.Util; import catdata.aql.AqlOptions; import catdata.aql.AqlOptions.AqlOption; import catdata.aql.DP; import catdata.aql.ImportAlgebra; import catdata.aql.Instance; import catdata.aql.It.ID; import catdata.aql.Kind; import catdata.aql.RawTerm; import catdata.aql.Schema; import catdata.aql.exp.InstExpRaw.Gen; import catdata.aql.exp.InstExpRaw.Sk; import catdata.aql.Term; import catdata.aql.Var; import catdata.aql.exp.SchExpRaw.Att; import catdata.aql.exp.SchExpRaw.En; import catdata.aql.exp.SchExpRaw.Fk; import catdata.aql.exp.TyExpRaw.Sym; import catdata.aql.exp.TyExpRaw.Ty; import catdata.aql.fdm.SaturatedInstance; public final class InstExpRandom extends InstExp<Ty,En,Sym,Fk,Att,Gen,Sk,ID,Chc<Sk,Pair<ID,Att>>> implements Raw { extends InstExp<Ty,En,Sym,Fk,Att,Pair<Integer,En>, Pair<Integer, Att>,Pair<Integer,En>,Pair<Integer,Att>> implements Raw { private Ctx<String, List<InteriorLabel<Object>>> raw = new Ctx<>(); Loading Loading @@ -119,40 +119,68 @@ extends InstExp<Ty,En,Sym,Fk,Att,Gen,Sk,ID,Chc<Sk,Pair<ID,Att>>> implements Raw //not exactly the smartest way @Override public Instance<Ty, En, Sym, Fk, Att, Gen, Sk, ID, Chc<Sk, Pair<ID, Att>>> eval(AqlEnv env) { public SaturatedInstance<Ty, En, Sym, Fk, Att, Pair<Integer, En>, Pair<Integer, Att>, Pair<Integer, En>, Pair<Integer, Att>> eval(AqlEnv env) { int seed = (Integer) new AqlOptions(options, null, env.defaults).getOrDefault(AqlOption.random_seed); Random rand = new Random(seed); List<Pair<LocStr, String>> gens = new LinkedList<>(); List<Pair<Integer, Pair<RawTerm, RawTerm>>> eqs = new LinkedList<>(); Schema<Ty, En, Sym, Fk, Att> schema = sch.eval(env); Ctx<En, Collection<Pair<Integer,En>>> ens0 = new Ctx<>(); Ctx<Ty, Collection<Pair<Integer,Att>>> tys = new Ctx<>(); Ctx<Pair<Integer, En>, Ctx<Fk, Pair<Integer, En>>> fks = new Ctx<>(); Ctx<Pair<Integer,En>, Ctx<Att, Term<Ty, Void, Sym, Void, Void, Void, Pair<Integer, Att>>>> atts = new Ctx<>(); for (Ty ty : schema.typeSide.tys) { tys.put(ty, new LinkedList<>()); } for (String en : ens.keySet()) { List<Pair<Integer,En>> l = new LinkedList<>(); int size = ens.get(en); for (int i = 0; i < size; i++) { String src = en + i; gens.add(new Pair<>(new LocStr(0, src), en)); for (Fk fk : schema.fksFrom(new En(en))) { En dst_en = schema.fks.get(fk).second; int dst_size = ens.containsKey(dst_en.str) ? ens.get(dst_en.str) : 0; if (dst_size == 0) { continue; } String dst = dst_en.toString() + rand.nextInt(dst_size); eqs.add(new Pair<>(0, new Pair<>(new RawTerm(fk.toString(), Util.singList(new RawTerm(src))), new RawTerm(dst)))); l.add(new Pair<>(i,new En(en))); Ctx<Att, Term<Ty, Void, Sym, Void, Void, Void, Pair<Integer, Att>>> ctx = new Ctx<>(); for (Att att : schema.atts.keySet()) { ctx.put(att, Term.Sk(new Pair<>(i, att))); tys.get(schema.atts.get(att).second).add(new Pair<>(i, att)); } for (Att att : schema.attsFrom(new En(en))) { Ty dst_ty = schema.atts.get(att).second; int dst_size = ens.containsKey(dst_ty.str) ? ens.get(dst_ty.str) : 0; atts.put(new Pair<>(i,new En(en)), ctx); if (dst_size == 0) { continue; Ctx<Fk, Pair<Integer, En>> ctx0 = new Ctx<>(); for (Fk fk : schema.fks.keySet()) { int size0 = ens.get(schema.fks.get(fk).second.str); Integer k = rand.nextInt(size0); ctx0.put(fk, new Pair<>(k, schema.fks.get(fk).second)); } String dst = dst_ty.toString() + rand.nextInt(dst_size); eqs.add(new Pair<>(0, new Pair<>(new RawTerm(att.toString(), Util.singList(new RawTerm(src))), new RawTerm(dst)))); fks.put(new Pair<>(i,new En(en)), ctx0); } ens0.put(new En(en), l); } ImportAlgebra<Ty, En, Sym, Fk, Att, Pair<Integer, En>, Pair<Integer, Att>> alg = new ImportAlgebra<Ty, En, Sym, Fk, Att, Pair<Integer, En>, Pair<Integer, Att>> (schema, ens0, tys, fks, atts, x->x.toString(), x->x.toString() , true); DP<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>> dp = new DP<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>>() { @Override public String toStringProver() { return "Random"; } @Override public boolean eq(Ctx<Var, Chc<Ty, En>> ctx, Term<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>> lhs, Term<Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>> rhs) { if (!ctx.isEmpty()) { Util.anomaly(); } return lhs.equals(rhs); } return new InstExpRaw(sch, Collections.emptyList(), gens, eqs, Util.toList(options)).eval(env); //inherits options }; return new SaturatedInstance <Ty, En, Sym, Fk, Att, Pair<Integer,En>, Pair<Integer, Att>, Pair<Integer,En>, Pair<Integer, Att>> (alg, dp, false, true, false, new Ctx<>()); } Loading
src/catdata/aql/fdm/EvalAlgebra.java +1 −1 Changes for src/catdata/aql/fdm/EvalAlgebra.java: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -313,7 +313,7 @@ public class EvalAlgebra<Ty, En1, Sym, Fk1, Att1, Gen, Sk, En2, Fk2, Att2, X, Y> } Connection conn = null; boolean safe = (I.algebra().talg().sks.isEmpty() && I.algebra().talg().eqs.isEmpty()) || allowUnsafeSql(); boolean useSql = I.size() >= minSizeForSql() && safe && (I.schema().typeSide instanceof SqlTypeSide); boolean useSql = I.size() >= minSizeForSql() && safe && (SqlTypeSide.tys().containsAll(I.schema().typeSide.tys)); int vlen = (int) options.getOrDefault(AqlOption.varchar_length); if (useSql) { this.Q = q.unnest(); Loading