解析效果:

select id,code,name,utime,src,ctime from stock where id<20 and code like '%6%' order by id,code
Index Type No Text Type Desc
------------------------------------------------------------------------------------
0 1 select KW:select
1 2 id Text
2 3 , Comma
3 2 code Text
4 3 , Comma
5 2 name Text
6 3 , Comma
7 2 utime Text
8 3 , Comma
9 2 src Text
10 3 , Comma
11 2 ctime Text
12 4 from KW:from
13 2 stock Text
14 5 where KW:where
15 2 id Text
16 16 < <
17 2 20 Text
18 6 and KW:and
19 2 code Text
20 49 like KW:like
21 2 '%6%' Text
22 9 order KW:order
23 10 by KW:by
24 2 id Text
25 3 , Comma
26 2 code Text select
id,
code,
name,
utime,
src,
ctime
from
stock
where
id<20 and
code like'%6%'
order by
id,
code Text Depth Parent Prev Next Child Cnt
------------------------------------------------------------------------------------
NULL 0 NULL NULL NULL 4
select 0 null NULL from 11
id 1 select NULL , 0
, 1 select id code 0
code 1 select , , 0
, 1 select code name 0
name 1 select , , 0
, 1 select name utime 0
utime 1 select , , 0
, 1 select utime src 0
src 1 select , , 0
, 1 select src ctime 0
ctime 1 select , NULL 0
from 0 null select where 1
stock 1 from NULL NULL 0
where 0 null from order by 3
id<20 1 where NULL and 0
and 1 where id<20 code like'%6%' 0
code like'%6%' 1 where and NULL 0
order by 0 null where NULL 4
id 1 order by NULL , 0
, 1 order by id code 0
code 1 order by , 0
1 order by code NULL 0

程序:

package com.heyang.easysql.builder04;

import java.util.List;

import com.heyang.easysql.lex.Lexer;
import com.heyang.easysql.node.Node;
import com.heyang.easysql.token.Token;
import com.heyang.easysql.util.EasySqlUtil; /**
* SQL Builder 1.04
* @author Heyang
*
*/
public class Builder {
private Node root; public Builder(List<Token> tokens) {
root=new Node(Node.TYPE_TRANSPARENT); int fromIndex=-1;
int whereIndex=-1;
int orderbyIndex=-1;
for(int i=0;i<tokens.size();i++) {
Token t=tokens.get(i);
if(t.getType()==Token.TYPE_FROM) {
fromIndex=i;
}
if(t.getType()==Token.TYPE_WHERE) {
whereIndex=i;
}
if(t.getType()==Token.TYPE_ORDER) {
int nextIndex=i+1;
if(nextIndex<tokens.size()) {
Token nextToken=tokens.get(nextIndex);
if(nextToken.getType()==Token.TYPE_BY) {
orderbyIndex=i;
}
}
}
} if(fromIndex!=-1) {
List<Token> subTokens=tokens.subList(0, fromIndex);
Node select=new Node(subTokens.get(0).getText());
root.addChild(select); for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i);
if(t.getType()==Token.TYPE_TEXT) {
select.addChild(new Node(t.getText()));
}else if(t.getType()==Token.TYPE_COMMA) {
select.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}
}
} if(fromIndex!=-1 && whereIndex!=-1) {
List<Token> subTokens=tokens.subList(fromIndex, whereIndex);
Node from=new Node(subTokens.get(0).getText());
root.addChild(from); for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i);
if(t.getType()==Token.TYPE_TEXT) {
from.addChild(new Node(t.getText()));
}else if(t.getType()==Token.TYPE_COMMA) {
from.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}
}
} if(whereIndex!=-1 && orderbyIndex!=-1) {
List<Token> subTokens=tokens.subList(whereIndex, orderbyIndex);
Node where=new Node(subTokens.get(0).getText());
root.addChild(where); String bundle="";
for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i); if(t.getType()==Token.TYPE_AND || t.getType()==Token.TYPE_OR) {
where.addChild(new Node(bundle));
bundle="";
where.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}else if(t.getType()==Token.TYPE_LIKE){
bundle+=" "+t.getText();
}else {
bundle+=t.getText();
}
} where.addChild(new Node(bundle));
} if(orderbyIndex!=-1) {
List<Token> subTokens=tokens.subList(orderbyIndex, tokens.size());
Node orderby=new Node("order by");
root.addChild(orderby); String bundle="";
for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i); if(t.getType()==Token.TYPE_TEXT) {
orderby.addChild(new Node(t.getText()));
}else if(t.getType()==Token.TYPE_COMMA) {
orderby.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}
} orderby.addChild(new Node(bundle));
}
} public void printRoot() {
System.out.println(root);
root.printHeaders();
root.printTree();
} public static void main(String[] args) throws Exception{
String sql=EasySqlUtil.removeExtraSpace(EasySqlUtil.readSqlFromFile("c:\\temp\\18.sql"));
System.out.println(sql);
Lexer l=new Lexer(sql);
List<Token> tokens=l.getTokenList();
l.printTokenList(); Builder builder=new Builder(tokens);
builder.printRoot();
}
}

--2020年5月15日--

最新文章

  1. Linux0.11内核--系统调用机制分析
  2. iOS Bundle display name国际化
  3. [修复] Firemonkey 使用 DrawPath 断线问题(Android &amp; iOS 平台)
  4. 深入理解Java虚拟机之读书笔记一 自动内存管理机制
  5. PHP Execute Command Bypass Disable_functions
  6. CentOS7 安装Docker报错
  7. UVa 12096 The SetStack Computer【STL】
  8. AVQueuePlayer,备用
  9. Step-by-Step Guide to Portal Development for Microsoft Dynamics CRM - 摘自网络
  10. WPF 皮肤之MathApps.Metro UI库
  11. codeforces 809E Surprise me!
  12. SFP光模块与SFP+、XFP、QSFP、GBIC、BIDI的区别
  13. GOOGLE RANKBRAIN 完整指南
  14. document.createDocumentFragment()运行效率
  15. 12.18 Daily Scrum
  16. 配置ssm 时, web.xml 文件无 # 自动代码提示
  17. JustOj 1910: 人见人爱A+B
  18. JFACE-SWT开发记录
  19. Microsoft 设计原则
  20. VueJS 数据驱动和依赖追踪分析

热门文章

  1. 每日一道 LeetCode (8):删除排序数组中的重复项和移除元素
  2. 方法解析之Method与ConstMethod介绍
  3. C#LeetCode刷题-蓄水池抽样
  4. day12 异常 模块 单例
  5. 封装react antd的upload上传组件
  6. kafka-clients 1.0 内部请求接口文档
  7. Azure Command Line (一)入门
  8. nautilus pg autoscaler PG自动伸缩
  9. 算法-heapq模块优先队列
  10. NeuroAttack: Undermining Spiking Neural Networks Security through Externally Triggered Bit-Flips