//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.consumers.csv.internals;
import java.util.Collection;
import java.util.Map;
import org.apache.uima.UimaContext;
import org.apache.uima.fit.util.JCasUtil;
import org.apache.uima.jcas.JCas;
import org.apache.uima.resource.ResourceInitializationException;
import uk.gov.dstl.baleen.consumers.csv.AbstractCsvConsumer;
import uk.gov.dstl.baleen.types.language.Sentence;
import uk.gov.dstl.baleen.types.semantic.Relation;
/**
* Write relations to CSV.
* <p>
* Format is:
*
* <ul>
* <li>source
* <li>sentence
* <li>type
* <li>subtype
* <li>source
* <li>target
* <li>sourceText
* <li>targetText
* <li>sourceType
* <li>targetType
* </ul>
*
* @baleen.javadoc
*/
public class CsvRelation extends AbstractCsvConsumer {
@Override
public void doInitialize(UimaContext aContext) throws ResourceInitializationException {
super.doInitialize(aContext);
write("source", "sentence", "type", "subtype", "source", "target", "sourceText", "targetText",
"sourceType", "targetType");
}
@Override
protected void write(JCas jCas) {
final String source = getDocumentAnnotation(jCas).getSourceUri();
final Map<Relation, Collection<Sentence>> coveringSentence = JCasUtil.indexCovering(jCas, Relation.class,
Sentence.class);
JCasUtil.select(jCas, Relation.class).stream().map(r -> {
String sentence = "";
final Collection<Sentence> sentences = coveringSentence.get(r);
if (!sentences.isEmpty())
sentence = sentences.iterator().next().getCoveredText();
return new String[] {source, sentence,
r.getRelationshipType(), r.getRelationSubType(),
normalize(r.getSource().getValue()), normalize(r.getTarget().getValue()),
normalize(r.getSource().getCoveredText()), normalize(r.getTarget().getCoveredText()),
r.getSource().getType().getShortName(), r.getTarget().getType().getShortName()
};
}).forEach(this::write);
}
}