提交 ccacff1d 编写于 作者: Q qiao tian

support compare "null < 2 " as false

use QLExpressRunStrategy.setCompareNullLessMoreAsFalse(true);
上级 0e4f9852
......@@ -15,12 +15,26 @@ public class QLExpressRunStrategy {
/**
* 预防空指针
*/
private static boolean avoidNullPointer = false;
/**
* 当空对象进行大小比较时,返回false, 例如 1 > null 和 null > 1都返回false
*/
private static boolean compareNullLessMoreAsFalse = false;
public static boolean isCompareNullLessMoreAsFalse() {
return compareNullLessMoreAsFalse;
}
public static void setCompareNullLessMoreAsFalse(boolean compareNullLessMoreAsFalse) {
QLExpressRunStrategy.compareNullLessMoreAsFalse = compareNullLessMoreAsFalse;
}
public static boolean isAvoidNullPointer() {
return avoidNullPointer;
}
public static void setAvoidNullPointer(boolean avoidNullPointer) {
QLExpressRunStrategy.avoidNullPointer = avoidNullPointer;
}
......
......@@ -3,6 +3,8 @@ package com.ql.util.express.instruction.op;
import com.ql.util.express.Operator;
import com.ql.util.express.exception.QLException;
import static com.ql.util.express.config.QLExpressRunStrategy.*;
/**
* 处理比较操作符号
*/
......@@ -38,6 +40,9 @@ public class OperatorEqualsLessMore extends Operator {
}
//进行其他大小比较操作
if (obj1 == null || obj2 == null){
if (isCompareNullLessMoreAsFalse()) {
return false;
}
throw new QLException("空操作数无法进行数字比较操作:left = " + obj1+",right = "+ obj2);
}
int i = Operator.compareData(obj1, obj2);
......
......@@ -3,6 +3,7 @@ package com.ql.util.express.instruction.op;
import com.ql.util.express.ArraySwap;
import com.ql.util.express.InstructionSetContext;
import com.ql.util.express.OperateData;
import com.ql.util.express.config.QLExpressRunStrategy;
import com.ql.util.express.instruction.OperateDataCacheManager;
import com.ql.util.express.instruction.opdata.OperateDataField;
......@@ -17,7 +18,11 @@ public class OperatorField extends OperatorBase {
}
public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception {
Object obj = list.get(0).getObject(parent);
OperateData operateData = list.get(0);
if (operateData == null && QLExpressRunStrategy.isAvoidNullPointer()) {
return null;
}
Object obj = operateData.getObject(parent);
return OperateDataCacheManager.fetchOperateDataField(obj,this.filedName);
}
public String toString(){
......
package com.ql.util.express.bugfix;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.ql.util.express.config.QLExpressRunStrategy;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class NullCompareTest {
@Before
public void before()
{
QLExpressRunStrategy.setCompareNullLessMoreAsFalse(true);
}
@After
public void after()
{
QLExpressRunStrategy.setCompareNullLessMoreAsFalse(false);
}
@Test
public void testNullCompar() throws Exception{
ExpressRunner runner = new ExpressRunner();
String[] explist = new String[]{
"x < 1",
"y > 1",
"x != 2",
};
for(String exp:explist) {
IExpressContext<String, Object> context = new DefaultContext<String, Object>();
System.out.println(exp);
((DefaultContext<String, Object>) context).put("x",2);
Object result = runner.execute(exp, context, null, true, false);
Assert.assertTrue((Boolean)result==false);
System.out.println(result);
}
explist = new String[]{
"x > 1",
"y == null",
"x == 2",
};
for(String exp:explist) {
IExpressContext<String, Object> context = new DefaultContext<String, Object>();
System.out.println(exp);
((DefaultContext<String, Object>) context).put("x",2);
Object result = runner.execute(exp, context, null, true, false);
Assert.assertTrue((Boolean)result==true);
System.out.println(result);
}
}
}
......@@ -9,34 +9,12 @@ import java.lang.reflect.Method;
public class RecursivelyRunnerTest {
static final String TEST_EXPRESS = "eval('10+10')+eval('20')+eval('30-10')";
static final ExpressRunner globalRunner = new ExpressRunner();
static{
globalRunner.addFunction("eval",new GlobalEvalOperator());
}
@Test
public void testErrorRecursivelyInvoke() throws Exception{
try {
Object r = globalRunner.execute(TEST_EXPRESS, null, null, true, false);
System.out.println(r);
}catch (Exception e){
// e.printStackTrace();
System.out.println("符合预期,嵌套调用同一个ExpressRunner不支持!");
}
}
@Test
public void testEvalOperator() throws Exception{
ExpressRunner runner = new ExpressRunner();
runner.addFunction("eval",new EvalOperator());
Object r = runner.execute(TEST_EXPRESS, null, null, true, false);
String express = "eval('10')+eval('20')+eval('30')";
Object r = runner.execute(express, null, null, true, false);
System.out.println(r);
}
......@@ -53,22 +31,12 @@ public class RecursivelyRunnerTest {
runner.addFunctionOfServiceMethod(name, subRunner, name, m.getParameterTypes(), null);
}
Object r = runner.execute(TEST_EXPRESS, null, null, true, false);
String express = "eval('10')+eval('20')+eval('30')";
Object r = runner.execute(express, null, null, true, false);
System.out.println(r);
}
public static class GlobalEvalOperator extends Operator{
@Override
public Object executeInner(Object[] list) throws Exception {
Object result = globalRunner.execute((String) list[0], new DefaultContext(), null, true, false);
return result;
}
}
public static class EvalOperator extends Operator{
private ExpressRunner subRun = new ExpressRunner();
......
......@@ -14,7 +14,7 @@ public class TimeOutExceptionTest {
private static String[] expressList = new String[]{
"sum=0;for(i=0;i<1000000000;i++){sum=sum+i;}return sum;",
"for(i=1;i<10;i++){System.out.println('loop time:'+i);Thread.sleep(3000);}"
"for(i=1;i<10;i++){System.out.println('loop time:'+i);Thread.sleep(300);}"
};
@Test
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册