Author: pkluegl Date: Tue Aug 4 11:47:41 2015 New Revision: 1694033 URL: http://svn.apache.org/r1694033 Log: UIMA-4547 - PARSE with optional locale - introduced POW function
Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g (original) +++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaLexer.g Tue Aug 4 11:47:41 2015 @@ -367,6 +367,7 @@ LOGN : 'LOGN'; SIN : 'SIN'; COS : 'COS'; TAN : 'TAN'; +POW : 'POW'; XOR : 'XOR'; TRUE : 'true'; FALSE : 'false'; Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original) +++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Tue Aug 4 11:47:41 2015 @@ -1434,8 +1434,10 @@ conditionFeature returns [AbstractRutaCo conditionParse returns [AbstractRutaCondition cond = null] : - PARSE LPAREN {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier RPAREN - {cond = ConditionFactory.createConditionParse(id, $blockDeclaration::env);} + PARSE LPAREN {isVariable($blockDeclaration::env,input.LT(1).getText())}? id = Identifier + (COMMA locale = stringExpression)? + RPAREN + {cond = ConditionFactory.createConditionParse(id, locale, $blockDeclaration::env);} ; conditionIs returns [AbstractRutaCondition cond = null] @@ -2215,8 +2217,10 @@ List<IStringExpression> args = new Array // not checked numberFunction returns [INumberExpression expr = null] : - (op=(EXP | LOGN | SIN | COS | TAN) numExprP=numberExpressionInPar) + (op=(EXP | LOGN | SIN | COS | TAN ) numExprP=numberExpressionInPar) {expr = ExpressionFactory.createComposedNumberExpression(numExprP,op);} + | op = POW LPAREN n1 = numberExpression COMMA n2 = numberExpression RPAREN + {expr = ExpressionFactory.createComposedNumberExpression(n1,op, n2);} //| {root = ExpressionFactory.createNumberFunction(numExprP,op)} | (e = externalNumberFunction)=> e = externalNumberFunction {expr = e;} ; Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java Tue Aug 4 11:47:41 2015 @@ -168,9 +168,9 @@ public class ConditionFactory { return null; } - public static AbstractRutaCondition createConditionParse(Token id, RutaBlock env) { + public static AbstractRutaCondition createConditionParse(Token id, IStringExpression localeExpr, RutaBlock env) { String var = id == null ? "" : id.getText(); - return new ParseCondition(var); + return new ParseCondition(var, localeExpr); } public static AbstractRutaCondition createConditionVariable(Token id) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java Tue Aug 4 11:47:41 2015 @@ -19,10 +19,14 @@ package org.apache.uima.ruta.condition; +import java.text.NumberFormat; +import java.util.Locale; + import org.apache.uima.cas.Type; import org.apache.uima.cas.text.AnnotationFS; import org.apache.uima.ruta.RutaEnvironment; import org.apache.uima.ruta.RutaStream; +import org.apache.uima.ruta.expression.string.IStringExpression; import org.apache.uima.ruta.rule.EvaluatedCondition; import org.apache.uima.ruta.rule.RuleElement; import org.apache.uima.ruta.visitor.InferenceCrowd; @@ -31,10 +35,18 @@ public class ParseCondition extends Abst private final String var; + private IStringExpression localeExpr; + public ParseCondition(String var) { super(); this.var = var; } + + public ParseCondition(String var, IStringExpression localeExpr) { + super(); + this.var = var; + this.localeExpr = localeExpr; + } @Override public EvaluatedCondition eval(AnnotationFS annotation, RuleElement element, RutaStream stream, @@ -42,16 +54,27 @@ public class ParseCondition extends Abst String text = annotation.getCoveredText(); RutaEnvironment env = element.getParent().getEnvironment(); Class<?> type = env.getVariableType(var); + NumberFormat nf = null; + String locale = annotation.getCAS().getDocumentLanguage(); + if(localeExpr != null) { + locale = localeExpr.getStringValue(element.getParent(), annotation, stream); + } + if(locale == null) { + locale = "x-unspecified"; + } + nf = NumberFormat.getInstance(Locale.forLanguageTag(locale)); try { if (Integer.class.equals(type)) { - text = normalizeNumber(text); - int value = Integer.valueOf(text); - env.setVariableValue(var, value); + Number parse = nf.parse(text); + env.setVariableValue(var, parse.intValue()); return new EvaluatedCondition(this, true); } else if (Double.class.equals(type)) { - text = normalizeNumber(text); - double value = Double.valueOf(text); - env.setVariableValue(var, value); + Number parse = nf.parse(text); + env.setVariableValue(var, parse.doubleValue()); + return new EvaluatedCondition(this, true); + } else if (Float.class.equals(type)) { + Number parse = nf.parse(text); + env.setVariableValue(var, parse.floatValue()); return new EvaluatedCondition(this, true); } else if (String.class.equals(type)) { env.setVariableValue(var, text); @@ -71,16 +94,16 @@ public class ParseCondition extends Abst } } - private String normalizeNumber(String text) { - String[] split = text.split("[,]"); - if (split.length == 2) { - return text.replaceAll(",", "."); - } - return text; - } - public String getVar() { return var; } + public IStringExpression getLocaleExpr() { + return localeExpr; + } + + public void setLocaleExpr(IStringExpression localeExpr) { + this.localeExpr = localeExpr; + } + } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java Tue Aug 4 11:47:41 2015 @@ -124,6 +124,16 @@ public class ExpressionFactory { exprList.add(expression); return new ComposedNumberExpression(exprList, ops); } + + public static INumberExpression createComposedNumberExpression(INumberExpression expression1, + Token opToken, INumberExpression expression2) { + List<String> ops = new ArrayList<String>(); + List<INumberExpression> exprList = new ArrayList<INumberExpression>(); + ops.add(opToken.getText()); + exprList.add(expression1); + exprList.add(expression2); + return new ComposedNumberExpression(exprList, ops); + } public static AbstractStringExpression createSimpleStringExpression(Token token) { String text = token.getText(); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java Tue Aug 4 11:47:41 2015 @@ -37,6 +37,23 @@ public class RutaExpression extends Ruta if (annotation == null) { return Collections.emptyList(); } + + // "autocast" to document annotation when mentioning document. + // This is either the actual document annotation or the current one in a block or inlined rule + AnnotationFS documentAnnotation = stream.getCas().getDocumentAnnotation(); + Type docType = documentAnnotation.getType(); + if(docType.equals(type)) { + List<AnnotationFS> result = new ArrayList<AnnotationFS>(1); + AnnotationFS windowAnnotation = stream.getFilter().getWindowAnnotation(); + if(windowAnnotation == null) { + result.add(documentAnnotation); + return result; + } else { + result.add(windowAnnotation); + return result; + } + } + if (annotation.getType().equals(type) || stream.getCas().getTypeSystem().subsumes(type, annotation.getType())) { List<AnnotationFS> result = new ArrayList<AnnotationFS>(1); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/AbstractNumberExpression.java Tue Aug 4 11:47:41 2015 @@ -76,7 +76,7 @@ public abstract class AbstractNumberExpr return t1 % t2; } else if ("EXP".equals(op)) { return Math.exp(t1); - } else if ("LOG".equals(op)) { + } else if ("LOGN".equals(op)) { return Math.log(t1); } else if ("SIN".equals(op)) { return Math.sin(t1); @@ -84,6 +84,8 @@ public abstract class AbstractNumberExpr return Math.cos(t1); } else if ("TAN".equals(op)) { return Math.tan(t1); + } else if ("POW".equals(op)) { + return Math.pow(t1, t2); } return 0; } @@ -109,6 +111,8 @@ public abstract class AbstractNumberExpr return (float) Math.cos(t1); } else if ("TAN".equals(op)) { return (float) Math.tan(t1); + } else if ("POW".equals(op)) { + return (float) Math.pow(t1, t2); } return 0; } @@ -134,6 +138,8 @@ public abstract class AbstractNumberExpr return (int) Math.cos(t1); } else if ("TAN".equals(op)) { return (int) Math.tan(t1); + } else if ("POW".equals(op)) { + return (int) Math.pow(t1, t2); } return 0; } Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java (original) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/ParseTest.java Tue Aug 4 11:47:41 2015 @@ -31,7 +31,7 @@ public class ParseTest { CAS cas = RutaTestUtils.processTestScript(this.getClass()); RutaTestUtils.assertAnnotationsEquals(cas, 1, 5, "42", "2", "1", "2", "3"); - RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "2,1"); + RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "2,1", "2.3"); RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "true"); RutaTestUtils.assertAnnotationsEquals(cas, 4, 5, "A Boolean b that is true", "b = false", "The Number 42", "The Double d = 2,1", "Another Double that is 2.3"); Modified: uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta (original) +++ uima/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/condition/ParseTest.ruta Tue Aug 4 11:47:41 2015 @@ -8,6 +8,7 @@ STRING s1; DECLARE T1, T2, T3, T4; NUM{PARSE(i1) -> MARK(T1)}; -(NUM PM NUM){PARSE(d1), IF((d1==2.1)) -> MARK(T2)}; +(NUM PM NUM){PARSE(d1, "de"), IF((d1==2.1)) -> MARK(T2)}; +(NUM PM NUM){PARSE(d1, "en"), IF((d1==2.3)) -> MARK(T2)}; W{PARSE(b1), IF(b1) -> MARK(T3)}; ANY+{PARSE(s1), -PARTOF(T4), -PARTOF(SEMICOLON) -> MARK(T4)}; \ No newline at end of file Modified: uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml (original) +++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.conditions.xml Tue Aug 4 11:47:41 2015 @@ -615,7 +615,7 @@ <emphasis role="bold">Definition:</emphasis> </title> <para> - <programlisting><![CDATA[PARSE(variable)]]></programlisting> + <programlisting><![CDATA[PARSE(variable(, stringExpression)?)]]></programlisting> </para> </section> <section> @@ -623,10 +623,10 @@ <emphasis role="bold">Example:</emphasis> </title> <para> - <programlisting><![CDATA[NUM{PARSE(var)};]]></programlisting> + <programlisting><![CDATA[NUM{PARSE(var,"de")};]]></programlisting> </para> <para> - If the variable 'var' is of an appropriate numeric type, the + If the variable 'var' is of an appropriate numeric type for the locale "de", the value of NUM is parsed and subsequently stored in 'var'. </para> </section> Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaLexer.g Tue Aug 4 11:47:41 2015 @@ -366,6 +366,7 @@ LOGN : 'LOGN'; SIN : 'SIN'; COS : 'COS'; TAN : 'TAN'; +POW : 'POW'; XOR : 'XOR'; TRUE : 'true'; FALSE : 'false'; Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Tue Aug 4 11:47:41 2015 @@ -1329,8 +1329,8 @@ conditionFeature returns [RutaCondition conditionParse returns [RutaCondition cond = null] : name = PARSE LPAREN - var=genericVariableReference - {cond = ConditionFactory.createCondition(name, var);} + var=genericVariableReference (COMMA locale = stringExpression)? + {cond = ConditionFactory.createCondition(name, var, locale);} RPAREN ; @@ -2349,6 +2349,8 @@ numberFunction returns [Expression expr : (op=(EXP | LOGN | SIN | COS | TAN) numExprP=numberExpressionInPar) {expr = ExpressionFactory.createUnaryArithmeticExpr(numExprP,op);} + | op = POW LPAREN n1 = numberExpression COMMA n2 = numberExpression RPAREN + {expr = ExpressionFactory.createBinaryArithmeticExpr(n1, n2, op);} //| {root = ExpressionFactory.createNumberFunction(numExprP,op)} | (e = externalNumberFunction)=> e = externalNumberFunction {expr = e;} ; Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java Tue Aug 4 11:47:41 2015 @@ -44,7 +44,7 @@ public class RutaKeywords implements IRu private static String[] booleanFunction = { "true", "false" }; - private static String[] numberFunction = { "EXP", "SIN", "COS", "TAN", "LOGN" }; + private static String[] numberFunction = { "EXP", "SIN", "COS", "TAN", "LOGN" , "POW" }; private static String[] stringFunction = { "REMOVESTRING" }; Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java?rev=1694033&r1=1694032&r2=1694033&view=diff ============================================================================== --- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java (original) +++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java Tue Aug 4 11:47:41 2015 @@ -245,6 +245,9 @@ public class ExpressionFactory extends A case RutaLexer.MINUS: operatorID = ExpressionConstants.E_MINUS; break; + case RutaLexer.POW: + operatorID = ExpressionConstants.E_POWER; + break; default: break; }