RED-10200: Spike: Performant update logic for facts in working memory
This commit is contained in:
parent
d34921acd8
commit
27b5a1afcd
@ -9,6 +9,10 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Containment;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Equality;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Intersection;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.GenericSemanticNode;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.GenericSemanticNode;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.NodeType;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.NodeType;
|
||||||
@ -17,6 +21,8 @@ import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlockCollector;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlockCollector;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.utils.EntityCreationUtility;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.utils.EntityEnrichmentService;
|
||||||
|
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -358,6 +364,36 @@ public class DocumentTree {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean addEntityToGraph(TextEntity entity) {
|
||||||
|
|
||||||
|
getRoot().getNode().addThisToEntityIfIntersects(entity);
|
||||||
|
|
||||||
|
TextBlock textBlock = entity.getDeepestFullyContainingNode().getTextBlock();
|
||||||
|
EntityEnrichmentService.enrichEntity(entity, textBlock);
|
||||||
|
|
||||||
|
EntityCreationUtility.addToPages(entity);
|
||||||
|
EntityCreationUtility.addEntityToNodeEntitySets(entity);
|
||||||
|
for (TextEntity textEntity : entity.getDeepestFullyContainingNode().getEntities()) {
|
||||||
|
if (entity.intersects(textEntity) && !entity.equals(textEntity)) {
|
||||||
|
if (textEntity.getTextRange().equals(entity.getTextRange())) {
|
||||||
|
textEntity.getRelations().put(textEntity, new Equality(entity, textEntity));
|
||||||
|
entity.getRelations().put(textEntity, new Equality(textEntity, entity));
|
||||||
|
} else if (textEntity.containedBy(entity)) {
|
||||||
|
entity.getRelations().put(textEntity, new Containment(entity, textEntity));
|
||||||
|
textEntity.getRelations().put(entity, new Intersection(textEntity, entity));
|
||||||
|
} else if (entity.containedBy(textEntity)) {
|
||||||
|
textEntity.getRelations().put(entity, new Containment(textEntity, entity));
|
||||||
|
entity.getRelations().put(textEntity, new Intersection(entity, textEntity));
|
||||||
|
} else {
|
||||||
|
entity.getRelations().put(textEntity, new Intersection(entity, textEntity));
|
||||||
|
textEntity.getRelations().put(entity, new Intersection(textEntity, entity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
package com.iqser.red.service.redaction.v1.server.model.document;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SemanticNode;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
public class IntersectingNodeVisitor extends AbstractNodeVisitor {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Set<SemanticNode> intersectingNodes;
|
||||||
|
private final TextRange textRange;
|
||||||
|
|
||||||
|
|
||||||
|
public IntersectingNodeVisitor(TextRange textRange) {
|
||||||
|
|
||||||
|
this.textRange = textRange;
|
||||||
|
this.intersectingNodes = new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitNodeDefault(SemanticNode node) {
|
||||||
|
|
||||||
|
if (textRange.intersects(node.getTextRange())) {
|
||||||
|
intersectingNodes.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,16 +0,0 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public abstract class AbstractBidirectionalRelation implements BidirectionalRelation {
|
|
||||||
|
|
||||||
protected final TextEntity a;
|
|
||||||
protected final TextEntity b;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract BidirectionalRelation invert();
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
|
||||||
|
|
||||||
public interface BidirectionalRelation extends Relation {
|
|
||||||
|
|
||||||
BidirectionalRelation invert();
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,10 +1,18 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
||||||
|
|
||||||
public class Containment extends AbstractRelation {
|
public class Containment extends Intersection {
|
||||||
|
|
||||||
public Containment(TextEntity container, TextEntity contained) {
|
public Containment(TextEntity container, TextEntity contained) {
|
||||||
|
|
||||||
super(container, contained);
|
super(container, contained);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TextEntity getContainer() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextEntity getContained() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,5 +6,6 @@ public enum EntityType {
|
|||||||
RECOMMENDATION,
|
RECOMMENDATION,
|
||||||
FALSE_POSITIVE,
|
FALSE_POSITIVE,
|
||||||
FALSE_RECOMMENDATION,
|
FALSE_RECOMMENDATION,
|
||||||
DICTIONARY_REMOVAL
|
DICTIONARY_REMOVAL,
|
||||||
|
TEMPORARY
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,17 +1,10 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
||||||
|
|
||||||
public class Equality extends AbstractBidirectionalRelation {
|
public class Equality extends Containment {
|
||||||
|
|
||||||
public Equality(TextEntity a, TextEntity b) {
|
public Equality(TextEntity a, TextEntity b) {
|
||||||
|
|
||||||
super(a, b);
|
super(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Equality invert() {
|
|
||||||
|
|
||||||
return new Equality(b, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -51,16 +51,18 @@ public interface IEntity {
|
|||||||
String type();
|
String type();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks this entity and all its intersecting nodes as updated
|
* Marks this entity and all its intersecting nodes as updated
|
||||||
*/
|
*/
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks this entity and all its intersecting nodes as removed
|
* Marks this entity and all its intersecting nodes as removed
|
||||||
*/
|
*/
|
||||||
void remove();
|
void remove();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Entity is valid, when it active and not a false recommendation, a false positive or a dictionary removal.
|
* An Entity is valid, when it active and not a false recommendation, a false positive or a dictionary removal.
|
||||||
*
|
*
|
||||||
@ -349,12 +351,18 @@ public interface IEntity {
|
|||||||
*/
|
*/
|
||||||
default void addMatchedRule(MatchedRule matchedRule) {
|
default void addMatchedRule(MatchedRule matchedRule) {
|
||||||
|
|
||||||
boolean valid = valid();
|
boolean wasValid = valid();
|
||||||
getMatchedRuleList().add(matchedRule);
|
getMatchedRuleList().add(matchedRule);
|
||||||
if (valid() == valid) {
|
handleStateChange(wasValid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
default void handleStateChange(boolean wasValid) {
|
||||||
|
|
||||||
|
if (valid() == wasValid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(!removed()) {
|
if (!removed()) {
|
||||||
update();
|
update();
|
||||||
} else {
|
} else {
|
||||||
remove();
|
remove();
|
||||||
|
|||||||
@ -1,17 +1,10 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
||||||
|
|
||||||
public class Intersection extends AbstractBidirectionalRelation {
|
public class Intersection extends AbstractRelation {
|
||||||
|
|
||||||
public Intersection(TextEntity a, TextEntity b) {
|
public Intersection(TextEntity a, TextEntity b) {
|
||||||
|
|
||||||
super(a, b);
|
super(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Intersection invert() {
|
|
||||||
|
|
||||||
return new Intersection(b, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -6,4 +6,5 @@ public interface Relation {
|
|||||||
|
|
||||||
|
|
||||||
TextEntity getB();
|
TextEntity getB();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,79 +0,0 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.model.document.entity;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class RelationStore {
|
|
||||||
|
|
||||||
//
|
|
||||||
// private final Map<Pair<String, String>, Relation> relations = new HashMap<>();
|
|
||||||
private final Map<String, Set<Relation>> entityRelations = new HashMap<>();
|
|
||||||
|
|
||||||
|
|
||||||
public void addRelation(Relation relation) {
|
|
||||||
|
|
||||||
String idA = relation.getA().getId();
|
|
||||||
String idB = relation.getB().getId();
|
|
||||||
|
|
||||||
Pair<String, String> key = Pair.of(idA, idB);
|
|
||||||
// relations.put(key, relation);
|
|
||||||
|
|
||||||
if (relation instanceof BidirectionalRelation bidirectionalRelation) {
|
|
||||||
|
|
||||||
// BidirectionalRelation invertedRelation = bidirectionalRelation.invert();
|
|
||||||
// Pair<String, String> invertedKey = Pair.of(idB, idA);
|
|
||||||
// relations.put(invertedKey, invertedRelation);
|
|
||||||
entityRelations.computeIfAbsent(idB, k -> new HashSet<>()).add(relation);
|
|
||||||
}
|
|
||||||
|
|
||||||
entityRelations.computeIfAbsent(idA, k -> new HashSet<>()).add(relation);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void removeRelation(Relation relation) {
|
|
||||||
|
|
||||||
String idA = relation.getA().getId();
|
|
||||||
String idB = relation.getB().getId();
|
|
||||||
|
|
||||||
Pair<String, String> key = Pair.of(idA, idB);
|
|
||||||
// relations.remove(key);
|
|
||||||
|
|
||||||
if (relation instanceof BidirectionalRelation) {
|
|
||||||
|
|
||||||
// Pair<String, String> invertedKey = Pair.of(idB, idA);
|
|
||||||
// relations.remove(invertedKey);
|
|
||||||
entityRelations.getOrDefault(idB, Collections.emptySet()).remove(relation);
|
|
||||||
}
|
|
||||||
|
|
||||||
entityRelations.getOrDefault(idA, Collections.emptySet()).remove(relation);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Set<Relation> getRelations(String entityId) {
|
|
||||||
|
|
||||||
return entityRelations.getOrDefault(entityId, Collections.emptySet());
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// public Relation getRelation(String idA, String idB) {
|
|
||||||
//
|
|
||||||
// return relations.get(Pair.of(idA, idB));
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
public Set<Relation> getAllRelations(Set<String> entityIds) {
|
|
||||||
|
|
||||||
return entityRelations.entrySet()
|
|
||||||
.stream()
|
|
||||||
.filter(entry -> entityIds.contains(entry.getKey()))
|
|
||||||
.flatMap(entry -> entry.getValue()
|
|
||||||
.stream())
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -12,7 +12,10 @@ import java.util.Optional;
|
|||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
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.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.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;
|
||||||
@ -72,8 +75,8 @@ public class TextEntity implements IEntity {
|
|||||||
List<SemanticNode> intersectingNodes = new LinkedList<>();
|
List<SemanticNode> intersectingNodes = new LinkedList<>();
|
||||||
SemanticNode deepestFullyContainingNode;
|
SemanticNode deepestFullyContainingNode;
|
||||||
|
|
||||||
// @Builder.Default
|
@Builder.Default
|
||||||
// Set<Relation> relations = new HashSet<>();
|
HashedMap<TextEntity, Relation> relations = new HashedMap<>();
|
||||||
|
|
||||||
|
|
||||||
public static TextEntity initialEntityNode(TextRange textRange, String type, EntityType entityType, SemanticNode node) {
|
public static TextEntity initialEntityNode(TextRange textRange, String type, EntityType entityType, SemanticNode node) {
|
||||||
@ -165,13 +168,15 @@ public class TextEntity implements IEntity {
|
|||||||
|
|
||||||
public void removeFromGraph() {
|
public void removeFromGraph() {
|
||||||
|
|
||||||
|
remove("FINAL.0.0", "removed completely");
|
||||||
intersectingNodes.forEach(node -> node.getEntities().remove(this));
|
intersectingNodes.forEach(node -> node.getEntities().remove(this));
|
||||||
pages.forEach(page -> page.getEntities().remove(this));
|
pages.forEach(page -> page.getEntities().remove(this));
|
||||||
intersectingNodes = new LinkedList<>();
|
intersectingNodes = new LinkedList<>();
|
||||||
//relations = new HashSet<>();
|
relations.keySet()
|
||||||
|
.forEach(entity -> entity.relations.remove(this));
|
||||||
|
relations = new HashedMap<>();
|
||||||
deepestFullyContainingNode = null;
|
deepestFullyContainingNode = null;
|
||||||
pages = new HashSet<>();
|
pages = new HashSet<>();
|
||||||
remove("FINAL.0.0", "removed completely");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -259,6 +264,20 @@ public class TextEntity implements IEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addManualChange(BaseAnnotation manualChange) {
|
||||||
|
|
||||||
|
manualOverwrite.addChange(manualChange);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addManualChanges(List<BaseAnnotation> manualChanges) {
|
||||||
|
|
||||||
|
manualOverwrite.addChanges(manualChanges);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean matchesAnnotationId(String manualRedactionId) {
|
public boolean matchesAnnotationId(String manualRedactionId) {
|
||||||
|
|
||||||
return getPositionsOnPagePerPage().stream()
|
return getPositionsOnPagePerPage().stream()
|
||||||
@ -325,6 +344,7 @@ public class TextEntity implements IEntity {
|
|||||||
getKieSessionUpdater().ifPresent(updater -> updater.update(this));
|
getKieSessionUpdater().ifPresent(updater -> updater.update(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void remove() {
|
public void remove() {
|
||||||
|
|
||||||
getKieSessionUpdater().ifPresent(updater -> updater.remove(this));
|
getKieSessionUpdater().ifPresent(updater -> updater.remove(this));
|
||||||
|
|||||||
@ -0,0 +1,95 @@
|
|||||||
|
package com.iqser.red.service.redaction.v1.server.utils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.IntersectingNodeVisitor;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
|
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.textblock.TextBlock;
|
||||||
|
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class EntityCreationUtility {
|
||||||
|
|
||||||
|
public void checkIfBothStartAndEndAreEmpty(String start, String end) {
|
||||||
|
|
||||||
|
checkIfBothStartAndEndAreEmpty(List.of(start), List.of(end));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public <T> void checkIfBothStartAndEndAreEmpty(List<T> start, List<T> end) {
|
||||||
|
|
||||||
|
if ((start == null || start.isEmpty()) && (end == null || end.isEmpty())) {
|
||||||
|
throw new IllegalArgumentException("Start and end values are empty!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int truncateEndIfLineBreakIsBetween(int end, int expandedEnd, TextBlock textBlock) {
|
||||||
|
|
||||||
|
if (textBlock.getNextLinebreak(end) < expandedEnd) {
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
return expandedEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Set<SemanticNode> findIntersectingSubNodes(SemanticNode initialIntersectingNode, TextRange textRange) {
|
||||||
|
|
||||||
|
IntersectingNodeVisitor visitor = new IntersectingNodeVisitor(textRange);
|
||||||
|
|
||||||
|
if (initialIntersectingNode.getTextRange().intersects(textRange)) {
|
||||||
|
initialIntersectingNode.accept(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return visitor.getIntersectingNodes();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addToPages(TextEntity entity) {
|
||||||
|
|
||||||
|
Set<Page> pages = entity.getDeepestFullyContainingNode().getPages(entity.getTextRange());
|
||||||
|
entity.getPages().addAll(pages);
|
||||||
|
pages.forEach(page -> page.getEntities().add(entity));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addEntityToNodeEntitySets(TextEntity entity) {
|
||||||
|
|
||||||
|
entity.getIntersectingNodes()
|
||||||
|
.forEach(node -> node.getEntities().add(entity));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean allEntitiesIntersectAndHaveSameTypes(List<TextEntity> entitiesToMerge) {
|
||||||
|
|
||||||
|
if (entitiesToMerge.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TextEntity previousEntity = entitiesToMerge.get(0);
|
||||||
|
for (TextEntity textEntity : entitiesToMerge.subList(1, entitiesToMerge.size())) {
|
||||||
|
boolean typeMatches = textEntity.type().equals(previousEntity.type());
|
||||||
|
boolean entityTypeMatches = textEntity.getEntityType().equals(previousEntity.getEntityType());
|
||||||
|
boolean intersects = textEntity.intersects(previousEntity);
|
||||||
|
if (!typeMatches || !entityTypeMatches || !intersects) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public TextRange toLineAfterTextRange(TextBlock textBlock, TextRange textRange) {
|
||||||
|
|
||||||
|
if (textBlock.getTextRange().end() == textRange.end()) {
|
||||||
|
return new TextRange(textRange.end(), textRange.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TextRange(textRange.end(), textBlock.getNextLinebreak(textRange.end())).trim(textBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,39 +1,36 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.service.document;
|
package com.iqser.red.service.redaction.v1.server.utils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.AccessLevel;
|
||||||
|
import lombok.experimental.FieldDefaults;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
@Service
|
@UtilityClass
|
||||||
@RequiredArgsConstructor
|
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
|
||||||
public class EntityEnrichmentService {
|
public class EntityEnrichmentService {
|
||||||
|
|
||||||
private final RedactionServiceSettings redactionServiceSettings;
|
int SURROUNDING_WORDS_OFFSET_WINDOW = 100;
|
||||||
|
int NUMBER_OF_SURROUNDING_WORDS = 3;
|
||||||
|
|
||||||
|
|
||||||
public void enrichEntity(TextEntity entity, TextBlock textBlock) {
|
public void enrichEntity(TextEntity entity, TextBlock textBlock) {
|
||||||
|
|
||||||
entity.setValue(textBlock.subSequence(entity.getTextRange()).toString());
|
entity.setValue(textBlock.subSequence(entity.getTextRange()).toString());
|
||||||
entity.setTextAfter(findTextAfter(entity.getTextRange().end(), textBlock));
|
entity.setTextAfter(findTextAfter(entity.getTextRange().end(), textBlock));
|
||||||
entity.setTextBefore(findTextBefore(entity.getTextRange().start(), textBlock));
|
entity.setTextBefore(findTextBefore(entity.getTextRange().start(), textBlock));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String findTextAfter(int index, TextBlock textBlock) {
|
private String findTextAfter(int index, TextBlock textBlock) {
|
||||||
|
int endOffset = Math.min(index + SURROUNDING_WORDS_OFFSET_WINDOW, textBlock.getTextRange().end());
|
||||||
int endOffset = Math.min(index + redactionServiceSettings.getSurroundingWordsOffsetWindow(), textBlock.getTextRange().end());
|
|
||||||
String textAfter = textBlock.subSequence(index, endOffset).toString();
|
String textAfter = textBlock.subSequence(index, endOffset).toString();
|
||||||
if (!textAfter.isBlank()) {
|
if (!textAfter.isBlank()) {
|
||||||
List<String> wordsAfter = splitToWordsAndRemoveEmptyWords(textAfter);
|
List<String> wordsAfter = splitToWordsAndRemoveEmptyWords(textAfter);
|
||||||
int numberOfWordsAfter = Math.min(wordsAfter.size(), redactionServiceSettings.getNumberOfSurroundingWords());
|
int numberOfWordsAfter = Math.min(wordsAfter.size(), NUMBER_OF_SURROUNDING_WORDS);
|
||||||
if (!wordsAfter.isEmpty()) {
|
if (!wordsAfter.isEmpty()) {
|
||||||
return concatWordsAfter(wordsAfter.subList(0, numberOfWordsAfter), textAfter.startsWith(" "));
|
return concatWordsAfter(wordsAfter.subList(0, numberOfWordsAfter), textAfter.startsWith(" "));
|
||||||
}
|
}
|
||||||
@ -41,14 +38,12 @@ public class EntityEnrichmentService {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String findTextBefore(int index, TextBlock textBlock) {
|
private String findTextBefore(int index, TextBlock textBlock) {
|
||||||
|
int offsetBefore = Math.max(index - SURROUNDING_WORDS_OFFSET_WINDOW, textBlock.getTextRange().start());
|
||||||
int offsetBefore = Math.max(index - redactionServiceSettings.getSurroundingWordsOffsetWindow(), textBlock.getTextRange().start());
|
|
||||||
String textBefore = textBlock.subSequence(offsetBefore, index).toString();
|
String textBefore = textBlock.subSequence(offsetBefore, index).toString();
|
||||||
if (!textBefore.isBlank()) {
|
if (!textBefore.isBlank()) {
|
||||||
List<String> wordsBefore = splitToWordsAndRemoveEmptyWords(textBefore);
|
List<String> wordsBefore = splitToWordsAndRemoveEmptyWords(textBefore);
|
||||||
int numberOfWordsBefore = Math.min(wordsBefore.size(), redactionServiceSettings.getNumberOfSurroundingWords());
|
int numberOfWordsBefore = Math.min(wordsBefore.size(), NUMBER_OF_SURROUNDING_WORDS);
|
||||||
if (!wordsBefore.isEmpty()) {
|
if (!wordsBefore.isEmpty()) {
|
||||||
return concatWordsBefore(wordsBefore.subList(wordsBefore.size() - numberOfWordsBefore, wordsBefore.size()), textBefore.endsWith(" "));
|
return concatWordsBefore(wordsBefore.subList(wordsBefore.size() - numberOfWordsBefore, wordsBefore.size()), textBefore.endsWith(" "));
|
||||||
}
|
}
|
||||||
@ -56,36 +51,26 @@ public class EntityEnrichmentService {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<String> splitToWordsAndRemoveEmptyWords(String text) {
|
||||||
private static List<String> splitToWordsAndRemoveEmptyWords(String textAfter) {
|
return Arrays.stream(text.split(" "))
|
||||||
|
|
||||||
return Arrays.stream(textAfter.split(" "))
|
|
||||||
.filter(word -> !Objects.equals("", word))
|
.filter(word -> !Objects.equals("", word))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String concatWordsBefore(List<String> words, boolean endWithSpace) {
|
||||||
private static String concatWordsBefore(List<String> words, boolean endWithSpace) {
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
for (String word : words) {
|
for (String word : words) {
|
||||||
sb.append(word).append(" ");
|
sb.append(word).append(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
String result = sb.toString().trim();
|
String result = sb.toString().trim();
|
||||||
return endWithSpace ? result + " " : result;
|
return endWithSpace ? result + " " : result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String concatWordsAfter(List<String> words, boolean startWithSpace) {
|
||||||
private static String concatWordsAfter(List<String> words, boolean startWithSpace) {
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
for (String word : words) {
|
for (String word : words) {
|
||||||
sb.append(word).append(" ");
|
sb.append(word).append(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
String result = sb.toString().trim();
|
String result = sb.toString().trim();
|
||||||
return startWithSpace ? " " + result : result;
|
return startWithSpace ? " " + result : result;
|
||||||
}
|
}
|
||||||
@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import com.iqser.red.service.dictionarymerge.commons.DictionaryEntry;
|
import com.iqser.red.service.dictionarymerge.commons.DictionaryEntry;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Relation;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.Patterns;
|
import com.iqser.red.service.redaction.v1.server.utils.Patterns;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.exception.NotFoundException;
|
import com.iqser.red.service.redaction.v1.server.utils.exception.NotFoundException;
|
||||||
@ -44,6 +45,13 @@ public class Dictionary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean containsType(String type) {
|
||||||
|
|
||||||
|
Map<Level, DictionaryModel> levelMap = localAccessMap.get(type);
|
||||||
|
return !(levelMap == null || levelMap.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private Level getLevel(boolean isDossierDictionary) {
|
private Level getLevel(boolean isDossierDictionary) {
|
||||||
|
|
||||||
return isDossierDictionary ? Level.DOSSIER : Level.DOSSIER_TEMPLATE;
|
return isDossierDictionary ? Level.DOSSIER : Level.DOSSIER_TEMPLATE;
|
||||||
|
|||||||
@ -8,10 +8,8 @@ import org.springframework.stereotype.Service;
|
|||||||
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.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.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
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.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
|
|
||||||
import io.micrometer.observation.annotation.Observed;
|
import io.micrometer.observation.annotation.Observed;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
@ -25,9 +23,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
|
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
|
||||||
public class DictionarySearchService {
|
public class DictionarySearchService {
|
||||||
|
|
||||||
EntityEnrichmentService entityEnrichmentService;
|
|
||||||
RelationStore relationStore;
|
|
||||||
|
|
||||||
|
|
||||||
@Observed(name = "DictionarySearchService", contextualName = "add-dictionary-entries")
|
@Observed(name = "DictionarySearchService", contextualName = "add-dictionary-entries")
|
||||||
public void addDictionaryEntities(Dictionary dictionary, List<SemanticNode> semanticNodes) {
|
public void addDictionaryEntities(Dictionary dictionary, List<SemanticNode> semanticNodes) {
|
||||||
@ -39,7 +34,7 @@ public class DictionarySearchService {
|
|||||||
@Observed(name = "DictionarySearchService", contextualName = "add-dictionary-entries")
|
@Observed(name = "DictionarySearchService", contextualName = "add-dictionary-entries")
|
||||||
public void addDictionaryEntities(Dictionary dictionary, SemanticNode node) {
|
public void addDictionaryEntities(Dictionary dictionary, SemanticNode node) {
|
||||||
|
|
||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
dictionary.getDictionarySearch().getBoundaries(node.getTextBlock())
|
dictionary.getDictionarySearch().getBoundaries(node.getTextBlock())
|
||||||
.filter(boundary -> entityCreationService.isValidEntityTextRange(node.getTextBlock(), boundary.textRange()))
|
.filter(boundary -> entityCreationService.isValidEntityTextRange(node.getTextBlock(), boundary.textRange()))
|
||||||
.forEach(match -> {
|
.forEach(match -> {
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
@ -24,14 +23,12 @@ import com.iqser.red.service.redaction.v1.server.model.dictionary.SearchImplemen
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RectangleWithPage;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.RectangleWithPage;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.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.model.document.textblock.TextBlock;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.RectangleTransformations;
|
import com.iqser.red.service.redaction.v1.server.utils.RectangleTransformations;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -40,15 +37,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@Service
|
@Service
|
||||||
public class EntityFindingUtility {
|
public class EntityFindingUtility {
|
||||||
|
|
||||||
EntityCreationService entityCreationService;
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public EntityFindingUtility(EntityEnrichmentService entityEnrichmentService, RelationStore relationStore) {
|
|
||||||
|
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Optional<TextEntity> findClosestEntityAndReturnEmptyIfNotFound(PrecursorEntity precursorEntity,
|
public Optional<TextEntity> findClosestEntityAndReturnEmptyIfNotFound(PrecursorEntity precursorEntity,
|
||||||
Map<String, List<TextEntity>> entitiesWithSameValue,
|
Map<String, List<TextEntity>> entitiesWithSameValue,
|
||||||
@ -192,7 +181,7 @@ public class EntityFindingUtility {
|
|||||||
|
|
||||||
return textBlocks.stream()
|
return textBlocks.stream()
|
||||||
.flatMap(searchImplementation::getBoundaries)
|
.flatMap(searchImplementation::getBoundaries)
|
||||||
.map(boundary -> entityCreationService.byTextRangeWithEngine(boundary, "temp", EntityType.ENTITY, node, Collections.emptySet()))
|
.map(boundary -> entityCreationService.byTextRangeWithEngine(boundary, "temp", EntityType.TEMPORARY, node, Collections.emptySet()))
|
||||||
.filter(Optional::isPresent)
|
.filter(Optional::isPresent)
|
||||||
.map(Optional::get)
|
.map(Optional::get)
|
||||||
.distinct()
|
.distinct()
|
||||||
@ -219,7 +208,7 @@ public class EntityFindingUtility {
|
|||||||
return textBlocks.stream()
|
return textBlocks.stream()
|
||||||
.flatMap(tb -> searchImplementation.getBoundaries(tb)
|
.flatMap(tb -> searchImplementation.getBoundaries(tb)
|
||||||
.filter(textRange -> entityCreationService.isValidEntityTextRange(tb, textRange)))
|
.filter(textRange -> entityCreationService.isValidEntityTextRange(tb, textRange)))
|
||||||
.map(boundary -> entityCreationService.byTextRangeWithEngine(boundary, "temp", EntityType.ENTITY, document, Collections.emptySet()))
|
.map(boundary -> entityCreationService.byTextRangeWithEngine(boundary, "temp", EntityType.TEMPORARY, document, Collections.emptySet()))
|
||||||
.filter(Optional::isPresent)
|
.filter(Optional::isPresent)
|
||||||
.map(Optional::get)
|
.map(Optional::get)
|
||||||
.distinct()
|
.distinct()
|
||||||
@ -233,7 +222,7 @@ public class EntityFindingUtility {
|
|||||||
|
|
||||||
return searchImplementation.getBoundaries(document.getTextBlock())
|
return searchImplementation.getBoundaries(document.getTextBlock())
|
||||||
.filter(textRange -> entityCreationService.isValidEntityTextRange(document.getTextBlock(), textRange))
|
.filter(textRange -> entityCreationService.isValidEntityTextRange(document.getTextBlock(), textRange))
|
||||||
.map(boundary -> entityCreationService.byTextRangeWithEngine(boundary, "temp", EntityType.ENTITY, document, Collections.emptySet()))
|
.map(boundary -> entityCreationService.byTextRangeWithEngine(boundary, "temp", EntityType.TEMPORARY, document, Collections.emptySet()))
|
||||||
.filter(Optional::isPresent)
|
.filter(Optional::isPresent)
|
||||||
.map(Optional::get)
|
.map(Optional::get)
|
||||||
.distinct()
|
.distinct()
|
||||||
|
|||||||
@ -431,12 +431,11 @@ public class EntityLogCreatorService {
|
|||||||
private static EntryType getEntryType(EntityType entityType) {
|
private static EntryType getEntryType(EntityType entityType) {
|
||||||
|
|
||||||
return switch (entityType) {
|
return switch (entityType) {
|
||||||
case ENTITY -> EntryType.ENTITY;
|
case ENTITY, TEMPORARY -> EntryType.ENTITY;
|
||||||
case HINT -> EntryType.HINT;
|
case HINT -> EntryType.HINT;
|
||||||
case FALSE_POSITIVE -> EntryType.FALSE_POSITIVE;
|
case FALSE_POSITIVE, DICTIONARY_REMOVAL -> EntryType.FALSE_POSITIVE;
|
||||||
case RECOMMENDATION -> EntryType.RECOMMENDATION;
|
case RECOMMENDATION -> EntryType.RECOMMENDATION;
|
||||||
case FALSE_RECOMMENDATION -> EntryType.FALSE_RECOMMENDATION;
|
case FALSE_RECOMMENDATION -> EntryType.FALSE_RECOMMENDATION;
|
||||||
case DICTIONARY_REMOVAL -> EntryType.FALSE_POSITIVE;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,8 @@ import com.google.common.collect.Sets;
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.PrecursorEntity;
|
import com.iqser.red.service.redaction.v1.server.model.PrecursorEntity;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.dictionary.Dictionary;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.dictionary.DictionaryModel;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
@ -44,18 +46,19 @@ public class ManualChangesApplicationService {
|
|||||||
public void recategorize(IEntity entityToBeReCategorized, ManualRecategorization manualRecategorization) {
|
public void recategorize(IEntity entityToBeReCategorized, ManualRecategorization manualRecategorization) {
|
||||||
|
|
||||||
entityToBeReCategorized.getMatchedRuleList().clear();
|
entityToBeReCategorized.getMatchedRuleList().clear();
|
||||||
entityToBeReCategorized.getManualOverwrite().addChange(manualRecategorization);
|
|
||||||
|
|
||||||
if (manualRecategorization.getType() == null) {
|
if (manualRecategorization.getType() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entityToBeReCategorized instanceof Image image) {
|
if (entityToBeReCategorized instanceof Image image) {
|
||||||
|
entityToBeReCategorized.getManualOverwrite().addChange(manualRecategorization);
|
||||||
image.setImageType(ImageType.fromString(manualRecategorization.getType()));
|
image.setImageType(ImageType.fromString(manualRecategorization.getType()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entityToBeReCategorized instanceof TextEntity textEntity) {
|
if (entityToBeReCategorized instanceof TextEntity textEntity) {
|
||||||
|
textEntity.addManualChange(manualRecategorization);
|
||||||
textEntity.setType(manualRecategorization.getType());
|
textEntity.setType(manualRecategorization.getType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,7 +90,7 @@ public class ManualChangesApplicationService {
|
|||||||
.map(ManualChangesApplicationService::toRectangle2D)
|
.map(ManualChangesApplicationService::toRectangle2D)
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
|
|
||||||
entityToBeResized.getManualOverwrite().addChange(manualResizeRedaction);
|
entityToBeResized.addManualChange(manualResizeRedaction);
|
||||||
|
|
||||||
SemanticNode node = entityToBeResized.getDeepestFullyContainingNode();
|
SemanticNode node = entityToBeResized.getDeepestFullyContainingNode();
|
||||||
PrecursorEntity searchEntity = PrecursorEntity.fromManualResizeRedaction(manualResizeRedaction);
|
PrecursorEntity searchEntity = PrecursorEntity.fromManualResizeRedaction(manualResizeRedaction);
|
||||||
|
|||||||
@ -1,17 +1,10 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.service.document;
|
package com.iqser.red.service.redaction.v1.server.service.document;
|
||||||
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.addEntityToNodeEntitySets;
|
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.*;
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.addToPages;
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.allEntitiesIntersectAndHaveSameTypes;
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.checkIfBothStartAndEndAreEmpty;
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.findIntersectingSubNodes;
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.toLineAfterTextRange;
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.document.EntityCreationUtility.truncateEndIfLineBreakIsBetween;
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.utils.SeparatorUtils.boundaryIsSurroundedBySeparators;
|
import static com.iqser.red.service.redaction.v1.server.utils.SeparatorUtils.boundaryIsSurroundedBySeparators;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -29,44 +22,26 @@ import com.iqser.red.service.redaction.v1.server.model.dictionary.SearchImplemen
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.ConsecutiveBoundaryCollector;
|
import com.iqser.red.service.redaction.v1.server.model.document.ConsecutiveBoundaryCollector;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.DocumentTree;
|
import com.iqser.red.service.redaction.v1.server.model.document.DocumentTree;
|
||||||
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.entity.Containment;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Equality;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.IKieSessionUpdater;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.IKieSessionUpdater;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Intersection;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.ManualChangeOverwrite;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.ManualChangeOverwrite;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Relation;
|
|
||||||
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.NodeType;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.NodeType;
|
||||||
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.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.utils.EntityEnrichmentService;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.RectangleTransformations;
|
import com.iqser.red.service.redaction.v1.server.utils.RectangleTransformations;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.RedactionSearchUtility;
|
import com.iqser.red.service.redaction.v1.server.utils.RedactionSearchUtility;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.exception.NotFoundException;
|
import com.iqser.red.service.redaction.v1.server.utils.exception.NotFoundException;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class EntityCreationService {
|
public class EntityCreationService {
|
||||||
|
|
||||||
private final EntityEnrichmentService entityEnrichmentService;
|
|
||||||
private final RelationStore relationStore;
|
|
||||||
private final Set<SemanticNode> nodesInKieSession; // empty set means all nodes are in kieSession
|
|
||||||
|
|
||||||
|
|
||||||
public EntityCreationService(EntityEnrichmentService entityEnrichmentService, RelationStore relationStore) {
|
|
||||||
|
|
||||||
this.entityEnrichmentService = entityEnrichmentService;
|
|
||||||
this.relationStore = relationStore;
|
|
||||||
this.nodesInKieSession = Collections.emptySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates entities found between specified start and stop strings, case-sensitive.
|
* Creates entities found between specified start and stop strings, case-sensitive.
|
||||||
@ -1010,12 +985,14 @@ 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 = addEntityToGraph(entity, node.getDocumentTree());
|
boolean added = node.getDocumentTree().addEntityToGraph(entity);
|
||||||
if (!added) {
|
if (!added) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
entity.addEngines(engines);
|
entity.addEngines(engines);
|
||||||
insertToKieSession(entity, node);
|
if(!entityType.equals(EntityType.TEMPORARY)) {
|
||||||
|
insertToKieSession(entity, node);
|
||||||
|
}
|
||||||
return Optional.of(entity);
|
return Optional.of(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1080,14 +1057,14 @@ public class EntityCreationService {
|
|||||||
.map(TextEntity::getManualOverwrite)
|
.map(TextEntity::getManualOverwrite)
|
||||||
.map(ManualChangeOverwrite::getManualChangeLog)
|
.map(ManualChangeOverwrite::getManualChangeLog)
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.forEach(manualChange -> mergedEntity.getManualOverwrite().addChange(manualChange));
|
.forEach(mergedEntity::addManualChange);
|
||||||
|
|
||||||
mergedEntity.setDictionaryEntry(entitiesToMerge.stream()
|
mergedEntity.setDictionaryEntry(entitiesToMerge.stream()
|
||||||
.anyMatch(TextEntity::isDictionaryEntry));
|
.anyMatch(TextEntity::isDictionaryEntry));
|
||||||
mergedEntity.setDossierDictionaryEntry(entitiesToMerge.stream()
|
mergedEntity.setDossierDictionaryEntry(entitiesToMerge.stream()
|
||||||
.anyMatch(TextEntity::isDossierDictionaryEntry));
|
.anyMatch(TextEntity::isDossierDictionaryEntry));
|
||||||
|
|
||||||
entityEnrichmentService.enrichEntity(mergedEntity, node.getTextBlock());
|
EntityEnrichmentService.enrichEntity(mergedEntity, node.getTextBlock());
|
||||||
|
|
||||||
addEntityToGraph(mergedEntity, node);
|
addEntityToGraph(mergedEntity, node);
|
||||||
insertToKieSession(mergedEntity, node);
|
insertToKieSession(mergedEntity, node);
|
||||||
@ -1145,7 +1122,7 @@ public class EntityCreationService {
|
|||||||
|
|
||||||
TextEntity newEntity = byTextRangeWithEngine(entity.getTextRange(), type, entityType, node, entity.getEngines()).orElseThrow(() -> new NotFoundException(
|
TextEntity newEntity = byTextRangeWithEngine(entity.getTextRange(), type, entityType, node, entity.getEngines()).orElseThrow(() -> new NotFoundException(
|
||||||
"No entity present!"));
|
"No entity present!"));
|
||||||
newEntity.getManualOverwrite().addChanges(entity.getManualOverwrite().getManualChangeLog());
|
newEntity.addManualChanges(entity.getManualOverwrite().getManualChangeLog());
|
||||||
newEntity.setDictionaryEntry(entity.isDictionaryEntry());
|
newEntity.setDictionaryEntry(entity.isDictionaryEntry());
|
||||||
newEntity.setDossierDictionaryEntry(entity.isDossierDictionaryEntry());
|
newEntity.setDossierDictionaryEntry(entity.isDossierDictionaryEntry());
|
||||||
return newEntity;
|
return newEntity;
|
||||||
@ -1456,7 +1433,7 @@ public class EntityCreationService {
|
|||||||
.ifPresent(e -> addDuplicateEntityToGraph(e, entity.getTextRange(), node));
|
.ifPresent(e -> addDuplicateEntityToGraph(e, entity.getTextRange(), node));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
addEntityToGraph(entity, documentTree);
|
documentTree.addEntityToGraph(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1507,48 +1484,4 @@ public class EntityCreationService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean addEntityToGraph(TextEntity entity, DocumentTree documentTree) {
|
|
||||||
|
|
||||||
documentTree.getRoot().getNode().addThisToEntityIfIntersects(entity);
|
|
||||||
|
|
||||||
// if (!nodesInKieSession.isEmpty() && entity.getIntersectingNodes()
|
|
||||||
// .stream()
|
|
||||||
// .anyMatch(node -> !nodesInKieSession.contains(node))) {
|
|
||||||
// entity.removeFromGraph();
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
TextBlock textBlock = entity.getDeepestFullyContainingNode().getTextBlock();
|
|
||||||
entityEnrichmentService.enrichEntity(entity, textBlock);
|
|
||||||
|
|
||||||
addToPages(entity);
|
|
||||||
addEntityToNodeEntitySets(entity);
|
|
||||||
|
|
||||||
if(relationStore != null) {
|
|
||||||
//List<Relation> relations = new LinkedList<>();
|
|
||||||
// compute relationships, by looping through deepestFullyContainingNode's entities
|
|
||||||
for (TextEntity textEntity : entity.getDeepestFullyContainingNode().getEntities()) {
|
|
||||||
if (entity.intersects(textEntity) && !entity.equals(textEntity)) {
|
|
||||||
Relation relation;
|
|
||||||
if (textEntity.getTextRange().equals(entity.getTextRange())) {
|
|
||||||
relation = new Equality(entity, textEntity);
|
|
||||||
} else if (textEntity.containedBy(entity)) {
|
|
||||||
relation = new Containment(textEntity, entity);
|
|
||||||
} else if (entity.containedBy(textEntity)) {
|
|
||||||
relation = new Containment(entity, textEntity);
|
|
||||||
} else {
|
|
||||||
relation = new Intersection(entity, textEntity);
|
|
||||||
}
|
|
||||||
relationStore.addRelation(relation);
|
|
||||||
//relations.add(relation);
|
|
||||||
//textEntity.getRelations().add(relation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//entity.getRelations().addAll(relations);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,15 +9,18 @@ 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.model.document.textblock.TextBlock;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
||||||
|
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
public class EntityCreationUtility {
|
public class EntityCreationUtility {
|
||||||
|
|
||||||
public static void checkIfBothStartAndEndAreEmpty(String start, String end) {
|
public void checkIfBothStartAndEndAreEmpty(String start, String end) {
|
||||||
|
|
||||||
checkIfBothStartAndEndAreEmpty(List.of(start), List.of(end));
|
checkIfBothStartAndEndAreEmpty(List.of(start), List.of(end));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static <T> void checkIfBothStartAndEndAreEmpty(List<T> start, List<T> end) {
|
public <T> void checkIfBothStartAndEndAreEmpty(List<T> start, List<T> end) {
|
||||||
|
|
||||||
if ((start == null || start.isEmpty()) && (end == null || end.isEmpty())) {
|
if ((start == null || start.isEmpty()) && (end == null || end.isEmpty())) {
|
||||||
throw new IllegalArgumentException("Start and end values are empty!");
|
throw new IllegalArgumentException("Start and end values are empty!");
|
||||||
@ -25,7 +28,7 @@ public class EntityCreationUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static int truncateEndIfLineBreakIsBetween(int end, int expandedEnd, TextBlock textBlock) {
|
public int truncateEndIfLineBreakIsBetween(int end, int expandedEnd, TextBlock textBlock) {
|
||||||
|
|
||||||
if (textBlock.getNextLinebreak(end) < expandedEnd) {
|
if (textBlock.getNextLinebreak(end) < expandedEnd) {
|
||||||
return end;
|
return end;
|
||||||
@ -34,7 +37,7 @@ public class EntityCreationUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Set<SemanticNode> findIntersectingSubNodes(SemanticNode initialIntersectingNode, TextRange textRange) {
|
public Set<SemanticNode> findIntersectingSubNodes(SemanticNode initialIntersectingNode, TextRange textRange) {
|
||||||
|
|
||||||
IntersectingNodeVisitor visitor = new IntersectingNodeVisitor(textRange);
|
IntersectingNodeVisitor visitor = new IntersectingNodeVisitor(textRange);
|
||||||
|
|
||||||
@ -46,7 +49,7 @@ public class EntityCreationUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void addToPages(TextEntity entity) {
|
public void addToPages(TextEntity entity) {
|
||||||
|
|
||||||
Set<Page> pages = entity.getDeepestFullyContainingNode().getPages(entity.getTextRange());
|
Set<Page> pages = entity.getDeepestFullyContainingNode().getPages(entity.getTextRange());
|
||||||
entity.getPages().addAll(pages);
|
entity.getPages().addAll(pages);
|
||||||
@ -54,14 +57,14 @@ public class EntityCreationUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void addEntityToNodeEntitySets(TextEntity entity) {
|
public void addEntityToNodeEntitySets(TextEntity entity) {
|
||||||
|
|
||||||
entity.getIntersectingNodes()
|
entity.getIntersectingNodes()
|
||||||
.forEach(node -> node.getEntities().add(entity));
|
.forEach(node -> node.getEntities().add(entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static boolean allEntitiesIntersectAndHaveSameTypes(List<TextEntity> entitiesToMerge) {
|
public boolean allEntitiesIntersectAndHaveSameTypes(List<TextEntity> entitiesToMerge) {
|
||||||
|
|
||||||
if (entitiesToMerge.isEmpty()) {
|
if (entitiesToMerge.isEmpty()) {
|
||||||
return true;
|
return true;
|
||||||
@ -79,7 +82,7 @@ public class EntityCreationUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static TextRange toLineAfterTextRange(TextBlock textBlock, TextRange textRange) {
|
public TextRange toLineAfterTextRange(TextBlock textBlock, TextRange textRange) {
|
||||||
|
|
||||||
if (textBlock.getTextRange().end() == textRange.end()) {
|
if (textBlock.getTextRange().end() == textRange.end()) {
|
||||||
return new TextRange(textRange.end(), textRange.end());
|
return new TextRange(textRange.end(), textRange.end());
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package com.iqser.red.service.redaction.v1.server.service.drools;
|
|||||||
|
|
||||||
import static com.iqser.red.service.redaction.v1.server.service.drools.ComponentDroolsExecutionService.RULES_LOGGER_GLOBAL;
|
import static com.iqser.red.service.redaction.v1.server.service.drools.ComponentDroolsExecutionService.RULES_LOGGER_GLOBAL;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -11,7 +10,6 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import org.kie.api.runtime.KieContainer;
|
import org.kie.api.runtime.KieContainer;
|
||||||
import org.kie.api.runtime.KieSession;
|
import org.kie.api.runtime.KieSession;
|
||||||
@ -30,13 +28,10 @@ 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.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
|
||||||
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.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;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.service.websocket.WebSocketService;
|
import com.iqser.red.service.redaction.v1.server.service.websocket.WebSocketService;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.exception.DroolsTimeoutException;
|
import com.iqser.red.service.redaction.v1.server.utils.exception.DroolsTimeoutException;
|
||||||
|
|
||||||
@ -54,8 +49,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
|
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
|
||||||
public class EntityDroolsExecutionService {
|
public class EntityDroolsExecutionService {
|
||||||
|
|
||||||
EntityEnrichmentService entityEnrichmentService;
|
|
||||||
RelationStore relationStore;
|
|
||||||
ObservationRegistry observationRegistry;
|
ObservationRegistry observationRegistry;
|
||||||
ManualChangesApplicationService manualChangesApplicationService;
|
ManualChangesApplicationService manualChangesApplicationService;
|
||||||
RedactionServiceSettings settings;
|
RedactionServiceSettings settings;
|
||||||
@ -99,113 +92,87 @@ public class EntityDroolsExecutionService {
|
|||||||
|
|
||||||
KieSession kieSession = kieContainer.newKieSession();
|
KieSession kieSession = kieContainer.newKieSession();
|
||||||
|
|
||||||
Set<SemanticNode> nodesInKieSession = sectionsToAnalyze.size() == document.streamAllSubNodes()
|
|
||||||
.count() ? new HashSet<>() : buildSet(sectionsToAnalyze, document);
|
|
||||||
|
|
||||||
KieSessionUpdater kieSessionUpdater = new KieSessionUpdater(kieSession, relationStore, nodesInKieSession);
|
|
||||||
document.setKieSessionUpdater(kieSessionUpdater);
|
|
||||||
|
|
||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore, nodesInKieSession);
|
|
||||||
RulesLogger logger = new RulesLogger(webSocketService, context);
|
|
||||||
if (settings.isDroolsDebug()) {
|
|
||||||
logger.enableAgendaTracking();
|
|
||||||
logger.enableObjectTracking();
|
|
||||||
}
|
|
||||||
kieSession.addEventListener(new TrackingAgendaEventListener(logger));
|
|
||||||
kieSession.addEventListener(new ObjectTrackingEventListener(logger));
|
|
||||||
|
|
||||||
kieSession.setGlobal("document", document);
|
|
||||||
kieSession.setGlobal("entityCreationService", entityCreationService);
|
|
||||||
kieSession.setGlobal("manualChangesApplicationService", manualChangesApplicationService);
|
|
||||||
kieSession.setGlobal("dictionary", dictionary);
|
|
||||||
|
|
||||||
if (hasGlobalWithName(kieSession, RULES_LOGGER_GLOBAL)) {
|
|
||||||
kieSession.setGlobal(RULES_LOGGER_GLOBAL, logger);
|
|
||||||
}
|
|
||||||
|
|
||||||
nodesInKieSession.add(document);
|
|
||||||
nodesInKieSession.addAll(sectionsToAnalyze);
|
|
||||||
nodesInKieSession.addAll(sectionsToAnalyze.stream()
|
|
||||||
.flatMap(SemanticNode::streamAllSubNodes)
|
|
||||||
.toList());
|
|
||||||
nodesInKieSession.forEach(kieSession::insert);
|
|
||||||
System.out.println("after document insert : " + kieSession.getFactCount());
|
|
||||||
|
|
||||||
document.getEntities()
|
|
||||||
.forEach(kieSession::insert);
|
|
||||||
relationStore.getAllRelations(document.getEntities()
|
|
||||||
.stream()
|
|
||||||
.map(TextEntity::getId)
|
|
||||||
.collect(Collectors.toSet()))
|
|
||||||
.forEach(kieSession::insert);
|
|
||||||
System.out.println("after getEntities insert : " + kieSession.getFactCount());
|
|
||||||
|
|
||||||
document.getPages()
|
|
||||||
.forEach(kieSession::insert);
|
|
||||||
System.out.println("after getPages insert : " + kieSession.getFactCount());
|
|
||||||
|
|
||||||
fileAttributes.stream()
|
|
||||||
.filter(f -> f.getValue() != null)
|
|
||||||
.forEach(kieSession::insert);
|
|
||||||
System.out.println("after fileAttributes insert : " + kieSession.getFactCount());
|
|
||||||
|
|
||||||
if (manualRedactions != null) {
|
|
||||||
manualRedactions.buildAll()
|
|
||||||
.stream()
|
|
||||||
.filter(BaseAnnotation::isLocal)
|
|
||||||
.forEach(kieSession::insert);
|
|
||||||
}
|
|
||||||
System.out.println("after manualRedactions insert : " + kieSession.getFactCount());
|
|
||||||
|
|
||||||
kieSession.insert(nerEntities);
|
|
||||||
System.out.println("after nerEntities insert : " + kieSession.getFactCount());
|
|
||||||
|
|
||||||
kieSession.getAgenda().getAgendaGroup("LOCAL_DICTIONARY_ADDS").setFocus();
|
|
||||||
|
|
||||||
CompletableFuture<Void> completableFuture = CompletableFuture.supplyAsync(() -> {
|
|
||||||
kieSession.fireAllRules();
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
completableFuture.get(settings.getDroolsExecutionTimeoutSecs(document.getNumberOfPages()), TimeUnit.SECONDS);
|
KieSessionUpdater kieSessionUpdater = new KieSessionUpdater(kieSession);
|
||||||
//
|
document.setKieSessionUpdater(kieSessionUpdater);
|
||||||
// nodesInKieSession = sectionsToAnalyze.size() == document.streamAllSubNodes()
|
|
||||||
// .count() ? Collections.emptySet() : buildSet(sectionsToAnalyze, document);
|
|
||||||
//
|
|
||||||
// kieSessionUpdater = new KieSessionUpdater(nodesInKieSession, kieSession);
|
|
||||||
//
|
|
||||||
// document.setKieSessionUpdater(kieSessionUpdater);
|
|
||||||
//
|
|
||||||
// kieSession.insert(document);
|
|
||||||
//
|
|
||||||
// kieSession.setGlobal("entityCreationService", entityCreationService);
|
|
||||||
//
|
|
||||||
// sectionsToAnalyze.stream()
|
|
||||||
// .flatMap(SemanticNode::streamAllSubNodes)
|
|
||||||
// .forEach(kieSession::insert);
|
|
||||||
// System.out.println("after SemanticNode insert : " + kieSession.getFactCount());
|
|
||||||
//
|
|
||||||
// completableFuture.get(settings.getDroolsExecutionTimeoutSecs(document.getNumberOfPages()), TimeUnit.SECONDS);
|
|
||||||
|
|
||||||
} catch (ExecutionException e) {
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
logger.error(e, "Exception during rule execution");
|
RulesLogger logger = new RulesLogger(webSocketService, context);
|
||||||
kieSession.dispose();
|
if (settings.isDroolsDebug()) {
|
||||||
if (e.getCause() instanceof TimeoutException) {
|
logger.enableAgendaTracking();
|
||||||
|
logger.enableObjectTracking();
|
||||||
|
}
|
||||||
|
kieSession.addEventListener(new TrackingAgendaEventListener(logger));
|
||||||
|
kieSession.addEventListener(new ObjectTrackingEventListener(logger));
|
||||||
|
|
||||||
|
kieSession.setGlobal("document", document);
|
||||||
|
kieSession.setGlobal("entityCreationService", entityCreationService);
|
||||||
|
kieSession.setGlobal("manualChangesApplicationService", manualChangesApplicationService);
|
||||||
|
kieSession.setGlobal("dictionary", dictionary);
|
||||||
|
|
||||||
|
if (hasGlobalWithName(kieSession, RULES_LOGGER_GLOBAL)) {
|
||||||
|
kieSession.setGlobal(RULES_LOGGER_GLOBAL, logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
kieSession.insert(document);
|
||||||
|
sectionsToAnalyze.forEach(kieSession::insert);
|
||||||
|
sectionsToAnalyze.stream()
|
||||||
|
.flatMap(SemanticNode::streamAllSubNodes)
|
||||||
|
.forEach(kieSession::insert);
|
||||||
|
System.out.println("after document insert : " + kieSession.getFactCount());
|
||||||
|
|
||||||
|
document.getEntities()
|
||||||
|
.forEach(kieSession::insert);
|
||||||
|
document.getEntities()
|
||||||
|
.forEach(textEntity -> textEntity.getRelations().values()
|
||||||
|
.forEach(kieSession::insert));
|
||||||
|
System.out.println("after getEntities insert : " + kieSession.getFactCount());
|
||||||
|
|
||||||
|
document.getPages()
|
||||||
|
.forEach(kieSession::insert);
|
||||||
|
System.out.println("after getPages insert : " + kieSession.getFactCount());
|
||||||
|
|
||||||
|
fileAttributes.stream()
|
||||||
|
.filter(f -> f.getValue() != null)
|
||||||
|
.forEach(kieSession::insert);
|
||||||
|
System.out.println("after fileAttributes insert : " + kieSession.getFactCount());
|
||||||
|
|
||||||
|
if (manualRedactions != null) {
|
||||||
|
manualRedactions.buildAll()
|
||||||
|
.stream()
|
||||||
|
.filter(BaseAnnotation::isLocal)
|
||||||
|
.forEach(kieSession::insert);
|
||||||
|
}
|
||||||
|
System.out.println("after manualRedactions insert : " + kieSession.getFactCount());
|
||||||
|
|
||||||
|
kieSession.insert(nerEntities);
|
||||||
|
System.out.println("after nerEntities insert : " + kieSession.getFactCount());
|
||||||
|
|
||||||
|
kieSession.getAgenda().getAgendaGroup("LOCAL_DICTIONARY_ADDS").setFocus();
|
||||||
|
|
||||||
|
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(kieSession::fireAllRules);
|
||||||
|
|
||||||
|
try {
|
||||||
|
completableFuture.get(settings.getDroolsExecutionTimeoutSecs(document.getNumberOfPages()), TimeUnit.SECONDS);
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
logger.error(e, "Exception during rule execution");
|
||||||
|
if (e.getCause() instanceof TimeoutException) {
|
||||||
|
throw new DroolsTimeoutException(String.format("The file %s caused a timeout", context.getFileId()), e, false, RuleFileType.ENTITY);
|
||||||
|
}
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
logger.error(e, "Exception during rule execution");
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (TimeoutException e) {
|
||||||
throw new DroolsTimeoutException(String.format("The file %s caused a timeout", context.getFileId()), e, false, RuleFileType.ENTITY);
|
throw new DroolsTimeoutException(String.format("The file %s caused a timeout", context.getFileId()), e, false, RuleFileType.ENTITY);
|
||||||
}
|
}
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
logger.error(e, "Exception during rule execution");
|
|
||||||
kieSession.dispose();
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (TimeoutException e) {
|
|
||||||
throw new DroolsTimeoutException(String.format("The file %s caused a timeout", context.getFileId()), e, false, RuleFileType.ENTITY);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<FileAttribute> resultingFileAttributes = getFileAttributes(kieSession);
|
List<FileAttribute> resultingFileAttributes = getFileAttributes(kieSession);
|
||||||
kieSession.dispose();
|
return resultingFileAttributes;
|
||||||
return resultingFileAttributes;
|
|
||||||
|
} finally {
|
||||||
|
kieSession.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,9 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.service.drools;
|
package com.iqser.red.service.redaction.v1.server.service.drools;
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.kie.api.runtime.KieSession;
|
import org.kie.api.runtime.KieSession;
|
||||||
import org.kie.api.runtime.rule.FactHandle;
|
import org.kie.api.runtime.rule.FactHandle;
|
||||||
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.IKieSessionUpdater;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.IKieSessionUpdater;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Relation;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Image;
|
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;
|
||||||
@ -21,16 +17,17 @@ import lombok.experimental.FieldDefaults;
|
|||||||
public class KieSessionUpdater implements IKieSessionUpdater {
|
public class KieSessionUpdater implements IKieSessionUpdater {
|
||||||
|
|
||||||
KieSession kieSession;
|
KieSession kieSession;
|
||||||
RelationStore relationStore;
|
|
||||||
Set<SemanticNode> nodesInKieSession;
|
|
||||||
|
|
||||||
|
|
||||||
public void insert(TextEntity textEntity) {
|
public void insert(TextEntity textEntity) {
|
||||||
|
|
||||||
kieSession.insert(textEntity);
|
kieSession.insert(textEntity);
|
||||||
updateIntersectingNodes(textEntity);
|
updateIntersectingNodes(textEntity);
|
||||||
relationStore.getRelations(textEntity.getId())
|
textEntity.getRelations().values()
|
||||||
.forEach(kieSession::insert);
|
.forEach(kieSession::insert);
|
||||||
|
textEntity.getRelations().keySet()
|
||||||
|
.forEach(k -> kieSession.insert(k.getRelations()
|
||||||
|
.get(textEntity)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -38,11 +35,15 @@ public class KieSessionUpdater implements IKieSessionUpdater {
|
|||||||
|
|
||||||
kieSession.update(kieSession.getFactHandle(textEntity), textEntity);
|
kieSession.update(kieSession.getFactHandle(textEntity), textEntity);
|
||||||
updateIntersectingNodes(textEntity);
|
updateIntersectingNodes(textEntity);
|
||||||
relationStore.getRelations(textEntity.getId())
|
textEntity.getRelations().values()
|
||||||
.forEach(r -> kieSession.update(kieSession.getFactHandle(r), r));
|
.forEach(this::updateFactIfPresent);
|
||||||
|
textEntity.getRelations().keySet()
|
||||||
|
.forEach(k -> updateFactIfPresent(k.getRelations()
|
||||||
|
.get(textEntity)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void update(Image image) {
|
public void update(Image image) {
|
||||||
|
|
||||||
kieSession.update(kieSession.getFactHandle(image), image);
|
kieSession.update(kieSession.getFactHandle(image), image);
|
||||||
@ -56,15 +57,14 @@ public class KieSessionUpdater implements IKieSessionUpdater {
|
|||||||
|
|
||||||
public void remove(TextEntity textEntity) {
|
public void remove(TextEntity textEntity) {
|
||||||
|
|
||||||
|
//test replace all deletes with updates
|
||||||
kieSession.delete(kieSession.getFactHandle(textEntity));
|
kieSession.delete(kieSession.getFactHandle(textEntity));
|
||||||
updateIntersectingNodes(textEntity);
|
updateIntersectingNodes(textEntity);
|
||||||
relationStore.getRelations(textEntity.getId())
|
textEntity.getRelations().values()
|
||||||
.forEach(r -> {
|
.forEach(this::deleteFactIfPresent);
|
||||||
FactHandle factHandle = kieSession.getFactHandle(r);
|
textEntity.getRelations().keySet()
|
||||||
if (factHandle != null) {
|
.forEach(k -> deleteFactIfPresent(k.getRelations()
|
||||||
kieSession.delete(factHandle);
|
.get(textEntity)));
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -82,9 +82,25 @@ public class KieSessionUpdater implements IKieSessionUpdater {
|
|||||||
private void updateIntersectingNodes(TextEntity textEntity) {
|
private void updateIntersectingNodes(TextEntity textEntity) {
|
||||||
|
|
||||||
textEntity.getIntersectingNodes()
|
textEntity.getIntersectingNodes()
|
||||||
.stream()
|
.forEach(this::updateFactIfPresent);
|
||||||
.filter(nodesInKieSession::contains)
|
}
|
||||||
.forEach(o -> kieSession.update(kieSession.getFactHandle(o), o));
|
|
||||||
|
|
||||||
|
|
||||||
|
private void updateFactIfPresent(Object o) {
|
||||||
|
|
||||||
|
FactHandle factHandle = kieSession.getFactHandle(o);
|
||||||
|
if (factHandle != null) {
|
||||||
|
kieSession.update(factHandle, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteFactIfPresent(Object o) {
|
||||||
|
|
||||||
|
FactHandle factHandle = kieSession.getFactHandle(o);
|
||||||
|
if (factHandle != null) {
|
||||||
|
kieSession.delete(factHandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,8 +17,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
||||||
@ -1334,7 +1333,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1358,7 +1357,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1383,7 +1382,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1394,7 +1393,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1438,7 +1437,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,10 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Containment;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Equality;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Intersection;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import static org.mockito.Mockito.times;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.wildfly.common.Assert.assertTrue;
|
import static org.wildfly.common.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
@ -14,12 +15,10 @@ import org.junit.jupiter.api.Test;
|
|||||||
import org.kie.api.runtime.KieSession;
|
import org.kie.api.runtime.KieSession;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.DocumentTree;
|
import com.iqser.red.service.redaction.v1.server.model.document.DocumentTree;
|
||||||
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.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.Headline;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Headline;
|
||||||
@ -31,14 +30,10 @@ import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.TableCell;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBlock;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
import com.iqser.red.service.redaction.v1.server.service.drools.KieSessionUpdater;
|
||||||
|
|
||||||
public class DocumentIEntityInsertionIntegrationTest extends BuildDocumentIntegrationTest {
|
public class DocumentIEntityInsertionIntegrationTest extends BuildDocumentIntegrationTest {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
private EntityCreationService entityCreationService;
|
private EntityCreationService entityCreationService;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
@ -49,7 +44,7 @@ public class DocumentIEntityInsertionIntegrationTest extends BuildDocumentIntegr
|
|||||||
public void createEntityCreationService() {
|
public void createEntityCreationService() {
|
||||||
|
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -93,6 +88,7 @@ public class DocumentIEntityInsertionIntegrationTest extends BuildDocumentIntegr
|
|||||||
public void assertSameEntitiesCantBeCreatedTwice() {
|
public void assertSameEntitiesCantBeCreatedTwice() {
|
||||||
|
|
||||||
Document document = buildGraph("files/new/crafted document.pdf");
|
Document document = buildGraph("files/new/crafted document.pdf");
|
||||||
|
document.setKieSessionUpdater(new KieSessionUpdater(kieSession));
|
||||||
String type = "CBI_author";
|
String type = "CBI_author";
|
||||||
assertTrue(entityCreationService.byTextRange(new TextRange(0, 10), type, EntityType.ENTITY, document)
|
assertTrue(entityCreationService.byTextRange(new TextRange(0, 10), type, EntityType.ENTITY, document)
|
||||||
.isPresent());
|
.isPresent());
|
||||||
|
|||||||
@ -30,7 +30,6 @@ import com.iqser.red.service.redaction.v1.server.logger.Context;
|
|||||||
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.dictionary.DictionarySearch;
|
import com.iqser.red.service.redaction.v1.server.model.dictionary.DictionarySearch;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.Page;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Page;
|
||||||
@ -40,7 +39,6 @@ import com.iqser.red.service.redaction.v1.server.model.document.textblock.TextBl
|
|||||||
import com.iqser.red.service.redaction.v1.server.rules.RulesIntegrationTest;
|
import com.iqser.red.service.redaction.v1.server.rules.RulesIntegrationTest;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.DictionaryService;
|
import com.iqser.red.service.redaction.v1.server.service.DictionaryService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.service.drools.EntityDroolsExecutionService;
|
import com.iqser.red.service.redaction.v1.server.service.drools.EntityDroolsExecutionService;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility;
|
import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility;
|
||||||
import com.knecon.fforesight.tenantcommons.TenantContext;
|
import com.knecon.fforesight.tenantcommons.TenantContext;
|
||||||
@ -54,10 +52,6 @@ public class DocumentPerformanceIntegrationTest extends RulesIntegrationTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DictionaryService dictionaryService;
|
private DictionaryService dictionaryService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
private EntityCreationService entityCreationService;
|
private EntityCreationService entityCreationService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@ -71,7 +65,7 @@ public class DocumentPerformanceIntegrationTest extends RulesIntegrationTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void stubClients() {
|
public void stubClients() {
|
||||||
|
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
TenantContext.setTenantId("redaction");
|
TenantContext.setTenantId("redaction");
|
||||||
|
|
||||||
when(rulesClient.getVersion(TEST_DOSSIER_TEMPLATE_ID, RuleFileType.ENTITY)).thenReturn(System.currentTimeMillis());
|
when(rulesClient.getVersion(TEST_DOSSIER_TEMPLATE_ID, RuleFileType.ENTITY)).thenReturn(System.currentTimeMillis());
|
||||||
|
|||||||
@ -5,32 +5,22 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.dictionary.SearchImplementation;
|
import com.iqser.red.service.redaction.v1.server.model.dictionary.SearchImplementation;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
|
|
||||||
public class SearchImplementationTest extends BuildDocumentIntegrationTest {
|
public class SearchImplementationTest extends BuildDocumentIntegrationTest {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchImplementationWithPunctuation() {
|
public void testSearchImplementationWithPunctuation() {
|
||||||
|
|
||||||
Document document = buildGraph("files/Minimal Examples/TestPunctuation");
|
Document document = buildGraph("files/Minimal Examples/TestPunctuation");
|
||||||
|
|
||||||
SearchImplementation searchImplementation = new SearchImplementation(List.of("Kuhn, J. O."), true);
|
SearchImplementation searchImplementation = new SearchImplementation(List.of("Kuhn, J. O."), true);
|
||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
List<TextEntity> entities = entityCreationService.bySearchImplementation(searchImplementation, "CBI_author", EntityType.ENTITY, document)
|
List<TextEntity> entities = entityCreationService.bySearchImplementation(searchImplementation, "CBI_author", EntityType.ENTITY, document)
|
||||||
.toList();
|
.toList();
|
||||||
assertEquals(2, entities.size());
|
assertEquals(2, entities.size());
|
||||||
@ -42,7 +32,7 @@ public class SearchImplementationTest extends BuildDocumentIntegrationTest {
|
|||||||
Document document = buildGraph("files/syngenta/CustomerFiles/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections");
|
Document document = buildGraph("files/syngenta/CustomerFiles/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections");
|
||||||
|
|
||||||
SearchImplementation searchImplementation = new SearchImplementation(List.of("mydossierredaction"), true);
|
SearchImplementation searchImplementation = new SearchImplementation(List.of("mydossierredaction"), true);
|
||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
List<TextEntity> entities = entityCreationService.bySearchImplementation(searchImplementation, "dossier_redaction", EntityType.ENTITY, document)
|
List<TextEntity> entities = entityCreationService.bySearchImplementation(searchImplementation, "dossier_redaction", EntityType.ENTITY, document)
|
||||||
.toList();
|
.toList();
|
||||||
assertEquals(2, entities.size());
|
assertEquals(2, entities.size());
|
||||||
|
|||||||
@ -12,17 +12,14 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.NodeType;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.NodeType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService;
|
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.EntityVisualizationUtility;
|
import com.iqser.red.service.redaction.v1.server.utils.EntityVisualizationUtility;
|
||||||
import com.knecon.fforesight.service.viewerdoc.service.PDFTronViewerDocumentService;
|
import com.knecon.fforesight.service.viewerdoc.service.PDFTronViewerDocumentService;
|
||||||
@ -33,12 +30,6 @@ import lombok.SneakyThrows;
|
|||||||
public class TableTest extends BuildDocumentIntegrationTest {
|
public class TableTest extends BuildDocumentIntegrationTest {
|
||||||
|
|
||||||
private static final boolean DRAW_FILE = false;
|
private static final boolean DRAW_FILE = false;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
|
|
||||||
private EntityCreationService entityCreationService;
|
private EntityCreationService entityCreationService;
|
||||||
|
|
||||||
private static final String TYPE_1 = "type1";
|
private static final String TYPE_1 = "type1";
|
||||||
@ -55,7 +46,7 @@ public class TableTest extends BuildDocumentIntegrationTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void createTable() {
|
public void createTable() {
|
||||||
|
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
|
|
||||||
String fileName = "files/Minimal Examples/BasicTable.pdf";
|
String fileName = "files/Minimal Examples/BasicTable.pdf";
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,6 @@ import com.iqser.red.service.redaction.v1.server.DeprecatedElementsFinder;
|
|||||||
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
||||||
import com.iqser.red.service.redaction.v1.server.client.RulesClient;
|
import com.iqser.red.service.redaction.v1.server.client.RulesClient;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint;
|
import com.iqser.red.service.redaction.v1.server.model.drools.RuleFileBluePrint;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.service.drools.DroolsValidationService;
|
import com.iqser.red.service.redaction.v1.server.service.drools.DroolsValidationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.drools.KieContainerCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.drools.KieContainerCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.drools.RuleFileParser;
|
import com.iqser.red.service.redaction.v1.server.service.drools.RuleFileParser;
|
||||||
@ -36,8 +35,6 @@ class DroolsValidationServiceTest {
|
|||||||
@MockBean
|
@MockBean
|
||||||
RulesClient rulesClient;
|
RulesClient rulesClient;
|
||||||
@MockBean
|
@MockBean
|
||||||
EntityEnrichmentService entityEnrichmentService;
|
|
||||||
@MockBean
|
|
||||||
RedactionServiceSettings redactionServiceSettings;
|
RedactionServiceSettings redactionServiceSettings;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,6 @@ import org.junit.jupiter.api.BeforeEach;
|
|||||||
import org.junit.jupiter.api.Disabled;
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
|
||||||
@ -51,11 +50,9 @@ import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest;
|
|||||||
import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse;
|
import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse;
|
||||||
import com.iqser.red.service.redaction.v1.server.mapper.DocumentGraphMapper;
|
import com.iqser.red.service.redaction.v1.server.mapper.DocumentGraphMapper;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
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.redaction.utils.OsUtils;
|
import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
||||||
import com.knecon.fforesight.tenantcommons.TenantContext;
|
import com.knecon.fforesight.tenantcommons.TenantContext;
|
||||||
|
|
||||||
@ -69,11 +66,6 @@ public class ManualChangesEnd2EndTest extends AbstractRedactionIntegrationTest {
|
|||||||
private static final String RULES = loadFromClassPath("drools/acceptance_rules.drl");
|
private static final String RULES = loadFromClassPath("drools/acceptance_rules.drl");
|
||||||
private static final String DM_RULES = loadFromClassPath("drools/documine_flora.drl");
|
private static final String DM_RULES = loadFromClassPath("drools/documine_flora.drl");
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
|
|
||||||
private EntityCreationService entityCreationService;
|
private EntityCreationService entityCreationService;
|
||||||
|
|
||||||
@ -81,7 +73,7 @@ public class ManualChangesEnd2EndTest extends AbstractRedactionIntegrationTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void createServices() {
|
public void createServices() {
|
||||||
|
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -15,16 +15,22 @@ import java.util.stream.Collectors;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.mapper.DocumentGraphMapper;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.Paragraph;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Paragraph;
|
||||||
import com.iqser.red.service.redaction.v1.server.rules.RulesIntegrationTest;
|
import com.iqser.red.service.redaction.v1.server.rules.RulesIntegrationTest;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.service.drools.KieSessionUpdater;
|
||||||
|
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
public class ManualChangesIntegrationTest extends RulesIntegrationTest {
|
public class ManualChangesIntegrationTest extends RulesIntegrationTest {
|
||||||
|
|
||||||
@ -225,4 +231,14 @@ public class ManualChangesIntegrationTest extends RulesIntegrationTest {
|
|||||||
return new Rectangle((float) rectangle2D.getMinX(), (float) rectangle2D.getMinY(), (float) rectangle2D.getWidth(), (float) rectangle2D.getHeight(), number);
|
return new Rectangle((float) rectangle2D.getMinX(), (float) rectangle2D.getMinY(), (float) rectangle2D.getWidth(), (float) rectangle2D.getHeight(), number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
|
protected Document buildGraph(String filename) {
|
||||||
|
|
||||||
|
Document document = super.buildGraph(filename);
|
||||||
|
document.setKieSessionUpdater(new KieSessionUpdater(kieSession));
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,19 +17,12 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||||
import com.iqser.red.service.redaction.v1.server.document.graph.BuildDocumentIntegrationTest;
|
import com.iqser.red.service.redaction.v1.server.document.graph.BuildDocumentIntegrationTest;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
|
|
||||||
public class ManualChangesUnitTest extends BuildDocumentIntegrationTest {
|
public class ManualChangesUnitTest extends BuildDocumentIntegrationTest {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
|
|
||||||
private EntityCreationService entityCreationService;
|
private EntityCreationService entityCreationService;
|
||||||
|
|
||||||
@ -37,7 +30,7 @@ public class ManualChangesUnitTest extends BuildDocumentIntegrationTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void createServices() {
|
public void createServices() {
|
||||||
|
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -30,24 +30,17 @@ import com.iqser.red.service.redaction.v1.server.model.PrecursorEntity;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.dictionary.DictionaryVersion;
|
import com.iqser.red.service.redaction.v1.server.model.dictionary.DictionaryVersion;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.IEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.service.DictionaryService;
|
import com.iqser.red.service.redaction.v1.server.service.DictionaryService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.EntityLogCreatorService;
|
import com.iqser.red.service.redaction.v1.server.service.EntityLogCreatorService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityFromPrecursorCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityFromPrecursorCreationService;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
public class PrecursorEntityTest extends BuildDocumentIntegrationTest {
|
public class PrecursorEntityTest extends BuildDocumentIntegrationTest {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EntityFromPrecursorCreationService entityFromPrecursorCreationService;
|
private EntityFromPrecursorCreationService entityFromPrecursorCreationService;
|
||||||
@ -108,7 +101,7 @@ public class PrecursorEntityTest extends BuildDocumentIntegrationTest {
|
|||||||
public void createFoundManualRedaction2() {
|
public void createFoundManualRedaction2() {
|
||||||
|
|
||||||
Document document = buildGraph("files/Minimal Examples/TestPunctuation");
|
Document document = buildGraph("files/Minimal Examples/TestPunctuation");
|
||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
|
|
||||||
List<TextEntity> tempEntities = entityCreationService.byString("Kuhn, J. O.", "CBI_author", EntityType.ENTITY, document)
|
List<TextEntity> tempEntities = entityCreationService.byString("Kuhn, J. O.", "CBI_author", EntityType.ENTITY, document)
|
||||||
.toList();
|
.toList();
|
||||||
@ -163,7 +156,7 @@ public class PrecursorEntityTest extends BuildDocumentIntegrationTest {
|
|||||||
private DocumentAndEntity createFoundManualRedaction() {
|
private DocumentAndEntity createFoundManualRedaction() {
|
||||||
|
|
||||||
Document document = buildGraph("files/syngenta/CustomerFiles/VV-919901.pdf");
|
Document document = buildGraph("files/syngenta/CustomerFiles/VV-919901.pdf");
|
||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
EntityCreationService entityCreationService = new EntityCreationService();
|
||||||
|
|
||||||
List<TextEntity> tempEntities = entityCreationService.byString("To: Syngenta Ltd.", "temp", EntityType.ENTITY, document)
|
List<TextEntity> tempEntities = entityCreationService.byString("To: Syngenta Ltd.", "temp", EntityType.ENTITY, document)
|
||||||
.toList();
|
.toList();
|
||||||
|
|||||||
@ -19,7 +19,6 @@ import org.apache.pdfbox.Loader;
|
|||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
|
||||||
import com.iqser.red.commons.jackson.ObjectMapperFactory;
|
import com.iqser.red.commons.jackson.ObjectMapperFactory;
|
||||||
@ -29,11 +28,9 @@ import com.iqser.red.service.redaction.v1.server.model.NerEntities;
|
|||||||
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.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.PositionOnPage;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.RelationStore;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
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.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.NerEntitiesAdapter;
|
import com.iqser.red.service.redaction.v1.server.service.document.NerEntitiesAdapter;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility;
|
import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility;
|
||||||
|
|
||||||
@ -43,10 +40,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest {
|
class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityEnrichmentService entityEnrichmentService;
|
|
||||||
@Autowired
|
|
||||||
private RelationStore relationStore;
|
|
||||||
private EntityCreationService entityCreationService;
|
private EntityCreationService entityCreationService;
|
||||||
|
|
||||||
|
|
||||||
@ -61,7 +54,7 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void createEntityCreationService() {
|
public void createEntityCreationService() {
|
||||||
|
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -22,11 +22,9 @@ import org.springframework.context.annotation.Import;
|
|||||||
import com.iqser.red.service.redaction.v1.server.AbstractRedactionIntegrationTest;
|
import com.iqser.red.service.redaction.v1.server.AbstractRedactionIntegrationTest;
|
||||||
import com.iqser.red.service.redaction.v1.server.document.graph.BuildDocumentIntegrationTest;
|
import com.iqser.red.service.redaction.v1.server.document.graph.BuildDocumentIntegrationTest;
|
||||||
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.RelationStore;
|
|
||||||
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.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;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
|
||||||
|
|
||||||
@ExtendWith(MockitoExtension.class)
|
@ExtendWith(MockitoExtension.class)
|
||||||
@Import(RulesIntegrationTest.TestConfiguration.class)
|
@Import(RulesIntegrationTest.TestConfiguration.class)
|
||||||
@ -34,10 +32,6 @@ public class RulesIntegrationTest extends BuildDocumentIntegrationTest {
|
|||||||
|
|
||||||
protected static final String RULES = "drools/rules.drl";
|
protected static final String RULES = "drools/rules.drl";
|
||||||
|
|
||||||
@Autowired
|
|
||||||
protected EntityEnrichmentService entityEnrichmentService;
|
|
||||||
@Autowired
|
|
||||||
protected RelationStore relationStore;
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected ManualChangesApplicationService manualChangesApplicationService;
|
protected ManualChangesApplicationService manualChangesApplicationService;
|
||||||
protected EntityCreationService entityCreationService;
|
protected EntityCreationService entityCreationService;
|
||||||
@ -85,7 +79,7 @@ public class RulesIntegrationTest extends BuildDocumentIntegrationTest {
|
|||||||
|
|
||||||
Dictionary dict = Mockito.mock(Dictionary.class);
|
Dictionary dict = Mockito.mock(Dictionary.class);
|
||||||
kieSession = kieContainer.newKieSession();
|
kieSession = kieContainer.newKieSession();
|
||||||
entityCreationService = new EntityCreationService(entityEnrichmentService, relationStore);
|
entityCreationService = new EntityCreationService();
|
||||||
kieSession.setGlobal("manualChangesApplicationService", manualChangesApplicationService);
|
kieSession.setGlobal("manualChangesApplicationService", manualChangesApplicationService);
|
||||||
kieSession.setGlobal("entityCreationService", entityCreationService);
|
kieSession.setGlobal("entityCreationService", entityCreationService);
|
||||||
kieSession.setGlobal("dictionary", dict);
|
kieSession.setGlobal("dictionary", dict);
|
||||||
|
|||||||
@ -1660,104 +1660,4 @@ Zyma SA
|
|||||||
Zyma SA, Nyon, Switzerland
|
Zyma SA, Nyon, Switzerland
|
||||||
Mambo-Tox Ltd. Biomedical Sciences Building Bassett Crescent East Southampton SO16 7PX UK
|
Mambo-Tox Ltd. Biomedical Sciences Building Bassett Crescent East Southampton SO16 7PX UK
|
||||||
Syngenta Environmental Sciences Jealott’s Hill International Research Centre Bracknell, Berkshire RG42 6EY UK
|
Syngenta Environmental Sciences Jealott’s Hill International Research Centre Bracknell, Berkshire RG42 6EY UK
|
||||||
Test Ignored Hint CBI_ADDRESS
|
Test Ignored Hint CBI_ADDRESS
|
||||||
the
|
|
||||||
be
|
|
||||||
to
|
|
||||||
of
|
|
||||||
and
|
|
||||||
a
|
|
||||||
in
|
|
||||||
that
|
|
||||||
have
|
|
||||||
I
|
|
||||||
it
|
|
||||||
for
|
|
||||||
not
|
|
||||||
on
|
|
||||||
with
|
|
||||||
he
|
|
||||||
as
|
|
||||||
you
|
|
||||||
do
|
|
||||||
at
|
|
||||||
this
|
|
||||||
but
|
|
||||||
his
|
|
||||||
by
|
|
||||||
from
|
|
||||||
they
|
|
||||||
we
|
|
||||||
say
|
|
||||||
her
|
|
||||||
she
|
|
||||||
or
|
|
||||||
an
|
|
||||||
will
|
|
||||||
my
|
|
||||||
one
|
|
||||||
all
|
|
||||||
would
|
|
||||||
there
|
|
||||||
their
|
|
||||||
what
|
|
||||||
so
|
|
||||||
up
|
|
||||||
out
|
|
||||||
if
|
|
||||||
about
|
|
||||||
who
|
|
||||||
get
|
|
||||||
which
|
|
||||||
go
|
|
||||||
me
|
|
||||||
when
|
|
||||||
make
|
|
||||||
can
|
|
||||||
like
|
|
||||||
time
|
|
||||||
no
|
|
||||||
just
|
|
||||||
him
|
|
||||||
know
|
|
||||||
take
|
|
||||||
people
|
|
||||||
into
|
|
||||||
year
|
|
||||||
your
|
|
||||||
good
|
|
||||||
some
|
|
||||||
could
|
|
||||||
them
|
|
||||||
see
|
|
||||||
other
|
|
||||||
than
|
|
||||||
then
|
|
||||||
now
|
|
||||||
look
|
|
||||||
only
|
|
||||||
come
|
|
||||||
its
|
|
||||||
over
|
|
||||||
think
|
|
||||||
also
|
|
||||||
back
|
|
||||||
after
|
|
||||||
use
|
|
||||||
two
|
|
||||||
how
|
|
||||||
our
|
|
||||||
work
|
|
||||||
first
|
|
||||||
well
|
|
||||||
way
|
|
||||||
even
|
|
||||||
new
|
|
||||||
want
|
|
||||||
because
|
|
||||||
any
|
|
||||||
these
|
|
||||||
give
|
|
||||||
day
|
|
||||||
most
|
|
||||||
us
|
|
||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
||||||
@ -1135,7 +1134,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1159,7 +1158,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1184,7 +1183,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1195,7 +1194,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1239,7 +1238,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
||||||
@ -1899,7 +1898,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1923,7 +1922,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1948,7 +1947,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1959,7 +1958,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2003,7 +2002,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
@ -1271,7 +1270,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1295,7 +1294,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1320,7 +1319,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1331,7 +1330,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1375,7 +1374,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
||||||
@ -862,7 +861,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -886,7 +885,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -911,7 +910,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -922,7 +921,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -966,7 +965,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
@ -183,7 +182,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -207,7 +206,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -232,7 +231,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -243,7 +242,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -287,7 +286,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,11 +18,10 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Containment
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Containment;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Equality
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Equality;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.Intersection
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.Intersection;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
||||||
@ -1158,7 +1157,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1182,7 +1181,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1207,7 +1206,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1218,7 +1217,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1262,7 +1261,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1499,21 +1498,6 @@ rule "X.10.0: remove false positives of ai"
|
|||||||
end
|
end
|
||||||
|
|
||||||
// Rule unit: X.11
|
// Rule unit: X.11
|
||||||
rule "X.11.0: Remove dictionary entity which intersects with a manual entity"
|
|
||||||
salience 64
|
|
||||||
when
|
|
||||||
$intersection: Intersection(
|
|
||||||
$a: a,
|
|
||||||
$b: b,
|
|
||||||
$a.engines contains Engine.MANUAL,
|
|
||||||
$a.active(),
|
|
||||||
$b.dictionaryEntry,
|
|
||||||
$b.engines not contains Engine.MANUAL
|
|
||||||
)
|
|
||||||
then
|
|
||||||
$b.remove("X.11.0", "remove dictionary entity which intersects with a manual entity");
|
|
||||||
end
|
|
||||||
|
|
||||||
rule "X.11.1: Remove non-manual entity which intersects with a manual entity"
|
rule "X.11.1: Remove non-manual entity which intersects with a manual entity"
|
||||||
salience 64
|
salience 64
|
||||||
when
|
when
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
@ -254,7 +253,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -278,7 +277,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -303,7 +302,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -314,7 +313,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -345,7 +344,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
@ -333,7 +332,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -357,7 +356,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -382,7 +381,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -393,7 +392,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -437,7 +436,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
@ -233,7 +232,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -257,7 +256,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -282,7 +281,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -293,7 +292,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -337,7 +336,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
||||||
@ -746,7 +745,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -770,7 +769,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -795,7 +794,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -806,7 +805,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -850,7 +849,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.SuperSection;
|
||||||
@ -1917,7 +1916,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1941,7 +1940,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1966,7 +1965,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1977,7 +1976,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2022,7 +2021,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,7 @@ import com.iqser.red.service.redaction.v1.server.model.document.TextRange;
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.MatchedRule
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.*;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Table;
|
||||||
@ -1338,7 +1337,7 @@ rule "MAN.1.0: Apply id removals that are valid and not in forced redactions to
|
|||||||
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
$idRemoval: IdRemoval($id: annotationId, !removeFromDictionary, !removeFromAllDossiers)
|
||||||
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
$entityToBeRemoved: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeRemoved.getManualOverwrite().addChange($idRemoval);
|
$entityToBeRemoved.addManualChange($idRemoval);
|
||||||
retract($idRemoval);
|
retract($idRemoval);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1362,7 +1361,7 @@ rule "MAN.2.0: Apply force redaction"
|
|||||||
$force: ManualForceRedaction($id: annotationId)
|
$force: ManualForceRedaction($id: annotationId)
|
||||||
$entityToForce: TextEntity(matchesAnnotationId($id))
|
$entityToForce: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToForce.getManualOverwrite().addChange($force);
|
$entityToForce.addManualChange($force);
|
||||||
retract($force);
|
retract($force);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1387,7 +1386,7 @@ rule "MAN.3.0: Apply entity recategorization"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() != $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1398,7 +1397,7 @@ rule "MAN.3.1: Apply entity recategorization of same type"
|
|||||||
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
not ManualRecategorization($id == annotationId, requestDate.isBefore($requestDate))
|
||||||
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
$entityToBeRecategorized: TextEntity(matchesAnnotationId($id), type() == $type)
|
||||||
then
|
then
|
||||||
$entityToBeRecategorized.getManualOverwrite().addChange($recategorization);
|
$entityToBeRecategorized.addManualChange($recategorization);
|
||||||
retract($recategorization);
|
retract($recategorization);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1441,7 +1440,7 @@ rule "MAN.4.1: Apply legal basis change"
|
|||||||
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
$legalBasisChange: ManualLegalBasisChange($id: annotationId)
|
||||||
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
$entityToBeChanged: TextEntity(matchesAnnotationId($id))
|
||||||
then
|
then
|
||||||
$entityToBeChanged.getManualOverwrite().addChange($legalBasisChange);
|
$entityToBeChanged.addManualChange($legalBasisChange);
|
||||||
retract($legalBasisChange)
|
retract($legalBasisChange)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user