Skip to content

Commit

Permalink
MAINT-2424 Update en-gb language refset copying api to avoid duplicat…
Browse files Browse the repository at this point in the history
…ion and deletion of existing components
  • Loading branch information
CoderMChu committed Dec 12, 2023
1 parent 154a18e commit 37ef3c4
Showing 1 changed file with 21 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ private Map<Long, List<ReferenceSetMember>> getReferencedComponents(String branc
.withQuery(bool(b -> b
.must(branchCriteria.getEntityBranchCriteria(ReferenceSetMember.class))
.must(termQuery(REFSET_ID, languageRefsetId))))
.withSourceFilter(new FetchSourceFilter(new String[]{REFERENCED_COMPONENT_ID, ACTIVE, ACCEPTABILITY_ID_FIELD_PATH, CONCEPT_ID}, null))
.withSourceFilter(new FetchSourceFilter(new String[]{ MEMBER_ID, REFERENCED_COMPONENT_ID, ACTIVE, ACCEPTABILITY_ID_FIELD_PATH, CONCEPT_ID}, null))
.withPageable(LARGE_PAGE);
if (lastDependantEffectiveTime != null) {
// for roll up upgrade every 6 months for example
Expand All @@ -156,7 +156,6 @@ private Map<Long, List<ReferenceSetMember>> getReferencedComponents(String branc

private List<ReferenceSetMember> addOrUpdateLanguageRefsetComponents(String branchPath, AdditionalRefsetExecutionConfig config, Map<Long, List<ReferenceSetMember>> languageRefsetMembersToCopy) {
BranchCriteria branchCriteria = versionControlHelper.getBranchCriteria(branchPath);
List<ReferenceSetMember> result = new ArrayList<>();

// Step 1: Get relevant en-gb language refset components to copy and map results by concept id (done in previous step - getReferencedComponents)
// Collect all relevant description IDs
Expand All @@ -175,8 +174,7 @@ private List<ReferenceSetMember> addOrUpdateLanguageRefsetComponents(String bran
.must(termQuery(REFSET_ID, config.getDefaultEnglishLanguageRefsetId()))
.must(termsQuery(ACCEPTABILITY_ID_FIELD_PATH, List.of(Concepts.PREFERRED, Concepts.ACCEPTABLE)))
.must(termsQuery(ReferenceSetMember.Fields.CONCEPT_ID, batch)))
).withSourceFilter(new FetchSourceFilter(new String[]{MEMBER_ID, EFFECTIVE_TIME, ACTIVE, MODULE_ID, REFSET_ID, REFERENCED_COMPONENT_ID, ACCEPTABILITY_ID_FIELD_PATH, CONCEPT_ID}, null))
.withPageable(LARGE_PAGE);
).withPageable(LARGE_PAGE);

try (final SearchHitsIterator<ReferenceSetMember> searchHitsIterator = elasticsearchTemplate.searchForStream(queryBuilder.build(), ReferenceSetMember.class)) {
searchHitsIterator.forEachRemaining(hit -> {
Expand Down Expand Up @@ -204,6 +202,8 @@ private List<ReferenceSetMember> addOrUpdateLanguageRefsetComponents(String bran

/* Step 4 */
// Update the existing language reference set members if needed
List<ReferenceSetMember> result = new ArrayList<>();
Set<String> memberIdsToSkipCopy = new HashSet<>();
for (Long conceptId : existingLanguageRefsetMembersToUpdate.keySet()) {
List<ReferenceSetMember> existingRefsetMembers = existingLanguageRefsetMembersToUpdate.get(conceptId);
if (languageRefsetMembersToCopy.containsKey(conceptId)) {
Expand All @@ -212,14 +212,17 @@ private List<ReferenceSetMember> addOrUpdateLanguageRefsetComponents(String bran
for (ReferenceSetMember existingRefsetMember : existingRefsetMembers) {
if (languageRefsetMembersToCopyMap.containsKey(existingRefsetMember.getReferencedComponentId())
&& isAbleToAddOrUpdate(existingRefsetMember.getReferencedComponentId(), config.getDefaultModuleId(), languageRefsetMembersToCopyMap, existingLanguageRefsetMembersMap, conceptToDescriptionsMap)) {
update(existingRefsetMember, languageRefsetMembersToCopyMap, result);
update(existingRefsetMember, languageRefsetMembersToCopyMap, result, memberIdsToSkipCopy);
}
}
}
}

Set<String> updated = result.stream().map(ReferenceSetMember::getReferencedComponentId).collect(Collectors.toSet());
logger.info("{} components to be updated", updated.size());
logger.info("{} existing components to be updated", updated.size());
if (!memberIdsToSkipCopy.isEmpty()) {
logger.info("{} components to skip copy as change exists in extension already.", memberIdsToSkipCopy.size());
}
// add new ones
for (Long conceptId : languageRefsetMembersToCopy.keySet()) {
List<ReferenceSetMember> toCopyLanguageRefsetMembers = languageRefsetMembersToCopy.get(conceptId);
Expand All @@ -229,7 +232,7 @@ && isAbleToAddOrUpdate(existingRefsetMember.getReferencedComponentId(), config.g
Map<String, ReferenceSetMember> existingLanguageRefsetMembersMap = convertMembersListToMap(existingRefsetMembers);

for (ReferenceSetMember toCopyMember : toCopyLanguageRefsetMembers) {
if (!updated.contains(toCopyMember.getReferencedComponentId())
if (!memberIdsToSkipCopy.contains(toCopyMember.getMemberId()) && !updated.contains(toCopyMember.getReferencedComponentId())
&& isAbleToAddOrUpdate(toCopyMember.getReferencedComponentId(), config.getDefaultModuleId(), languageRefsetMembersToCopyMap, existingLanguageRefsetMembersMap, conceptToDescriptionsMap)) {
ReferenceSetMember toAdd = new ReferenceSetMember(UUID.randomUUID().toString(), null, toCopyMember.isActive(),
config.getDefaultModuleId(), config.getDefaultEnglishLanguageRefsetId(), toCopyMember.getReferencedComponentId());
Expand Down Expand Up @@ -284,14 +287,19 @@ private ReferenceSetMember copy(ReferenceSetMember enGbMember, AdditionalRefsetE
return extensionMember;
}

private void update(ReferenceSetMember member, Map<String, ReferenceSetMember> existingComponents, List<ReferenceSetMember> result) {
private void update(ReferenceSetMember member, Map<String, ReferenceSetMember> existingComponents, List<ReferenceSetMember> result, Set<String> memberIdsToSkipCopy ) {
if (existingComponents.containsKey(member.getReferencedComponentId())) {
// update
// only updates when active or acceptability is changed
ReferenceSetMember existing = existingComponents.get(member.getReferencedComponentId());
member.setActive(existing.isActive());
member.setEffectiveTimeI(null);
member.setAdditionalField(ACCEPTABILITY_ID, existing.getAdditionalField(ACCEPTABILITY_ID));
result.add(member);
if (existing.isActive() != member.isActive() || !existing.getAdditionalField(ACCEPTABILITY_ID).equals(member.getAdditionalField(ACCEPTABILITY_ID))) {
member.setActive(existing.isActive());
member.setEffectiveTimeI(null);
member.setAdditionalField(ACCEPTABILITY_ID, existing.getAdditionalField(ACCEPTABILITY_ID));
result.add(member);
} else {
memberIdsToSkipCopy.add(existing.getMemberId());
logger.debug("No need to copy change of language refset member {} to extension because it has the latest change already {}", existing.getMemberId(), member.getMemberId());
}
}
}

Expand Down

0 comments on commit 37ef3c4

Please sign in to comment.