MOQL--操作数(Operand) (四)

来源:互联网 发布:云客服绩效计算软件 编辑:程序博客网 时间:2024/06/05 00:16
表达式Operand

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

数组表达式Operand

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

      数组表达式Operand中的数组对象不仅仅包括Java语言中所有调用isArray()方法返回true的数组对象,还包括所有实现了java.lang.Iterable接口和java.util.Map接口的对象,以及java.sql.ResultSet对象和org.moql.RecordSet对象。ResultSetRecordSet分别是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();

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

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

try {

   //访问链表中第3Map对象的以‘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));

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

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

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

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

   /*访问第5Map元素中以’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无法通过MoqlUtilscreateOperand方法直接创建。它的格式为一个只返回一个字段的MOQL查询语句,如:select field1 from table where field2 < 10,该语句只返回一个字段field1。另外,该Operand会出现在MOQL语法的输出列位置,或是where条件的”in”操作符后。如:selectselect field1 from table where field2 < 10 as field1, field2 from table2select 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