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="&gt;" 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

你可能感兴趣的:(java,sql,memory,LINQ,based)