diff --git a/src/main/java/com/googlecode/aviator/AviatorEvaluator.java b/src/main/java/com/googlecode/aviator/AviatorEvaluator.java index e0cd1138..882fc6e0 100644 --- a/src/main/java/com/googlecode/aviator/AviatorEvaluator.java +++ b/src/main/java/com/googlecode/aviator/AviatorEvaluator.java @@ -93,12 +93,12 @@ public final class AviatorEvaluator { private static AviatorClassLoader aviatorClassLoader; /** - * Optimized for compile speed,this is the default option + * Optimized for compile speed */ public static final int COMPILE = 0; /** - * Optimized for execute speed + * Optimized for execute speed,this is the default option */ public static final int EVAL = 1; @@ -234,9 +234,10 @@ public AviatorClassLoader run() { /** - * set optimize level,default AviatorEvaluator.COMPILE + * set optimize level,default AviatorEvaluator.EVAL * - * @see COMPILE,EVAL + * @see #COMPILE + * @see #EVAL * * @param value */ diff --git a/src/main/java/com/googlecode/aviator/BaseExpression.java b/src/main/java/com/googlecode/aviator/BaseExpression.java index e8921e5d..6d78f03f 100644 --- a/src/main/java/com/googlecode/aviator/BaseExpression.java +++ b/src/main/java/com/googlecode/aviator/BaseExpression.java @@ -1,5 +1,7 @@ package com.googlecode.aviator; +import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -17,7 +19,15 @@ public abstract class BaseExpression implements Expression { public BaseExpression(List varNames) { super(); - this.varNames = varNames; + LinkedHashSet tmp = new LinkedHashSet(varNames.size()); + // process nested names + for (String name : varNames) { + if (name.contains(".")) { + name = name.substring(0, name.indexOf(".")); + } + tmp.add(name); + } + this.varNames = new ArrayList(tmp); } diff --git a/src/main/java/com/googlecode/aviator/code/OptimizeCodeGenerator.java b/src/main/java/com/googlecode/aviator/code/OptimizeCodeGenerator.java index 7bd85f56..7bbf61a7 100644 --- a/src/main/java/com/googlecode/aviator/code/OptimizeCodeGenerator.java +++ b/src/main/java/com/googlecode/aviator/code/OptimizeCodeGenerator.java @@ -331,6 +331,18 @@ public Expression getResult() { } } } + else if (delegateToken.getDelegateTokenType() == DelegateTokenType.Array) { + Token realToken = delegateToken.getToken(); + if (realToken.getType() == TokenType.Variable) { + varName = token.getLexeme(); + if (!variables.containsKey(varName)) { + variables.put(varName, 1); + } + else { + variables.put(varName, variables.get(varName) + 1); + } + } + } break; } } diff --git a/src/test/java/com/googlecode/aviator/AviatorEvaluatorUnitTest.java b/src/test/java/com/googlecode/aviator/AviatorEvaluatorUnitTest.java index a6109fca..a180eeec 100644 --- a/src/test/java/com/googlecode/aviator/AviatorEvaluatorUnitTest.java +++ b/src/test/java/com/googlecode/aviator/AviatorEvaluatorUnitTest.java @@ -47,20 +47,34 @@ public void testExec() { String exp1 = "b-c+a"; String exp2 = "2*3.14*(R-r)+b/c"; String exp3 = "f>d?k:a"; + String exp4 = "map.a > map.b ? list[0][1]: y"; assertEquals(8, AviatorEvaluator.exec(exp1, 6, 2, 4)); assertEquals(104, AviatorEvaluator.exec(exp1, 99, 3, 8)); assertEquals(1.14d, AviatorEvaluator.exec(exp1, 3.14, 3, 1)); assertEquals(6.28, AviatorEvaluator.exec(exp2, 4, 3, 0, 100)); assertEquals(13.304d, AviatorEvaluator.exec(exp2, 5, 3.2, 4, 2.0)); assertEquals(3.14d, AviatorEvaluator.exec(exp3, 2, 1, 3.14, 9)); - assertEquals(9, AviatorEvaluator.exec(exp3,1,2,3.14,9)); + assertEquals(9, AviatorEvaluator.exec(exp3, 1, 2, 3.14, 9)); + + Map map = new HashMap(); + map.put("a", 100); + map.put("b", 99); + int[][] list = new int[1][2]; + list[0]=new int[2]; + list[0][1] = 2000; + int y = 999; + assertEquals(2000L, AviatorEvaluator.exec(exp4, map, list, y)); + map.put("a", 99); + assertEquals(999L, AviatorEvaluator.exec(exp4, map, list, y)); } - @Test(expected=IllegalArgumentException.class) + + @Test(expected = IllegalArgumentException.class) public void testExecIllegalArguments() { - AviatorEvaluator.exec("a-b+c",1,2); + AviatorEvaluator.exec("a-b+c", 1, 2); } + @Test public void testCompileCache() { Expression exp1 = AviatorEvaluator.compile("1+3", true); diff --git a/src/test/java/com/googlecode/aviator/test/function/FunctionTest.java b/src/test/java/com/googlecode/aviator/test/function/FunctionTest.java index e84e4351..07a98935 100644 --- a/src/test/java/com/googlecode/aviator/test/function/FunctionTest.java +++ b/src/test/java/com/googlecode/aviator/test/function/FunctionTest.java @@ -447,6 +447,20 @@ public void testGetVariableNames() { assertEquals("e", vars.get(3)); assertEquals("c", vars.get(4)); + // Test map or list as variable + expression = AviatorEvaluator.compile("map.a>10 && list[0][1]<3 && bean.c == bean.x || bean.d == y", true); + assertNotNull(expression); + vars = expression.getVariableNames(); + assertEquals(4, vars.size()); + assertTrue(vars.contains("map")); + assertTrue(vars.contains("list")); + assertTrue(vars.contains("bean")); + assertTrue(vars.contains("y")); + assertEquals("map", vars.get(0)); + assertEquals("list", vars.get(1)); + assertEquals("bean", vars.get(2)); + assertEquals("y", vars.get(3)); + }