Skip to content
New issue

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

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

Already on GitHub? # to your account

feat(snomed.datastore): Allow clients to selectively update concept members #1311

Merged
merged 2 commits into from
Aug 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import com.b2international.snowowl.snomed.core.domain.refset.SnomedReferenceSetMember;
import com.b2international.snowowl.snomed.datastore.index.entry.SnomedConceptDocument;
import com.b2international.snowowl.snomed.datastore.request.SnomedConceptCreateRequestBuilder;
import com.b2international.snowowl.snomed.datastore.request.SnomedConceptUpdateRequestBuilder;
import com.b2international.snowowl.snomed.datastore.request.SnomedRequests;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
Expand Down Expand Up @@ -500,34 +501,39 @@

@Override
public Request<TransactionContext, String> toCreateRequest(String containerId) {
// XXX: "containerId" parameter is ignored in case of new concepts
return toCreateRequestBuilder().build();
}

public SnomedConceptCreateRequestBuilder toCreateRequestBuilder() {
return SnomedRequests.prepareNewConcept()
.setActive(isActive())
.addMembers(getMembers())
.addRelationships(getRelationships())
.addDescriptions(getDescriptions())
.setDefinitionStatusId(getDefinitionStatusId())
.setId(getId())
.setModuleId(getModuleId())
.setSubclassDefinitionStatus(getSubclassDefinitionStatus());
.setActive(isActive())
.addMembers(getMembers())
.addRelationships(getRelationships())
.addDescriptions(getDescriptions())
.setDefinitionStatusId(getDefinitionStatusId())
.setId(getId())
.setModuleId(getModuleId())
.setSubclassDefinitionStatus(getSubclassDefinitionStatus());

Check warning on line 517 in snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/SnomedConcept.java

View check run for this annotation

Codecov / codecov/patch

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/SnomedConcept.java#L510-L517

Added lines #L510 - L517 were not covered by tests
}

@Override
public Request<TransactionContext, Boolean> toUpdateRequest() {
return toUpdateRequestBuilder().build();

Check warning on line 522 in snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/SnomedConcept.java

View check run for this annotation

Codecov / codecov/patch

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/SnomedConcept.java#L522

Added line #L522 was not covered by tests
}

public SnomedConceptUpdateRequestBuilder toUpdateRequestBuilder() {
return SnomedRequests.prepareUpdateConcept(getId())
.setActive(isActive())
.setInactivationProperties(getInactivationProperties())
.setDefinitionStatusId(getDefinitionStatusId())
.setModuleId(getModuleId())
.setSubclassDefinitionStatus(getSubclassDefinitionStatus())
.setDescriptions(getDescriptions())
.setRelationships(getRelationships())
.setMembers(getMembers())
.build();
.setActive(isActive())
.setInactivationProperties(getInactivationProperties())
.setDefinitionStatusId(getDefinitionStatusId())
.setModuleId(getModuleId())
.setSubclassDefinitionStatus(getSubclassDefinitionStatus())
.setDescriptions(getDescriptions())
.setRelationships(getRelationships())
.setMembers(getMembers());

Check warning on line 534 in snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/SnomedConcept.java

View check run for this annotation

Codecov / codecov/patch

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/SnomedConcept.java#L527-L534

Added lines #L527 - L534 were not covered by tests
}


@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
private List<SnomedReferenceSetMember> members;

private SnomedReferenceSet refSet;
private Set<SnomedRefSetType> memberTypesToUpdate;

SnomedConceptUpdateRequest(String componentId) {
super(componentId);
Expand Down Expand Up @@ -106,6 +107,10 @@
this.refSet = refSet;
}

void setMemberTypesToUpdate(Set<SnomedRefSetType> memberTypesToUpdate) {
this.memberTypesToUpdate = memberTypesToUpdate;
}

@Override
public Boolean execute(TransactionContext context) {
final int pageSize = context.getPageSize();
Expand Down Expand Up @@ -224,9 +229,16 @@
}

private Set<String> getPreviousMemberIds(BranchContext context, String conceptId, int pageSize) {
// An empty set means none of the existing members should be considered
if (memberTypesToUpdate != null && memberTypesToUpdate.isEmpty()) {
return ImmutableSet.of();

Check warning on line 234 in snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedConceptUpdateRequest.java

View check run for this annotation

Codecov / codecov/patch

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedConceptUpdateRequest.java#L234

Added line #L234 was not covered by tests
}

return SnomedRequests.prepareSearchMember()
.setLimit(pageSize)
.filterByReferencedComponent(conceptId)
// This filter handles the "null" and "non-empty set" cases
.filterByRefSetType(memberTypesToUpdate)
.stream(context)
.flatMap(SnomedReferenceSetMembers::stream)
.filter(getFilter())
Expand All @@ -239,7 +251,7 @@
.filter(getFilter())
.collect(Collectors.toSet());
}

private Predicate<SnomedReferenceSetMember> getFilter() {
return m -> !FILTERED_REFSET_IDS.contains(m.getRefsetId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@
package com.b2international.snowowl.snomed.datastore.request;

import java.util.List;
import java.util.Set;

import com.b2international.snowowl.snomed.core.domain.SnomedDescription;
import com.b2international.snowowl.snomed.core.domain.SnomedRelationship;
import com.b2international.snowowl.snomed.core.domain.SubclassDefinitionStatus;
import com.b2international.snowowl.snomed.core.domain.refset.SnomedRefSetType;
import com.b2international.snowowl.snomed.core.domain.refset.SnomedReferenceSet;
import com.b2international.snowowl.snomed.core.domain.refset.SnomedReferenceSetMember;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;

/**
* @since 4.5
Expand All @@ -35,6 +38,7 @@
private List<SnomedRelationship> relationships;
private List<SnomedReferenceSetMember> members;
private SnomedReferenceSet refSet;
private Set<SnomedRefSetType> memberTypesToUpdate;

SnomedConceptUpdateRequestBuilder(String componentId) {
super(componentId);
Expand Down Expand Up @@ -75,6 +79,34 @@
return getSelf();
}

/**
* Supported input values are:
*
* <ul>
* <li><code>null</code> &rarr; <b>all</b> existing members of a concept are
* compared against the list provided in <code>members</code>
* </li>
*
* <li>empty set &rarr; <b>none</b> of the existing members of a concept are
* compared against the list provided in <code>members</code><br>
* (all elements in <code>members</code> will be added as a result)
* </li>
*
* <li>non-empty set &rarr; only those existing members of a concept will be
* compared against the list provided in <code>members</code> that have a
* type contained in this set<br>
* (existing members of any other type will be ignored)
* </li>
* </ul>
*
* @param memberTypesToUpdate - the reference set types to consider when
* updating existing members of a concept
*/
public SnomedConceptUpdateRequestBuilder setMemberTypesToUpdate(Set<SnomedRefSetType> memberTypesToUpdate) {
this.memberTypesToUpdate = memberTypesToUpdate != null ? ImmutableSet.copyOf(memberTypesToUpdate) : null;
return getSelf();

Check warning on line 107 in snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedConceptUpdateRequestBuilder.java

View check run for this annotation

Codecov / codecov/patch

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/datastore/request/SnomedConceptUpdateRequestBuilder.java#L107

Added line #L107 was not covered by tests
}

@Override
protected void init(SnomedConceptUpdateRequest req) {
super.init(req);
Expand All @@ -84,6 +116,6 @@
req.setRelationships(relationships);
req.setMembers(members);
req.setRefSet(refSet);
req.setMemberTypesToUpdate(memberTypesToUpdate);
}

}
Loading