Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package optimizer;
- import java.util.*;
- import java.sql.*;
- public class opt
- {
- private static boolean hasCommon(String permut,String rel)
- {
- int i,j;
- for(i=0;i<permut.length();i++)
- {
- if(permut.charAt(i)!='('&&permut.charAt(i)!=')')
- {
- for(j=0;j<rel.length();j++)
- {
- if(permut.charAt(i)==rel.charAt(j))
- return false;
- }
- }
- }
- return true;
- }
- private static boolean canJoin(String permut,String rel,Vector<String> allowed)
- {
- int i,j;
- if(hasCommon(permut,rel))
- {
- for(i=0;i<permut.length();i++)
- {
- for(j=0;j<rel.length();j++)
- {
- if(!permut.contains(rel)&&(allowed.contains(Character.toString(permut.charAt(i))+Character.toString(rel.charAt(j)))||allowed.contains(Character.toString(rel.charAt(j))+Character.toString(permut.charAt(i)))))
- return true;
- }
- }
- }
- return false;
- }
- private static int joinCost(int nt1,int ndt1,int nt2,int ndt2,int nrs)
- {
- int val=ndt1;
- if(ndt1<ndt2)
- val=ndt2;
- return (((nt1+nt2)/nrs)+((nt1*nt2)/(nrs*val))+(nt1+nt2));
- }
- public static String optimize(Vector<String> rels,Vector<Vector<String>> rel_cols,Vector<String> allowed,int nrs)
- {
- int i,j,k;
- TreeMap single_rel = new TreeMap<String,Integer>();
- TreeMap rel_tup= new TreeMap<String,Integer>();
- Random rand = new Random();
- TreeMap rel_dist_tup= new TreeMap<String,Integer>();
- Connection con = null;
- String url = "jdbc:mysql://localhost:3306/";
- String db = "hnrs";
- String driver = "com.mysql.jdbc.Driver";
- String user = "root";
- String pass = "";
- String meta_table="meta_info";
- String size_table="table_size";
- HashMap temp_d = new HashMap<String,HashMap<String,Integer>>();
- for(i=0;i<rels.size();i++)
- {
- try{
- Class.forName(driver);
- con = DriverManager.getConnection(url+db, user, pass);
- Statement st = con.createStatement();
- ResultSet res = st.executeQuery("SELECT size FROM "+size_table+" where table_name=\""+(String)rels.get(i)+"\"");
- res.next();
- // System.out.println("SELECT size FROM "+size_table+" where table_name=\""+(String)rels.get(i)+"\"");
- System.out.println(res.toString());
- int a=res.getInt("size");
- Vector tutu=(Vector<String>)rel_cols.get(i);
- // System.out.println(tutu.toString());
- if(tutu.size()!=1)
- {
- for(j=0;j<tutu.size();j++)
- {
- String temp_tutu=(String)tutu.get(j);
- int kash=temp_tutu.toString().indexOf('|');
- res = st.executeQuery("SELECT num_d_tuples FROM "+meta_table+" where table_name=\""+(String)rels.get(i)+"\" and col_name=\""+temp_tutu.toString().substring(kash+1)+"\"");
- // System.out.println("SELECT num_d_tuples FROM "+meta_table+" where table_name=\""+(String)rels.get(i)+"\" and col_name=\""+temp_tutu.toString().substring(kash+1)+"\"");
- res.next();
- int b=res.getInt("num_d_tuples");
- String fafa=temp_tutu.substring(0,kash);
- if(temp_d.containsKey(rels.get(i)+fafa))
- {
- HashMap temp=(HashMap<String,Integer>)temp_d.get(rels.get(i)+fafa);
- temp.put(rels.get(i),new Integer(b));
- temp_d.remove(rels.get(i)+fafa);
- temp_d.put(rels.get(i)+fafa,temp);
- }
- else if(temp_d.containsKey(fafa+rels.get(i)))
- {
- HashMap temp=(HashMap<String,Integer>)temp_d.get(fafa+rels.get(i));
- temp.put(rels.get(i),new Integer(b));
- temp_d.remove(fafa+rels.get(i));
- temp_d.put(fafa+rels.get(i),temp);
- }
- else
- {
- HashMap temp = new HashMap<String,Integer>();
- temp.put(rels.get(i),new Integer(b));
- temp_d.put(rels.get(i)+fafa,temp);
- }
- }
- }
- else
- {
- res = st.executeQuery("SELECT num_d_tuples FROM "+meta_table+" where table_name=\""+(String)rels.get(i)+"\" and col_name=\""+tutu.get(0)+"\"");
- res.next();
- int b=res.getInt("num_d_tuples");
- rel_dist_tup.put((String)rels.get(i),new Integer(b));
- // System.out.println("---------------");
- }
- rel_tup.put((String)rels.get(i),a);
- // calculate the cost ??
- single_rel.put((String)rels.get(i),1);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- // System.out.println("req :"+ temp_d.toString());
- // System.out.println("req :"+rel_dist_tup.toString());
- TreeMap plan_tup_list = new TreeMap<String,Integer>(rel_tup);
- TreeMap plan_dist_list = new TreeMap<String,Integer>(rel_dist_tup);
- TreeMap plan_list = new TreeMap<String,Integer>();
- Vector permuts=new Vector(rels);
- TreeMap cost_list = new TreeMap<String,Integer>();
- for(i=1;i<rels.size();i++)
- {
- /* Each level of join */
- // System.out.print(i);
- // System.out.println(":");
- // Vector temp = new Vector<String>();
- Vector cannotjoin = new Vector<String>();
- for(j=0;j<permuts.size();j++)
- {
- // System.out.println((String)permuts.get(j));
- int n_tup2 = (Integer)plan_tup_list.get((String)permuts.get(j));
- int n_d_tup2=0;
- boolean d_flag=true;
- if(plan_dist_list.containsKey((String)permuts.get(j)))
- {
- n_d_tup2 = (Integer)plan_dist_list.get((String)permuts.get(j));
- d_flag=false;
- }
- for(k=0;k<permuts.size();k++)
- {
- //System.out.println("Can join ? "+ (String)permuts.get(j)+"--"+(String)permuts.get(k));
- if(!permuts.contains("("+(String)permuts.get(j)+")("+(String)permuts.get(k)+")")&&!cannotjoin.contains((String)permuts.get(j)+(String)permuts.get(k))&&canJoin((String)permuts.get(j),(String)permuts.get(k),allowed))
- {
- // System.out.print("-- yes ");
- if(d_flag)
- {
- if(temp_d.containsKey((String)permuts.get(j)+(String)permuts.get(k)))
- n_d_tup2=(Integer)(((HashMap<String,Integer>)temp_d.get((String)permuts.get(j)+(String)permuts.get(k))).get((String)permuts.get(j)));
- else if(temp_d.containsKey((String)permuts.get(k)+(String)permuts.get(j)))
- n_d_tup2=(Integer)(((HashMap<String,Integer>)temp_d.get((String)permuts.get(k)+(String)permuts.get(j))).get((String)permuts.get(j)));
- else
- System.out.println("Error1");
- }
- int n_d_tup1=0;
- if(plan_dist_list.containsKey((String)permuts.get(k)))
- {
- n_d_tup1 = (Integer)plan_dist_list.get((String)permuts.get(k));
- }
- else
- {
- if(temp_d.containsKey((String)permuts.get(j)+(String)permuts.get(k)))
- n_d_tup1=(Integer)(((HashMap<String,Integer>)temp_d.get((String)permuts.get(j)+(String)permuts.get(k))).get((String)permuts.get(k)));
- else if(temp_d.containsKey((String)permuts.get(k)+(String)permuts.get(j)))
- n_d_tup1=(Integer)(((HashMap<String,Integer>)temp_d.get((String)permuts.get(k)+(String)permuts.get(j))).get((String)permuts.get(k)));
- else
- System.out.println("Error2");
- }
- cannotjoin.addElement((String)permuts.get(k)+(String)permuts.get(j));
- String f_perm="("+(String)permuts.get(j)+")("+(String)permuts.get(k)+")";
- permuts.addElement(f_perm);
- plan_list.put(f_perm,1);
- int n_tup1 = (Integer)plan_tup_list.get((String)permuts.get(k));
- if(n_d_tup1<n_d_tup2)
- {
- // System.out.println("nt1:"+n_tup1+":nt2:"+n_tup2+":n_d_tup2:"+n_d_tup2);
- // System.out.println("test->"+(long)n_tup1*n_tup2/n_d_tup2);
- plan_tup_list.put(f_perm,new Integer((int)((long)n_tup1*n_tup2/n_d_tup2)));
- plan_dist_list.put(f_perm,n_d_tup2);
- }
- else
- {
- // System.out.println("nt1:"+n_tup1+":nt2:"+n_tup2+":n_d_tup1:"+n_d_tup1);
- // System.out.println("test->"+(long)n_tup1*n_tup2/n_d_tup1);
- plan_tup_list.put(f_perm,new Integer((int)((long)n_tup1*n_tup2/n_d_tup1)));
- plan_dist_list.put(f_perm,n_d_tup1);
- }
- // System.out.println("t1-"+n_d_tup1+" t2-"+n_d_tup2);
- // System.out.println("tup_list:"+plan_tup_list.toString());
- // System.out.println("dup_list:"+plan_dist_list.toString());
- // System.out.println("cost:"+f_perm+":"+joinCost(n_tup1,n_d_tup1,n_tup2,n_d_tup2,nrs));
- int cost=+joinCost(n_tup1,n_d_tup1,n_tup2,n_d_tup2,nrs);
- if(cost_list.containsKey((String)permuts.get(k)))
- {
- // System.out.println("Adding cost of "+(String)permuts.get(k)+" to "+(String)permuts.get(k));
- cost+=((Integer)cost_list.get((String)permuts.get(k))).intValue();
- }
- // cost+=Integer.toInt(cost_list.get((String)permuts.get(k)));
- cost_list.put(f_perm,new Integer(cost));
- // System.out.println("cost_list:"+cost_list.toString());
- }
- }
- }
- // System.out.println(temp.capacity());
- // if(temp.size()!=0)
- // permuts=temp;
- }
- Vector<Integer> dups=new Vector();
- TreeMap final_list = new TreeMap<String,Integer>(cost_list);
- // System.out.println("-->"+plan_tup_list.toString());
- Set keys = plan_tup_list.keySet();
- int length=0;
- for (Iterator ii = keys.iterator(); ii.hasNext();) {
- String key = (String) ii.next();
- // System.out.println(key);
- if(key.length()>length)
- length=key.length();
- Integer value = (Integer) plan_tup_list.get(key);
- if(!dups.contains(value))
- dups.add(value);
- else
- final_list.remove(key);
- }
- // System.out.println(length+"-->"+final_list.toString());
- String ret=new String();
- int minCost=999999999;
- for(Iterator ij=final_list.keySet().iterator();ij.hasNext();)
- {
- String key=(String) ij.next();
- if(key.length()==length && minCost>(Integer) final_list.get(key))
- {
- ret=key;
- minCost=(Integer) final_list.get(key);
- }
- }
- // System.out.println("Key is ->"+ret+"min cost ->"+minCost);
- return ret;
- }
- public static void main(String[] args)
- {
- Vector rels=new Vector();
- Vector cols=new Vector();
- Vector final_one = new Vector<Vector<String>>();
- Vector temp = new Vector<String>();
- rels.addElement("I");
- cols.addElement("S_NATIONKEY:");
- final_one.addElement(cols);
- rels.addElement("H");
- cols=new Vector();
- cols.addElement("O_COMMENT:");
- final_one.addElement(cols);
- rels.addElement("T");
- cols=new Vector();
- cols.addElement("I|C_NATIONKEY:");
- cols.addElement("H|C_NAME:");
- final_one.addElement(cols);
- Vector all=new Vector();
- all.addElement("IT");
- all.addElement("TH");
- // System.out.println(rels.toString());
- // /// System.out.println(final_one.toString());
- String out=optimize(rels,final_one,all,4);
- // // System.out.println(out);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement