Author: pkluegl Date: Sat Jun 8 18:01:10 2013 New Revision: 1491023 URL: http://svn.apache.org/r1491023 Log: UIMA-2980 - added optional annotations, which will be filtered by rule match
Added: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java Modified: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml Modified: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1491023&r1=1491022&r2=1491023&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Sat Jun 8 18:01:10 2013 @@ -199,10 +199,7 @@ public class RutaStream extends FSIterat public void addAnnotation(AnnotationFS annotation, boolean addToIndex, AbstractRuleMatch<? extends AbstractRule> creator) { - if (addToIndex) { - cas.addFsToIndexes(annotation); - } - addAnnotation(annotation, creator); + addAnnotation(annotation, true, true, creator); } public void addAnnotation(AnnotationFS annotation, @@ -233,6 +230,7 @@ public class RutaStream extends FSIterat crowd.annotationAdded(annotation, creator); } + private boolean checkSpan(AnnotationFS annotation) { boolean result = false; int begin = annotation.getBegin(); Modified: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java?rev=1491023&r1=1491022&r2=1491023&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java (original) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java Sat Jun 8 18:01:10 2013 @@ -85,6 +85,8 @@ public class RutaEngine extends JCasAnno public static final String BASIC_TYPE = "org.apache.uima.ruta.type.RutaBasic"; + public static final String OPTIONAL_TYPE = "org.apache.uima.ruta.type.RutaOptional"; + public static final String SEEDERS = "seeders"; public static final String REMOVE_BASICS = "removeBasics"; @@ -131,6 +133,8 @@ public class RutaEngine extends JCasAnno public static final String SIMPLE_GREEDY_FOR_COMPOSED = "simpleGreedyForComposed"; + + private String[] seeders; private Boolean createDebugInfo; Modified: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java?rev=1491023&r1=1491022&r2=1491023&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java (original) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java Sat Jun 8 18:01:10 2013 @@ -32,6 +32,7 @@ import org.apache.uima.cas.text.Annotati import org.apache.uima.ruta.RutaStream; import org.apache.uima.ruta.ScriptApply; import org.apache.uima.ruta.action.AbstractRutaAction; +import org.apache.uima.ruta.engine.RutaEngine; public class RuleMatch extends AbstractRuleMatch<RutaRule> { @@ -150,10 +151,16 @@ public class RuleMatch extends AbstractR for (RuleElementMatch ruleElementMatch : list2) { List<AnnotationFS> textsMatched = ruleElementMatch.getTextsMatched(); if (textsMatched != null && !textsMatched.isEmpty()) { - begin = Math.min(textsMatched.get(0).getBegin(), begin); - end = Math.max(textsMatched.get(textsMatched.size() - 1).getEnd(), end); - if (cas == null) { - cas = textsMatched.get(0).getCAS(); + AnnotationFS first = getFirstNormal(textsMatched); + if (first != null) { + begin = Math.min(first.getBegin(), begin); + } + AnnotationFS last = getLastNormal(textsMatched); + if (last != null) { + end = Math.max(last.getEnd(), end); + } + if (cas == null && first != null) { + cas = first.getCAS(); } } } @@ -167,6 +174,34 @@ public class RuleMatch extends AbstractR return result; } + private AnnotationFS getFirstNormal(List<AnnotationFS> textsMatched) { + // hotfix for invisible dummy matches + int pointer = 0; + AnnotationFS annotationFS = null; + while (pointer < textsMatched.size() && (annotationFS = textsMatched.get(pointer)) != null + && annotationFS.getType().getName().equals(RutaEngine.OPTIONAL_TYPE)) { + pointer++; + } + if (pointer < textsMatched.size()) { + return annotationFS; + } + return null; + } + + private AnnotationFS getLastNormal(List<AnnotationFS> textsMatched) { + // hotfix for invisible dummy matches + int pointer = textsMatched.size() - 1; + AnnotationFS annotationFS = null; + while (pointer >= 0 && (annotationFS = textsMatched.get(pointer)) != null + && annotationFS.getType().getName().equals(RutaEngine.OPTIONAL_TYPE)) { + pointer--; + } + if (pointer >= 0) { + return annotationFS; + } + return null; + } + public static List<Integer> extendIndexes(List<Integer> indexes) { if (indexes == null || indexes.size() <= 1) { return indexes; Modified: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java?rev=1491023&r1=1491022&r2=1491023&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java (original) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java Sat Jun 8 18:01:10 2013 @@ -36,6 +36,7 @@ import org.apache.uima.ruta.RutaBlock; import org.apache.uima.ruta.RutaStream; import org.apache.uima.ruta.action.AbstractRutaAction; import org.apache.uima.ruta.condition.AbstractRutaCondition; +import org.apache.uima.ruta.engine.RutaEngine; import org.apache.uima.ruta.expression.string.StringExpression; import org.apache.uima.ruta.type.RutaBasic; import org.apache.uima.ruta.type.RutaFrame; @@ -443,23 +444,30 @@ public class WildCardRuleElement extends end = later.getBegin(); } + int filteredBegin = begin; + int filteredEnd = end; RutaBasic beginAnchor = stream.getBeginAnchor(begin); RutaBasic endAnchor = stream.getEndAnchor(end); if (beginAnchor != null && !stream.isVisible(beginAnchor)) { beginAnchor = stream.getBasicNextTo(false, beginAnchor); - if(beginAnchor != null) { - begin = beginAnchor.getBegin(); + if (beginAnchor != null) { + filteredBegin = beginAnchor.getBegin(); } } if (endAnchor != null && !stream.isVisible(endAnchor)) { endAnchor = stream.getBasicNextTo(true, endAnchor); - if(endAnchor != null) { - end = endAnchor.getEnd(); + if (endAnchor != null) { + filteredEnd = endAnchor.getEnd(); } } + if(filteredBegin < filteredEnd) { + begin = filteredBegin; + end = filteredEnd; + } else { + type = cas.getTypeSystem().getType(RutaEngine.OPTIONAL_TYPE); + } AnnotationFS afs = cas.createAnnotation(type, begin, end); - return afs; } Added: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java?rev=1491023&view=auto ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java (added) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java Sat Jun 8 18:01:10 2013 @@ -0,0 +1,65 @@ + + +/* First created by JCasGen Sat Jun 08 19:25:02 CEST 2013 */ +package org.apache.uima.ruta.type; + +import org.apache.uima.jcas.JCas; +import org.apache.uima.jcas.JCasRegistry; +import org.apache.uima.jcas.cas.TOP_Type; + +import org.apache.uima.jcas.tcas.Annotation; + + +/** + * Updated by JCasGen Sat Jun 08 19:25:02 CEST 2013 + * XML source: D:/work/workspace-tmb5/ruta/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml + * @generated */ +public class RutaOptional extends Annotation { + /** @generated + * @ordered + */ + @SuppressWarnings ("hiding") + public final static int typeIndexID = JCasRegistry.register(RutaOptional.class); + /** @generated + * @ordered + */ + @SuppressWarnings ("hiding") + public final static int type = typeIndexID; + /** @generated */ + @Override + public int getTypeIndexID() {return typeIndexID;} + + /** Never called. Disable default constructor + * @generated */ + protected RutaOptional() {/* intentionally empty block */} + + /** Internal - constructor used by generator + * @generated */ + public RutaOptional(int addr, TOP_Type type) { + super(addr, type); + readObject(); + } + + /** @generated */ + public RutaOptional(JCas jcas) { + super(jcas); + readObject(); + } + + /** @generated */ + public RutaOptional(JCas jcas, int begin, int end) { + super(jcas); + setBegin(begin); + setEnd(end); + readObject(); + } + + /** <!-- begin-user-doc --> + * Write your own initialization here + * <!-- end-user-doc --> + @generated modifiable */ + private void readObject() {/*default - does nothing empty block */} + +} + + \ No newline at end of file Added: uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java?rev=1491023&view=auto ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java (added) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java Sat Jun 8 18:01:10 2013 @@ -0,0 +1,58 @@ + +/* First created by JCasGen Sat Jun 08 19:25:02 CEST 2013 */ +package org.apache.uima.ruta.type; + +import org.apache.uima.jcas.JCas; +import org.apache.uima.jcas.JCasRegistry; +import org.apache.uima.cas.impl.CASImpl; +import org.apache.uima.cas.impl.FSGenerator; +import org.apache.uima.cas.FeatureStructure; +import org.apache.uima.cas.impl.TypeImpl; +import org.apache.uima.cas.Type; +import org.apache.uima.jcas.tcas.Annotation_Type; + +/** + * Updated by JCasGen Sat Jun 08 19:25:02 CEST 2013 + * @generated */ +public class RutaOptional_Type extends Annotation_Type { + /** @generated */ + @Override + protected FSGenerator getFSGenerator() {return fsGenerator;} + /** @generated */ + private final FSGenerator fsGenerator = + new FSGenerator() { + public FeatureStructure createFS(int addr, CASImpl cas) { + if (RutaOptional_Type.this.useExistingInstance) { + // Return eq fs instance if already created + FeatureStructure fs = RutaOptional_Type.this.jcas.getJfsFromCaddr(addr); + if (null == fs) { + fs = new RutaOptional(addr, RutaOptional_Type.this); + RutaOptional_Type.this.jcas.putJfsFromCaddr(addr, fs); + return fs; + } + return fs; + } else return new RutaOptional(addr, RutaOptional_Type.this); + } + }; + /** @generated */ + @SuppressWarnings ("hiding") + public final static int typeIndexID = RutaOptional.typeIndexID; + /** @generated + @modifiable */ + @SuppressWarnings ("hiding") + public final static boolean featOkTst = JCasRegistry.getFeatOkTst("org.apache.uima.ruta.type.RutaOptional"); + + + + /** initialize variables to correspond with Cas Type and Features + * @generated */ + public RutaOptional_Type(JCas jcas, Type casType) { + super(jcas, casType); + casImpl.getFSClassRegistry().addGeneratorForType((TypeImpl)this.casType, getFSGenerator()); + + } +} + + + + \ No newline at end of file Modified: uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml?rev=1491023&r1=1491022&r2=1491023&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml (original) +++ uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml Sat Jun 8 18:01:10 2013 @@ -37,6 +37,11 @@ </features> </typeDescription> <typeDescription> + <name>org.apache.uima.ruta.type.RutaOptional</name> + <description/> + <supertypeName>uima.tcas.Annotation</supertypeName> + </typeDescription> + <typeDescription> <name>org.apache.uima.ruta.type.RutaAnnotation</name> <description/> <supertypeName>uima.tcas.Annotation</supertypeName> Modified: uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml?rev=1491023&r1=1491022&r2=1491023&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml (original) +++ uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml Sat Jun 8 18:01:10 2013 @@ -37,6 +37,11 @@ </features> </typeDescription> <typeDescription> + <name>org.apache.uima.ruta.type.RutaOptional</name> + <description/> + <supertypeName>uima.tcas.Annotation</supertypeName> + </typeDescription> + <typeDescription> <name>org.apache.uima.ruta.type.RutaAnnotation</name> <description/> <supertypeName>uima.tcas.Annotation</supertypeName>