Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SO-4633: Ensure description inactivator member inactivation is possible #753

Open
wants to merge 4 commits into
base: 7.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,28 @@
* @since 7.9.2
*/
public class SnomedComponentInactivationApiTest extends AbstractSnomedApiTest {


@Test
public void descriptionInactivationIndicatorInactivation() {
String conceptId = createNewConcept(branchPath);
SnomedConcept concept = getConcept(conceptId, "descriptions()");
String descriptionId = concept.getDescriptions().getItems().get(0).getId();

Map<?, ?> pendingMoveUpdate = ImmutableMap.of(
"inactivationProperties", new InactivationProperties(Concepts.PENDING_MOVE, null),
"commitComment", "Set to Pending Move");
updateComponent(branchPath, SnomedComponentType.DESCRIPTION, descriptionId, pendingMoveUpdate).statusCode(204);
SnomedDescription description = getDescription(descriptionId, "members()");
assertEquals(true, getIndicatorMember(description, Concepts.REFSET_DESCRIPTION_INACTIVITY_INDICATOR).isActive());

Map<?, ?> indicatorStatusUpdate = ImmutableMap.of(
"inactivationProperties", new InactivationProperties(Concepts.PENDING_MOVE, null, false),
"commitComment", "Inactivate Inactivation Indicator");
updateComponent(branchPath, SnomedComponentType.DESCRIPTION, descriptionId, indicatorStatusUpdate).statusCode(204);
SnomedDescription updatedDescription = getDescription(descriptionId, "members()");
assertEquals(false, getIndicatorMember(updatedDescription, Concepts.REFSET_DESCRIPTION_INACTIVITY_INDICATOR).isActive());
}

@Test
public void reuseConceptAndDescriptionInactivationIndicators() throws Exception {
// create a concept
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public final class InactivationProperties implements Serializable {

private static final long serialVersionUID = 1L;

private Boolean inactivationIndicatorStatus;
private SnomedConcept inactivationIndicator;
private List<AssociationTarget> associationTargets;

Expand All @@ -36,6 +37,12 @@ public InactivationProperties(String inactivationIndicatorId, List<AssociationTa
setAssociationTargets(associationTargets);
}

public InactivationProperties(String inactivationIndicatorId, List<AssociationTarget> associationTargets, Boolean inactivationIndicatorStatus) {
setInactivationIndicatorId(inactivationIndicatorId);
setAssociationTargets(associationTargets);
setInactivationIndicatorStatus(inactivationIndicatorStatus);
}

/**
* Returns the component's corresponding active inactivation indicator member value. In case of multiple values present in the corresponding
* inactivation indicator reference set this value will return the first active occurrence from that refset.
Expand Down Expand Up @@ -70,5 +77,13 @@ public List<AssociationTarget> getAssociationTargets() {
public void setAssociationTargets(List<AssociationTarget> associationTargets) {
this.associationTargets = associationTargets;
}

public Boolean getInactivationIndicatorStatus() {
return inactivationIndicatorStatus;
}

public void setInactivationIndicatorStatus(Boolean inactivationIndicatorStatus) {
this.inactivationIndicatorStatus = inactivationIndicatorStatus;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,28 @@ protected final boolean ensureMemberActive(final TransactionContext context, fin

}
}

protected final boolean ensureStatusChanged(final TransactionContext context, final SnomedReferenceSetMember existingMember,
final Boolean newMemberStatus, final SnomedRefSetMemberIndexEntry.Builder updatedMember) {
if (newMemberStatus == null) {
return false;
} else if (!existingMember.isActive() && newMemberStatus) {
if (LOG.isDebugEnabled()) { LOG.debug("Reactivating {} member {}.", getMemberType(), existingMember.getId()); }
updatedMember.active(true);
updateModule(context, existingMember, updatedMember, context.service(ModuleIdProvider.class).apply(componentToUpdate));
unsetEffectiveTime(existingMember, updatedMember);
return true;
} else if (existingMember.isActive() && !newMemberStatus) {
if (LOG.isDebugEnabled()) { LOG.debug("Inactivating {} member {}.", getMemberType(), existingMember.getId()); }
updatedMember.active(false);
updateModule(context, existingMember, updatedMember, context.service(ModuleIdProvider.class).apply(componentToUpdate));
unsetEffectiveTime(existingMember, updatedMember);
return true;
} else {
if (LOG.isDebugEnabled()) { LOG.debug("{} member {} already {}, not updating.", getMemberType(), existingMember.getId(), newMemberStatus ? "active" : "inactive"); }
return false;
}
}

protected final boolean removeOrDeactivate(final TransactionContext context, final SnomedReferenceSetMember existingMember, final SnomedRefSetMemberIndexEntry.Builder updatedMember) {
if (!existingMember.isReleased()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ protected final <B extends SnomedComponentDocument.Builder<B, T>, T extends Snom
final boolean currentStatus = component.isActive();
final boolean newStatus = isActive() == null ? currentStatus : isActive();
final String newInactivationIndicatorId = getInactivationProperties() == null || getInactivationProperties().getInactivationIndicatorId() == null ? "" : getInactivationProperties().getInactivationIndicatorId();
final Boolean newInactivationIndicatorStatus = getInactivationProperties() == null ? null : getInactivationProperties().getInactivationIndicatorStatus();
final ImmutableMultimap.Builder<String, String> newAssociationTargets = ImmutableMultimap.builder();

if (getInactivationProperties() != null && !CompareUtils.isEmpty(getInactivationProperties().getAssociationTargets())) {
Expand All @@ -114,7 +115,7 @@ protected final <B extends SnomedComponentDocument.Builder<B, T>, T extends Snom
// (using default values if not given)

inactivateComponent(context, component, updatedComponent);
updateInactivationIndicator(context, component, newInactivationIndicatorId);
updateInactivationIndicator(context, component, newInactivationIndicatorId, newInactivationIndicatorStatus);
updateAssociationTargets(context, component, newAssociationTargets.build());
postInactivateComponent(context, component, updatedComponent);
return true;
Expand All @@ -124,7 +125,7 @@ protected final <B extends SnomedComponentDocument.Builder<B, T>, T extends Snom
// Inactive --> Active: concept reactivation, clear indicator and association targets

reactivateComponent(context, component, updatedComponent);
updateInactivationIndicator(context, component, newInactivationIndicatorId);
updateInactivationIndicator(context, component, newInactivationIndicatorId, newInactivationIndicatorStatus);
updateAssociationTargets(context, component, newAssociationTargets.build());
postReactivateComponent(context, component, updatedComponent);
return true;
Expand All @@ -134,7 +135,10 @@ protected final <B extends SnomedComponentDocument.Builder<B, T>, T extends Snom
// Same status, allow indicator and/or association targets to be updated if required
// (using original values that can be null)

updateInactivationIndicator(context, component, getInactivationProperties() != null ? getInactivationProperties().getInactivationIndicatorId() : null);
updateInactivationIndicator(context,
component,
getInactivationProperties() != null ? getInactivationProperties().getInactivationIndicatorId() : null,
newInactivationIndicatorStatus);
updateAssociationTargets(context, component, newAssociationTargets.build());
return false;

Expand Down Expand Up @@ -173,14 +177,15 @@ protected final void updateAssociationTargets(final TransactionContext context,
}
new SnomedAssociationTargetUpdateRequest(concept, associationTargets).execute(context);
}

protected final void updateInactivationIndicator(final TransactionContext context, final SnomedComponentDocument concept, final String newInactivationIndicatorId) {
protected final void updateInactivationIndicator(final TransactionContext context, final SnomedComponentDocument concept, final String newInactivationIndicatorId, Boolean newInactivationIndicatorStatus) {
if (newInactivationIndicatorId == null) {
return;
}

final SnomedInactivationReasonUpdateRequest inactivationUpdateRequest = new SnomedInactivationReasonUpdateRequest(concept, getInactivationIndicatorRefSetId());
inactivationUpdateRequest.setInactivationValueId(newInactivationIndicatorId);
inactivationUpdateRequest.setInactivationMemberStatus(newInactivationIndicatorStatus);
inactivationUpdateRequest.execute(context);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ final class SnomedInactivationReasonUpdateRequest extends BaseComponentMemberUpd

private final String inactivationRefSetId;
private String inactivationValueId;
private Boolean inactivationMemberStatus;


SnomedInactivationReasonUpdateRequest(final SnomedComponentDocument componentToUpdate, final String inactivationRefSetId) {
Expand All @@ -87,7 +88,11 @@ final class SnomedInactivationReasonUpdateRequest extends BaseComponentMemberUpd
void setInactivationValueId(final String inactivationValueId) {
this.inactivationValueId = inactivationValueId;
}


public void setInactivationMemberStatus(Boolean inactivationMemberStatus) {
this.inactivationMemberStatus = inactivationMemberStatus;
}

@Override
protected boolean canUpdate(TransactionContext context) {
// Null leaves inactivation reason unchanged, empty string clears existing inactivation reason
Expand Down Expand Up @@ -130,7 +135,7 @@ protected void doExecute(TransactionContext context, SnomedComponentDocument com
if (Objects.equals(existingValueId, inactivationValueId)) {

// Exact match, just make sure that the member is active
changed = ensureMemberActive(context, existingMember, updatedMember);
changed = ensureStatusChanged(context, existingMember, inactivationMemberStatus, updatedMember);

} else if (!CLEAR.equals(inactivationValueId)) {
// Re-use this member, if the intention was not to remove the existing value
Expand Down Expand Up @@ -172,5 +177,5 @@ protected void doExecute(TransactionContext context, SnomedComponentDocument com
.addTo(context);
}
}

}