/** * */ package eu.play_project.dcep.distributedetalis.join; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeSet; /** * @author Ningyuan Pan * */ public class Core { //private ResultComparator comp = new ResultComparator(); public static void make(Map<String, SelectVariable> variables, List<SelectResults> results){ NaturalJoiner cross = new NaturalJoiner(); List<ResultRegistry> minp = new ArrayList<ResultRegistry>(2); getMinProduct(minp, variables); while(minp.size() > 1){ ResultRegistry min1 = minp.get(0); SelectResults min2 = minp.get(1); //System.out.println("\nCross Chosen: ( "+min1.getNum()+" "+min2.getNum()+" ) "); min1.setResult(cross.naturalJoin(min1.getResult(), min1.getVariables(), min2.getResult(), min2.getVariables())); // remove min2 in all relevant variables and add min1 List<String> min2v = min2.getVariables(); for(int i = 0; i < min2v.size(); i++){ SelectVariable sv = variables.get(min2v.get(i)); boolean b1 = sv.removeRelResult(min2); boolean b2 = sv.addRelResult(min1); //System.out.print("\nVariable "+min2v.get(i)+" remove relevant result "+min2.getNum()+": "+b1); //System.out.print("\nVariable "+min2v.get(i)+" add relevant result "+min1.getNum()+": "+b2); } // remove min2 boolean b3 = results.remove(min2); //System.out.print("\nRemove result "+min2.getNum()+": "+b3+"\n"); getMinProduct(minp, variables); } // nature product with all independent results SelectResults ret = results.get(0); if(results.size() > 1){ for(int i = 1; i < results.size(); i++){ SelectResults ir = results.get(i); //System.out.println("\nIndepCross Chosen: ( "+ret.getNum()+" "+ir.getNum()+" ) "); ret.setResult(cross.naturalJoin(ret.getResult(), ret.getVariables(), ir.getResult(), ir.getVariables())); } } } // O(SIGMA(select variables):log|relevant results|) private static void getMinProduct(List<ResultRegistry> ret, Map<String, SelectVariable> vars){ int product = Integer.MAX_VALUE; ret.clear(); for(String v : vars.keySet()){ TreeSet<ResultRegistry> rr = vars.get(v).getRelResult(); if(rr.size() > 1){ ResultRegistry r1 = rr.pollFirst(); ResultRegistry r2 = rr.first(); rr.add(r1); int minProd = (r1.getSize())*(r2.getSize()); if(minProd > 0 && minProd < product){ product = minProd; ret.clear(); ret.add(r1); ret.add(r2); //System.out.println("\nCross Cadidate: ( "+r1.getNum()+" "+r2.getNum()+" ) "); } } } } /*public static void make2(Map<String, SelectVariable> variables, List<ResultRegistry> results){ NaturalJoiner cross = new NaturalJoiner(); List<ResultRegistry> indepResults = new ArrayList<ResultRegistry>(); while(results.size() > 1){ Collections.sort(results, comp); // get the result with minimal size ResultRegistry minr = results.get(0); List<String> minrv = minr.getVariables(); List<ResultRegistry> rr = new ArrayList<ResultRegistry>(); // search through all variables in the minimal result for(int i = 0; i < minrv.size(); i++){ SelectVariable sv = variables.get(minrv.get(i)); Set<ResultRegistry> vr = sv.getRelResult(); // search through all results that share same variable with minimal result for(ResultRegistry r : vr){ if(r != minr){ System.out.print("\nCross Candidate on "+minrv.get(i)+" : ( "+minr.getNum()+" "+r.getNum()+" ) "); if(!rr.contains(r)) rr.add(r); } } } Collections.sort(rr, comp); if(!rr.isEmpty()){ ResultRegistry minrr = rr.get(0); System.out.println("\nCross Chosen: ( "+minr.getNum()+" "+minrr.getNum()+" ) "); // nature product between minimal result and its minimal rel. result minr.setResult(cross.naturalJoin(minr.getResult(), minr.getVariables(), minrr.getResult(), minrr.getVariables())); System.gc(); // remove minrr in all relevant variables and add minr List<String> minrrv = minrr.getVariables(); for(int i = 0; i < minrrv.size(); i++){ SelectVariable sv = variables.get(minrrv.get(i)); boolean b1 = sv.removeRelResult(minrr); boolean b2 = sv.addRelResult(minr); System.out.print("\nVariable "+minrrv.get(i)+" remove relevant result "+minrr.getNum()+": "+b1); System.out.print("\nVariable "+minrrv.get(i)+" add relevant result "+minr.getNum()+": "+b2); } // remove minrr boolean b3 = results.remove(minrr); System.out.print("\nRemove result "+minrr.getNum()+": "+b3+"\n"); } else{ boolean b4 = indepResults.add(minr); results.remove(minr); System.out.print("\nRemove independent result "+minr.getNum()+": "+b4+"\n"); } } // nature product with all independent results ResultRegistry ret = results.get(0); for(int i = 0; i < indepResults.size(); i++){ ResultRegistry ir = indepResults.get(i); System.out.println("\nIndepCross Chosen: ( "+ret.getNum()+" "+ir.getNum()+" ) "); ret.setResult(cross.naturalJoin(ret.getResult(), ret.getVariables(), ir.getResult(), ir.getVariables())); System.gc(); } }*/ /*class ResultComparator implements Comparator <ResultRegistry>{ @Override public int compare(ResultRegistry r1, ResultRegistry r2){ return r1.getSize() - r2.getSize(); } }*/ }