Author: pkluegl
Date: Wed May 15 11:18:39 2013
New Revision: 1482766
URL: http://svn.apache.org/r1482766
Log:
UIMA-2904
- added implicit action implementation
Added:
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitMarkAction.java
Modified:
uima/sandbox/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ActionFactory.java
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
Modified:
uima/sandbox/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1482766&r1=1482765&r2=1482766&view=diff
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
(original)
+++
uima/sandbox/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
Wed May 15 11:18:39 2013
@@ -918,6 +918,14 @@ featureMatchExpression2 returns [Feature
{fme = ExpressionFactory.createFeatureMatchExpression(f, op, arg,
$blockDeclaration::env);}
;
+
+featureAssignmentExpression returns [FeatureMatchExpression fme = null]
+ :
+ f = featureExpression op = ASSIGN_EQUAL arg = primitiveArgument
+ {fme = ExpressionFactory.createFeatureMatchExpression(f, op, arg,
$blockDeclaration::env);}
+ ;
+
+
variable returns [Token var = null]
:
{isVariable($blockDeclaration::env, input.LT(1).getText())}? v =
Identifier {var = v;}
@@ -1241,7 +1249,10 @@ action returns [AbstractRutaAction resu
| a = actionRemoveRetainType
| a = actionAddFilterType
| a = actionRemoveFilterType
- | (a = externalAction)=> a = externalAction
+ | (externalAction)=> a = externalAction
+ | (featureAssignmentExpression)=> fae = featureAssignmentExpression {a
= ActionFactory.createAction(fae);}
+ | (typeExpression)=> te = typeExpression {a =
ActionFactory.createAction(te);}
+
// | a = variableAction
) {result = a;}
;
Modified:
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java?rev=1482766&r1=1482765&r2=1482766&view=diff
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
(original)
+++
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
Wed May 15 11:18:39 2013
@@ -27,6 +27,7 @@ import org.antlr.runtime.Token;
import org.apache.uima.ruta.RutaBlock;
import org.apache.uima.ruta.expression.RutaExpression;
import org.apache.uima.ruta.expression.bool.BooleanExpression;
+import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
import org.apache.uima.ruta.expression.list.ListExpression;
import org.apache.uima.ruta.expression.list.StringListExpression;
import org.apache.uima.ruta.expression.list.TypeListExpression;
@@ -264,6 +265,14 @@ public class ActionFactory {
return new TrimAction(types, typeList);
}
+ public static AbstractRutaAction createAction(FeatureMatchExpression fae) {
+ return new ImplicitFeatureAction(fae);
+ }
+
+ public static AbstractRutaAction createAction(TypeExpression te) {
+ return new ImplicitMarkAction(te);
+ }
+
}
Added:
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java?rev=1482766&view=auto
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
(added)
+++
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
Wed May 15 11:18:39 2013
@@ -0,0 +1,154 @@
+/*
+ * 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.action;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.uima.cas.Feature;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.TypeSystem;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.UIMAConstants;
+import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.bool.BooleanExpression;
+import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
+import org.apache.uima.ruta.expression.number.NumberExpression;
+import org.apache.uima.ruta.expression.string.StringExpression;
+import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.rule.AnnotationComparator;
+import org.apache.uima.ruta.rule.RuleElement;
+import org.apache.uima.ruta.rule.RuleMatch;
+import org.apache.uima.ruta.utils.UIMAUtils;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+public class ImplicitFeatureAction extends AbstractRutaAction {
+
+ private FeatureMatchExpression expr;
+
+ private Comparator<? super AnnotationFS> comp = new AnnotationComparator();
+
+ public ImplicitFeatureAction(FeatureMatchExpression expr) {
+ super();
+ this.expr = expr;
+ }
+
+ @Override
+ public void execute(RuleMatch match, RuleElement element, RutaStream stream,
InferenceCrowd crowd) {
+ TypeExpression typeExpr = expr.getTypeExpr();
+ Type type = typeExpr.getType(element.getParent());
+ List<AnnotationFS> matchedAnnotations =
match.getMatchedAnnotationsOf(element, stream);
+ Collection<AnnotationFS> annotations = new TreeSet<AnnotationFS>(comp);
+ for (AnnotationFS annotation : matchedAnnotations) {
+ annotations.addAll(getAnnotations(annotation, type, expr, stream));
+ }
+ for (AnnotationFS each : annotations) {
+ stream.getCas().removeFsFromIndexes(each);
+ }
+ Collection<AnnotationFS> featureAnnotations =
expr.getFeatureAnnotations(annotations, stream,
+ element.getParent(), false);
+ Feature feature = expr.getFeature(element.getParent());
+ RutaExpression arg = expr.getArg();
+ for (AnnotationFS each : featureAnnotations) {
+ setFeatureValue(each, feature, arg, element, stream);
+ }
+ for (AnnotationFS each : annotations) {
+ stream.getCas().addFsToIndexes(each);
+ }
+ }
+
+ private void setFeatureValue(AnnotationFS a, Feature feature, RutaExpression
argExpr,
+ RuleElement element, RutaStream stream) {
+ String range = feature.getRange().getName();
+ if (range.equals(UIMAConstants.TYPE_STRING)) {
+ if (argExpr instanceof StringExpression) {
+ StringExpression stringExpr = (StringExpression) argExpr;
+ String string = stringExpr.getStringValue(element.getParent());
+ a.setStringValue(feature, string);
+ }
+ } else if (argExpr instanceof NumberExpression
+ && (range.equals(UIMAConstants.TYPE_INTEGER) ||
range.equals(UIMAConstants.TYPE_LONG)
+ || range.equals(UIMAConstants.TYPE_SHORT) || range
+ .equals(UIMAConstants.TYPE_BYTE))) {
+ NumberExpression numberExpr = (NumberExpression) argExpr;
+ int v = numberExpr.getIntegerValue(element.getParent());
+ a.setIntValue(feature, v);
+ } else if (argExpr instanceof NumberExpression &&
(range.equals(UIMAConstants.TYPE_DOUBLE))) {
+ NumberExpression numberExpr = (NumberExpression) argExpr;
+ double v = numberExpr.getDoubleValue(element.getParent());
+ a.setDoubleValue(feature, v);
+ } else if (argExpr instanceof NumberExpression &&
(range.equals(UIMAConstants.TYPE_FLOAT))) {
+ NumberExpression numberExpr = (NumberExpression) argExpr;
+ float v = numberExpr.getFloatValue(element.getParent());
+ a.setFloatValue(feature, v);
+ } else if (argExpr instanceof BooleanExpression &&
(range.equals(UIMAConstants.TYPE_BOOLEAN))) {
+ BooleanExpression booleanExpr = (BooleanExpression) argExpr;
+ boolean v = booleanExpr.getBooleanValue(element.getParent());
+ a.setBooleanValue(feature, v);
+ } else if (argExpr instanceof BooleanExpression &&
(range.equals(UIMAConstants.TYPE_BOOLEAN))) {
+ BooleanExpression booleanExpr = (BooleanExpression) argExpr;
+ boolean v = booleanExpr.getBooleanValue(element.getParent());
+ a.setBooleanValue(feature, v);
+ } else if (argExpr instanceof TypeExpression &&
!feature.getRange().isPrimitive()) {
+ TypeExpression typeExpr = (TypeExpression) argExpr;
+ Type t = typeExpr.getType(element.getParent());
+ List<AnnotationFS> inWindow = stream.getAnnotationsInWindow(a, t);
+ if (feature.getRange().isArray()) {
+ a.setFeatureValue(feature, UIMAUtils.toFSArray(stream.getJCas(),
inWindow));
+ } else {
+ AnnotationFS annotation = inWindow.get(0);
+ a.setFeatureValue(feature, annotation);
+ }
+ }
+ }
+
+ private List<AnnotationFS> getAnnotations(AnnotationFS annotation, Type type,
+ FeatureMatchExpression fme, RutaStream stream) {
+ List<AnnotationFS> result = new ArrayList<AnnotationFS>();
+ TypeSystem typeSystem = stream.getCas().getTypeSystem();
+ if (typeSystem.subsumes(type, annotation.getType())) {
+ result.add(annotation);
+ } else {
+ Set<AnnotationFS> beginAnchors =
stream.getBeginAnchor(annotation.getBegin())
+ .getBeginAnchors(type);
+ Set<AnnotationFS> endAnchors =
stream.getEndAnchor(annotation.getEnd()).getEndAnchors(type);
+ @SuppressWarnings("unchecked")
+ Collection<AnnotationFS> intersection = CollectionUtils
+ .intersection(beginAnchors, endAnchors);
+ result.addAll(intersection);
+ }
+ return result;
+ }
+
+ public FeatureMatchExpression getExpr() {
+ return expr;
+ }
+
+ public void setExpr(FeatureMatchExpression expr) {
+ this.expr = expr;
+ }
+
+}
Added:
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitMarkAction.java
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitMarkAction.java?rev=1482766&view=auto
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitMarkAction.java
(added)
+++
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitMarkAction.java
Wed May 15 11:18:39 2013
@@ -0,0 +1,50 @@
+/*
+ * 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.action;
+
+import java.util.List;
+
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.rule.RuleElement;
+import org.apache.uima.ruta.rule.RuleMatch;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+public class ImplicitMarkAction extends AbstractMarkAction {
+
+ public ImplicitMarkAction(TypeExpression te) {
+ super(te);
+ }
+
+ @Override
+ public void execute(RuleMatch match, RuleElement element, RutaStream stream,
InferenceCrowd crowd) {
+ List<AnnotationFS> matchedAnnotations =
match.getMatchedAnnotations(stream, null,
+ element.getContainer());
+ for (AnnotationFS matchedAnnotation : matchedAnnotations) {
+ if (matchedAnnotation == null) {
+ return;
+ }
+ createAnnotation(matchedAnnotation, element, stream, match);
+ }
+
+ }
+
+}
Modified:
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1482766&r1=1482765&r2=1482766&view=diff
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
(original)
+++
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
Wed May 15 11:18:39 2013
@@ -903,6 +903,11 @@ externalTypeFunction returns [Expression
}
;
+featureAssignmentExpression returns [Expression expr = null]
+ :
+ feature = dottedId comp = ASSIGN_EQUAL value = primitiveArgument {expr
= ExpressionFactory.createFeatureMatch(feature, comp, value);}
+ ;
+
featureTypeExpression returns [Expression expr = null]
:
feature = dottedId (comp = EQUAL | comp = NOTEQUAL) value =
primitiveArgument {expr = ExpressionFactory.createFeatureMatch(feature, comp,
value);}
@@ -1288,12 +1293,17 @@ result = ActionFactory.createEmptyAction
| a = actionAddRetainType
| a = actionRemoveFilterType
| a = actionRemoveRetainType
- | a = externalAction
+ | (externalAction)=> a = externalAction
+ | (featureAssignmentExpression)=> fae = featureAssignmentExpression {a
= ActionFactory.createAction(fae);}
+ | (typeExpression)=> te = typeExpression {a =
ActionFactory.createAction(te);}
+
// | a = variableAction
) {result = a;}
;
+
+
variableAction returns [RutaAction action = null]
:
// also create an dummy action for auto-completion
Modified:
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ActionFactory.java
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ActionFactory.java?rev=1482766&r1=1482765&r2=1482766&view=diff
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ActionFactory.java
(original)
+++
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ActionFactory.java
Wed May 15 11:18:39 2013
@@ -235,4 +235,20 @@ public class ActionFactory extends Abstr
nameEnd, assignments, structure);
}
+ public static RutaAction createAction(Expression... exprsArray) {
+ List<Expression> exprL = new ArrayList<Expression>();
+ if (exprsArray != null) {
+ for (int i = 0; i < exprsArray.length; i++) {
+ Expression expression = exprsArray[i];
+ if (expression != null) {
+ exprL.add(expression);
+ }
+ }
+ }
+ int[] bounds = getBounds(exprL.get(0), exprL.get(exprL.size()-1));
+ return new RutaAction(bounds[0], bounds[1], exprL,
+ ExpressionConstants.USER_EXPRESSION_START, "", bounds[0],
+ bounds[0]);
+ }
+
}
Modified:
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
URL:
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java?rev=1482766&r1=1482765&r2=1482766&view=diff
==============================================================================
---
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
(original)
+++
uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/ExpressionFactory.java
Wed May 15 11:18:39 2013
@@ -110,7 +110,10 @@ public class ExpressionFactory extends A
// =====> TYPE-EXPRESSIONS <======
public static Expression createTypeExpression(Expression e) {
- return new RutaExpression(e.sourceStart(), e.sourceEnd(), e,
RutaTypeConstants.RUTA_TYPE_AT);
+ if(e != null) {
+ return new RutaExpression(e.sourceStart(), e.sourceEnd(), e,
RutaTypeConstants.RUTA_TYPE_AT);
+ }
+ return null;
}
public static Expression createEmptyTypeExpression(Token token) {