import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.AllColumns;
import net.sf.jsqlparser.statement.select.AllTableColumns;
import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.select.SubJoin;
import net.sf.jsqlparser.statement.select.SubSelect;
public class GenerateTree {
private AlgebraTree tree = null;
//private AlgebraTree
private String sql_str =null;
private AlgebraNode table_head = null;
public String getSql_str() {
return sql_str;
}
public void setSql_str(String sql_str) {
this.sql_str = sql_str;
}
public AlgebraNode getTable_head() {
return table_head;
}
public void setTable_head(AlgebraNode table_head) {
this.table_head = table_head;
}
public AlgebraTree getTree() {
return tree;
}
public void setTree(AlgebraTree tree) {
this.tree = tree;
}
public String getSql() {
return sql_str;
}
public void setSql(String sql) {
this.sql_str = sql;
}
public GenerateTree(String sql) throws JSQLParserException
{
sql_str = sql;
CCJSqlParserManager parserManager = new CCJSqlParserManager();
Select select = (Select) parserManager.parse(new StringReader(sql));
//tree = new AlgebraTree();
explainSql(getPainSelect(select));
//tree.setSub_head(table_head);
optimization_strategy_four();//执行优化策略四
optimization_strategy_one();//执行优化策略一
optimization_strategy_two();//执行优化策略二
optimization_strategy_three();//执行优化策略三
//optimization_strategy_five();
}
public PlainSelect getPainSelect(Select select) throws JSQLParserException
{
PlainSelect plain = (PlainSelect) select.getSelectBody();
return plain;
}
private AlgebraNode explainSql(PlainSelect plain) {
//System.out.println("order by:"+plain.getOrderByElements());
// TODO Auto-generated method stub
//System.out.println(plain.get);
List<SelectItem> selectitem = plain.getSelectItems();
//System.out.println("8888"+plain);
AlgebraNode<SelectItem> head = new AlgebraNode<SelectItem>();
head.setList(selectitem);
head.setType(4);//投影节点
AlgebraTree new_tree = null;
if(tree == null)//第一次进入该函数 为主select
{
tree = new AlgebraTree();
tree.setHead(head);
}
else//不是第一次进入该函数 子select
{
AlgebraTree temp_temp_temp = null;
temp_temp_temp = tree;
while(temp_temp_temp .getNextTree()!=null)//得到最后一个select 树
{
temp_temp_temp = temp_temp_temp .getNextTree();
}
new_tree = new AlgebraTree();
new_tree.setHead(head);
temp_temp_temp .setNextTree(new_tree);
}
Expression epsn = plain.getWhere();
AlgebraNode<Expression> current = null;
if (epsn != null) {
Stack<Expression> st = new Stack<Expression>();
st.push(epsn);
List<Expression> andexpList = new ArrayList<Expression>();
while (!st.isEmpty()) {
Expression temp = st.pop();
if (temp instanceof AndExpression) {
st.push(((AndExpression) temp).getLeftExpression());
st.push(((AndExpression) temp).getRightExpression());
} else {
andexpList.add(temp);
}
}
AlgebraNode<Expression> temp = null;
AlgebraNode<Expression> where_head = null;
for (int i = 0; i < andexpList.size(); i++) {
temp = new AlgebraNode<Expression>();
List<Expression> tp = new ArrayList<Expression>();
tp.add(andexpList.get(i));
temp.setList(tp);
temp.setType(3);// 选择类型
if (andexpList.get(i) instanceof InExpression) {
InExpression ie = (InExpression) (andexpList.get(i));
SubSelect sc = (SubSelect) (ie.getRightItemsList());
// System.out.println("rightitemlist:"+ie.getRightItemsList());
// System.out.println("leftitemlist:"+ie.getLeftItemsList());
// System.out.println("LeftExpression:"+ ie.getLeftExpression());
temp.setSon_add(explainSql((PlainSelect) sc.getSelectBody()));// 子select递归调用
temp.getSon_add().setFather(temp);// 设置父节点
}
if (i == 0) {
where_head = temp;
current = temp;
} else {
current.setSon(temp);
temp.setFather(current);
current = temp;
}
}
/***整合SelectItem 和where部分***/
head.setSon(where_head);
where_head.setFather(head);
}
/***整合where部分和from部分***/
FromItem fi = plain.getFromItem();
//if()
AlgebraNode left_temp = null;
if(fi instanceof SubSelect)
{
//System.out.println("SubSelect"+fi);
left_temp = explainSql((PlainSelect)((SubSelect) fi).getSelectBody());//递归调用
}
if(fi instanceof Table)
{
List<Table> tablelist = new ArrayList<Table>();//表部分
tablelist.add((Table)fi);
// System.out.println("哈哈"+tablelist);
AlgebraNode<Table> table_temp = new AlgebraNode<Table>();
table_temp.setType(1);
table_temp.setList(tablelist);
left_temp = table_temp;
//把所有表单独连一起,便于优化
if(new_tree == null)//说明为主select
{
//System.out.println("呵呵");
AlgebraNode table_temp_head = null;
table_temp_head = tree.getSub_head();
if(table_temp_head!=null)
{
while(table_temp_head.getSon()!=null)
{
table_temp_head = table_temp_head.getSon();
}
table_temp_head.setNext(table_temp);
table_temp.setPervious(table_temp_head);
}
else
{
tree.setSub_head(table_temp);
}
}
else//为子select
{
AlgebraNode table_temp_head = null;
table_temp_head = new_tree.getSub_head();
if(table_temp_head!=null)
{
while(table_temp_head.getSon()!=null)
{
table_temp_head = table_temp_head.getSon();
}
table_temp_head.setNext(table_temp);
table_temp.setPervious(table_temp_head);
}
else
{
new_tree.setSub_head(table_temp);
}
}
}
//得到joins
List<Join> joins = plain.getJoins();
//System.out.println("++++"+plain);
//System.out.println("哈哈"+joins);
AlgebraNode join_current = null;
if(joins == null)//直接将该节点与上一个节点相连
{
if (epsn != null) {
current.setSon(left_temp);
left_temp.setFather(current);
}
else
{
head.setSon(left_temp);
left_temp.setFather(head);
}
}
else//不为空,建一个连接树
{
for(int i = 0;i<joins.size();i++)
{
List<Join> join_list = new ArrayList<Join>();//根据join造一个连接节点
join_list.add(joins.get(i));
AlgebraNode<Join> temp_join_1 = new AlgebraNode<Join>();
temp_join_1.setList(join_list);
temp_join_1.setType(2);
AlgebraNode temp_join_2 = null;//生成join后面元素的节点 可能是一个子select 可能是一个表
if(joins.get(i).getRightItem() instanceof SubSelect)
{
SubSelect subselect_temp = (SubSelect)(joins.get(i).getRigh
JSQL.rar_fortycqi_jSQL_jSQL下载_sql解析器_toucha9a
版权申诉
66 浏览量
2022-09-23
04:08:21
上传
评论
收藏 274KB RAR 举报
APei
- 粉丝: 64
- 资源: 1万+
最新资源
- c51_2_2.c
- ASCII American Standard Code for Information Interchange
- 一个chm格式的 SQL 函数手册-SQL语言手册文档
- 计算当前月份的天数和剩余天数
- 基于ARM的指令调度和延迟分支
- 基于Vue和TypeScript的极简聊天应用设计源码 - HasChat
- 基于Vue2全家桶和Zcool数据的图片收集网站设计源码 - cool-picture
- 基于C和C++的二维绘制工具设计源码 - DrawPro
- Object.defineProperty 的 IE 补丁object-defineproperty-ie-master.zip
- 整卷预览.mhtml
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈