use of com.b2international.commons.exceptions.BadRequestException in project snow-owl by b2ihealthcare.
the class RelationshipChangeConverter method expand.
@Override
public void expand(final List<RelationshipChange> results) {
if (!expand().containsKey(RelationshipChange.Expand.RELATIONSHIP)) {
return;
}
/*
* Depending on the relationship change search request, we might need to issue
* SNOMED CT searches against multiple branches; find out which ones we have.
*/
final Multimap<String, RelationshipChange> itemsByBranch = getItemsByBranch(results);
// Check if we only need to load inferred relationships in their entirety
final Options expandOptions = expand().getOptions(RelationshipChange.Expand.RELATIONSHIP);
final boolean inferredOnly = expandOptions.getBoolean("inferredOnly");
final Options relationshipExpandOptions = expandOptions.getOptions("expand");
final Options sourceOptions = relationshipExpandOptions.getOptions(SnomedRelationship.Expand.SOURCE);
final Options typeOptions = relationshipExpandOptions.getOptions(SnomedRelationship.Expand.TYPE);
final Options destinationOptions = relationshipExpandOptions.getOptions(SnomedRelationship.Expand.DESTINATION);
final boolean needsSource = relationshipExpandOptions.keySet().contains(SnomedRelationship.Expand.SOURCE);
final boolean needsType = relationshipExpandOptions.keySet().contains(SnomedRelationship.Expand.TYPE);
final boolean needsDestination = relationshipExpandOptions.keySet().contains(SnomedRelationship.Expand.DESTINATION);
// Do not allow expansion of members
final boolean needsMembers = relationshipExpandOptions.keySet().contains(MEMBERS);
if (needsMembers) {
throw new BadRequestException("Members can not be expanded on reasoner relationship changes.");
}
for (final String branch : itemsByBranch.keySet()) {
final Collection<RelationshipChange> itemsForCurrentBranch = itemsByBranch.get(branch);
/*
* Expand concepts on the relationship currently set on each item first, as they
* might have changed when compared to the "origin" relationship.
*/
if (needsSource) {
expandConcepts(branch, itemsForCurrentBranch, sourceOptions, ReasonerRelationship::getSourceId, ReasonerRelationship::setSource);
}
if (needsType) {
expandConcepts(branch, itemsForCurrentBranch, typeOptions, ReasonerRelationship::getTypeId, ReasonerRelationship::setType);
}
if (needsDestination) {
expandConcepts(branch, itemsForCurrentBranch, destinationOptions, ReasonerRelationship::getDestinationId, ReasonerRelationship::setDestination);
}
// Now fetch the rest of the properties for the relationships (except IS As where no ID is recorded)
final Set<String> relationshipIds = itemsForCurrentBranch.stream().filter(c -> !inferredOnly || ChangeNature.NEW.equals(c.getChangeNature())).map(c -> c.getRelationship().getOriginId()).filter(id -> id != null).collect(Collectors.toSet());
final Request<BranchContext, SnomedRelationships> relationshipSearchRequest = SnomedRequests.prepareSearchRelationship().filterByIds(relationshipIds).setLimit(relationshipIds.size()).setExpand(relationshipExpandOptions).setLocales(locales()).build();
final SnomedRelationships relationships = new BranchRequest<>(branch, new RevisionIndexReadRequest<>(relationshipSearchRequest)).execute(context());
final Map<String, SnomedRelationship> relationshipsById = Maps.uniqueIndex(relationships, SnomedRelationship::getId);
for (final RelationshipChange item : itemsForCurrentBranch) {
final ReasonerRelationship reasonerRelationship = item.getRelationship();
final String originId = reasonerRelationship.getOriginId();
switch(item.getChangeNature()) {
case NEW:
if (originId == null) {
// reasonerRelationship.setCharacteristicType(...) is already set
// reasonerRelationship.setDestination(...) is already set
reasonerRelationship.setDestinationNegated(false);
// reasonerRelationship.setGroup(...) is already set
reasonerRelationship.setModifierId(Concepts.EXISTENTIAL_RESTRICTION_MODIFIER);
// reasonerRelationship.setReleased(...) is already set
// reasonerRelationship.setSource(...) is already set
// reasonerRelationship.setType(...) is already set
// reasonerRelationship.setUnionGroup(...) is already set
// reasonerRelationship.setValue(...) is already set
} else {
final SnomedRelationship expandedRelationship = relationshipsById.get(originId);
// reasonerRelationship.setCharacteristicType(...) is already set
reasonerRelationship.setDestination(expandedRelationship.getDestination());
reasonerRelationship.setDestinationNegated(expandedRelationship.isDestinationNegated());
// reasonerRelationship.setGroup(...) is already set
reasonerRelationship.setModifierId(expandedRelationship.getModifierId());
// reasonerRelationship.setReleased(...) is already set
// reasonerRelationship.setSource(...) is already set
reasonerRelationship.setType(expandedRelationship.getType());
// reasonerRelationship.setUnionGroup(...) is already set
reasonerRelationship.setValueAsObject(expandedRelationship.getValueAsObject());
}
break;
case UPDATED:
if (!inferredOnly) {
final SnomedRelationship expandedRelationship = relationshipsById.get(originId);
reasonerRelationship.setCharacteristicTypeId(expandedRelationship.getCharacteristicTypeId());
reasonerRelationship.setDestination(expandedRelationship.getDestination());
reasonerRelationship.setDestinationNegated(expandedRelationship.isDestinationNegated());
// reasonerRelationship.setGroup(...) is already set
reasonerRelationship.setModifierId(expandedRelationship.getModifierId());
// reasonerRelationship.setReleased(...) is already set
reasonerRelationship.setSource(expandedRelationship.getSource());
reasonerRelationship.setType(expandedRelationship.getType());
reasonerRelationship.setUnionGroup(expandedRelationship.getUnionGroup());
reasonerRelationship.setValueAsObject(expandedRelationship.getValueAsObject());
}
break;
case REDUNDANT:
if (!inferredOnly) {
final SnomedRelationship expandedRelationship = relationshipsById.get(originId);
reasonerRelationship.setCharacteristicTypeId(expandedRelationship.getCharacteristicTypeId());
reasonerRelationship.setDestination(expandedRelationship.getDestination());
reasonerRelationship.setDestinationNegated(expandedRelationship.isDestinationNegated());
reasonerRelationship.setGroup(expandedRelationship.getRelationshipGroup());
reasonerRelationship.setModifierId(expandedRelationship.getModifierId());
// reasonerRelationship.setReleased(...) is already set
reasonerRelationship.setSource(expandedRelationship.getSource());
reasonerRelationship.setType(expandedRelationship.getType());
reasonerRelationship.setUnionGroup(expandedRelationship.getUnionGroup());
reasonerRelationship.setValueAsObject(expandedRelationship.getValueAsObject());
}
break;
default:
throw new IllegalStateException(String.format("Unexpected relationship change '%s' found with SCTID '%s'.", item.getChangeNature(), item.getRelationship().getOriginId()));
}
}
}
}
Aggregations