MOQL--操作数(Operand) (四)
来源:互联网 发布:云客服绩效计算软件 编辑:程序博客网 时间:2024/06/05 00:16
表达式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) (四)
- MOQL--操作数(Operand) (一)
- MOQL--操作数(Operand) (二)
- MOQL--操作数(Operand) (三)
- ARM 汇编中灵活的第二操作数(Flexible second operand)
- JVM学习笔记-操作数栈(Operand Stack)
- JVM学习笔记-操作数栈(Operand Stack)
- Unsupported operand types 不支持的操作数据类型
- MOQL简介
- MOQL—过滤器(Filter)
- MOQL—转换器(Translator)
- hive 操作(四)
- shell 操作(四)
- 汇编语言基础四 —— 操作数的寻址方式
- JOJ1037:Operand
- MOQL—ElasticSearch转换器(Translator)
- MOQL-复杂事件处理(CEP)
- left operand must be l-value(左边的操作符必须是可赋值的变量)
- 通过SQL绘制杨辉三角
- Winform版计算器
- 基于JCFXBL与GSM短信猫的短信中心建设方案
- Android ZXing 二维码、条形码扫描介绍
- java经典面试题(2)
- MOQL--操作数(Operand) (四)
- hdu3473——MinimumSum(划分树)
- 我的职业观
- 清除注册表中的vmware信息
- ON_MESSAGE和ON_REGISTERED_MESSAGE
- python for 循环
- 杭电2009
- 命运
- Java Thread-safe