You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2014/05/21 15:06:36 UTC
svn commit: r1596568 - in /uima/ruta/trunk:
ruta-core-ext/src/main/java/org/apache/uima/ruta/block/
ruta-core-ext/src/test/java/org/apache/uima/ruta/block/
ruta-core/src/main/java/org/apache/uima/ruta/
ruta-core/src/main/java/org/apache/uima/ruta/rule/...
Author: pkluegl
Date: Wed May 21 13:06:36 2014
New Revision: 1596568
URL: http://svn.apache.org/r1596568
Log:
UIMA-3833
- added new extension: ONLYONCE block
- added test
- added ide extension
Added:
uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlock.java (with props)
uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockExtension.java (with props)
uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyOnceBlockTest.java (with props)
uima/ruta/trunk/ruta-ep-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockIDEExtension.java (with props)
Modified:
uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java
uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyFirstBlockTest.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
uima/ruta/trunk/ruta-ep-core-ext/plugin.xml
Modified: uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java?rev=1596568&r1=1596567&r2=1596568&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java (original)
+++ uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyFirstBlock.java Wed May 21 13:06:36 2014
@@ -32,7 +32,6 @@ import org.apache.uima.ruta.rule.Abstrac
import org.apache.uima.ruta.rule.AbstractRuleMatch;
import org.apache.uima.ruta.rule.RuleApply;
import org.apache.uima.ruta.rule.RuleMatch;
-import org.apache.uima.ruta.rule.RutaRule;
import org.apache.uima.ruta.rule.RutaRuleElement;
import org.apache.uima.ruta.visitor.InferenceCrowd;
Added: uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlock.java?rev=1596568&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlock.java (added)
+++ uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlock.java Wed May 21 13:06:36 2014
@@ -0,0 +1,48 @@
+/*
+ * 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.block;
+
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.RutaScriptBlock;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.ScriptApply;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+/**
+ * A block construct in UIMA Ruta, in which each rule matches only once and additional positions are
+ * skipped.
+ *
+ */
+public class OnlyOnceBlock extends RutaScriptBlock {
+
+ public OnlyOnceBlock(RutaBlock parent, String defaultNamespace) {
+ super(null, null, null, parent, defaultNamespace);
+ }
+
+ @Override
+ public ScriptApply apply(RutaStream stream, InferenceCrowd crowd) {
+ boolean oldSetting = stream.isOnlyOnce();
+ stream.setOnlyOnce(true);
+ ScriptApply result = super.apply(stream, crowd);
+ stream.setOnlyOnce(oldSetting);
+ return result;
+ }
+
+}
Propchange: uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlock.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockExtension.java?rev=1596568&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockExtension.java (added)
+++ uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockExtension.java Wed May 21 13:06:36 2014
@@ -0,0 +1,68 @@
+/*
+ * 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.block;
+
+import java.util.List;
+
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.RutaElement;
+import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.extensions.IRutaBlockExtension;
+import org.apache.uima.ruta.extensions.RutaParseException;
+import org.apache.uima.ruta.verbalize.RutaVerbalizer;
+
+public class OnlyOnceBlockExtension implements IRutaBlockExtension {
+
+ private final String[] knownExtensions = new String[] { "ONLYONCE" };
+
+ private final Class<?>[] extensions = new Class[] { OnlyOnceBlock.class };
+
+ public String verbalize(RutaElement element, RutaVerbalizer verbalizer) {
+ if (element instanceof OnlyOnceBlock) {
+ OnlyOnceBlock b = (OnlyOnceBlock) element;
+ String verbalize = verbalizer.verbalize(b, false);
+ verbalize = verbalize.replaceFirst("BLOCK", verbalizeName(element));
+ return verbalize;
+ } else {
+ return "UnknownAction";
+ }
+ }
+
+ @Override
+ public RutaBlock createBlock(String name, List<RutaExpression> args, RutaBlock env)
+ throws RutaParseException {
+ return new OnlyOnceBlock(env, name);
+ }
+
+
+ public String verbalizeName(RutaElement element) {
+ return knownExtensions[0];
+ }
+
+ public String[] getKnownExtensions() {
+ return knownExtensions;
+ }
+
+ public Class<?>[] extensions() {
+ return extensions;
+ }
+
+
+}
Propchange: uima/ruta/trunk/ruta-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockExtension.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyFirstBlockTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyFirstBlockTest.java?rev=1596568&r1=1596567&r2=1596568&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyFirstBlockTest.java (original)
+++ uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyFirstBlockTest.java Wed May 21 13:06:36 2014
@@ -38,15 +38,17 @@ public class OnlyFirstBlockTest {
@Test
public void test() {
- String document = "some text";
- String script = "ONLYFIRST Document{}{\n";
- script += "Document{-> T1};\n";
- script += "Document{-> T2};\n";
+ String document = "some text with numbers: 1 2 3 4";
+ String script = "ONLYONCE Document{}{\n";
+ script += "SW{-> T1};\n";
+ script += "NUM{-> T2};\n";
+ script += "SW+{-> T1};\n";
+ script += "NUM+{-> T4};\n";
script += "}";
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(RutaEngine.PARAM_ADDITIONAL_EXTENSIONS,
- new String[] { OnlyFirstBlockExtension.class.getName() });
+ new String[] { OnlyOnceBlockExtension.class.getName() });
CAS cas = null;
try {
cas = RutaTestUtils.getCAS(document);
@@ -63,12 +65,26 @@ public class OnlyFirstBlockTest {
ai = cas.getAnnotationIndex(t);
assertEquals(1, ai.size());
iterator = ai.iterator();
- assertEquals("some text", iterator.next().getCoveredText());
+ assertEquals("some", iterator.next().getCoveredText());
t = RutaTestUtils.getTestType(cas, 2);
ai = cas.getAnnotationIndex(t);
- assertEquals(0, ai.size());
+ assertEquals(1, ai.size());
+ iterator = ai.iterator();
+ assertEquals("1", iterator.next().getCoveredText());
+
+ t = RutaTestUtils.getTestType(cas, 3);
+ ai = cas.getAnnotationIndex(t);
+ assertEquals(1, ai.size());
+ iterator = ai.iterator();
+ assertEquals("some text with numbers", iterator.next().getCoveredText());
+ t = RutaTestUtils.getTestType(cas, 2);
+ ai = cas.getAnnotationIndex(t);
+ assertEquals(1, ai.size());
+ iterator = ai.iterator();
+ assertEquals("1 2 3 4", iterator.next().getCoveredText());
+
if (cas != null) {
cas.release();
}
Added: uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyOnceBlockTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyOnceBlockTest.java?rev=1596568&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyOnceBlockTest.java (added)
+++ uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyOnceBlockTest.java Wed May 21 13:06:36 2014
@@ -0,0 +1,77 @@
+/*
+ * 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.block;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.FSIterator;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaEngine;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.junit.Test;
+
+public class OnlyOnceBlockTest {
+
+ @Test
+ public void test() {
+ String document = "some text";
+ String script = "ONLYFIRST Document{}{\n";
+ script += "Document{-> T1};\n";
+ script += "Document{-> T2};\n";
+ script += "}";
+
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put(RutaEngine.PARAM_ADDITIONAL_EXTENSIONS,
+ new String[] { OnlyFirstBlockExtension.class.getName() });
+ CAS cas = null;
+ try {
+ cas = RutaTestUtils.getCAS(document);
+ Ruta.apply(cas, script, parameters);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ Type t = null;
+ AnnotationIndex<AnnotationFS> ai = null;
+ FSIterator<AnnotationFS> iterator = null;
+
+ t = RutaTestUtils.getTestType(cas, 1);
+ ai = cas.getAnnotationIndex(t);
+ assertEquals(1, ai.size());
+ iterator = ai.iterator();
+ assertEquals("some text", iterator.next().getCoveredText());
+
+ t = RutaTestUtils.getTestType(cas, 2);
+ ai = cas.getAnnotationIndex(t);
+ assertEquals(0, ai.size());
+
+ if (cas != null) {
+ cas.release();
+ }
+
+ }
+}
Propchange: uima/ruta/trunk/ruta-core-ext/src/test/java/org/apache/uima/ruta/block/OnlyOnceBlockTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1596568&r1=1596567&r2=1596568&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Wed May 21 13:06:36 2014
@@ -86,6 +86,8 @@ public class RutaStream extends FSIterat
private Boolean greedyRule;
+ private boolean onlyOnce = false;
+
public RutaStream(CAS cas, Type basicType, FilterManager filter, boolean lowMemoryProfile,
boolean simpleGreedyForComposed, InferenceCrowd crowd) {
super();
@@ -359,6 +361,7 @@ public class RutaStream extends FSIterat
stream.setDynamicAnchoring(dynamicAnchoring);
stream.setGreedyRuleElement(greedyRuleElement);
stream.setGreedyRule(greedyRule);
+ stream.setGreedyRule(greedyRule);
return stream;
}
@@ -752,6 +755,19 @@ public class RutaStream extends FSIterat
this.simpleGreedyForComposed = simpleGreedyForComposed;
}
+ public boolean isGreedyAnchoring() {
+ return greedyRule || greedyRuleElement;
+ }
+
+ public boolean isOnlyOnce() {
+ return onlyOnce;
+ }
+
+ public void setOnlyOnce(Boolean onlyOnce) {
+ this.onlyOnce = onlyOnce;
+ }
+
+
public boolean isVisible(AnnotationFS annotationFS) {
if (annotationFS == null) {
return false;
@@ -802,10 +818,6 @@ public class RutaStream extends FSIterat
}
}
- public boolean isGreedyAnchoring() {
- return greedyRule || greedyRuleElement;
- }
-
public Collection<AnnotationFS> getAnnotations(Type type) {
Collection<AnnotationFS> result = new LinkedList<AnnotationFS>();
AnnotationFS windowAnnotation = filter.getWindowAnnotation();
@@ -832,4 +844,6 @@ public class RutaStream extends FSIterat
return result;
}
+
+
}
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java?rev=1596568&r1=1596567&r2=1596568&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java Wed May 21 13:06:36 2014
@@ -60,8 +60,14 @@ public class RutaRuleElement extends Abs
boolean useAlternatives = anchors.size() != 1;
for (AnnotationFS eachAnchor : anchors) {
if (stream.isGreedyAnchoring() && isAlreadyCovered(eachAnchor, ruleApply, stream)) {
+ // skip if next matched should not overlap
continue;
}
+ if (stream.isOnlyOnce() && ruleApply.getApplied() > 0) {
+ // skip if the rule should only be applied once, on the first successful match
+ continue;
+ }
+
ComposedRuleElementMatch extendedContainerMatch = containerMatch;
RuleMatch extendedMatch = ruleMatch;
if (useAlternatives) {
Modified: uima/ruta/trunk/ruta-ep-core-ext/plugin.xml
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-core-ext/plugin.xml?rev=1596568&r1=1596567&r2=1596568&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-core-ext/plugin.xml (original)
+++ uima/ruta/trunk/ruta-ep-core-ext/plugin.xml Wed May 21 13:06:36 2014
@@ -26,5 +26,12 @@ under the License.
engine="org.apache.uima.ruta.block.OnlyFirstBlockExtension">
</block>
</extension>
+ <extension
+ point="org.apache.uima.ruta.ide.blockExtension">
+ <block
+ class="org.apache.uima.ruta.block.OnlyOnceBlockIDEExtension"
+ engine="org.apache.uima.ruta.block.OnlyOnceBlockExtension">
+ </block>
+ </extension>
</plugin>
Added: uima/ruta/trunk/ruta-ep-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockIDEExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockIDEExtension.java?rev=1596568&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-ep-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockIDEExtension.java (added)
+++ uima/ruta/trunk/ruta-ep-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockIDEExtension.java Wed May 21 13:06:36 2014
@@ -0,0 +1,41 @@
+/*
+ * 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.block;
+
+import org.antlr.runtime.RecognitionException;
+import org.apache.uima.ruta.ide.core.extensions.IIDEConditionExtension;
+import org.apache.uima.ruta.ide.core.extensions.IRutaCheckerProblemFactory;
+import org.eclipse.dltk.ast.expressions.Expression;
+import org.eclipse.dltk.compiler.problem.IProblemReporter;
+
+public class OnlyOnceBlockIDEExtension implements IIDEConditionExtension {
+ private final String[] strings = new String[] { "ONLYONCE" };
+
+ public String[] getKnownExtensions() {
+ return strings;
+ }
+
+ public boolean checkSyntax(Expression element, IRutaCheckerProblemFactory problemFactory,
+ IProblemReporter rep) throws RecognitionException {
+ // do not add additional checks yet
+ return true;
+ }
+
+}
Propchange: uima/ruta/trunk/ruta-ep-core-ext/src/main/java/org/apache/uima/ruta/block/OnlyOnceBlockIDEExtension.java
------------------------------------------------------------------------------
svn:eol-style = native