MOQL—转换器(Translator)
来源:互联网 发布:黄黄的软件 编辑:程序博客网 时间:2024/05/22 02:10
MOQL是一个面向内存对象设计的查询统计分析工具,其语法兼容SQL标准。其语法结构除支持如下:
select count(a.id) cnt, sum(a.num) sum, a.num%500 mod from BeanA a group by 3 having mod > 10 order by 1
的标准SQL书写格式外,还拥有xml结构的书写格式,如下:
<selector id="40daef74-ba85-465b-b051-9f41ad00a526">
<cache size="100"/>
<columns>
<column name="cnt" value="count(a.id)"/>
<column name="sum" value="sum(a.num)"/>
<column name="mod" value="a.num%500"/>
</columns>
<tables>
<table name="a" value="BeanA"/>
</tables>
<groupby>
<group column="3"/>
</groupby>
<having>
<binary loperand="mod" operator=">" roperand="10"/>
</having>
<orderby>
<order column="1" mode="ASC"/>
</orderby>
</selector>
以上两种语法格式可以互换。当MOQL使用xml格式时,可以根据需要将xml格式的语法格式转换为不同的SQL方言。除MOQL语法外,还支持Oracle、SQL Server、DB2、MySQL、PostgreSQL等方言。
MOQL的xml语法格式可以看作是sql语句的语法树结构形式,他结构清晰,比较利于通过程序进行编写和修改。尤其方便前后台的交互。当一个应用系统需要提供比较完善且开放的查询功能时,可以通过编辑xml格式的查询语句,然后将其传送给后台;由后台根据数据库的类型转换为对应的sql方言,然后对数据库进行查询并最终返回结果集。这种模式可以在前端为用户提供灵活开放的查询功能,在后端屏蔽数据库的差异,方便迁移。
以下是一段演示代码,演示了从标准sql格式到xml格式的转换,以及xml格式到各方言的sql格式转换。
String sql ="select count(a.id) cnt, sum(a.num) sum, a.num%500 modfrom BeanA a group by 3 having mod > 10 orderby 1 limit 10,3";
try {
String xml = MoqlUtils.translateMoql2Xml(sql);
System.out.println(xml);
sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.MOQL);
System.out.println(sql);
sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.ORACLE);
System.out.println(sql);
sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.SQLSERVER);
System.out.println(sql);
sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.MYSQL);
System.out.println(sql);
sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.POSTGRESQL);
System.out.println(sql);
sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.DB2);
System.out.println(sql);
} catch (MoqlException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
输出如下:
<?xml version="1.0"encoding="UTF-8"?>
<selectorsxmlns="http://www.moql.org/schema/moql"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.moql.org/schema/moqlselector-base.xsd">
<selector id="b6463fb5-298e-461f-8f60-e9da8f5da80f">
<cache size="100"/>
…
<limit offset="10"value="3"/>
</selector>
</selectors>
select cache(100,fifo) count(a.id),sum(a.num), a.num % 500 from BeanA a group by 3 having mod > 10 order by 1asc limit 10,3
select count(a.id), sum(a.num), a.num % 500from BeanA a where rownum <= 3 group by 3 having mod > 10 order by 1 asc
select top 3 count(a.id), sum(a.num), a.num %500 from BeanA a group by 3 having mod > 10 order by 1 asc
select count(a.id), sum(a.num), a.num % 500from BeanA a group by 3 having mod > 10 order by 1 asc limit 10,3
select count(a.id), sum(a.num), a.num % 500from BeanA a group by 3 having mod > 10 order by 1 asc limit 10,3
select count(a.id), sum(a.num), a.num % 500from BeanA a group by 3 having mod > 10 order by 1 asc fetch first 3 rowsonly
从上面演示代码输出的xml格式我们可以发现其格式比较复杂,可以包含不止一个selector标签(注:每个selector标签代表了一个sql语句)。这与MOQL最初的设计初衷有关,不影响使用,可以不必关心。另外,需要注意的就是,当sql语句中存在聚集运算时,如:union、intersect等时,其xml结构的标签就不是selector了,而是setlector了,setlector下会包含两个selector标签,表示两个集合进行聚集运算。关于MOQL的xml语法结构的标签说明,如果有朋友感兴趣,留言或邮件我,我将再详细写篇文章进行介绍。
MOQL的相关路径如下:
项目地址:http://sourceforge.net/projects/moql/
代码路径:svn://svn.code.sf.net/p/moql/code/trunk
- MOQL—转换器(Translator)
- MOQL—ElasticSearch转换器(Translator)
- MOQL—过滤器(Filter)
- MOQL—筛选器(Selector)(一)
- MOQL—筛选器(Selector)(二)
- MOQL—筛选器(Selector)(三)
- MOQL简介
- poj 2121——Inglish-Number Translator
- POJ2121——Inglish-Number Translator
- Message Translator
- Message Translator
- 转换器
- 转换器
- MOQL-复杂事件处理(CEP)
- 二——十进制转换器
- Struts1——自定义转换器
- WPF学习——转换器
- qemu a fast and portable dynamic translator——大致翻译
- 代理模式示例
- flash string类型转换成gb2312或者gbk类型 as3.0
- Palindromes _easy version 2029 hdu
- CTime和DWORD类型的相互转换
- 单表查询某列最大最小值的性能问题
- MOQL—转换器(Translator)
- http://api.kting.cn/book/seach/?keyword=%@&type=%@
- 暑假实习--SVN
- 讲解Struts构架中action的跳转大全
- ios 第1,2,3天
- hdu 4018 Parsing URL
- 二叉树遍历
- 后台修改u8用户密码
- hdu 4608 暴力大数