use of de.tudarmstadt.ukp.clarin.webanno.api.annotation.rendering.model.VCommentType.ERROR in project webanno by webanno.
the class RelationRendererTest method thatRelationOverlapBehaviorOnRenderGeneratesErrors.
@Test
public void thatRelationOverlapBehaviorOnRenderGeneratesErrors() throws Exception {
TokenBuilder<Token, Sentence> builder = new TokenBuilder<>(Token.class, Sentence.class);
builder.buildTokens(jcas, "This is a test .\nThis is sentence two .");
for (Token t : select(jcas, Token.class)) {
POS pos = new POS(jcas, t.getBegin(), t.getEnd());
t.setPos(pos);
pos.addToIndexes();
}
RelationAdapter adapter = new RelationAdapter(layerSupportRegistry, featureSupportRegistry, null, depLayer, FEAT_REL_TARGET, FEAT_REL_SOURCE, () -> asList(dependencyLayerGovernor, dependencyLayerDependent), behaviors);
List<POS> posAnnotations = new ArrayList<>(select(jcas, POS.class));
POS source = posAnnotations.get(0);
POS target = posAnnotations.get(1);
RelationRenderer sut = new RelationRenderer(adapter, layerSupportRegistry, featureSupportRegistry, asList(new RelationOverlapBehavior()));
// Create two annotations stacked annotations
depLayer.setOverlapMode(ANY_OVERLAP);
AnnotationFS dep1 = adapter.add(document, username, source, target, jcas.getCas());
AnnotationFS dep2 = adapter.add(document, username, source, target, jcas.getCas());
{
depLayer.setOverlapMode(ANY_OVERLAP);
VDocument vdoc = new VDocument();
sut.render(jcas.getCas(), asList(), vdoc, 0, jcas.getDocumentText().length());
assertThat(vdoc.comments()).filteredOn(c -> !YIELD.equals(c.getCommentType())).isEmpty();
}
{
depLayer.setOverlapMode(STACKING_ONLY);
VDocument vdoc = new VDocument();
sut.render(jcas.getCas(), asList(), vdoc, 0, jcas.getDocumentText().length());
assertThat(vdoc.comments()).filteredOn(c -> !YIELD.equals(c.getCommentType())).isEmpty();
}
{
depLayer.setOverlapMode(OVERLAP_ONLY);
VDocument vdoc = new VDocument();
sut.render(jcas.getCas(), asList(), vdoc, 0, jcas.getDocumentText().length());
assertThat(vdoc.comments()).filteredOn(c -> !YIELD.equals(c.getCommentType())).usingFieldByFieldElementComparator().contains(new VComment(dep1, ERROR, "Stacking is not permitted."), new VComment(dep2, ERROR, "Stacking is not permitted."));
}
{
depLayer.setOverlapMode(NO_OVERLAP);
VDocument vdoc = new VDocument();
sut.render(jcas.getCas(), asList(), vdoc, 0, jcas.getDocumentText().length());
assertThat(vdoc.comments()).filteredOn(c -> !YIELD.equals(c.getCommentType())).usingFieldByFieldElementComparator().contains(new VComment(dep1, ERROR, "Stacking is not permitted."), new VComment(dep2, ERROR, "Stacking is not permitted."));
}
// Remove the stacked annotation and introduce one that is purely overlapping
adapter.delete(document, username, jcas.getCas(), new VID(dep2));
depLayer.setOverlapMode(ANY_OVERLAP);
AnnotationFS dep3 = adapter.add(document, username, source, posAnnotations.get(2), jcas.getCas());
{
depLayer.setOverlapMode(NO_OVERLAP);
VDocument vdoc = new VDocument();
sut.render(jcas.getCas(), asList(), vdoc, 0, jcas.getDocumentText().length());
assertThat(vdoc.comments()).filteredOn(c -> !YIELD.equals(c.getCommentType())).usingFieldByFieldElementComparator().contains(new VComment(dep1, ERROR, "Overlap is not permitted."), new VComment(dep3, ERROR, "Overlap is not permitted."));
}
}
use of de.tudarmstadt.ukp.clarin.webanno.api.annotation.rendering.model.VCommentType.ERROR in project webanno by webanno.
the class SpanOverlapBehavior method onRender.
@Override
public void onRender(TypeAdapter aAdapter, VDocument aResponse, Map<AnnotationFS, VSpan> aAnnoToSpanIdx, int aPageBegin, int aPageEnd) {
if (aAnnoToSpanIdx.isEmpty()) {
return;
}
// The following code requires annotations with the same offsets to be adjacent during
// iteration, so we sort the entries here
AnnotationComparator cmp = new AnnotationComparator();
final List<AnnotationFS> sortedSpans = aAnnoToSpanIdx.keySet().stream().sorted(cmp).collect(Collectors.toList());
switch(aAdapter.getLayer().getOverlapMode()) {
case ANY_OVERLAP:
// Nothing to check
break;
case NO_OVERLAP:
{
Set<AnnotationFS> overlapping = new HashSet<>();
Set<AnnotationFS> stacking = new HashSet<>();
overlappingOrStackingSpans(sortedSpans, stacking, overlapping);
overlapping.forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Overlap is not permitted.")));
stacking.forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Stacking is not permitted.")));
break;
}
case STACKING_ONLY:
// Here, we must find all overlapping relations because they are not permitted
overlappingNonStackingSpans(sortedSpans).forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Only stacking is permitted.")));
break;
case OVERLAP_ONLY:
stackingSpans(sortedSpans).forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Stacking is not permitted.")));
break;
}
}
use of de.tudarmstadt.ukp.clarin.webanno.api.annotation.rendering.model.VCommentType.ERROR in project webanno by webanno.
the class RelationOverlapBehavior method onRender.
@Override
public void onRender(TypeAdapter aAdapter, VDocument aResponse, Map<AnnotationFS, VArc> aAnnoToArcIdx) {
if (aAnnoToArcIdx.isEmpty()) {
return;
}
final AnnotationLayer layer = aAdapter.getLayer();
final RelationAdapter adapter = (RelationAdapter) aAdapter;
final CAS cas = aAnnoToArcIdx.keySet().iterator().next().getCAS();
final Type type = getType(cas, adapter.getAnnotationTypeName());
final Feature targetFeature = type.getFeatureByBaseName(adapter.getTargetFeatureName());
final Feature sourceFeature = type.getFeatureByBaseName(adapter.getSourceFeatureName());
AnnotationComparator cmp = new AnnotationComparator();
final List<AnnotationFS> sortedRelations = aAnnoToArcIdx.keySet().stream().sorted(cmp).collect(Collectors.toList());
switch(layer.getOverlapMode()) {
case ANY_OVERLAP:
// Nothing to check
break;
case NO_OVERLAP:
{
Set<AnnotationFS> overlapping = new HashSet<>();
Set<AnnotationFS> stacking = new HashSet<>();
overlappingOrStackingRelations(sortedRelations, sourceFeature, targetFeature, stacking, overlapping);
overlapping.forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Overlap is not permitted.")));
stacking.forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Stacking is not permitted.")));
break;
}
case STACKING_ONLY:
{
// Here, we must find all overlapping relations because they are not permitted
overlappingNonStackingRelations(sortedRelations, sourceFeature, targetFeature).forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Only stacking is permitted.")));
break;
}
case OVERLAP_ONLY:
// Here, we must find all stacked relations because they are not permitted.
// We go through all relations based on the their offsets. Stacked relations must have
// the same offsets (at least if we consider relations as having a direction, i.e.
// that a relation A->B does not count as stacked on a relation B->A). But since there
// can be multiple relations going out from the same sourceFS, we need to consider all
// of them for potential stacking.
stackingRelations(sortedRelations, sourceFeature, targetFeature).forEach(fs -> aResponse.add(new VComment(new VID(fs), ERROR, "Stacking is not permitted.")));
break;
}
}
Aggregations