Author: pkluegl Date: Fri Feb 24 15:45:45 2017 New Revision: 1784287 URL: http://svn.apache.org/viewvc?rev=1784287&view=rev Log: UIMA-5332 + UIMA-5331 - adapt grammars and inference UIMA-5219 - prepare
Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java (with props) uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java (with props) uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java (with props) uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java (with props) uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ConditionedAnnotationTypeExpression.java (with props) Modified: 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/RutaScriptFactory.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.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/feature/GenericFeatureExpression.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml 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/parser/ast/ExpressionFactory.java 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=1784287&r1=1784286&r2=1784287&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 Fri Feb 24 15:45:45 2017 @@ -106,7 +106,6 @@ import org.apache.uima.ruta.rule.quantif @parser::members { private List vars = new ArrayList(); private int level = 0; -private RutaScriptFactory factory = new RutaScriptFactory(); private RutaExternalFactory external; private String namespace; private String moduleName; @@ -114,7 +113,16 @@ private ResourceManager resourceManager; private UimaContext context; private RutaDescriptorInformation descInfo; +private ExpressionFactory expressionFactory; +private RutaScriptFactory factory; +public void setScriptFactory(RutaScriptFactory factory) { + this.factory = factory; +} + +public void setExpressionFactory(ExpressionFactory factory) { + this.expressionFactory = factory; +} public void setDescriptorInformation(RutaDescriptorInformation descInfo) { this.descInfo = descInfo; @@ -133,7 +141,6 @@ public void setExternalFactory(RutaExter } public void setContext(UimaContext context){ this.context = context; - factory.setContext(context); } public void emitErrorMessage(String msg) { @@ -1032,21 +1039,21 @@ ruleElementMatchPart [RuleElementContain ( (annotationAddressExpression)=>addressExpr = annotationAddressExpression { - MatchReference mr = ExpressionFactory.createMatchReference(addressExpr); + MatchReference mr = expressionFactory.createMatchReference(addressExpr); re = factory.createRuleElement(mr, container, $blockDeclaration::env); } | (typeFunction)=> tf = typeFunction { - MatchReference mr = ExpressionFactory.createMatchReference(tf); + MatchReference mr = expressionFactory.createMatchReference(tf); re = factory.createRuleElement(mr, container, $blockDeclaration::env); } | match = dottedIdWithIndex2 ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument)? { - MatchReference mr = ExpressionFactory.createMatchReference(match, comp, arg); + MatchReference mr = expressionFactory.createMatchReference(match, comp, arg); re = factory.createRuleElement(mr, container, $blockDeclaration::env); } @@ -1110,7 +1117,7 @@ rawActions returns [List<AbstractRutaAct listExpression returns [ListExpression expr = null] : - (featureExpression)=>fe = featureExpression {expr = ExpressionFactory.createGenericFeatureExpression(fe);} + (featureExpression)=>fe = featureExpression {expr = expressionFactory.createGenericFeatureExpression(fe);} | (booleanListExpression)=> bl = booleanListExpression {expr = bl;} | (intListExpression)=> il = intListExpression {expr = il;} | (doubleListExpression)=> dl = doubleListExpression {expr = dl;} @@ -1138,7 +1145,7 @@ untypedListExpression returns [ListExpre List<IRutaExpression> list = new ArrayList<IRutaExpression>(); } : LCURLY (e = argument {list.add(e);} (COMMA e = argument {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createUntypedListExpression(list);} + {expr = expressionFactory.createUntypedListExpression(list);} ; booleanListExpression returns [AbstractBooleanListExpression expr = null] @@ -1151,10 +1158,10 @@ simpleBooleanListExpression returns [Abs List<IBooleanExpression> list = new ArrayList<IBooleanExpression>(); } : LCURLY (e = simpleBooleanExpression {list.add(e);} (COMMA e = simpleBooleanExpression {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createBooleanListExpression(list);} + {expr = expressionFactory.createBooleanListExpression(list);} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "BOOLEANLIST")}? var = Identifier - {expr = ExpressionFactory.createReferenceBooleanListExpression(var);} + {expr = expressionFactory.createReferenceBooleanListExpression(var);} ; @@ -1168,10 +1175,10 @@ simpleIntListExpression returns [Abstrac List<INumberExpression> list = new ArrayList<INumberExpression>(); } : LCURLY (e = simpleNumberExpression {list.add(e);} (COMMA e = simpleNumberExpression {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createNumberListExpression(list);} + {expr = expressionFactory.createNumberListExpression(list);} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "INTLIST")}? var = Identifier - {expr = ExpressionFactory.createReferenceIntListExpression(var);} + {expr = expressionFactory.createReferenceIntListExpression(var);} ; @@ -1194,10 +1201,10 @@ simpleDoubleListExpression returns [Abst List<INumberExpression> list = new ArrayList<INumberExpression>(); } : LCURLY (e = simpleNumberExpression {list.add(e);} (COMMA e = simpleNumberExpression {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createNumberListExpression(list);} + {expr = expressionFactory.createNumberListExpression(list);} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "DOUBLELIST")}? var = Identifier - {expr = ExpressionFactory.createReferenceDoubleListExpression(var);} + {expr = expressionFactory.createReferenceDoubleListExpression(var);} ; @@ -1211,10 +1218,10 @@ simpleFloatListExpression returns [Abstr List<INumberExpression> list = new ArrayList<INumberExpression>(); } : LCURLY (e = simpleNumberExpression {list.add(e);} (COMMA e = simpleNumberExpression {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createNumberListExpression(list);} + {expr = expressionFactory.createNumberListExpression(list);} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "FLOATLIST")}? var = Identifier - {expr = ExpressionFactory.createReferenceFloatListExpression(var);} + {expr = expressionFactory.createReferenceFloatListExpression(var);} ; stringListExpression returns [AbstractStringListExpression expr = null] @@ -1227,10 +1234,10 @@ simpleStringListExpression returns [Abst List<IStringExpression> list = new ArrayList<IStringExpression>(); } : LCURLY (e = simpleStringExpression {list.add(e);} (COMMA e = simpleStringExpression {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createStringListExpression(list);} + {expr = expressionFactory.createStringListExpression(list);} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "STRINGLIST")}? var = Identifier - {expr = ExpressionFactory.createReferenceStringListExpression(var);} + {expr = expressionFactory.createReferenceStringListExpression(var);} ; @@ -1244,10 +1251,10 @@ simpleTypeListExpression returns [Abstra List<ITypeExpression> list = new ArrayList<ITypeExpression>(); } : LCURLY (e = simpleTypeExpression {list.add(e);} (COMMA e = simpleTypeExpression {list.add(e);})*)? RCURLY - {expr = ExpressionFactory.createTypeListExpression(list);} + {expr = expressionFactory.createTypeListExpression(list);} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "TYPELIST")}? var = Identifier - {expr = ExpressionFactory.createReferenceTypeListExpression(var);} + {expr = expressionFactory.createReferenceTypeListExpression(var);} ; typeMatchExpression returns [IRutaExpression expr = null] @@ -1263,7 +1270,7 @@ options { matchReference returns [MatchReference mr = null] : ref = dottedId - {mr = ExpressionFactory.createMatchReference(ref);} + {mr = expressionFactory.createMatchReference(ref);} ; typeExpression returns [ITypeExpression type = null] @@ -1272,7 +1279,7 @@ options { } : tf = typeFunction {type = tf;} - //| tl = typeListExpression LBRACK index = numberExpression RBRACK {type = ExpressionFactory.createTypeListIndexExpression(tl, index);} + //| tl = typeListExpression LBRACK index = numberExpression RBRACK {type = expressionFactory.createTypeListIndexExpression(tl, index);} | st = simpleTypeExpression {type = st;} ; @@ -1297,17 +1304,17 @@ externalTypeFunction returns [ITypeExpre simpleTypeExpression returns [ITypeExpression type = null] : {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "TYPE")}? var = Identifier - {type = ExpressionFactory.createReferenceTypeExpression(var);} + {type = expressionFactory.createReferenceTypeExpression(var);} | at = annotationType - {type = ExpressionFactory.createSimpleTypeExpression(at, $blockDeclaration::env);} + {type = expressionFactory.createSimpleTypeExpression(at, $blockDeclaration::env);} ; matchExpression returns [FeatureExpression feat = null] : match = dottedId - {MatchReference mr = ExpressionFactory.createMatchReference(match);} + {MatchReference mr = expressionFactory.createMatchReference(match);} ; featureExpression returns [FeatureExpression feat = null] @@ -1318,8 +1325,8 @@ ITypeExpression te = null; : match = dottedIdWithIndex { - MatchReference mr = ExpressionFactory.createMatchReference(match); - feat = ExpressionFactory.createFeatureExpression(mr, $blockDeclaration::env); + MatchReference mr = expressionFactory.createMatchReference(match); + feat = expressionFactory.createFeatureExpression(mr, $blockDeclaration::env); } ; @@ -1327,11 +1334,11 @@ featureMatchExpression returns [FeatureE : match = dottedIdWithIndex ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument)? { - MatchReference mr = ExpressionFactory.createMatchReference(match); + MatchReference mr = expressionFactory.createMatchReference(match); if(comp != null) { - fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env); + fme = expressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env); } else { - fme = ExpressionFactory.createFeatureExpression(mr, $blockDeclaration::env); + fme = expressionFactory.createFeatureExpression(mr, $blockDeclaration::env); } } ; @@ -1340,8 +1347,8 @@ featureMatchExpression2 returns [Feature : match = dottedIdWithIndex (comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument { - MatchReference mr = ExpressionFactory.createMatchReference(match); - fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env);} + MatchReference mr = expressionFactory.createMatchReference(match); + fme = expressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env);} ; @@ -1349,8 +1356,8 @@ featureAssignmentExpression returns [Fea : match = dottedIdWithIndex op = ASSIGN_EQUAL arg = argument { - MatchReference mr = ExpressionFactory.createMatchReference(match); - fme = ExpressionFactory.createFeatureMatchExpression(mr, op, arg, $blockDeclaration::env); + MatchReference mr = expressionFactory.createMatchReference(match); + fme = expressionFactory.createFeatureMatchExpression(mr, op, arg, $blockDeclaration::env); } ; @@ -1384,14 +1391,14 @@ listVariable returns [Token var = null] //@init {List<ITypeExpression> exprs = new ArrayList<ITypeExpression>();} // : // LBRACK e = typeExpressionAnd{exprs.add(e);} ( COMMA e = typeExpressionAnd{exprs.add(e);} )* RBRACK -// {type = ExpressionFactory.createOrTypeExpression(exprs);} +// {type = expressionFactory.createOrTypeExpression(exprs);} // ; //typeExpressionAnd returns [ITypeExpression type = null] //@init {List<ITypeExpression> exprs = new ArrayList<ITypeExpression>();} // : // LBRACK e = simpleTypeExpression{exprs.add(e);} ( SEMI e = simpleTypeExpression{exprs.add(e);} )* RBRACK -// {type = ExpressionFactory.createAndTypeExpression(exprs);} +// {type = expressionFactory.createAndTypeExpression(exprs);} // ; quantifierPart returns [RuleElementQuantifier quantifier = null] @@ -2315,14 +2322,26 @@ options { backtrack = true; } : - (featureExpression)=> fe = featureExpression {expr = ExpressionFactory.createGenericFeatureExpression(fe);} + match = dottedIdWithIndex2 (comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument LCURLY cs = conditions RCURLY + {MatchReference mr = expressionFactory.createMatchReference(match, comp, arg); + expr = expressionFactory.createConditionedAnnotationTypeExpression(mr,cs);} + | match = dottedIdWithIndex2 LCURLY cs = conditions RCURLY + {MatchReference mr = expressionFactory.createMatchReference(match); + expr = expressionFactory.createConditionedAnnotationTypeExpression(mr,cs);} + | match = dottedIdWithIndex2 (comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument + {MatchReference mr = expressionFactory.createMatchReference(match, comp, arg); + expr = expressionFactory.createAnnotationTypeExpression(mr);} + + | (featureExpression)=> fe = featureExpression {expr = expressionFactory.createGenericFeatureExpression(fe);} | a2 = booleanExpression {expr = a2;} | a3 = numberExpression {expr = a3;} | a4 = stringExpression {expr = a4;} | (listExpression)=> l = listExpression {expr = l;} | a5 = nullExpression {expr = a5;} | a6 = annotationOrTypeExpression {expr = a6;} - //| a1 = typeExpression {expr = a1;} + //| match = dottedIdWithIndex2 ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument)? + //{MatchReference mr = expressionFactory.createMatchReference(match, comp, arg); + //expr = expressionFactory.createAnnotationTypeExpression(mr);} //(a2 = booleanExpression)=> a2 = booleanExpression {expr = a2;} //| (a3 = numberExpression)=> a3 = numberExpression {expr = a3;} @@ -2330,6 +2349,20 @@ options { //| (a1 = typeExpression)=> a1 = typeExpression {expr = a1;} ; +simpleArgument returns [IRutaExpression expr = null] +options { + backtrack = true; +} + : + (featureExpression)=> fe = featureExpression {expr = expressionFactory.createGenericFeatureExpression(fe);} + | a2 = booleanExpression {expr = a2;} + | a3 = numberExpression {expr = a3;} + | a4 = stringExpression {expr = a4;} + | (listExpression)=> l = listExpression {expr = l;} + | a5 = nullExpression {expr = a5;} + ; + + annotationOrTypeExpression returns [IRutaExpression expr = null] : aae = annotationAddressExpression {expr = aae;} @@ -2338,14 +2371,17 @@ annotationOrTypeExpression returns [IRut | af = annotationFunction {expr = af;} | - ref = dottedId - {expr = ExpressionFactory.createGenericExpression(ref);} + match = dottedIdWithIndex2 ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument)? + {MatchReference mr = expressionFactory.createMatchReference(match, comp, arg); + expr = expressionFactory.createAnnotationTypeExpression(mr);} + //ref = dottedId + //{expr = expressionFactory.createGenericExpression(ref);} ; annotationExpression returns [IRutaExpression expr = null] : {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATION") }? - id = Identifier {expr = ExpressionFactory.createAnnotationVariableExpression(id);} + id = Identifier {expr = expressionFactory.createAnnotationVariableExpression(id);} | //(annotationListIndexExpression)=> alie = annotationListIndexExpression {expr = alie;} //| @@ -2359,24 +2395,24 @@ annotationExpression returns [IRutaExpre annotationListIndexExpression returns [IRutaExpression expr = null] : - al = annotationListExpression LBRACK index = numberExpression RBRACK {expr = ExpressionFactory.createAnnotationListIndexExpression(al, index);} + al = annotationListExpression LBRACK index = numberExpression RBRACK {expr = expressionFactory.createAnnotationListIndexExpression(al, index);} ; annotationListExpression returns [AbstractAnnotationListExpression expr = null] : {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "ANNOTATIONLIST")}? - id = Identifier {expr = ExpressionFactory.createAnnotationListVariableExpression(id);} + id = Identifier {expr = expressionFactory.createAnnotationListVariableExpression(id);} ; annotationAddressExpression returns [IAnnotationExpression expr = null] : - ADDRESS_PREFIX address = DecimalLiteral {expr = ExpressionFactory.createAnnotationAddressExpression(address);} + ADDRESS_PREFIX address = DecimalLiteral {expr = expressionFactory.createAnnotationAddressExpression(address);} ; annotationLabelExpression returns [IRutaExpression expr = null] : - label = Identifier {expr = ExpressionFactory.createAnnotationLabelExpression(label);} + label = Identifier {expr = expressionFactory.createAnnotationLabelExpression(label);} ; annotationFunction returns [IAnnotationExpression expr = null] @@ -2396,7 +2432,7 @@ externalAnnotationFunction returns [IAnn nullExpression returns [IRutaExpression expr = null] : - NULL {expr = ExpressionFactory.createNullExpression();} + NULL {expr = expressionFactory.createNullExpression();} ; @@ -2510,19 +2546,19 @@ List<IStringExpression> args = new Array } : RESOURCE LPAREN name = dottedId (COMMA arg = stringExpression {args.add(arg);} )* RPAREN - {expr = ExpressionFactory.createExternalWordListExpression(name, args);} + {expr = expressionFactory.createExternalWordListExpression(name, args);} | path = RessourceLiteral - {expr = ExpressionFactory.createLiteralWordListExpression(path);} + {expr = expressionFactory.createLiteralWordListExpression(path);} | id = Identifier - {expr = ExpressionFactory.createReferenceWordListExpression(id);} + {expr = expressionFactory.createReferenceWordListExpression(id);} ; wordListOrStringExpression returns [WordListExpression expr = null] : (stringExpression)=> string = stringExpression - {expr = ExpressionFactory.createStringWordListExpression(string);} + {expr = expressionFactory.createStringWordListExpression(string);} | e = wordListExpression {expr = e;} @@ -2534,19 +2570,19 @@ List<IStringExpression> args = new Array } : RESOURCE LPAREN name = dottedId (COMMA arg = stringExpression {args.add(arg);} )* RPAREN - {expr = ExpressionFactory.createExternalWordTableExpression(name, args);} + {expr = expressionFactory.createExternalWordTableExpression(name, args);} | path = RessourceLiteral - {expr = ExpressionFactory.createLiteralWordTableExpression(path);} + {expr = expressionFactory.createLiteralWordTableExpression(path);} | id = Identifier - {expr = ExpressionFactory.createReferenceWordTableExpression(id);} + {expr = expressionFactory.createReferenceWordTableExpression(id);} ; wordTableOrStringExpression returns [WordTableExpression expr = null] : (stringExpression)=>string = stringExpression - {expr = ExpressionFactory.createStringWordTableExpression(string);} + {expr = expressionFactory.createStringWordTableExpression(string);} | e = wordTableExpression {expr = e;} @@ -2557,10 +2593,10 @@ wordTableOrStringExpression returns [Wor numberFunction returns [INumberExpression expr = null] : (op=(EXP | LOGN | SIN | COS | TAN ) numExprP=numberExpressionInPar) - {expr = ExpressionFactory.createComposedNumberExpression(numExprP,op);} + {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)} + {expr = expressionFactory.createComposedNumberExpression(n1,op, n2);} + //| {root = expressionFactory.createNumberFunction(numExprP,op)} | (e = externalNumberFunction)=> e = externalNumberFunction {expr = e;} ; @@ -2589,7 +2625,7 @@ additiveExpression returns [INumberExpre List<Token> ops = new ArrayList<Token>();} : e = multiplicativeExpression{exprs.add(e);} ((PLUS | MINUS)=> op = (PLUS | MINUS){ops.add(op);} e = multiplicativeExpression{exprs.add(e);} )* - {expr = ExpressionFactory.createComposedNumberExpression(exprs,ops);} + {expr = expressionFactory.createComposedNumberExpression(exprs,ops);} ; multiplicativeExpression returns [INumberExpression expr = null] @@ -2597,8 +2633,8 @@ multiplicativeExpression returns [INumbe List<Token> ops = new ArrayList<Token>();} : (e = simpleNumberExpression{exprs.add(e);} (( STAR | SLASH | PERCENT )=> op = ( STAR | SLASH | PERCENT ){ops.add(op);} e = simpleNumberExpression{exprs.add(e);} )* - {expr = ExpressionFactory.createComposedNumberExpression(exprs,ops);} - //| nl = numberListExpression LBRACK index = numberExpression RBRACK {expr = ExpressionFactory.createNumberListIndexExpression(nl, index);} + {expr = expressionFactory.createComposedNumberExpression(exprs,ops);} + //| nl = numberListExpression LBRACK index = numberExpression RBRACK {expr = expressionFactory.createNumberListIndexExpression(nl, index);} | e1 = numberFunction {expr = e1;}) ; @@ -2614,11 +2650,11 @@ numberExpressionInPar returns [INumberEx simpleNumberExpression returns [INumberExpression expr = null] : - (featureExpression)=> fe = featureExpression {expr = ExpressionFactory.createNumberFeatureExpression(fe);} - | m = MINUS? lit = DecimalLiteral {expr = ExpressionFactory.createIntegerExpression(lit,m);} + (featureExpression)=> fe = featureExpression {expr = expressionFactory.createNumberFeatureExpression(fe);} + | m = MINUS? lit = DecimalLiteral {expr = expressionFactory.createIntegerExpression(lit,m);} // TODO what about float numbers? - | m = MINUS? lit = FloatingPointLiteral {expr = ExpressionFactory.createDoubleExpression(lit,m);} - | m = MINUS? var = numberVariable {expr = ExpressionFactory.createReferenceNumberExpression(var,m);} + | m = MINUS? lit = FloatingPointLiteral {expr = expressionFactory.createDoubleExpression(lit,m);} + | m = MINUS? var = numberVariable {expr = expressionFactory.createReferenceNumberExpression(var,m);} | e = numberExpressionInPar {expr = e;} ; @@ -2630,15 +2666,15 @@ options { List<IStringExpression> exprs = new ArrayList<IStringExpression>(); } : - (featureExpression)=> fe = featureExpression {expr = ExpressionFactory.createStringFeatureExpression(fe);} - //|(stringListExpression)=> sl = stringListExpression LBRACK index = numberExpression RBRACK {expr = ExpressionFactory.createStringListIndexExpression(sl, index);} + (featureExpression)=> fe = featureExpression {expr = expressionFactory.createStringFeatureExpression(fe);} + //|(stringListExpression)=> sl = stringListExpression LBRACK index = numberExpression RBRACK {expr = expressionFactory.createStringListIndexExpression(sl, index);} | e = simpleStringExpression {exprs.add(e);} ((PLUS)=>PLUS ( (numberExpressionInPar)=> e2 = numberExpressionInPar {exprs.add(e2);} - | arg = argument {if(arg instanceof IStringExpression) {exprs.add((IStringExpression)arg);}} + | arg = simpleArgument {if(arg instanceof IStringExpression) {exprs.add((IStringExpression)arg);}} //| le = listExpression {exprs.add(le);} ))* - {expr = ExpressionFactory.createComposedStringExpression(exprs);} + {expr = expressionFactory.createComposedStringExpression(exprs);} |(e = stringFunction)=> e = stringFunction{expr = e;} ; @@ -2665,24 +2701,24 @@ externalStringFunction returns [IStringE simpleStringExpression returns [IStringExpression expr = null] : - lit = StringLiteral {expr = ExpressionFactory.createSimpleStringExpression(lit);} - | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "STRING")}? id = Identifier {expr = ExpressionFactory.createReferenceStringExpression(id);} + lit = StringLiteral {expr = expressionFactory.createSimpleStringExpression(lit);} + | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "STRING")}? id = Identifier {expr = expressionFactory.createReferenceStringExpression(id);} ; booleanExpression returns [IBooleanExpression expr = null] : - (featureExpression)=> fe = featureExpression {expr = ExpressionFactory.createBooleanFeatureExpression(fe);} + (featureExpression)=> fe = featureExpression {expr = expressionFactory.createBooleanFeatureExpression(fe);} | (e = composedBooleanExpression)=> e = composedBooleanExpression {expr = e;} |sbE = simpleBooleanExpression {expr = sbE;} - //| bl = booleanListExpression LBRACK index = numberExpression RBRACK {expr = ExpressionFactory.createBooleanListIndexExpression(bl, index);} + //| bl = booleanListExpression LBRACK index = numberExpression RBRACK {expr = expressionFactory.createBooleanListIndexExpression(bl, index);} ; simpleBooleanExpression returns [IBooleanExpression expr = null] : e = literalBooleanExpression {expr = e;} | {isVariableOfType($blockDeclaration::env,input.LT(1).getText(), "BOOLEAN")}? - id = Identifier {expr = ExpressionFactory.createReferenceBooleanExpression(id);} + id = Identifier {expr = expressionFactory.createReferenceBooleanExpression(id);} ; // not checked @@ -2702,7 +2738,7 @@ booleanFunction returns [IBooleanExpress : (op = XOR LPAREN e1 = booleanExpression COMMA e2 = booleanExpression RPAREN) - {expr = ExpressionFactory.createBooleanFunction(op,e1,e2);} + {expr = expressionFactory.createBooleanFunction(op,e1,e2);} | (e = externalBooleanFunction)=> e = externalBooleanFunction {expr = e;} ; @@ -2721,14 +2757,14 @@ externalBooleanFunction returns [IBoolea booleanCompare returns [IBooleanExpression expr = null] : (e1 = simpleBooleanExpression op = (EQUAL | NOTEQUAL) e2 = booleanExpression) - {expr = ExpressionFactory.createBooleanFunction(op,e1,e2);} + {expr = expressionFactory.createBooleanFunction(op,e1,e2);} ; literalBooleanExpression returns [IBooleanExpression expr = null] : - v = TRUE {expr = ExpressionFactory.createSimpleBooleanExpression(v);} - | v = FALSE {expr = ExpressionFactory.createSimpleBooleanExpression(v);} + v = TRUE {expr = expressionFactory.createSimpleBooleanExpression(v);} + | v = FALSE {expr = expressionFactory.createSimpleBooleanExpression(v);} ; @@ -2738,14 +2774,14 @@ booleanTypeExpression returns [IBoolea e1 = typeExpression op = (EQUAL | NOTEQUAL) e2 = typeExpression - {expr = ExpressionFactory.createBooleanTypeExpression(e1,op,e2);} + {expr = expressionFactory.createBooleanTypeExpression(e1,op,e2);} ; booleanStringExpression returns [IBooleanExpression expr = null] : e1 = stringExpression op = (EQUAL | NOTEQUAL) e2 = stringExpression - {expr = ExpressionFactory.createBooleanStringExpression(e1,op,e2);} + {expr = expressionFactory.createBooleanStringExpression(e1,op,e2);} ; booleanNumberExpression returns [IBooleanExpression expr = null] @@ -2755,6 +2791,6 @@ booleanNumberExpression returns [IBool op = (LESS | GREATER | GREATEREQUAL | LESSEQUAL | EQUAL | NOTEQUAL)//{ops.add(op);} e2 = numberExpression//{exprs.add(e);} //RPAREN - {expr = ExpressionFactory.createBooleanNumberExpression(e1,op,e2);} + {expr = expressionFactory.createBooleanNumberExpression(e1,op,e2);} ; \ No newline at end of file Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java?rev=1784287&r1=1784286&r2=1784287&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java Fri Feb 24 15:45:45 2017 @@ -70,8 +70,18 @@ public class RutaScriptFactory { private UimaContext context; - public RutaScriptFactory() { + private ExpressionFactory expressionFactory; + + private TypeUsageInformation typeUsage; + + public RutaScriptFactory(ExpressionFactory expressionFactory, TypeUsageInformation typeUsage) { super(); + this.typeUsage = typeUsage; + if (expressionFactory == null) { + this.expressionFactory = new ExpressionFactory(typeUsage); + } else { + this.expressionFactory = expressionFactory; + } } public RutaScriptBlock createScriptBlock(Token id, RutaRuleElement ruleElement, @@ -109,7 +119,9 @@ public class RutaScriptFactory { RutaScriptBlock result = createScriptBlock(module, null, null, null, defaultNamespace); List<RuleElement> ruleElements = new ArrayList<RuleElement>(); RuleElementIsolator container = new RuleElementIsolator(); - MatchReference mr = ExpressionFactory.createMatchReference(new SimpleTypeExpression(CAS.TYPE_NAME_DOCUMENT_ANNOTATION)); + ITypeExpression documentExpression = expressionFactory + .createSimpleTypeExpression(CAS.TYPE_NAME_DOCUMENT_ANNOTATION, null); + MatchReference mr = expressionFactory.createMatchReference(documentExpression); ruleElements.add(createRuleElement(mr, container, result)); RutaRule createRule = createRule(ruleElements, result); container.setContainer(createRule); @@ -119,21 +131,23 @@ public class RutaScriptFactory { return result; } - public RutaBlock createForEachBlock(Token varToken, IBooleanExpression direction, RutaRuleElement ruleElement, List<RutaStatement> body, RutaBlock parent) { - - if(varToken== null) { - throw new IllegalArgumentException("A FOREACH block requires that the annotation variable is named."); + public RutaBlock createForEachBlock(Token varToken, IBooleanExpression direction, + RutaRuleElement ruleElement, List<RutaStatement> body, RutaBlock parent) { + + if (varToken == null) { + throw new IllegalArgumentException( + "A FOREACH block requires that the annotation variable is named."); } - + String varName = varToken.getText(); RutaRule rule = null; - if(ruleElement != null) { + if (ruleElement != null) { rule = createRule(ruleElement, parent); } - String namespace = parent.getNamespace()+ "." + varName; + String namespace = parent.getNamespace() + "." + varName; return new ForEachBlock(varName, direction, rule, body, parent, namespace); } - + public RutaRule createRule(RuleElement element, RutaBlock parent) { List<RuleElement> elements = new ArrayList<RuleElement>(); elements.add(element); @@ -142,10 +156,10 @@ public class RutaScriptFactory { public RutaStatement createImplicitRule(List<AbstractRutaAction> actions, RutaBlock parent) { List<RuleElement> elements = new ArrayList<RuleElement>(); - ITypeExpression documentExpression = new SimpleTypeExpression("Document"); - MatchReference mr = ExpressionFactory.createMatchReference(documentExpression); - RutaRuleElement element = createRuleElement(mr, null, null, actions, null, + ITypeExpression documentExpression = expressionFactory.createSimpleTypeExpression("Document", parent); + MatchReference mr = expressionFactory.createMatchReference(documentExpression); + RutaRuleElement element = createRuleElement(mr, null, null, actions, null, parent); elements.add(element); RutaRule rule = createRule(elements, parent); element.setContainer(rule.getRoot()); @@ -156,16 +170,19 @@ public class RutaScriptFactory { return new RutaRule(elements, parent, idCounter++); } - public RutaRuleElement createRuleElement(MatchReference matchReference, RuleElementContainer container, RutaBlock parent) { + public RutaRuleElement createRuleElement(MatchReference matchReference, + RuleElementContainer container, RutaBlock parent) { return createRuleElement(matchReference, null, null, null, container, parent); } - - public RutaRuleElement createRuleElement(MatchReference matchReference, RuleElementQuantifier quantifier, List<AbstractRutaCondition> conditions, + + public RutaRuleElement createRuleElement(MatchReference matchReference, + RuleElementQuantifier quantifier, List<AbstractRutaCondition> conditions, List<AbstractRutaAction> actions, RuleElementContainer container, RutaBlock parent) { - AnnotationTypeExpression expression = ExpressionFactory.createAnnotationTypeExpression(matchReference); + AnnotationTypeExpression expression = expressionFactory + .createAnnotationTypeExpression(matchReference); return createRuleElement(expression, quantifier, conditions, actions, container, parent); } - + public RutaRuleElement createRuleElement(IRutaExpression expression, RuleElementQuantifier quantifier, List<AbstractRutaCondition> conditions, List<AbstractRutaAction> actions, RuleElementContainer container, RutaBlock parent) { @@ -175,7 +192,8 @@ public class RutaScriptFactory { } else if (expression instanceof IStringExpression) { matcher = new RutaLiteralMatcher((IStringExpression) expression); } else { - throw new RuntimeException(expression.getClass().getSimpleName() + " is not a valid expression for a matching condition."); + throw new RuntimeException(expression.getClass().getSimpleName() + + " is not a valid expression for a matching condition."); } return new RutaRuleElement(matcher, quantifier, conditions, actions, container, parent); } @@ -295,6 +313,4 @@ public class RutaScriptFactory { this.context = context; } - - } Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java?rev=1784287&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java (added) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java Fri Feb 24 15:45:45 2017 @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.uima.ruta; + +import java.util.ArrayList; +import java.util.List; + +/** + * Container for storing information about the usage of types and annotations within a ruta + * script/module. + * + */ +public class TypeUsageInformation { + + private List<String> mentionedTypes; + + public TypeUsageInformation() { + super(); + mentionedTypes = new ArrayList<>(); + } + + public void addMentionedType(String mention) { + mentionedTypes.add(mention); + } + + public List<String> getMentionedTypes() { + return mentionedTypes; + } + +} Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/TypeUsageInformation.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java?rev=1784287&r1=1784286&r2=1784287&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorFactory.java Fri Feb 24 15:45:45 2017 @@ -39,7 +39,9 @@ import org.apache.uima.resource.Resource import org.apache.uima.resource.ResourceManager; import org.apache.uima.resource.impl.ResourceManager_impl; import org.apache.uima.resource.metadata.TypeSystemDescription; +import org.apache.uima.ruta.RutaScriptFactory; import org.apache.uima.ruta.engine.RutaEngine; +import org.apache.uima.ruta.expression.ExpressionFactory; import org.apache.uima.ruta.extensions.IRutaExtension; import org.apache.uima.ruta.extensions.RutaExternalFactory; import org.apache.uima.ruta.parser.RutaLexer; @@ -128,15 +130,24 @@ public class RutaDescriptorFactory { RutaLexer lexer = new RutaLexer(st); CommonTokenStream tokens = new CommonTokenStream(lexer); RutaParser parser = new RutaParser(tokens); + RutaDescriptorInformation descInfo = new RutaDescriptorInformation(); + + parser.setDescriptorInformation(descInfo); - // TODO no context? - parser.setContext(null); + + ExpressionFactory expressionFactory = new ExpressionFactory(); + RutaScriptFactory scriptFactory = new RutaScriptFactory(expressionFactory, null); + scriptFactory.setContext(null); + ResourceManager rm = getResourceManager(options); + + parser.setScriptFactory(scriptFactory); + parser.setExpressionFactory(expressionFactory); parser.setExternalFactory(initializeExternalFactory(options)); - // TODO no resource, avoid fail on missing resources while parsing + parser.setContext(null); parser.setResourcePaths(new String[0]); - ResourceManager rm = getResourceManager(options); parser.setResourceManager(rm); + String name = scriptFile.getName(); int lastIndexOf = name.lastIndexOf(RutaEngine.SCRIPT_FILE_EXTENSION); if (lastIndexOf != -1) { @@ -162,6 +173,8 @@ public class RutaDescriptorFactory { parser.setDescriptorInformation(descInfo); // TODO no context? parser.setContext(null); + parser.setScriptFactory(new RutaScriptFactory(null, null)); + parser.setExpressionFactory(new ExpressionFactory()); parser.setExternalFactory(initializeExternalFactory(options)); // TODO no resource, avoid fail on missing resources while parsing parser.setResourcePaths(new String[0]); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java?rev=1784287&r1=1784286&r2=1784287&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java Fri Feb 24 15:45:45 2017 @@ -61,8 +61,11 @@ import org.apache.uima.resource.Resource import org.apache.uima.ruta.FilterManager; import org.apache.uima.ruta.RutaEnvironment; import org.apache.uima.ruta.RutaModule; +import org.apache.uima.ruta.RutaScriptFactory; import org.apache.uima.ruta.RutaStream; +import org.apache.uima.ruta.TypeUsageInformation; import org.apache.uima.ruta.block.RutaBlock; +import org.apache.uima.ruta.expression.ExpressionFactory; import org.apache.uima.ruta.extensions.IRutaExtension; import org.apache.uima.ruta.extensions.RutaExternalFactory; import org.apache.uima.ruta.parser.RutaLexer; @@ -428,7 +431,7 @@ public class RutaEngine extends JCasAnno private RutaModule script; - private RutaExternalFactory factory; + private RutaExternalFactory externalFactory; private RutaVerbalizer verbalizer; @@ -438,6 +441,8 @@ public class RutaEngine extends JCasAnno private List<Type> seedTypes; + private TypeUsageInformation typeUsageInformation; + private TypeSystem lastTypeSystem; private ResourceManager resourceManager = null; @@ -455,8 +460,8 @@ public class RutaEngine extends JCasAnno this.context = aContext; - factory = new RutaExternalFactory(); - factory.setContext(aContext); + externalFactory = new RutaExternalFactory(); + externalFactory.setContext(aContext); verbalizer = new RutaVerbalizer(); // reinitialize analysis engines if this one is configured @@ -468,7 +473,7 @@ public class RutaEngine extends JCasAnno scriptRutaResourceLoader = new RutaResourceLoader(scriptPaths, resourceManager.getExtensionClassLoader()); descriptorRutaResourceLoader = new RutaResourceLoader(descriptorPaths, resourceManager.getExtensionClassLoader()); - if (!factory.isInitialized()) { + if (!externalFactory.isInitialized()) { initializeExtensionWithClassPath(); } if (!reloadScript) { @@ -630,7 +635,7 @@ public class RutaEngine extends JCasAnno IRutaExtension extension = (IRutaExtension) forName.newInstance(); verbalizer.addExternalVerbalizers(extension); for (String name : extension.getKnownExtensions()) { - factory.addExtension(name, extension); + externalFactory.addExtension(name, extension); } } } catch (Exception e) { @@ -937,6 +942,7 @@ public class RutaEngine extends JCasAnno } else if (Boolean.class.equals(variableType)) { return Boolean.parseBoolean(value); } else if (Type.class.equals(variableType)) { + // TODO return value; } return null; @@ -981,35 +987,51 @@ public class RutaEngine extends JCasAnno } } - private RutaModule loadScriptByString(String rules) throws RecognitionException { + protected RutaModule loadScriptByString(String rules) throws RecognitionException { CharStream st = new ANTLRStringStream(rules); RutaLexer lexer = new RutaLexer(st); CommonTokenStream tokens = new CommonTokenStream(lexer); - RutaParser parser = new RutaParser(tokens); - parser.setContext(context); - parser.setExternalFactory(factory); - parser.setResourcePaths(resourcePaths); - parser.setResourceManager(resourceManager); + RutaParser parser = createParser(tokens); RutaModule script = parser.file_input("Anonymous"); return script; } - private RutaModule loadScript(Resource scriptResource, String name) + protected RutaModule loadScript(Resource scriptResource, String name) throws IOException, RecognitionException { InputStream scriptInputStream = scriptResource.getInputStream(); CharStream st = new ANTLRInputStream(scriptInputStream, scriptEncoding); RutaLexer lexer = new RutaLexer(st); CommonTokenStream tokens = new CommonTokenStream(lexer); - RutaParser parser = new RutaParser(tokens); - parser.setExternalFactory(factory); - parser.setContext(context); - parser.setResourcePaths(resourcePaths); + RutaParser parser = createParser(tokens); RutaModule script = parser.file_input(name); return script; } - public RutaExternalFactory getFactory() { - return factory; + private RutaParser createParser(CommonTokenStream tokens) { + RutaParser parser = new RutaParser(tokens); + if(typeUsageInformation == null) { + typeUsageInformation = new TypeUsageInformation(); + } + ExpressionFactory expressionFactory = new ExpressionFactory(typeUsageInformation); + RutaScriptFactory scriptFactory = new RutaScriptFactory(expressionFactory, typeUsageInformation); + scriptFactory.setContext(context); + + parser.setScriptFactory(scriptFactory); + parser.setExpressionFactory(expressionFactory); + parser.setExternalFactory(externalFactory); + parser.setContext(context); + parser.setResourcePaths(resourcePaths); + parser.setResourceManager(resourceManager); + + return parser; + } + + protected RutaExternalFactory getFactory() { + return externalFactory; + } + + protected TypeUsageInformation getTypeUsageInfomation() { + return typeUsageInformation; } @Override Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java?rev=1784287&r1=1784286&r2=1784287&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java Fri Feb 24 15:45:45 2017 @@ -30,6 +30,7 @@ import org.apache.uima.ruta.RutaStream; import org.apache.uima.ruta.expression.annotation.IAnnotationExpression; import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression; import org.apache.uima.ruta.expression.feature.FeatureExpression; +import org.apache.uima.ruta.expression.feature.FeatureMatchExpression; import org.apache.uima.ruta.expression.type.ITypeExpression; import org.apache.uima.ruta.rule.MatchContext; @@ -87,32 +88,49 @@ public class AnnotationTypeExpression ex if (featureExpression != null) { Collection<? extends AnnotationFS> result = featureExpression.getAnnotations(annotations, true, context, stream); - if(result.isEmpty()) { + if (result.isEmpty()) { return null; } annotations = new ArrayList<>(result); } - if (context.getDirection()) { - return annotations.get(annotations.size() - 1); - } else { - return annotations.get(0); - } + if (context.getDirection()) { + return annotations.get(annotations.size() - 1); + } else { + return annotations.get(0); + } } } else { Type type = getType(context, stream); if (type != null) { - if (getFeatureExpression() != null) { - List<AnnotationFS> bestGuessedAnnotationsAt = stream - .getBestGuessedAnnotationsAt(context.getAnnotation(), type); + + List<AnnotationFS> bestGuessedAnnotations = null; + + if (featureExpression instanceof FeatureMatchExpression) { + // allow more matches for feature matches + bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, context); + } else if(featureExpression != null) { + bestGuessedAnnotations = stream.getBestGuessedAnnotationsAt(context.getAnnotation(), + type); + } else { + bestGuessedAnnotations = stream.getBestGuessedAnnotationsAt(context.getAnnotation(), + type); + if (bestGuessedAnnotations.isEmpty()) { + bestGuessedAnnotations = new ArrayList<>(1); + bestGuessedAnnotations.add(stream.getSingleAnnotationByTypeInContext(type, context)); + } + } + + if (featureExpression != null) { Collection<AnnotationFS> annotations = new ArrayList<>(); - annotations.addAll(bestGuessedAnnotationsAt); - Collection<? extends AnnotationFS> featureAnnotations = getFeatureExpression() - .getAnnotations(annotations, false, context, stream); + annotations.addAll(bestGuessedAnnotations); + Collection<? extends AnnotationFS> featureAnnotations = featureExpression + .getAnnotations(annotations, true, context, stream); if (featureAnnotations != null && !featureAnnotations.isEmpty()) { return featureAnnotations.iterator().next(); } - } else { - return stream.getSingleAnnotationByTypeInContext(type, context); + } + if (bestGuessedAnnotations != null && !bestGuessedAnnotations.isEmpty()) { + return bestGuessedAnnotations.get(0); } } } @@ -180,17 +198,35 @@ public class AnnotationTypeExpression ex return result; } } else { - Type type = getType(context, stream); if (type != null) { - if (getFeatureExpression() != null) { - List<AnnotationFS> bestGuessedAnnotationsAt = stream - .getBestGuessedAnnotationsAt(context.getAnnotation(), type); - Collection<? extends AnnotationFS> featureAnnotations = getFeatureExpression() - .getAnnotations(bestGuessedAnnotationsAt, false, context, stream); - return new ArrayList<>(featureAnnotations); + + List<AnnotationFS> bestGuessedAnnotations = null; + + if (featureExpression instanceof FeatureMatchExpression) { + // allow more matches for feature matches + bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, context); + } else if(featureExpression != null) { + bestGuessedAnnotations = stream.getBestGuessedAnnotationsAt(context.getAnnotation(), + type); + if (bestGuessedAnnotations.isEmpty()) { + bestGuessedAnnotations =stream.getAnnotationsByTypeInContext(type, context); + } } else { - return stream.getAnnotationsByTypeInContext(type, context); + bestGuessedAnnotations =stream.getAnnotationsByTypeInContext(type, context); + } + + if (featureExpression != null) { + Collection<AnnotationFS> annotations = new ArrayList<>(); + annotations.addAll(bestGuessedAnnotations); + Collection<? extends AnnotationFS> featureAnnotations = featureExpression + .getAnnotations(annotations, true, context, stream); + if (featureAnnotations != null && !featureAnnotations.isEmpty()) { + return new ArrayList<>(featureAnnotations); + } + } + if (bestGuessedAnnotations != null && !bestGuessedAnnotations.isEmpty()) { + return bestGuessedAnnotations; } } } Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java?rev=1784287&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java (added) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java Fri Feb 24 15:45:45 2017 @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.expression; + +import static org.junit.Assert.assertNotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.uima.cas.FeatureStructure; +import org.apache.uima.cas.Type; +import org.apache.uima.cas.text.AnnotationFS; +import org.apache.uima.ruta.RutaStream; +import org.apache.uima.ruta.condition.AbstractRutaCondition; +import org.apache.uima.ruta.expression.annotation.IAnnotationExpression; +import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression; +import org.apache.uima.ruta.expression.feature.FeatureExpression; +import org.apache.uima.ruta.expression.feature.FeatureMatchExpression; +import org.apache.uima.ruta.expression.type.ITypeExpression; +import org.apache.uima.ruta.rule.EvaluatedCondition; +import org.apache.uima.ruta.rule.MatchContext; +import org.apache.uima.ruta.visitor.InferenceCrowd; + +public class ConditionedAnnotationTypeExpression extends AnnotationTypeExpression { + + private AbstractRutaCondition condition; + + public ConditionedAnnotationTypeExpression(MatchReference reference, + AbstractRutaCondition condition) { + super(reference); + this.condition = condition; + } + + @Override + public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) { + List<AnnotationFS> annotationList = getAnnotationList(context, stream); + if(!annotationList.isEmpty()) { + return annotationList.get(0); + } + return null; + } + + @Override + public List<AnnotationFS> getAnnotationList(MatchContext context, RutaStream stream) { + List<AnnotationFS> annotationList = super.getAnnotationList(context, stream); + List<AnnotationFS> result = new ArrayList<>(); + for (AnnotationFS annotation : annotationList) { + if(evalulate(context, stream, annotation)) { + result.add(annotation); + } + } + return result; + } + + private boolean evalulate(MatchContext context, RutaStream stream, AnnotationFS annotation) { + MatchContext localContext = new MatchContext(annotation, context.getElement(), context.getRuleMatch(), context.getDirection()); + EvaluatedCondition eval = condition.eval(localContext, stream, InferenceCrowd.emptyCrowd); + return eval.isValue(); + } + +} Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java ------------------------------------------------------------------------------ svn:eol-style = native 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=1784287&r1=1784286&r2=1784287&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 Fri Feb 24 15:45:45 2017 @@ -24,7 +24,11 @@ import java.util.List; import org.antlr.runtime.Token; import org.apache.uima.cas.CAS; +import org.apache.uima.ruta.TypeUsageInformation; import org.apache.uima.ruta.block.RutaBlock; +import org.apache.uima.ruta.condition.AbstractRutaCondition; +import org.apache.uima.ruta.condition.AndCondition; +import org.apache.uima.ruta.condition.ConditionFactory; import org.apache.uima.ruta.expression.annotation.AbstractAnnotationListExpression; import org.apache.uima.ruta.expression.annotation.AnnotationAddressExpression; import org.apache.uima.ruta.expression.annotation.AnnotationFeatureExpression; @@ -94,10 +98,18 @@ import org.apache.uima.ruta.expression.t public class ExpressionFactory { - private ExpressionFactory() { + private TypeUsageInformation typeUsage; + + public ExpressionFactory() { + this(null); + } + + public ExpressionFactory(TypeUsageInformation typeUsage) { + super(); + this.typeUsage = typeUsage; } - public static INumberExpression createIntegerExpression(Token number, Token minus) { + public INumberExpression createIntegerExpression(Token number, Token minus) { Integer valueOf = Integer.valueOf(number.getText()); SimpleNumberExpression simpleNumberExpression = new SimpleNumberExpression(valueOf); if (minus != null) { @@ -107,7 +119,7 @@ public class ExpressionFactory { } } - public static INumberExpression createDoubleExpression(Token number, Token minus) { + public INumberExpression createDoubleExpression(Token number, Token minus) { Double valueOf = Double.valueOf(number.getText()); SimpleNumberExpression simpleNumberExpression = new SimpleNumberExpression(valueOf); if (minus != null) { @@ -117,7 +129,7 @@ public class ExpressionFactory { } } - public static INumberExpression createReferenceNumberExpression(Token var, Token minus) { + public INumberExpression createReferenceNumberExpression(Token var, Token minus) { NumberVariableExpression simpleNumberExpression = new NumberVariableExpression(var.getText()); if (minus != null) { return new NegativeNumberExpression(simpleNumberExpression); @@ -126,8 +138,8 @@ public class ExpressionFactory { } } - public static INumberExpression createComposedNumberExpression( - List<INumberExpression> expressions, List<Token> opTokens) { + public INumberExpression createComposedNumberExpression(List<INumberExpression> expressions, + List<Token> opTokens) { List<String> ops = new ArrayList<String>(); for (Token token : opTokens) { ops.add(token.getText()); @@ -135,7 +147,7 @@ public class ExpressionFactory { return new ComposedNumberExpression(expressions, ops); } - public static INumberExpression createComposedNumberExpression(INumberExpression expression, + public INumberExpression createComposedNumberExpression(INumberExpression expression, Token opToken) { List<String> ops = new ArrayList<String>(); List<INumberExpression> exprList = new ArrayList<INumberExpression>(); @@ -144,7 +156,7 @@ public class ExpressionFactory { return new ComposedNumberExpression(exprList, ops); } - public static INumberExpression createComposedNumberExpression(INumberExpression expression1, + public INumberExpression createComposedNumberExpression(INumberExpression expression1, Token opToken, INumberExpression expression2) { List<String> ops = new ArrayList<String>(); List<INumberExpression> exprList = new ArrayList<INumberExpression>(); @@ -154,270 +166,274 @@ public class ExpressionFactory { return new ComposedNumberExpression(exprList, ops); } - public static AbstractStringExpression createSimpleStringExpression(Token token) { + public AbstractStringExpression createSimpleStringExpression(Token token) { String text = token.getText(); String substring = text.substring(1, text.length() - 1); return new SimpleStringExpression(substring); } - public static IStringExpression createComposedStringExpression(List<IStringExpression> expressions) { + public IStringExpression createComposedStringExpression(List<IStringExpression> expressions) { return new ComposedStringExpression(expressions); } - public static AbstractStringExpression createReferenceStringExpression(Token var) { + public AbstractStringExpression createReferenceStringExpression(Token var) { return new StringVariableExpression(var.getText()); } - public static IBooleanExpression createBooleanNumberExpression(INumberExpression e1, Token op, + public IBooleanExpression createBooleanNumberExpression(INumberExpression e1, Token op, INumberExpression e2) { return new BooleanNumberExpression(e1, op.getText(), e2); } - - public static IBooleanExpression createBooleanStringExpression(IStringExpression e1, Token op, + + public IBooleanExpression createBooleanStringExpression(IStringExpression e1, Token op, IStringExpression e2) { return new BooleanStringExpression(e1, op.getText(), e2); } - public static IBooleanExpression createSimpleBooleanExpression(Token v) { + public IBooleanExpression createSimpleBooleanExpression(Token v) { return new SimpleBooleanExpression(Boolean.valueOf(v.getText())); } - public static IBooleanExpression createReferenceBooleanExpression(Token id) { + public IBooleanExpression createReferenceBooleanExpression(Token id) { return new BooleanVariableExpression(id.getText()); } - public static ITypeExpression createSimpleTypeExpression(Token typeToken, RutaBlock parent) { + public ITypeExpression createSimpleTypeExpression(Token typeToken, RutaBlock parent) { String typeString = typeToken == null ? CAS.TYPE_NAME_DOCUMENT_ANNOTATION : typeToken.getText(); return new SimpleTypeExpression(typeString); } - public static ITypeExpression createReferenceTypeExpression(Token varToken) { + public ITypeExpression createReferenceTypeExpression(Token varToken) { String varString = varToken == null ? "" : varToken.getText(); return new TypeVariableExpression(varString); } - public static ITypeExpression createSimpleTypeExpression(String typeString, RutaBlock parent) { + public ITypeExpression createSimpleTypeExpression(String typeString, RutaBlock parent) { return new SimpleTypeExpression(typeString); } - public static IBooleanExpression createBooleanFunction(Token op, IBooleanExpression e1, + public IBooleanExpression createBooleanFunction(Token op, IBooleanExpression e1, IBooleanExpression e2) { return new SimpleBooleanFunction(op.getText(), e1, e2); } - public static WordTableExpression createReferenceWordTableExpression(Token id) { + public WordTableExpression createReferenceWordTableExpression(Token id) { return new ReferenceWordTableExpression(id.getText()); } - public static WordListExpression createReferenceWordListExpression(Token id) { + public WordListExpression createReferenceWordListExpression(Token id) { return new ReferenceWordListExpression(id.getText()); } - public static WordListExpression createLiteralWordListExpression(Token path) { + public WordListExpression createLiteralWordListExpression(Token path) { return new LiteralWordListExpression(path.getText()); } - public static WordTableExpression createLiteralWordTableExpression(Token path) { + public WordTableExpression createLiteralWordTableExpression(Token path) { return new LiteralWordTableExpression(path.getText()); } - - public static WordListExpression createStringWordListExpression(IStringExpression expr) { + + public WordListExpression createStringWordListExpression(IStringExpression expr) { return new StringWordListExpression(expr); } - public static WordTableExpression createStringWordTableExpression(IStringExpression expr) { + public WordTableExpression createStringWordTableExpression(IStringExpression expr) { return new StringWordTableExpression(expr); } - public static IBooleanExpression createBooleanTypeExpression(ITypeExpression e1, Token op, + public IBooleanExpression createBooleanTypeExpression(ITypeExpression e1, Token op, ITypeExpression e2) { return new BooleanTypeExpression(e1, op.getText(), e2); } - public static AbstractBooleanListExpression createReferenceBooleanListExpression(Token var) { + public AbstractBooleanListExpression createReferenceBooleanListExpression(Token var) { return new BooleanListVariableExpression(var.getText()); } - public static AbstractStringListExpression createReferenceStringListExpression(Token var) { + public AbstractStringListExpression createReferenceStringListExpression(Token var) { return new StringListVariableExpression(var.getText()); } - public static AbstractTypeListExpression createReferenceTypeListExpression(Token var) { + public AbstractTypeListExpression createReferenceTypeListExpression(Token var) { return new TypeListVariableExpression(var.getText()); } - public static AbstractNumberListExpression createReferenceDoubleListExpression(Token var) { + public AbstractNumberListExpression createReferenceDoubleListExpression(Token var) { return new NumberListVariableExpression(var.getText()); } - public static AbstractNumberListExpression createReferenceIntListExpression(Token var) { + public AbstractNumberListExpression createReferenceIntListExpression(Token var) { return new NumberListVariableExpression(var.getText()); } - public static AbstractNumberListExpression createReferenceFloatListExpression(Token var) { + public AbstractNumberListExpression createReferenceFloatListExpression(Token var) { return new NumberListVariableExpression(var.getText()); } - public static AbstractBooleanListExpression createBooleanListExpression(List<IBooleanExpression> list) { + public AbstractBooleanListExpression createBooleanListExpression(List<IBooleanExpression> list) { return new SimpleBooleanListExpression(list); } - public static AbstractNumberListExpression createNumberListExpression(List<INumberExpression> list) { + public AbstractNumberListExpression createNumberListExpression(List<INumberExpression> list) { return new SimpleNumberListExpression(list); } - public static AbstractTypeListExpression createTypeListExpression(List<ITypeExpression> list) { + public AbstractTypeListExpression createTypeListExpression(List<ITypeExpression> list) { return new SimpleTypeListExpression(list); } - public static AbstractStringListExpression createStringListExpression(List<IStringExpression> list) { + public AbstractStringListExpression createStringListExpression(List<IStringExpression> list) { return new SimpleStringListExpression(list); } - public static FeatureExpression createFeatureExpression(MatchReference mr, RutaBlock env) { + public FeatureExpression createFeatureExpression(MatchReference mr, RutaBlock env) { return new SimpleFeatureExpression(mr); } - public static FeatureMatchExpression createFeatureMatchExpression(MatchReference mr, Token opToken, + public FeatureMatchExpression createFeatureMatchExpression(MatchReference mr, Token opToken, IRutaExpression arg, RutaBlock env) { String op = ""; - if(opToken != null) { + if (opToken != null) { op = opToken.getText(); } return new FeatureMatchExpression(mr, op, arg); } - public static MatchReference createMatchReference(Token refToken) { + public MatchReference createMatchReference(Token refToken) { return createMatchReference(refToken, null, null); } - - public static MatchReference createMatchReference(Token matchToken, Token comparatorToken, IRutaExpression argument) { + + public MatchReference createMatchReference(Token matchToken, Token comparatorToken, + IRutaExpression argument) { String match = matchToken.getText(); String comparator = null; - if(comparatorToken != null) { + if (comparatorToken != null) { comparator = comparatorToken.getText(); } + // TODO , mentions in token? return new MatchReference(match, comparator, argument); } - - public static MatchReference createMatchReference(ITypeExpression expression) { + + public MatchReference createMatchReference(ITypeExpression expression) { return new MatchReference(expression); } - public static MatchReference createMatchReference(IAnnotationExpression expression) { + public MatchReference createMatchReference(IAnnotationExpression expression) { return new MatchReference(expression); } - public static INumberExpression createNumberFeatureExpression(FeatureExpression fe) { + public INumberExpression createNumberFeatureExpression(FeatureExpression fe) { return new NumberFeatureExpression(fe); } - public static AbstractStringExpression createStringFeatureExpression(FeatureExpression fe) { + public AbstractStringExpression createStringFeatureExpression(FeatureExpression fe) { return new StringFeatureExpression(fe); } - public static IBooleanExpression createBooleanFeatureExpression(FeatureExpression fe) { + public IBooleanExpression createBooleanFeatureExpression(FeatureExpression fe) { return new BooleanFeatureExpression(fe); } - public static GenericFeatureExpression createGenericFeatureExpression(FeatureExpression fe) { + public GenericFeatureExpression createGenericFeatureExpression(FeatureExpression fe) { return new GenericFeatureExpression(fe); } - public static ListExpression<Object> createUntypedListExpression(List<IRutaExpression> list) { + public ListExpression<Object> createUntypedListExpression(List<IRutaExpression> list) { return new UntypedListExpression(list); } - public static WordListExpression createExternalWordListExpression(Token name, + public WordListExpression createExternalWordListExpression(Token name, List<IStringExpression> args) { return new ExternalWordListExpression(name.getText(), args); } - public static WordTableExpression createExternalWordTableExpression(Token name, + public WordTableExpression createExternalWordTableExpression(Token name, List<IStringExpression> args) { return new ExternalWordTableExpression(name.getText(), args); } - public static IRutaExpression createNullExpression() { + public IRutaExpression createNullExpression() { return new NullExpression(); } - public static IAnnotationExpression createAnnotationAddressExpression(Token address) { + public IAnnotationExpression createAnnotationAddressExpression(Token address) { return new AnnotationAddressExpression(address.getText()); } - public static IRutaExpression createAnnotationLabelExpression(Token label) { + public IRutaExpression createAnnotationLabelExpression(Token label) { return new AnnotationLabelExpression(label.getText()); } - public static IRutaExpression createAnnotationVariableExpression(Token var) { + public IRutaExpression createAnnotationVariableExpression(Token var) { return new AnnotationVariableExpression(var.getText()); } - public static AbstractAnnotationListExpression createAnnotationListVariableExpression(Token var) { + public AbstractAnnotationListExpression createAnnotationListVariableExpression(Token var) { return new AnnotationListVariableExpression(var.getText()); } - public static IAnnotationExpression createAnnotationFeatureExpression( + public IAnnotationExpression createAnnotationFeatureExpression( FeatureExpression featureExpression) { return new AnnotationFeatureExpression(featureExpression); } - - public static IAnnotationListExpression createAnnotationListFeatureExpression( + + public IAnnotationListExpression createAnnotationListFeatureExpression( FeatureExpression featureExpression) { return new AnnotationListFeatureExpression(featureExpression); } - - public static IBooleanListExpression createBooleanListFeatureExpression( + + public IBooleanListExpression createBooleanListFeatureExpression( FeatureExpression featureExpression) { return new BooleanListFeatureExpression(featureExpression); } - - public static INumberListExpression createNumberListFeatureExpression( + + public INumberListExpression createNumberListFeatureExpression( FeatureExpression featureExpression) { return new NumberListFeatureExpression(featureExpression); } - - public static IStringListExpression createStringListFeatureExpression( + + public IStringListExpression createStringListFeatureExpression( FeatureExpression featureExpression) { return new StringListFeatureExpression(featureExpression); } - public static IRutaExpression createGenericExpression(Token ref) { + public IRutaExpression createGenericExpression(Token ref) { MatchReference match = new MatchReference(ref.getText()); return new AnnotationTypeExpression(match); } - - - public static AnnotationTypeExpression createAnnotationTypeExpression(MatchReference mr) { + + public AnnotationTypeExpression createAnnotationTypeExpression(MatchReference mr) { return new AnnotationTypeExpression(mr); } + + public AnnotationTypeExpression createConditionedAnnotationTypeExpression(MatchReference mr, List<AbstractRutaCondition> conditions) { + AbstractRutaCondition condition = ConditionFactory.createConditionAnd(conditions, null); + return new ConditionedAnnotationTypeExpression(mr, condition); + } - public static IStringExpression createStringListIndexExpression(AbstractStringListExpression sl, + public IStringExpression createStringListIndexExpression(AbstractStringListExpression sl, INumberExpression index) { return null; } - - public static IBooleanExpression createBooleanListIndexExpression(IBooleanListExpression bl, + + public IBooleanExpression createBooleanListIndexExpression(IBooleanListExpression bl, INumberExpression index) { return null; } - - public static INumberExpression createNumberListIndexExpression(AbstractNumberListExpression nl, + + public INumberExpression createNumberListIndexExpression(AbstractNumberListExpression nl, INumberExpression index) { return null; } - - public static ITypeExpression createTypeListIndexExpression(AbstractTypeListExpression tl, + + public ITypeExpression createTypeListIndexExpression(AbstractTypeListExpression tl, INumberExpression index) { return null; } - - public static IAnnotationExpression createAnnotationListIndexExpression(AbstractAnnotationListExpression al, - INumberExpression index) { + + public IAnnotationExpression createAnnotationListIndexExpression( + AbstractAnnotationListExpression al, INumberExpression index) { return null; } - - } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java?rev=1784287&r1=1784286&r2=1784287&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java Fri Feb 24 15:45:45 2017 @@ -65,15 +65,18 @@ public class GenericFeatureExpression ex private IAnnotationListExpression annotationListExpression; + private ExpressionFactory expressionFactory; + public GenericFeatureExpression(FeatureExpression fe) { super(); this.featureExpression = fe; + this.expressionFactory = new ExpressionFactory(); } @Override public String getStringValue(MatchContext context, RutaStream stream) { if (stringExpression == null) { - stringExpression = ExpressionFactory.createStringFeatureExpression(featureExpression); + stringExpression = expressionFactory.createStringFeatureExpression(featureExpression); } return stringExpression.getStringValue(context, stream); } @@ -81,7 +84,7 @@ public class GenericFeatureExpression ex @Override public boolean getBooleanValue(MatchContext context, RutaStream stream) { if (booleanExpression == null) { - booleanExpression = ExpressionFactory.createBooleanFeatureExpression(featureExpression); + booleanExpression = expressionFactory.createBooleanFeatureExpression(featureExpression); } return booleanExpression.getBooleanValue(context, stream); } @@ -89,7 +92,7 @@ public class GenericFeatureExpression ex @Override public int getIntegerValue(MatchContext context, RutaStream stream) { if (numberExpression == null) { - numberExpression = ExpressionFactory.createNumberFeatureExpression(featureExpression); + numberExpression = expressionFactory.createNumberFeatureExpression(featureExpression); } return numberExpression.getIntegerValue(context, stream); } @@ -97,7 +100,7 @@ public class GenericFeatureExpression ex @Override public double getDoubleValue(MatchContext context, RutaStream stream) { if (numberExpression == null) { - numberExpression = ExpressionFactory.createNumberFeatureExpression(featureExpression); + numberExpression = expressionFactory.createNumberFeatureExpression(featureExpression); } return numberExpression.getDoubleValue(context, stream); } @@ -105,7 +108,7 @@ public class GenericFeatureExpression ex @Override public float getFloatValue(MatchContext context, RutaStream stream) { if (numberExpression == null) { - numberExpression = ExpressionFactory.createNumberFeatureExpression(featureExpression); + numberExpression = expressionFactory.createNumberFeatureExpression(featureExpression); } return numberExpression.getFloatValue(context, stream); } @@ -113,7 +116,7 @@ public class GenericFeatureExpression ex @Override public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) { if (annotationExpression == null) { - annotationExpression = ExpressionFactory.createAnnotationFeatureExpression(featureExpression); + annotationExpression = expressionFactory.createAnnotationFeatureExpression(featureExpression); } return annotationExpression.getAnnotation(context, stream); } @@ -121,7 +124,7 @@ public class GenericFeatureExpression ex @Override public FeatureStructure getFeatureStructure(MatchContext context, RutaStream stream) { if (annotationExpression == null) { - annotationExpression = ExpressionFactory.createAnnotationFeatureExpression(featureExpression); + annotationExpression = expressionFactory.createAnnotationFeatureExpression(featureExpression); } return annotationExpression.getFeatureStructure(context, stream); } @@ -144,7 +147,7 @@ public class GenericFeatureExpression ex @Override public List<String> getStringList(MatchContext context, RutaStream stream) { if (stringListExpression == null) { - stringListExpression = ExpressionFactory.createStringListFeatureExpression(featureExpression); + stringListExpression = expressionFactory.createStringListFeatureExpression(featureExpression); } return stringListExpression.getStringList(context, stream); } @@ -152,7 +155,7 @@ public class GenericFeatureExpression ex @Override public List<Number> getNumberList(MatchContext context, RutaStream stream) { if (numberListExpression == null) { - numberListExpression = ExpressionFactory.createNumberListFeatureExpression(featureExpression); + numberListExpression = expressionFactory.createNumberListFeatureExpression(featureExpression); } return numberListExpression.getNumberList(context, stream); } @@ -160,7 +163,7 @@ public class GenericFeatureExpression ex @Override public List<Boolean> getBooleanList(MatchContext context, RutaStream stream) { if (booleanListExpression == null) { - booleanListExpression = ExpressionFactory + booleanListExpression = expressionFactory .createBooleanListFeatureExpression(featureExpression); } return booleanListExpression.getBooleanList(context, stream); @@ -169,7 +172,7 @@ public class GenericFeatureExpression ex @Override public List<AnnotationFS> getAnnotationList(MatchContext context, RutaStream stream) { if (annotationListExpression == null) { - annotationListExpression = ExpressionFactory + annotationListExpression = expressionFactory .createAnnotationListFeatureExpression(featureExpression); } return annotationListExpression.getAnnotationList(context, stream); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java?rev=1784287&r1=1784286&r2=1784287&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/InferenceCrowd.java Fri Feb 24 15:45:45 2017 @@ -19,6 +19,7 @@ package org.apache.uima.ruta.visitor; +import java.util.Collections; import java.util.List; import org.apache.uima.cas.text.AnnotationFS; @@ -30,6 +31,8 @@ import org.apache.uima.ruta.rule.Abstrac public class InferenceCrowd implements RutaInferenceVisitor { + public static InferenceCrowd emptyCrowd = new InferenceCrowd(Collections.<RutaInferenceVisitor>emptyList()); + private final List<RutaInferenceVisitor> visitors; public InferenceCrowd(List<RutaInferenceVisitor> visitors) { Added: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java?rev=1784287&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java (added) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java Fri Feb 24 15:45:45 2017 @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.uima.ruta.engine; + +import org.antlr.runtime.RecognitionException; +import org.junit.Test; + +public class RutaEngineTest { + + @Test + public void testTypeUsageInformation() throws Exception { + RutaEngine engine = new RutaEngine(); + String script = ""; + + engine.loadScriptByString(script); + } + +} Propchange: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java?rev=1784287&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java (added) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java Fri Feb 24 15:45:45 2017 @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.expression; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.uima.cas.CAS; +import org.apache.uima.ruta.engine.Ruta; +import org.apache.uima.ruta.engine.RutaTestUtils; +import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature; +import org.junit.Test; + +public class ConditionedAnnotationTypeExpressionTest { + + @Test + public void test() throws Exception { + String document = "This is a test."; + String script = ""; + script += "Document{-> CREATE(Struct1, \"a\" = SW{SW.begin==8})};\n"; + script += "Document{-> CREATE(Struct2, \"a\" = SW.begin==8{REGEXP(\"a\")})};\n"; + script += "Struct1.a{-> T1};\n"; + script += "Struct2.a{-> T2};\n"; + + Map<String, String> complexTypes = new TreeMap<String, String>(); + complexTypes.put("Struct1", "uima.tcas.Annotation"); + complexTypes.put("Struct2", "uima.tcas.Annotation"); + Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>(); + List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>(); + features.put("Struct1", list); + features.put("Struct2", list); + list.add(new TestFeature("a", "", "uima.tcas.Annotation")); + list.add(new TestFeature("as", "", "uima.cas.FSArray")); + + CAS cas = RutaTestUtils.getCAS(document, complexTypes, features); + Ruta.apply(cas, script); + + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "a"); + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "a"); + } + +} Propchange: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpressionTest.java ------------------------------------------------------------------------------ svn:eol-style = native