表达式Operand

表达式Operand是MOQL语法中格式最丰富且复杂的一类、。它包括数组表达式、数学运算表达式以及成员表达式三种类型。另外,在MOQL源代码中我们还可以看到,表达式Operand至少还包括关系运算表达式以及逻辑运算表达式。但这两种表达式无法通过MoqlUtils.createOperand()直接创建,它们必须应用在过滤器(Filter)中。我们将在过滤器(Filter)中介绍以上两种表达式的应用。

数组表达式Operand

数组表达式Operand除了能对传统意义上的数组进行描述定义外,还可以对如:Map、List等集合进行定义描述。其基本的格式为:“数组对象[索引]”。数组对象可以是一个变量、数组表达式或成员表达式Operand;索引可以是一个常量、变量、函数或表达式Operand。

数组表达式Operand中的数组对象不仅仅包括Java语言中所有调用isArray()方法返回true的数组对象,还包括所有实现了java.lang.Iterable接口和java.util.Map接口的对象,以及java.sql.ResultSet对象和org.moql.RecordSet对象。ResultSet与RecordSet分别是JDBC查询和MOQL查询的结果对象。数组对象中除了实现了java.util.Map接口的对象外,其他所有对象都是以数值索引方式进行访问的,且都是以‘0’作为数组中第一个数据的索引。若索引不是以数值形式传入,而是以字符串形式传入的,系统会尝试将该字符串转换为一个数值索引后,再进行数组访问,如array[1]、array[‘1’]等。而实现了java.util.Map接口的对象,其索引可以为任意对象,该对象即这个Map对象的Key,如:map[‘key’]。若数组表达式的索引值没有填写,如:array[],则除Map对象外表示要访问数组中的全部数据,而Map对象表示要访问其全部值数据,不包括Key数据。

数组表达式Operand的相关示例代码如下:

EntityMap entityMap =new EntityMapImpl();

//生成一个由5个Map对象构建的链表对象

entityMap.putEntity("bean", BeanFactory.createMapList(5));

try {

//访问链表中第3个Map对象的以‘value’做索引的数据的值

Operand member = MoqlUtils.createOperand("bean[2]['value']");

System.out.println(member.toString() +" " + member.getOperandType());

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

//访问链表中的所有Map对象

member = MoqlUtils.createOperand("bean[]");

System.out.println(member.toString() +" " + member.getOperandType());

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

/*访问第5个Map元素中以’bean’为索引的Bean对象的num属性,该例子结合了成员表达式Operand的格式*/

member = MoqlUtils.createOperand("bean[4]['bean'].num");

System.out.println(member.toString() +" " + member.getOperandType());

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

/*访问第5个Map元素中以’bean’为索引的Bean对象的getArray()方法返回数组的第6个元素*/

member = MoqlUtils.createOperand("bean[4]['bean'].getArray()[5]");

System.out.println(member.toString() +" " + member.getOperandType());

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

}catch (MoqlException e) {

e.printStackTrace();

}

其执行结果如下:

bean[2]['value'] EXPRESSION

0

bean[] EXPRESSION

[{bean=org.moql.core.simulation.BeanA@1309e87, name=0, value=0}, {bean=org.moql.core.simulation.BeanA@f7c31d, name=1, value=0}, {bean=org.moql.core.simulation.BeanA@2acc65, name=2, value=0}, {bean=org.moql.core.simulation.BeanA@1d10a5c, name=3, value=0}, {bean=org.moql.core.simulation.BeanA@ff2413, name=4, value=0}, {bean=org.moql.core.simulation.BeanA@9980d5, name=5, value=0}, {bean=org.moql.core.simulation.BeanA@1d95492, name=6, value=0}, {bean=org.moql.core.simulation.BeanA@13f7281, name=7, value=0}, {bean=org.moql.core.simulation.BeanA@76ab2f, name=8, value=0}, {bean=org.moql.core.simulation.BeanA@e0cc23, name=9, value=0},

……

{bean=org.moql.core.simulation.BeanA@2f48d2, name=8, value=0}, {bean=org.moql.core.simulation.BeanA@55d93d, name=9, value=0},

……

{bean=org.moql.core.simulation.BeanA@147c1db, name=18, value=0}, {bean=org.moql.core.simulation.BeanA@82d37, name=19, value=0}]

bean[4]['bean'].num EXPRESSION

10

bean[4]['bean'].getArray()[5] EXPRESSION

5

数学运算表达式Operand

数学运算表达式Operand的格式如下:“Operand1运算符 Operand2”。数学运算表达式支持的数学运算符都是二元运算符,他们按执行的优先顺序划分为:乘法(*)、除法(/)、模(%)优于加法(+)、减法(-)优于按位与(&)优于异或(^)优于按位或(|)运算。运算符两端的两个操作数可以是除列筛选Operand以外的任意类型的Operand。若其中一个Operand是另一个数学运算表达式Operand,则整个表达式就是一个包含连续多个运算符操作的表达式,如:a + 1 * 10 / 5 等。

数学运算表达式Operand的相关示例代码如下:

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.toString() +" " + arithmetic.getOperandType());

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

}catch (MoqlException e) {

e.printStackTrace();

}

其执行结果如下:

(num * num1) / num2 * 2.2 + 2 - 1 EXPRESSION

20.8

成员表达式Operand

成员表达式Operand用于访问对象的成员属性或者成员函数。其格式如下:“对象.成员”。“.”是成员运算符,其左侧的对象可以是变量、函数、数组表达式或成员表达式Operand;其右侧的成员可以是变量或函数Operand。当成员是变量Operand时,“对象”必须拥有能够获得该变量的对应的Getter函数。当变量是布尔型时,函数名为变量加上”is”前缀;当变量是非布尔型时,函数名为变量加上”get”前缀。当成员是函数Operand时,“对象”必须拥有对应的函数,且函数的参数类型需要与函数Operand中描述的参数类型一致。

成员表达式Operand的相关示例代码如下:

EntityMap entityMap =new EntityMapImpl();

entityMap.putEntity("bean",new BeanA("bean", 5));

try {

Operand member = MoqlUtils.createOperand("bean.name");

System.out.println(member.toString() +" " + member.getOperandType());

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

member = MoqlUtils.createOperand("bean.getNum()");

System.out.println(member.toString() +" " + member.getOperandType());

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

}catch (MoqlException e) {

e.printStackTrace();

}

其执行结果如下:

bean.name EXPRESSION

Abean

bean.getNum() EXPRESSION

5

列筛选Operand

列筛选Operand是一类特殊的Operand,该类Operand无法通过MoqlUtils的createOperand方法直接创建。它的格式为一个只返回一个字段的MOQL查询语句,如:select field1 from table where field2 < 10,该语句只返回一个字段field1。另外,该Operand会出现在MOQL语法的输出列位置,或是where条件的”in”操作符后。如:selectselect field1 from table where field2 < 10 as field1, field2 from table2、select field2, field1 from table2 where field2 in (select field1 from table)等。

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

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

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

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

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

  2. C++基础知识(四)—— 操作符/运算符

    前面已经学习了变量和常量,我们可以开始对它们进行操作,这就要用到C++的操作符.有些语言,很多操作符都是一些关键字, 比如add, equals等等.C++的操作符主要是由符号组成的.这些符号不在字母 ...

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

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

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

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

  5. 2020收官--Filter4Go

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

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

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

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

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

  8. CPU处理器架构和工作原理浅析

    汇编语言是学习计算机如何工作的很好的工具,它需要我们具备计算机硬件的工作知识. 基本微机设计 下图给出了假想机的基本设计.中央处理单元(CPU)是进行算术和逻辑操作的部件,包含了有限数量的存储位置-- ...

  9. 计算机基础原理知识,计算机基础知识之计算机的工作原理

    1.3 计算机的工作原理 到目前为止,微机的工作原理均采用冯.若依曼的存储程序方式,即把程序存储在微机内,由微机自动存取指令并执行它.微机的工作过程就是执行程序的过程,而程序由指令序列组成,因此,执行 ...

  10. WPF框架教程 | 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(https://blog.csdn.net/lzuacm/ar ...

最新文章

  1. aws lambda使用_如何使用AWS Lambda和S3构建无服务器URL缩短器
  2. python文本操作
  3. rpm命令选项中文说明
  4. NUXT: 视图和模板
  5. linux目录 文件 pdf,linux文件与目录管理.pdf
  6. NSString 字符串 操作 常用
  7. Android之网络编程之网络通信几种方式实例分享
  8. 从零开始学keras之多分类问题
  9. C++序列化模拟三 -----酒后日志
  10. 高仿计算器 双页面浏览器 谷歌内核网页版宝贝类目查询
  11. 【python】模拟斗牛纸牌游戏「牛牛」
  12. 和生活一起理解51单片机① 如何入门学习单片机
  13. 免费视频存储平台(微云、百度网盘、谷歌硬盘、酷播云)的截图对比
  14. 十分感谢--致谢好友的
  15. 展望未来「编程之路起始篇」
  16. 安装算量软件消火栓系统_识别其他设备
  17. 思维导图超级学习力提升宝典
  18. html内联样式(表),外部样式表
  19. 什么是Google AdWords关键字广告?
  20. Ue4制作鼠标拖尾效果

热门文章

  1. javascript 经常会用到的东西
  2. 895计算机专业基础,2017北京工业大学895计算机学科专业基础考研入学考试大纲...
  3. 为什么其他计算机连接需要密码是什么东西,连接其他电脑需要密码怎么处理
  4. 斑马打印机怎么打印二维码_简单介绍斑马打印机---GX430t
  5. linux execl 错误信息,Excel:自动隐藏错误结果的显示信息(转)
  6. java 深拷贝 序列化_java 之 利用序列化实现深拷贝
  7. matlab现值与终值函数_个人家庭投资理财基础(二 单利、复利、终值、现值、内部收益率)...
  8. ssh密钥登录 改密码登录_如何使用密钥对通过SSH登录而不使用密码
  9. java treeset_Java TreeSet
  10. 索引多维数组_PHP数组–索引,关联和多维