Commit abcabeee authored by Ryan Wisnesky's avatar Ryan Wisnesky
Browse files

misc

parent b660358e
Loading
Loading
Loading
Loading
+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;
@@ -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;
@@ -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;
@@ -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) {
@@ -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;
@@ -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) {
@@ -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) {
@@ -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;
@@ -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;
+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;
@@ -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<>();
	
@@ -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<>());
	}

	
+1 −1
Changes for src/catdata/aql/fdm/EvalAlgebra.java: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -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();