MOQL--操作数(Operand) (三)
函数Operand
函数Operand的格式如下:函数名(参数1,参数2…)。函数名与Java语法中标示符的命名规范一致,该命名规范已在变量Operand中进行了描述。其每一个参数都是一个Operand,Operand可以是常量、变量、函数或者表达式中的任意一种。如:sum(a)、_formatTime(‘yyyy-mm-dd’,getCurrentTime())、random(23+15)等。
函数Operand的示例代码如下:
EntityMap entityMap = new EntityMapImpl(); entityMap.putEntity("num", 123); try { Operand function = MoqlUtils.createOperand("max(num)"); System.out.println(function.toString() + " " + function.getOperandType()); System.out.println(function.operate(entityMap)); entityMap.putEntity("num", 345); System.out.println(function.operate(entityMap)); //重置函数状态 function.reset(); entityMap.putEntity("num", 12); System.out.println(function.operate(entityMap)); function = MoqlUtils.createOperand("test(1, num, 'a')"); System.out.println(function.toString() + " " + function.getOperandType()); } catch (MoqlException e) { e.printStackTrace(); } |
其执行结果输出如下:
max(num) FUNCTION 123 345 12 test(1,num,'a') FUNCTION |
MOQL目前已支持了部分的函数Operand,如聚集函数Operand:count、sum、avg、min、以及max等。这些Operand在生成后调用operate方法就可以直接对数据进行计算。但如果要创建一个MOQL未支持的函数,MOQL会为其创建一个缺省的Operand,该Operand只是对函数字符串进行了解析,如上面的代码片段中的函数“test(1, num, 'a')”。该函数字符串被解析为一个缺省的函数Operand,但是当我们调用它的operate方法时,它会抛出一个java.lang.UnsupportedOperationException,表示该Operand不支持该方法。为了能够让MOQL也支持test函数,我们需要为test做一个对应的Operand的实现。相关的实现代码如下:
publicclass TestRegistFunction { publicstaticclass Test extends AbstractFunction { public Test(List<Operand> parameters) { /* “test”是该对象对应的函数Operand的名字,3是test函数可以接受的参数数量。若parameters的size与该值不一样时,会抛出IllegalArgumentException,表示输入的函数字符串不合法*/ super("test",3,parameters); functionType = FunctionType.COMMON; } @Override protected Object innerOperate(EntityMap entityMap) { Object obj1 = parameters.get(0).operate(entityMap); Object obj2 = parameters.get(1).operate(entityMap); Object obj3 = parameters.get(2).operate(entityMap); StringBuffer sbuf = new StringBuffer(); sbuf.append(obj1.toString()); sbuf.append("||"); sbuf.append(obj2.toString()); sbuf.append("||"); sbuf.append(obj3.toString()); return sbuf.toString(); } } publicstaticvoid main(String[] args) { EntityMap entityMap = new EntityMapImpl(); entityMap.putEntity("num", 123); try { Operand function = MoqlUtils.createOperand("test(1, num, 'a')"); System.out.println(function.toString() + " " + function.getOperandType()); System.out.println(function.operate(entityMap)); } catch(Exception e) { e.printStackTrace(); } try { //注册test函数的实现 MoqlUtils.registFunction("test", Test.class.getName()); Operand function = MoqlUtils.createOperand("test(1, num, 'a')"); System.out.println(function.toString() + " " + function.getOperandType()); System.out.println(function.operate(entityMap)); } catch (MoqlException e) { e.printStackTrace(); } } } |
其执行结果输出如下:
test(1,num,'a') FUNCTION java.lang.UnsupportedOperationException at org.moql.operand.function.MemberFunction.innerOperate(MemberFunction.java:49) at org.moql.operand.function.AbstractFunction.operate(AbstractFunction.java:120) at org.moql.core.test.TestRegistFunction.main(TestRegistFunction.java:44) test(1,num,'a') FUNCTION 1||123||a |
Test类继承了AbstractFunction抽象类,它是test函数的Operand实现。test函数可以接收3个参数,当参数的个数与3不一致时,其构造函数将抛出异常,表示test函数的调用格式不正确,如:test(1,num)将会抛出异常。当我们定义一个函数其参数为变长时,我们可以将3替换为-1,表示变长。或者我们用org.moql.operand.function.Function中的VARIANT_PARAMETERS常量来表示,该值为-1。Test类的主体逻辑在innerOperate中实现,Test类覆写了该方法,将三个参数简单的连接成一个字符串并返回。
从上例代码的执行情况我们看到,在第一次创建test函数的Operand后,调用operate方法抛出了异常;于是在第二次创建test函数的Operand前,我们调用了MOQL的函数注册方法,为test函数注册了Operand的实现类Test。而后我们创建了test函数的Operand并调用了它的operate方法。此次调用获得了预期的输出效果。其根本原因是,第一次创建的函数Operand,因未找到注册的Operand实现,生成了一个缺省的函数Operand,该Operand不支持operate方法;而第二次我们创建函数Operand时,发现了注册的实现类Test,于是绑定了该实现,生成了test函数对应的Operand。
项目地址:http://sourceforge.net/projects/moql/
代码路径:svn://svn.code.sf.net/p/moql/code/trunk
MOQL--操作数(Operand) (三)相关推荐
- MOQL—筛选器(Selector)(一)
Selector是MOQL提供的最核心的功能,它相当于SQL(结构化查询语言)中DQL(数据查询语言)的功能,即我们通常所说的Select关键字所描述的查询功能.它能够对Java内存中的对象数据进行查 ...
- 实体类的动态生成(三)
前言 在 .NET 中主要有两种动态生成并编译的方式,一种是通过 System.Linq.Expressions 命名空间中的 LambdaExpression 类的 CompileToMethod( ...
- [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...
- 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...
- 汇编语言(三)——X86处理器架构
为了深入学习计算机,我们需要了解与 x86 汇编语言相关的底层硬件知识.以及从程序员角度看到的主机系统.其中包括了所有的 Intel IA-32 和 Intel 64 处理器和高级微设备 (AMD) ...
- pushpop指令的操作数必须是字操作数_PLC的指令,电气人必须了解的基础内容
指令语句表编程语言是所有PLC都具有的最基本的编程语言.而指令语句表程序是由一条一条的指令堆砌而成的.因此,我们有必要对指令进行进一步的说明和解读. 1.指令格式 PLC的指令语句表程序和微机汇编语言 ...
- zemax评价函数编辑器_zemax常用评价函数操作数..doc
zemax常用评价函数操作数. Operand Definitions ZEMAX supports optimization operands which are used to define th ...
- 写给父亲的语音计算器(加减乘除的处理C#,三)
曾给孩子写了一个计算器把我累坏了,四个操作数,三个操作符,只有加减乘除四则运算,我的个神,三个操作符一共4*4*4=64种组合,这样写计算器,没完没了,今天写给父亲的语音计算器终于突破了.上代码: p ...
- Java官方教程(三-2)赋值 运算和一元运算符(2020.12.19)
前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子:翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着 ...
- 计算机系统读书笔记三
程序的机器级表示: 计算机执行机器代码,用字节序列编码低级的操作,包括处理数据.管理内存.读写存储设备上的数据.利用网络通信. 编译器将源代码转译成机器代码需要基于:编程语言的规则.目标机器的指令集. ...
最新文章
- 成本、质量、人力资源要点
- python解决鸡兔同笼问题
- oracle数据磊导入数据,可传输表空间记载
- linux下JNI的demo
- SAP Cloud for Customer销售订单Account字段的实现逻辑
- getParameterValues用法
- android 音频加载hal so调试
- APP下载页面(支持微信扫一扫)
- MITRE 发布工控系统的 ATTCK 框架
- hive 如何将数组转成字符串_Hive 字符串操作[转]
- [摘抄]3D电视原理
- linux 文件系统的简单操作
- SQLServer数据库基础教程
- 【干货】|800份实战经验PPT免费下载
- 命令改计算机用户名和密码,利用NET命令添加、修改用户账户信息
- 【HTML5】Web前端——制作 3D 旋转魔方相册
- win10系统迁移后系统重装_win7/win10系统迁移到新SSD硬盘的方法
- android 解压相关问题,解压文件失败的情况
- ubuntu中文论坛
- RK3399 hi3559A 平台离线语音识别、合成、翻译、声纹
热门文章
- RobotStudio关于Ctrl+鼠标左键拖动速度慢的解决方法
- 自动基线校正 python_安全运维中基线检查的自动化之ansible工具巧用
- python怎么索引txt数据中第四行_python-在熊猫数据框中按行计数编制索引
- 简述中断处理的6个步骤_基于SCDM软件的CFD前处理工作5个步骤
- c语言字符输出128,如何将128位整数转换为C中的十进制ASCII字符串?
- 最大堆和最小堆和平衡二叉树_最小堆二叉树
- r语言中的while循环_R编程中的While循环
- jqueryui时间插件_jQueryUI AutoComplete插件
- xcode 快捷_您必须知道的Xcode快捷方式
- Android P通知