SQL Builder 1.04
解析效果:
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日--
SQL Builder 1.04的更多相关文章
- xorm的sql builder
最近在使用xorm,并使用了sql builder来构建sql查询没想到升级后原来可以使用的代码居然报错了. 0x00 代码 sql, args, _ := builder.Select(" ...
- SQL Server 基础 04 函数与分组查询数据
函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值). ...
- using the library to generate a dynamic SELECT or DELETE statement mysqlbaits xml配置文件 与 sql构造器 对比
https://github.com/mybatis/mybatis-dynamic-sql MyBatis Dynamic SQL What Is This? This library is ...
- 10046事件跟踪会话sql
背景知识: 10046 事件按照收集信息内容,可以分成4个级别: Level 1: 等同于SQL_TRACE 的功能 Level 4: 在Level 1的基础上增加收集绑定变量的信息 Level 8: ...
- MyBatis(3.2.3) - Dynamic SQL
Sometimes, static SQL queries may not be sufficient for application requirements. We may have to bui ...
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...
- Go sql语句引号问题
使用Go进行Mysql开发时,会遇到引号问题(实际上,与语言无关,只要使用sql就会遇到这些类似问题). 本文举例说明如何解决这些问题. Example1 第一例子演示格式字符是否要加引号. 代码如下 ...
- PetaPoco源代码学习--3.Sql类
PetaPoco对数据库的操作直接使用SQL语句,在代码中进行调用既可以直接传递SQL语句,也可以使用提供的SQL类来获取到SQL语句进行操作,直接传递SQL语句在内部实现中也是封装成Sql类传递到底 ...
随机推荐
- 朴素贝叶斯分类器基本代码 && n折交叉优化
自己也是刚刚入门.. 没脸把自己的代码放上去,先用别人的. 加上自己的解析,挺全面的,希望有用. import re import pandas as pd import numpy as np fr ...
- css 命名规则 BEM!
随着CSS的发展,使用CSS有语义化的命名约定和CSS层的分离,将有助于它的可扩展性,性能的提高和代码的组织管理.著作权归作者所有. BEM本质应该是一个css命名方案,最流行的命名规则之一就是BEM ...
- 栈及其简单应用(二)(python代码)
一.括号判定 前一篇文章我们介绍了栈的简单应用中,关于括号的判定,但那只是一种括号的判定,下面我们来介绍多种括号混合使用时,如何判断括号左右一一对应. 比如“{}{(}(][”这种情况,需要对一种括号 ...
- HTTP PUT/POST/PATCH的区别
幂等 idempotent 幂等操作的特定就是其任意多次执行所产生的影响与一次执行的影响相同 POST POST 用来创建一个新的数据 POST 不是幂等的, 意味着多次操作的结果是不同的, 多次操作 ...
- CPF 入门教程 - 样式和动画(三)
CPF NetCore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) 用样式可以对内部元素进行批量设置属性. ...
- Linux学习笔记 一 第一章 Linux 系统简介
Linux简介 一.UNIX与Linux发展史
- WKWebView 网络请求Header 丢失
WKWebView 是苹果手机上主要的H5加载控件,它相比UIWebView 有诸多优势.在次不做比较,但是它的坑缺比较多.网上也有很多的例子但是做的比较好的真不多,我在这里推荐俩博客供大家参考.ht ...
- 使用folderLeft函数统计字母出现的次数
实例:统计字符串中字母出现的次数 import scala.collection.mutable object Demo_018{ def main(args: Array[String]): Uni ...
- 如何获取东方财富文华新浪财经实时行情数据API接口
BIGI行情期货外汇股指A股期权实时行情数据文华新浪财经API接口新浪财经并非实时行情数据源,所以获取的行情数据源也并非实时的.以下介绍的方法和新浪财经获取行情数据源的方法是一致的.需要实时行情数据源 ...
- Dubbo源码学习之-通过源码看看dubbo对netty的使用
前言 前段时间,从头开始将netty源码了解了个大概,但都是原理上理解.刚好博主对dubbo框架了解过一些,这次就以dubbo框架为例,详细看看dubbo这种出色的开源框架是如何使用netty的,又是 ...