package com.ecloud.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.mysql.fabric.xmlrpc.base.Array;
/**
* 获取数据
* @author chend
*
*/
public class GetMessage {
static Connection con=DateConnection.getConnection();
static PreparedStatement pstmt=null;
static ResultSet set=null;
static List<TablePO> list=new ArrayList<TablePO>();
public static List<TablePO> GetMessageTable(){
String sql="select * FROM (select TABLE_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE GROUP BY TABLE_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME ) as a"+
" where a.REFERENCED_TABLE_NAME !='null'";
try {
pstmt=con.prepareStatement(sql);
set=pstmt.executeQuery();
while(set.next()){
TablePO po=new TablePO();
po.setOne(set.getString("REFERENCED_TABLE_NAME"));
po.setMany(set.getString("TABLE_NAME"));
list.add(po);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
set.close();
pstmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
/*************对表进行排序**********************/
//需要排序的表
static List<String> queryList=new LinkedList<String>();
//排序后的表
static List<String> afterList=new ArrayList<String>();
//添加需要排序的表
public static void addquery(){
queryList.add("tb_user");
queryList.add("b_banquetorder");
queryList.add("tb_order");
queryList.add("b_company_customer");
queryList.add("df_cust_base");
queryList.add("tb_hotel");
queryList.add("tb_agent");
queryList.add("local_invalidreason");
queryList.add("s_servicehandbook");
queryList.add("ly_travelagent");
queryList.add("ms_delicacy");
}
//1.判断是否为躶主表如果是就优先取出
public static void addKeyTable(List<TablePO> list){
/************************无关联关系**************************************/
//把主躶表现放入到集合
for(int i=0;i<queryList.size();i++){
boolean bl=true;
for(TablePO p:list){
//如果子表里面没有的则证明是裸表或者顶级主表
if(queryList.get(i).equalsIgnoreCase(p.getMany().trim())){
bl=false;
break;
}
}
//如果子表里面没有证明是裸表或者顶级主表则放入到新集合中
if(bl){
afterList.add(queryList.get(i));
}
}
//把主躶表移除
for(String str:afterList){
queryList.remove(str);
}
}
/**************************有关联关系***********************************/
public static Map<String,List<String>> andJoinTable(List<TablePO> list){
//子-主集合
Map<String,List<String>> map=new HashMap<String,List<String>>();
//获取主表
for(String str:queryList){
//主表集合
List<String> mainTableList=new ArrayList<String>();
for(TablePO p:list){
//子表与需要转移的表相同
if(str.equalsIgnoreCase(p.getMany())){
//判断主表是否在需要
mainTableList.add(p.getOne());
}
}
map.put(str, mainTableList);
}
return map;
}
/**
* 判断map集合list里面的元素在queryList里面是否存在,如果不存在就把key放入的afterList,并且情况queyList多余数据
* @param arg
*/
public static Map<String,List<String>> keyFunction(Map<String,List<String>> map){
//记录存在的主键
Map<String,List<String>> mapkey=new HashMap<String, List<String>>();
for(String query:queryList){
List<String> listkey=new ArrayList<String>();
boolean bl=true;
for(String mstr:map.get(query)){
for(String query2:queryList){
if(mstr.equals(query2)){
bl=false;
listkey.add(mstr);
}
}
}
//放入
if(bl){
afterList.add(query);
}else{
mapkey.put(query, listkey);
}
}
//删除
for(String str:afterList){
queryList.remove(str);
}
return mapkey;
}
//排除自己引用自己的情况
public static void Topology( Map<String,List<String>> map){
//如果key=value 直接排除
for(String str:queryList){
List<String> list= map.get(str);
for(String str2:list){
if(str2.equals(str)){
//自己引用自己
afterList.add(str2);
}
}
}
}
public static void main(String arg[]){
List<TablePO> list= GetMessage.GetMessageTable();
addquery();
addKeyTable(list);
Map<String,List<String>> map=GetMessage.andJoinTable(list);
System.out.println(map);
Topology(map);
while(map.size()>0){
System.out.println(map=keyFunction(map));
}
for(String s:afterList){
System.out.println(s);
}
}
}