RED-10200: refactoring and cleanup

This commit is contained in:
maverickstuder 2024-12-02 18:18:13 +01:00
parent af347de8a3
commit 8126e7f81e
6 changed files with 60 additions and 49 deletions

View File

@ -364,7 +364,7 @@ public class DocumentTree {
} }
public boolean addEntityToGraph(TextEntity entity) { public void addEntityToGraph(TextEntity entity) {
getRoot().getNode().addThisToEntityIfIntersects(entity); getRoot().getNode().addThisToEntityIfIntersects(entity);
@ -390,7 +390,6 @@ public class DocumentTree {
} }
} }
} }
return true;
} }

View File

@ -2,6 +2,13 @@ package com.iqser.red.service.redaction.v1.server.model.document.entity;
public interface EntityEventListener { public interface EntityEventListener {
/**
* Invoked when an entity is inserted.
*
* @param entity The entity that was inserted.
*/
void onEntityInserted(IEntity entity);
/** /**
* Invoked when an entity is updated. * Invoked when an entity is updated.
* *

View File

@ -4,11 +4,11 @@ import java.awt.geom.Rectangle2D;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.PriorityQueue; import java.util.PriorityQueue;
import java.util.Set; import java.util.Set;
@ -17,7 +17,6 @@ import org.apache.commons.collections4.map.HashedMap;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation;
import com.iqser.red.service.redaction.v1.server.model.document.TextRange; import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Document;
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Page; import com.iqser.red.service.redaction.v1.server.model.document.nodes.Page;
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode;
import com.iqser.red.service.redaction.v1.server.utils.IdBuilder; import com.iqser.red.service.redaction.v1.server.utils.IdBuilder;
@ -27,7 +26,6 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
/** /**
@ -76,7 +74,7 @@ public class TextEntity implements IEntity {
SemanticNode deepestFullyContainingNode; SemanticNode deepestFullyContainingNode;
@Builder.Default @Builder.Default
HashedMap<TextEntity, Relation> relations = new HashedMap<>(); Map<TextEntity, Relation> relations = new HashMap<>();
@Builder.Default @Builder.Default
Collection<EntityEventListener> entityEventListeners = new ArrayList<>(); Collection<EntityEventListener> entityEventListeners = new ArrayList<>();

View File

@ -994,12 +994,11 @@ public class EntityCreationService {
} }
return Optional.empty(); // Entity has been resized, if there are duplicates they should be treated there return Optional.empty(); // Entity has been resized, if there are duplicates they should be treated there
} }
boolean added = node.getDocumentTree().addEntityToGraph(entity); node.getDocumentTree().addEntityToGraph(entity);
if (!added) {
return Optional.empty();
}
entity.addEngines(engines);
insertToKieSession(entity); insertToKieSession(entity);
entity.addEngines(engines);
return Optional.of(entity); return Optional.of(entity);
} }
@ -1074,7 +1073,6 @@ public class EntityCreationService {
EntityEnrichmentService.enrichEntity(mergedEntity, node.getTextBlock()); EntityEnrichmentService.enrichEntity(mergedEntity, node.getTextBlock());
addEntityToGraph(mergedEntity, node); addEntityToGraph(mergedEntity, node);
insertToKieSession(mergedEntity);
entitiesToMerge.stream() entitiesToMerge.stream()
.filter(e -> !e.equals(mergedEntity)) .filter(e -> !e.equals(mergedEntity))
@ -1136,20 +1134,6 @@ public class EntityCreationService {
} }
/**
* Inserts a text entity into the kieSession for further processing.
*
* @param textEntity The merged text entity to insert.
*/
public void insertToKieSession(TextEntity textEntity) {
if(kieSessionUpdater != null) {
textEntity.addEntityEventListener(kieSessionUpdater);
kieSessionUpdater.insert(textEntity);
}
}
/** /**
* Creates a text entity based on a Named Entity Recognition (NER) entity. * Creates a text entity based on a Named Entity Recognition (NER) entity.
* *
@ -1438,6 +1422,7 @@ public class EntityCreationService {
} else { } else {
documentTree.addEntityToGraph(entity); documentTree.addEntityToGraph(entity);
insertToKieSession(entity);
} }
} }
@ -1488,4 +1473,19 @@ public class EntityCreationService {
}); });
} }
/**
* Inserts a text entity into the kieSession for further processing.
*
* @param textEntity The merged text entity to insert.
*/
public void insertToKieSession(TextEntity textEntity) {
if(kieSessionUpdater != null) {
kieSessionUpdater.insert(textEntity);
}
}
} }

View File

@ -28,8 +28,9 @@ import com.iqser.red.service.redaction.v1.server.logger.RulesLogger;
import com.iqser.red.service.redaction.v1.server.logger.TrackingAgendaEventListener; import com.iqser.red.service.redaction.v1.server.logger.TrackingAgendaEventListener;
import com.iqser.red.service.redaction.v1.server.model.NerEntities; import com.iqser.red.service.redaction.v1.server.model.NerEntities;
import com.iqser.red.service.redaction.v1.server.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.model.dictionary.Dictionary;
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity; import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Document; import com.iqser.red.service.redaction.v1.server.model.document.nodes.Document;
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Image;
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode;
import com.iqser.red.service.redaction.v1.server.service.ManualChangesApplicationService; import com.iqser.red.service.redaction.v1.server.service.ManualChangesApplicationService;
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService; import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
@ -115,17 +116,19 @@ public class EntityDroolsExecutionService {
kieSession.insert(document); kieSession.insert(document);
sectionsToAnalyze.forEach(kieSession::insert); sectionsToAnalyze.forEach(kieSession::insert);
sectionsToAnalyze.stream() sectionsToAnalyze.stream()
.flatMap(SemanticNode::streamAllSubNodes) .flatMap(SemanticNode::streamAllSubNodes)
.forEach(kieSession::insert); .forEach(semanticNode -> {
if (semanticNode instanceof Image image) {
kieSessionUpdater.insert(image);
} else {
kieSession.insert(semanticNode);
}
});
for (TextEntity entity : document.getEntities()) {
entity.addEntityEventListener(kieSessionUpdater);
kieSession.insert(entity);
}
document.getEntities() document.getEntities()
.forEach(textEntity -> textEntity.getRelations().values() .forEach(kieSessionUpdater::insert);
.forEach(kieSession::insert));
document.getPages() document.getPages()
.forEach(kieSession::insert); .forEach(kieSession::insert);

View File

@ -20,15 +20,24 @@ public class KieSessionUpdater implements EntityEventListener {
KieSession kieSession; KieSession kieSession;
public void insert(TextEntity textEntity) { public void insert(IEntity entity) {
kieSession.insert(textEntity); entity.addEntityEventListener(this);
updateIntersectingNodes(textEntity); onEntityInserted(entity);
textEntity.getRelations().values() }
.forEach(kieSession::insert);
textEntity.getRelations().keySet() @Override
.forEach(k -> kieSession.insert(k.getRelations() public void onEntityInserted(IEntity entity) {
.get(textEntity)));
if (entity instanceof TextEntity textEntity) {
updateIntersectingNodes(textEntity);
textEntity.getRelations().values()
.forEach(kieSession::insert);
textEntity.getRelations().keySet()
.forEach(k -> kieSession.insert(k.getRelations()
.get(textEntity)));
}
kieSession.insert(entity);
} }
@ -36,7 +45,6 @@ public class KieSessionUpdater implements EntityEventListener {
public void onEntityUpdated(IEntity entity) { public void onEntityUpdated(IEntity entity) {
if (entity instanceof TextEntity textEntity) { if (entity instanceof TextEntity textEntity) {
kieSession.update(kieSession.getFactHandle(textEntity), textEntity);
updateIntersectingNodes(textEntity); updateIntersectingNodes(textEntity);
textEntity.getRelations().values() textEntity.getRelations().values()
.forEach(this::updateFactIfPresent); .forEach(this::updateFactIfPresent);
@ -45,13 +53,13 @@ public class KieSessionUpdater implements EntityEventListener {
.get(textEntity))); .get(textEntity)));
} }
if (entity instanceof Image image) { if (entity instanceof Image image) {
kieSession.update(kieSession.getFactHandle(image), image);
SemanticNode parent = image; SemanticNode parent = image;
while (parent.hasParent()) { while (parent.hasParent()) {
parent = parent.getParent(); parent = parent.getParent();
kieSession.update(kieSession.getFactHandle(parent), parent); kieSession.update(kieSession.getFactHandle(parent), parent);
} }
} }
kieSession.update(kieSession.getFactHandle(entity), entity);
} }
@ -59,8 +67,6 @@ public class KieSessionUpdater implements EntityEventListener {
public void onEntityRemoved(IEntity entity) { public void onEntityRemoved(IEntity entity) {
if (entity instanceof TextEntity textEntity) { if (entity instanceof TextEntity textEntity) {
//test replace all deletes with updates
kieSession.delete(kieSession.getFactHandle(textEntity));
updateIntersectingNodes(textEntity); updateIntersectingNodes(textEntity);
textEntity.getRelations().values() textEntity.getRelations().values()
.forEach(this::deleteFactIfPresent); .forEach(this::deleteFactIfPresent);
@ -69,15 +75,13 @@ public class KieSessionUpdater implements EntityEventListener {
.get(textEntity))); .get(textEntity)));
} }
if (entity instanceof Image image) { if (entity instanceof Image image) {
kieSession.delete(kieSession.getFactHandle(image));
SemanticNode parent = image; SemanticNode parent = image;
while (parent.hasParent()) { while (parent.hasParent()) {
parent = parent.getParent(); parent = parent.getParent();
kieSession.update(kieSession.getFactHandle(parent), parent); kieSession.update(kieSession.getFactHandle(parent), parent);
} }
} }
kieSession.delete(kieSession.getFactHandle(entity));
} }