Atitit.linq java的原理与实现 解释器模式
Atitit.linq java的原理与实现 解释器模式
1. Linq from where 的实现
Map row= from(ColumnsDefs).where(eq("COLUMN_NAME", key)).exe().get(0);
2. Where expr 的实现
大概有15个expr。。。 关系(大小比较),逻辑expr。。。In like 等。。
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
3. Attilax的一点变化
没使用终结符号的概念..两个数据类型..express类型,common data..
要是express类型..就是可以计算的express... 贝儿走普通的数据..
Note::checkSuitOk should use interpreter
4. 解释器模式的结构
· 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释器NonterminalExpression完成。
· 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
· 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
仅有两类元素:运算元素和运算符号,运算元素就是指a、b、c等符号,需要具体赋值的对象,也叫做终结符号,为什么叫终结符号呢?因为这些元素除了需要赋值外,不需要做任何处理,所有运算元素都对应一个具体的业务参数,这是语法中最小的单元逻辑,不可再拆分;运算符号就是加减符号,需要我们编写算法进行处理,每个运算符号都要对应处理单元,否则公式无法运行,运算符号也叫做非终结符号
们就可以先画一个简单的类图,如图27-1所示。

5. Code
5.1. EqExpression
package com.attilax.linq;
import java.util.Map;
public class EqExpression extends AExpression {
public EqExpression(String leftCol, Object ritVal) {
this.left=leftCol;
this.rit=ritVal;
}
public boolean interpreter(Map row) {
//LikeExpression le=(LikeExpression) whereExpressAst;
if(row.get(this.left.toString()).toString().equals(this.rit.toString()))
return true;
else
return false;
}
5.2. LikeExpression
package com.attilax.linq;
import java.util.Map;
public class LikeExpression extends AExpression{
public LikeExpression(String col, String val) {
this.left=col;
this.rit=val;
}
public boolean checkSuitOk(Map row) {
//LikeExpression le=(LikeExpression) whereExpressAst;
if(row.get(this.left.toString()).toString().contains(this.rit.toString()))
return true;
else
return false;
}
}
5.3. AndExpression
package com.attilax.linq;
import java.util.Map;
public class AndExpression extends AExpression {
public AndExpression(AExpression whereExpressAst, AExpression eq) {
this.left=whereExpressAst;
this.rit=eq;
}
public boolean checkSuitOk(Map row) {
//LikeExpression le=(LikeExpression) whereExpressAst;
AExpression lft_exp=(AExpression) this.left;
AExpression rit_exp=(AExpression) this.rit;
return lft_exp.checkSuitOk(row) && rit_exp.checkSuitOk(row);
}
}
5.4. AExpression
package com.attilax.linq;
import java.util.Map;
public class AExpression {
public Object left;
public Object rit;
public boolean checkSuitOk(Map row) {
throw new RuntimeException("no imp in base aexp class");
}
}
6. 参考
Atitit.linq api 兼容性草案 v2.docx
23种设计模式(14):解释器模式 - 卡奴达摩的专栏 - 博客频道 - CSDN.NET.htm
解释器模式 详解 - 疯狂程序员 - 博客频道 - CSDN.NET.htm
Atitit.linq java的原理与实现 解释器模式的更多相关文章
- Java设计模式(17)解释器模式(Interpreter模式)
Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...
- Java描述设计模式(14):解释器模式
本文源码:GitHub·点这里 || GitEE·点这里 一.解释器模式 1.基础概念 解释器模式是对象的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Java设计模式(4)原型模式(Prototype模式)
Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- Java设计模式(21)访问模式(Visitor者模式)
Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
随机推荐
- 最小生成树(Kruskal)(并查集)
最小生成树 时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 2[提交][状态][讨论版] 题目描述 某个宇宙帝国有N个星球,由于宇宙的空间是三维的,因此每个星球的位置可以用三维 ...
- 服务认证暴力破解工具Crowbar
服务认证暴力破解工具Crowbar Crowbar是Kali Linux新增的一款服务认证暴力破解工具.该工具支持OpenVPN.RDP.SSH和VNC服务.该工具具备常见的暴力破解功能,如主机字 ...
- cogs 2554. [福利]可持久化线段树
题目链接 cogs 2554. [福利]可持久化线段树 题解 没有 代码 #include<cstdio> #include<cstring> #include<algo ...
- [BZOJ5465][APIO2018]选圆圈(KD-Tree)
题意:给你n个圆,每次选择半径最大的,将它和与它相交的圆全部删去,输出每个圆是在哪次被删的. KD树模板题.用一个矩形框住这个圆,就可以直接剪枝了.为了防止被卡可以将点旋转一个角度,为了保险还可以多转 ...
- 5.8 Properties
一.Propertie 主要用于读写资源配置文件. Properties继承自Hashtable. 我们来看下HashMap和Hashtable的区别: Hashtabl 线程安全, 同步, ...
- Spring的Aop 注解配置
1,导包 2,准备目标对象 package com.songyan.anno; public interface UserService { void save(); void delete(); v ...
- 阿里云乌班图16配置-PHP环境(包括mysql及apache安装)
1. 安装apache apt-get update apt-get install apache2 service apache2 restart 通过浏览器访问服务器的IP,如果出现Apac ...
- Nginx用为缓存服务器
Nginx 缓存组成 共享内存 数据定位 存储键和缓存对象的元数据 磁盘空间: 存储数据 nginx做为反向代理时,能够将来自upstream的响应缓存至本地,并在后续的客户端请求同样内容时直接从 ...
- mongodb_profier
http://docs.mongodb.org/manual/reference/database-profiler/ 一.获取.设置profile(profile用collection存储数据) d ...
- android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面
关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等.第一:大多数实现库都难以进行动画和样式的自己定义. 第二:不能非常好的兼容多种滚 ...