001package org.cleartk.clearnlp;
002
003import java.util.List;
004
005import org.apache.uima.jcas.JCas;
006import org.apache.uima.jcas.cas.FSArray;
007import org.apache.uima.jcas.tcas.Annotation;
008import org.cleartk.syntax.dependency.type.DependencyNode;
009import org.cleartk.syntax.dependency.type.DependencyRelation;
010import org.cleartk.syntax.dependency.type.TopDependencyNode;
011import org.cleartk.token.type.Sentence;
012import org.cleartk.token.type.Token;
013import org.apache.uima.fit.util.FSCollectionFactory;
014import org.apache.uima.fit.util.JCasUtil;
015
016import com.google.common.annotations.Beta;
017import com.google.common.collect.Lists;
018
019/**
020 * Defines common set of dependency graph data type operations used to convert and query ClearTK dependency types
021 * such as {@link TopDependencyNode}, {@link DependencyNode} and {@link DependencyRelation}
022 * 
023 * 
024 * @author Lee Becker
025 *
026 */
027@Beta
028public class CleartkDependencyOps implements DependencyOps<DependencyNode, Token, TopDependencyNode, Sentence, DependencyRelation> {
029
030  @Override
031  public TopDependencyNode selectRootNode(JCas jCas, Annotation coveringAnnotation) {
032    List<TopDependencyNode> nodes = JCasUtil.selectCovered(jCas, TopDependencyNode.class, coveringAnnotation);
033    if (nodes.size() != 1) {
034      throw new IllegalArgumentException("Expected 1 root node, found " + nodes.size());
035    }
036    return nodes.get(0);
037  }
038
039  @Override
040  public List<DependencyNode> selectNodes(JCas jCas, Annotation coveringAnnotation) {
041    List<DependencyNode> result = Lists.newArrayList();
042    for (DependencyNode node : JCasUtil.selectCovered(jCas, DependencyNode.class, coveringAnnotation)) {
043      if (!(node instanceof TopDependencyNode)) {
044        result.add(node);
045      }
046    }
047    return result;
048  }
049
050  @Override
051  public List<DependencyRelation> getHeadRelations(JCas jCas, DependencyNode node) {
052    return Lists.newArrayList(JCasUtil.select(node.getHeadRelations(), DependencyRelation.class));
053  }
054
055  @Override
056  public DependencyNode getHead(JCas jCas, DependencyRelation relation) {
057    return relation.getHead();
058  }
059
060  @Override
061  public String getLabel(JCas jCas, DependencyRelation relation) {
062    return relation.getRelation();
063  }
064
065  @Override
066  public TopDependencyNode createRootNode(JCas jCas, Sentence sentence) {
067    return new TopDependencyNode(jCas, sentence.getBegin(), sentence.getEnd());
068  }
069
070  @Override
071  public DependencyNode createNode(JCas jCas, Token token) {
072    return new DependencyNode(jCas, token.getBegin(), token.getEnd());
073  }
074
075  @Override
076  public DependencyRelation createRelation(JCas jCas, DependencyNode head, DependencyNode child, String relation) {
077    DependencyRelation rel = new DependencyRelation(jCas);
078    rel.setChild(child);
079    rel.setHead(head);
080    rel.setRelation(relation);
081    return rel; 
082  }
083
084  @Override
085  public void setHeadRelations(
086      JCas jCas,
087      DependencyNode node,
088      List<DependencyRelation> headRelations) {
089    node.setHeadRelations(new FSArray(jCas, headRelations.size()));
090    FSCollectionFactory.fillArrayFS(node.getHeadRelations(), headRelations);
091  }
092
093  @Override
094  public void setChildRelations(
095      JCas jCas,
096      DependencyNode node,
097      List<DependencyRelation> childRelations) {
098    node.setChildRelations(new FSArray(jCas, childRelations.size()));
099    FSCollectionFactory.fillArrayFS(node.getChildRelations(), childRelations);
100  }
101
102}