MOQL—转换器(Translator)
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
新项目地址:https://github.com/colorknight/moql
MOQL—转换器(Translator)相关推荐
- 2020收官--Filter4Go
终于在2021年到来之前完成了Filter4Go. Filter4Go是一款基于GO语言开发的,兼容SQL语言Where子句语法的数据过滤的工具(https://github.com/colorkni ...
- java开源网络服务器端组件_OpenNMS - 网络服务器端组件 - 组件类库 - JAVA开源项目 - 开源吧...
相关开源项目 Jsmtpd:Jsmtpd是一个简洁的Email服务器,完全用Java开发.它基本的功能是可以利用SMTP协议来发送Email.Jsmtpd的其它功能是以插件模块的形式来实现,支持TLS ...
- rtp 多媒体流同步控制 实时传输协议 简介
RTP(Real-time Transport Protocol)是由IETF开发的实时传输协议,可以在面向连接或无连接的下层协议上工作,通常和UDP协议一起使用.RTP的工作机理与RSVP不同,主要 ...
- ug中文字大小设置_UG与AutoCAD的数据转换,原来还有这么简单的方法
一起探讨,一起学习,一起进步.大家的每一次点赞,每一次评论,每一次转发.都是我创作的动力,期待你的加入 一.转换的过程 在UG中进行数据转换的时候主要将UG ->Drafting中工程图的信息转 ...
- systemtap工具使用介绍
简介 systemtap 是利用Kprobe 提供的API来实现动态地监控和跟踪运行中的Linux内核的工具,相比Kprobe,systemtap更加简单,提供给用户简单的命令行接口,以及编写内核指令 ...
- 网络流媒体协议之——RTP协议概述
网络流媒体协议系列: 网络流媒体协议之--MPEG-DASH协议简述 网络流媒体协议之--HLS概述 网络流媒体协议之--UDP协议概述 今天来整理一下RTP. RTP(Real-time Trans ...
- LMAX Disruptor用户手册-4.0.0.RC2-最好的入门文章
LMAX Disruptor 用户手册 原文链接 LMAX Disruptor是一个高性能线程通信库.它起源于LMAX对高并发,高性能,无锁算法的研究,如今已成长为Exchange基础架构的核心部分. ...
- 嵌入式 RTP协议详解以及其他相关协议
RTP协议 1 RTP报文格式 2 基于RTP的带宽控制方法 1.接收端的控制策略 2.发送端的控制策略 RTP(Real-timeTransportProtocol)是由IETF开发的实时传输 ...
- RTP协议详解(荷载H264)
目录 RTP的会话过程 RTP实际应用中的细节 用户网络带宽不同 用户是否被防火墙隔离 RTP结构解析 解析举例 RTP荷载H264码流 单个NAL单元包 分片单元(FU-A) 解析举例 RTP的会话 ...
最新文章
- CentOS中Mysql常用操作
- JAVA之门面模式概述
- python判断集合为空
- kamctl start
- php仿tp5实现模型,php手记之05-tp5模型操作数据库
- linux系统主机信任,Linux信任主机(SSH)
- matlab parfor不能用,matlab中parfor函数
- Fastreport.Net用户手册:报表对象
- 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
- html显示pcd,PCD5043 Datasheet(数据表) 10 Page - NXP Semiconductors
- MyBatis学习总结(25)——Mybatis Generator generatorConfig.xml配置文件详细说明
- linux查询rpm包详细信息
- 一款熊猫游戏java_狂热的熊猫_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
- 阿里云办公安全产品专家高传贵:零信任,让全球办公安全更简单
- 【EXLIBRIS】随笔记 002
- FRM 5.3业绩衡量比率
- vue脚手架结构目录文件
- excel怎么不显示图表上显示为0%的项?
- MySQL的基本用法
- 【flutter 起步走】Flutter 布局解决消消乐,谁说只会写写布局不能做游戏?
热门文章
- 自动驾驶算法-滤波器系列(四)——不同运动模型在KF/EKF中的应用
- (二十六)深度学习目标检测:Fast-RCNN
- 主机连接wifi,如何设置虚拟机上网方式
- python安装jupyterlab_JupyterLab的安装及使用
- kafka为什么用java重写,kafka怎么发布订阅 怎么在java中实现
- 威联通_万兆加持!威联通QNAP TS-932X,首次入手威联通NAS简单体验
- html中rem和em,CSS 中的 rem 和 em 的区别(1)
- 网页运行python脚本_python脚本和网页有何区别
- 什么作用计算机辅助工艺,什么是CAPP技术(计算机辅助工艺过程设计)
- Java Scheduler ScheduledExecutorService ScheduledThreadPoolExecutor示例