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
最新文章
- C++的内存泄漏检测【转载】
- Okhttp3的简单使用
- ROS学习笔记(三)——ROS安装
- Windows环境下MongoDB的安装与配置
- YII2 实现后台操作记录日志(转)
- Android ImageView src与backgroud
- php中关于抽象(abstract)类和抽象方法的问题解析
- SLF4J user manual
- 一个项目经理对主流项目管理工具的对比:禅道VS华为软件开发云
- js获取设备
- android binder机制详解
- 海思uboot启动流程详细分析(三)【转】
- 如何关闭git pull产生的merge 信息
- Longest Palindrome 最长回文串问题
- strong vs copy
- 技术宅学习Linux系统还是很有前途的
- Jmeter 同一个测试计划下的多个线程组 执行顺序 希望调整为顺序执行
- 1416: Kick Ass Biu [几何]
- Elixir's keyword lists as option parameters
- Android-显示意图和隐式意图
热门文章
- 索引(Index)
- [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)
- [OpenJudge90][序列DP+乱搞]滑雪
- Oracle RAC 环境下的 v$log v$logfile
- 关于css解决俩边等高的问题(等高布局)
- Linux下打包命令tar
- Shiro 设置session超时时间
- 腾讯云linux服务器分区方案
- http://blog.csdn.net/pet8766/article/details/8186955
- LeetCode(28)Implement strStr()