Operand是MOQL语法结构的重要组成部分,语法结构中那些需要被分析处理的数据列或数据值都被称之为Operand。如select后跟的数据列,where条件中描述的条件字段以及需要匹配的常数值等都被称之为Operand。如下面语句中的红色字体部分,均表示是一个Operand。通过对其计算,我们可以获得数据结果,并形成最终我们求解的数据结果集。

select count(a.id) cnt,sum(a.num) sum, a.num%500 mod from BeanA a group by3 having mod >10 order by 1

在MOQL中,Operand不仅能在完整的语法结构中使用,还可以单独使用。MOQL提供了方法可以直接创建一个操作数,并利用此操作数完成数据的求解。如下:

EntityMap entityMap = new EntityMapImpl();

entityMap.putEntity("num", 12);

entityMap.putEntity("num1", 3);

entityMap.putEntity("num2", 4);

try {

Operand arithmetic = MoqlUtils.createOperand("(num * num1) / num2 * 2.2 + 2 - 1");

System.out.println(arithmetic.operate(entityMap));

} catch (MoqlException e) {

e.printStackTrace();

}

该例中为表达式"(num * num1) / num2 * 2.2 + 2 -1"创建了一个操作数,该操作数利用传入的实体Map对表达式进行了求解,并输出了执行结果,结果为20.8。MoqlUtils的createOperand方法可以创建一个操作数,传给该方法的参数为一个操作数表达式字符串,返回的对象为一个Operand接口,该接口位于org.moql的包路径下,定义如下:

publicinterface Operand {

/*获得操作数的类型*/

OperandType getOperandType();

/*返回操作数的名字*/

String getName();

/*返回操作数在文本串中的位置,返回对象类型为org.antlr.runtime.Token */

Object getSource();

/*根据给定的实体Map传入的值,计算操作数的值*/

Object operate(EntityMap entityMap);

/*根据给定的实体Map传入的值,计算操作数的布尔值。*/

boolean booleanOperate(EntityMap  entityMap);

/*操作数的返回值是否为一固定常量。*/

boolean isConstantReturn();

/*重置操作数,将操作数状态置为初始状态。*/

void reset();

}

getOperandType()方法用于返回Operand的类型OperandType。OperandType为枚举类型,也位于org.moql的包路径下,定义格式如下:

publicenum OperandType {

UNKNOWN,

CONSTANT,

VARIABLE,

FUNCTION,

EXPRESSION,

COLUMNSELECTOR

}

其包括的Operand类型有常量(CONSTANT)、变量(VARIABLE)、函数(FUNCTION)、表达式(EXPRESSION)及列筛选器(COLUMNSELECTOR)五类(注:Operand的类型将在后面详细介绍),当Operand不属于以上任何一类时用UNKNOWN未知表示。

getName()方法用于获得Operand的名字。除了函数类型的Operand的名字为函数名外,其它类型的Operand的名字就是生成Operand的字符串本身。如:“sum(a.num)”整体被解析为一个函数Operand,其名字为“sum”,其内嵌了一个由“a.num”解析而成的表达式Operand作为参数,该Operand名字为“a.num”;再如:“123”被解析为常量Operand,其名字为“123”等。

getSource()方法用于返回操作数在文本串中的位置。如:“sum(a.num)”会被解析为多个操作数,对每个操作数调用该方法就可以定位操作数在文本串中的位置了。

operate(EntityMapentityMap)方法是Operand提供的主要方法,利用该方法操作数可以对给定的参数进行求值。EntityMap是一个装有实体对象的Map,其实体名若与变量Operand的名字一致,那么实体对象便会被变量Operand绑定用来求解。

booleanOperate(EntityMapentityMap)方法是operate(EntityMap entityMap)方法的扩展。用于将Operand的计算结果以布尔值的形式返回。若operate方法返回值的类型是java.lang.Boolean,则该方法返回调用Boolean.booleanValue()所得的值;若operate方法返回值的类型不是java.lang.Boolean,返回值为null时,返回false,否则返回true;

isConstantReturn()方法用于告诉调用者在调用Operand的operate方法后是否总能返回一个不变得常量值。若该Operand是一个常量类型的Operand,则该调用总是返回true,表示调用常量类型Operand的operate方法总是返回同一个常量值。而对于该方法更有意义的用途是在函数类型Operand以及表达式类型Operand中的调用。这两种类型的Operand在初始化时会判断所有其相关的Operand的该方法调用,返回是否都是true。若都是true,则表示该操作数的执行结果与operate调用时传入的EntityMap参数无关,那么就可以预先对该操作数进行求解,而不用等到每次调用operate方法时现去求解了。这样可以在一定程度上提升Operand的执行效率。若对该方法的调用感兴趣,可以查看源代码中

org.moql.operand.function.AbstractFunction类以及org.moql.operand.expression.arithmetic.AbstractArithmeticExpression类的相关初始化实现。

reset()方法用于重置Operand,将Operand的状态恢复为初始状态。Operand在计算时分为有状态和无状态两种情况。有状态是指当对Operand的operate方法进行多次调用时,其计算结果受以前调用结果的影响;而无状态是指多次调用不会受以前调用结果的影响。对于有状态的Operand需要通过调用reset方法将其状态恢复为初始状态。如:“sum(a.num)”对应的Operand,会累计每次调用operate方法的结果,对每次调用的值求和。若需要重新开始计数,需要调用reset方法将该Operand恢复为初始值。类似的Operand还有count、avg、max、min等聚合函数。

项目地址:http://sourceforge.net/projects/moql/

代码路径:svn://svn.code.sf.net/p/moql/code/trunk

新项目地址:https://github.com/colorknight/moql

MOQL--操作数(Operand) (一)相关推荐

  1. MOQL—筛选器(Selector)(一)

    Selector是MOQL提供的最核心的功能,它相当于SQL(结构化查询语言)中DQL(数据查询语言)的功能,即我们通常所说的Select关键字所描述的查询功能.它能够对Java内存中的对象数据进行查 ...

  2. zemax评价函数编辑器_zemax常用评价函数操作数..doc

    zemax常用评价函数操作数. Operand Definitions ZEMAX supports optimization operands which are used to define th ...

  3. 一条计算机指令规定其操作数,在计算机指令中,规定其所执行操作功能的部分称为 A地址码 B 操作码 C操作数 D源操作数...

    在计算机指令中,规定其所执行操作功能的部分称为 B 操作码 . 操作码指计算机程序中所规定的要执行操作的那一部分指令或字段(通常用代码表示),其实就是指令序列号,用来告诉CPU需要执行哪一条指令. 操 ...

  4. 2020收官--Filter4Go

    终于在2021年到来之前完成了Filter4Go. Filter4Go是一款基于GO语言开发的,兼容SQL语言Where子句语法的数据过滤的工具(https://github.com/colorkni ...

  5. The key of C# 学习笔记I-II

    作者 :Kemin's booootLog  http://blog.csdn.net/keminlau/ Sunday, October 3, 2004 微软提出的CLS(Common Langua ...

  6. C++中Reference与指针(Pointer)的使用对比

    了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer. 在C++ 中,reference在很多方面与指针(pointer ...

  7. [译]深入理解JVM

    深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...

  8. awk - 模式扫描与处理语言

    awk - 模式扫描与处理语言 (第二版) Alfred V. Aho Brian W. Kernighan Peter J. Weinberger Bell Laboratories Murray ...

  9. php $表达式,Notepad++

    例如,a=1,b=2,c=3,d=4,给出 a+b/(d-c),应计算出结果为3,若为 a*b/(c-1) 则应计算出结果为1 这种情况下,第一反应可能是用数字值将字符串里的变量替换,然后通过eval ...

  10. java虚拟机所支持的指令_JVM虚拟机指令

    1概述 a虚拟机的指令由一个字节长度(意味着操作码总数不能超过256条).代表某种操作含义的数字(操作码,Opcode)以及跟随其后的0至多个代表此操作所需参数的操作数(operand)构成 b因为J ...

最新文章

  1. Android的Application的生命周期方法
  2. 用Canvas画圆环百分比进度条
  3. php函数方法,基于PHP函数的操作方法
  4. Python文件类型
  5. 电商运营、美工必备导航类网站,有效提高工作效率
  6. win10 python免安装_使用Python编写免安装运行时、以Windows后台服务形式运行的WEB服务器...
  7. 数据库授予用户增删改查的权限的语句_mysql数据库终端上的增删改查及权限等相关操作...
  8. oracle11g win10版本,win10系统安装的oracle11g和cloud6.2 创建数据中心报错
  9. poj 1734 Sightseeing trip(floyd 拓展 求最小环)
  10. VS2022编译项目出现““csc.exe”已退出,代码为 -1073741819”的错误解决办法
  11. 完成端口(IOCP)详解[1/2](转载)
  12. linux 常用命令详解(文件处理命令,权限管理命令,文件搜索命令,帮助命令,用户管理命令,压缩解压命令,关机重启命令)
  13. 永宏plc和台达vfd-m变頻器modbs rtu通讯程序史上最好用的plc和变頻器rtu通讯程序
  14. bind 完成正确安装
  15. 【BSC】使用Python玩转PancakeSwap(入门篇)
  16. Sql like模糊查询 区分大小写
  17. HEIC格式怎么转换?掌握这个方法,轻松实现!
  18. Codeforces Edu Hacking
  19. python绘制单列多色柱状图
  20. 从新一代华为全屋智能解决方案看智能家居的本质

热门文章

  1. [biztalk笔记]-1.Hello World!
  2. ROS kinetic + Ubuntu16.04编译LSD-SLAM
  3. 部分代码_C primer plus 第三章 (代码部分)
  4. php 读取多个文件,使用PHPExcel读取多个文件
  5. java有没有友元函数_c++中友元函数理解与使用
  6. ssh密钥登录 改密码登录_如何使用密钥对通过SSH登录而不使用密码
  7. 使用Enide Studio 2014 IDE进行Express JS路由
  8. eval函数python_Python eval()函数
  9. 转:正则表达式简介及在C++11中的简单使用
  10. 开课吧课堂:人工智能对金融行业的影响