表达式的修改及结果。
一、 删除表达式的子节点
删除表达式后,可能会对这个表达式所在的整个表达式产生影响,例如:
d.cntrb_date1 >= '$From_Date$'
以上比较表达式,删除 d.cntrb_date1 或 ‘$From_Date$’ 中的任意一个, 整个表达式也被删除。
根据表达式和其所在表达式的情况不同,处理的方式也不同,以下为主要情况
- 数学表达式: +,-,*,/ 和其他含有两个 operand 的数学表达式,删除其中一个 operand 后, 还会留下另外一个。
- 逻辑表达式: and, or, 删除其中一个 operand 后, 还会留下另外一个。
- 比较表达式: <, > 等, 删除其中一个 operand 后, 整个表达式也被删除。
- in, between, () 表达式, 删除其中一个 operand 后, 整个表达式也被删除。
- 其它表达式, 删除其中一个 operand 后, 整个表达式也被删除。
删除一个表达式后,如果导致父表达式也被删除,会递归处理更高级别的表达式,直到最高层的表达式。
1. API
TExpression.removeMe()
2. 相关属性的变化
如果一个节点被删除, 那么该节点的属性:
- getNodeStatus() 为 ENodeStatus.nsRemoved
- getStartToken(), getEndToken() 返回 null
- toString(), 返回 null
- expression.getExpressionType() == EExpressionType.removed_t
判断一个节点是否被删除, 用 getNodeStatus() == ENodeStatus.nsRemoved
如果一个表达式的 left operann and right operand 都被删除, 那么该表达式的状态也处于被删除。 以上属性同样满足。
3. 利用 TParseTreeNodeList.removeItem(int index) 来移除 expression list 中的 expresssion
(1,2,3,4)
调用
expressionList.removeItem(0);
结果为:
(2,3,4)
二、更改表达式
d.cntrb_date1 >= '$From_Date$'
After set ‘$From_Date$’ to 1 , the expression will be
d.cntrb_date1 >= 1
通过以下代码实现上面的更改功能:
expression.getRightOperand().setString("1");
assertTrue(expression.toString().equalsIgnoreCase("d.cntrb_date1 >= 1"));
三、增加表达式
增加表达式一般通过修改原有表达式来实现,例如:
d.cntrb_date1 >= '$From_Date$'
想变为:
d.cntrb_date1 >= '$From_Date$' + 1
通过以下代码实现上面的更改功能:
expression.getRightOperand().setString(expression.getRightOperand().toString()+" + 1");
assertTrue(expression.toString().equalsIgnoreCase("d.cntrb_date1 >= '$From_Date$' + 1"));
参考代码
- public void testRemove1()
- public void testRemoveExprList()