use of com.b2international.snowowl.core.domain.BranchContext in project snow-owl by b2ihealthcare.
the class SnomedEclRefinementEvaluator method evalMembers.
private Promise<Collection<Property>> evalMembers(BranchContext context, Set<String> focusConceptIds, Collection<String> typeIds, DataTypeComparison comparison) {
final Object value;
final DataType type;
if (comparison instanceof BooleanValueComparison) {
value = ((BooleanValueComparison) comparison).isValue();
type = DataType.BOOLEAN;
} else if (comparison instanceof StringValueComparison) {
value = ((StringValueComparison) comparison).getValue();
type = DataType.STRING;
} else if (comparison instanceof IntegerValueComparison) {
value = ((IntegerValueComparison) comparison).getValue();
type = DataType.INTEGER;
} else if (comparison instanceof DecimalValueComparison) {
value = ((DecimalValueComparison) comparison).getValue();
type = DataType.DECIMAL;
} else {
return SnomedEclEvaluationRequest.throwUnsupported(comparison);
}
final SearchResourceRequest.Operator operator = toSearchOperator(comparison.getOp());
final Options propFilter = Options.builder().put(SnomedRf2Headers.FIELD_CHARACTERISTIC_TYPE_ID, getCharacteristicTypes(expressionForm)).put(SnomedRf2Headers.FIELD_TYPE_ID, typeIds).put(SnomedRefSetMemberIndexEntry.Fields.DATA_TYPE, type).put(SnomedRf2Headers.FIELD_VALUE, value).put(SearchResourceRequest.operator(SnomedRf2Headers.FIELD_VALUE), operator).build();
return SnomedRequests.prepareSearchMember().filterByActive(true).filterByRefSetType(SnomedRefSetType.CONCRETE_DATA_TYPE).filterByReferencedComponent(focusConceptIds).filterByProps(propFilter).setEclExpressionForm(expressionForm).setLimit(context.service(RepositoryConfiguration.class).getIndexConfiguration().getResultWindow()).<Property>transformAsync(context, req -> req.build(context.path()), members -> members.stream().map(input -> {
return new Property(input.getReferencedComponent().getId(), (String) input.getProperties().get(SnomedRf2Headers.FIELD_TYPE_ID), input.getProperties().get(SnomedRf2Headers.FIELD_VALUE), (Integer) input.getProperties().get(SnomedRf2Headers.FIELD_RELATIONSHIP_GROUP));
}));
}
use of com.b2international.snowowl.core.domain.BranchContext in project snow-owl by b2ihealthcare.
the class ConceptSuggestionRequest method doExecute.
@Override
protected Suggestions doExecute(BranchContext context) throws IOException {
TermFilter termFilter;
if (containsKey(TERM)) {
if (containsKey(MIN_OCCURENCE_COUNT)) {
termFilter = TermFilter.minTermMatch(getString(TERM), (Integer) get(MIN_OCCURENCE_COUNT)).withIgnoreStopwords();
} else {
termFilter = TermFilter.defaultTermMatch(getString(TERM)).withIgnoreStopwords();
}
} else {
// Gather tokens
final Multiset<String> tokenOccurrences = HashMultiset.create();
final EnglishStemmer stemmer = new EnglishStemmer();
// Get the suggestion base set of concepts
final ConceptSearchRequestBuilder baseRequestBuilder = new ConceptSearchRequestBuilder().filterByCodeSystemUri(context.service(ResourceURI.class)).setLimit(SCROLL_LIMIT).setLocales(locales());
if (containsKey(QUERY)) {
baseRequestBuilder.filterByInclusions(getCollection(QUERY, String.class));
}
if (containsKey(MUST_NOT_QUERY)) {
baseRequestBuilder.filterByExclusions(getCollection(MUST_NOT_QUERY, String.class));
}
baseRequestBuilder.stream(context).flatMap(Concepts::stream).flatMap(concept -> getAllTerms(concept).stream()).map(term -> term.toLowerCase(Locale.US)).flatMap(lowerCaseTerm -> TOKEN_SPLITTER.splitToList(lowerCaseTerm).stream()).map(token -> stemToken(stemmer, token)).forEach(tokenOccurrences::add);
topTokens = Multisets.copyHighestCountFirst(tokenOccurrences).elementSet().stream().filter(// skip short tokens
token -> token.length() > 2).limit(topTokenCount).collect(Collectors.toList());
int minShouldMatch = containsKey(MIN_OCCURENCE_COUNT) ? (Integer) get(MIN_OCCURENCE_COUNT) : DEFAULT_MIN_OCCURENCE_COUNT;
termFilter = TermFilter.minTermMatch(topTokens.stream().collect(Collectors.joining(" ")), minShouldMatch);
}
/*
* Run a search with the top tokens and minimum number of matches, excluding everything
* that was included previously.
*/
final Set<String> exclusions = newHashSet();
exclusions.addAll(getCollection(QUERY, String.class));
exclusions.addAll(getCollection(MUST_NOT_QUERY, String.class));
final ConceptSearchRequestBuilder resultRequestBuilder = new ConceptSearchRequestBuilder().filterByCodeSystemUri(context.service(ResourceURI.class)).filterByActive(true).filterByTerm(termFilter).setPreferredDisplay(getString(DISPLAY)).setLimit(limit()).setLocales(locales()).setSearchAfter(searchAfter()).sortBy(sortBy());
if (!exclusions.isEmpty()) {
resultRequestBuilder.filterByExclusions(exclusions);
}
final Concepts conceptSuggestions = resultRequestBuilder.build().execute(context);
return new Suggestions(topTokens, conceptSuggestions.getItems(), conceptSuggestions.getSearchAfter(), limit(), conceptSuggestions.getTotal());
}
use of com.b2international.snowowl.core.domain.BranchContext in project snow-owl by b2ihealthcare.
the class ConcreteDomainChangeConverter method expandComponentCategory.
// Copied from SnomedReferenceSetMemberConverter
private void expandComponentCategory(final String branch, final ComponentCategory category, final Collection<String> componentIds, final Options componentOptions, final Multimap<String, ReasonerConcreteDomainMember> membersByReferencedComponent) {
final SearchResourceRequestBuilder<?, BranchContext, ? extends CollectionResource<? extends SnomedCoreComponent>> searchRequestBuilder = createSearchRequestBuilder(category);
searchRequestBuilder.filterByIds(componentIds).setLimit(componentIds.size()).setLocales(locales()).setExpand(componentOptions.get("expand", Options.class));
final CollectionResource<? extends SnomedCoreComponent> referencedComponents = new BranchRequest<>(branch, new RevisionIndexReadRequest<>(searchRequestBuilder.build())).execute(context());
for (final SnomedCoreComponent referencedComponent : referencedComponents) {
for (final ReasonerConcreteDomainMember member : membersByReferencedComponent.get(referencedComponent.getId())) {
member.setReferencedComponent(referencedComponent);
}
}
}
use of com.b2international.snowowl.core.domain.BranchContext in project snow-owl by b2ihealthcare.
the class ConcreteDomainChangeConverter method expand.
@Override
public void expand(final List<ConcreteDomainChange> results) {
if (!expand().containsKey(ConcreteDomainChange.Expand.CONCRETE_DOMAIN_MEMBER)) {
return;
}
/*
* Depending on the CD member change search request, we might need to issue
* SNOMED CT searches against multiple branches; find out which ones we have.
*/
final Multimap<String, ConcreteDomainChange> itemsByBranch = getItemsByBranch(results);
// Check if we only need to load inferred CD members in their entirety
final Options expandOptions = expand().getOptions(ConcreteDomainChange.Expand.CONCRETE_DOMAIN_MEMBER);
final boolean inferredOnly = expandOptions.getBoolean("inferredOnly");
final Options cdMemberExpandOptions = expandOptions.getOptions("expand");
final Options referencedComponentOptions = cdMemberExpandOptions.getOptions(SnomedReferenceSetMember.Expand.REFERENCED_COMPONENT);
/*
* Remove this option from the member expand options map, so that member search
* does not expand the referenced component again
*/
final boolean needsReferencedComponent = cdMemberExpandOptions.keySet().remove(SnomedReferenceSetMember.Expand.REFERENCED_COMPONENT);
for (final String branch : itemsByBranch.keySet()) {
final Collection<ConcreteDomainChange> itemsForCurrentBranch = itemsByBranch.get(branch);
/*
* Expand referenced component on members via a separate search request, as they
* can be different from the referenced component on the "origin" member
*/
if (needsReferencedComponent) {
final List<ReasonerConcreteDomainMember> blankMembers = itemsForCurrentBranch.stream().filter(c -> !inferredOnly || ChangeNature.NEW.equals(c.getChangeNature())).map(ConcreteDomainChange::getConcreteDomainMember).collect(Collectors.toList());
final Multimap<String, ReasonerConcreteDomainMember> membersByReferencedComponent = Multimaps.index(blankMembers, ReasonerConcreteDomainMember::getReferencedComponentId);
final Multimap<ComponentCategory, String> referencedComponentsByCategory = Multimaps.index(membersByReferencedComponent.keySet(), SnomedIdentifiers::getComponentCategory);
for (final Entry<ComponentCategory, Collection<String>> categoryEntry : referencedComponentsByCategory.asMap().entrySet()) {
expandComponentCategory(branch, categoryEntry.getKey(), categoryEntry.getValue(), referencedComponentOptions, membersByReferencedComponent);
}
}
/*
* Then fetch all the required members (these will have a referenced component
* ID that should no longer be copied on inferred members). Note that the same "origin"
* member might be used for multiple eg. "new" counterparts.
*/
final Set<String> cdMemberUuids = itemsForCurrentBranch.stream().filter(c -> !inferredOnly || ChangeNature.NEW.equals(c.getChangeNature())).map(c -> c.getConcreteDomainMember().getOriginMemberId()).collect(Collectors.toSet());
final Request<BranchContext, SnomedReferenceSetMembers> cdMemberSearchRequest = SnomedRequests.prepareSearchMember().filterByIds(cdMemberUuids).setLimit(cdMemberUuids.size()).setExpand(cdMemberExpandOptions).setLocales(locales()).build();
final SnomedReferenceSetMembers cdMembers = new BranchRequest<>(branch, new RevisionIndexReadRequest<>(cdMemberSearchRequest)).execute(context());
final Map<String, SnomedReferenceSetMember> cdMembersByUuid = Maps.uniqueIndex(cdMembers, SnomedReferenceSetMember::getId);
/*
* Finally, set the member on the change item, but preserve the properties that
* were already set in "toResource"
*/
for (final ConcreteDomainChange item : itemsForCurrentBranch) {
final ReasonerConcreteDomainMember reasonerMember = item.getConcreteDomainMember();
final String memberUuid = reasonerMember.getOriginMemberId();
switch(item.getChangeNature()) {
case NEW:
{
final SnomedReferenceSetMember expandedMember = cdMembersByUuid.get(memberUuid);
final Map<String, Object> expandedProperties = expandedMember.getProperties();
// reasonerMember.setCharacteristicTypeId(...) is already set
// reasonerMember.setGroup(...) is already set
// reasonerMember.setReferencedComponent(...) is already set (or expanded)
reasonerMember.setReferenceSetId(expandedMember.getRefsetId());
// reasonerMember.setReleased(...) is already set
reasonerMember.setSerializedValue((String) expandedProperties.get(SnomedRf2Headers.FIELD_VALUE));
reasonerMember.setTypeId((String) expandedProperties.get(SnomedRf2Headers.FIELD_TYPE_ID));
}
break;
case UPDATED:
if (!inferredOnly) {
final SnomedReferenceSetMember expandedMember = cdMembersByUuid.get(memberUuid);
final Map<String, Object> expandedProperties = expandedMember.getProperties();
reasonerMember.setCharacteristicTypeId((String) expandedProperties.get(SnomedRf2Headers.FIELD_CHARACTERISTIC_TYPE_ID));
reasonerMember.setGroup((Integer) expandedProperties.get(SnomedRf2Headers.FIELD_RELATIONSHIP_GROUP));
// reasonerMember.setReferencedComponent(...) is already set (or expanded)
reasonerMember.setReferenceSetId(expandedMember.getRefsetId());
// reasonerMember.setReleased(...) is already set
// reasonerMember.setSerializedValue(...) is already set
reasonerMember.setTypeId((String) expandedProperties.get(SnomedRf2Headers.FIELD_TYPE_ID));
}
break;
case REDUNDANT:
if (!inferredOnly) {
final SnomedReferenceSetMember expandedMember = cdMembersByUuid.get(memberUuid);
final Map<String, Object> expandedProperties = expandedMember.getProperties();
reasonerMember.setCharacteristicTypeId((String) expandedProperties.get(SnomedRf2Headers.FIELD_CHARACTERISTIC_TYPE_ID));
reasonerMember.setGroup((Integer) expandedProperties.get(SnomedRf2Headers.FIELD_RELATIONSHIP_GROUP));
// reasonerMember.setReferencedComponent(...) is already set (or expanded)
reasonerMember.setReferenceSetId(expandedMember.getRefsetId());
// reasonerMember.setReleased(...) is already set
reasonerMember.setSerializedValue((String) expandedProperties.get(SnomedRf2Headers.FIELD_VALUE));
reasonerMember.setTypeId((String) expandedProperties.get(SnomedRf2Headers.FIELD_TYPE_ID));
}
break;
default:
throw new IllegalStateException(String.format("Unexpected CD member change '%s' found with UUID '%s'.", item.getChangeNature(), item.getConcreteDomainMember().getOriginMemberId()));
}
}
}
}
use of com.b2international.snowowl.core.domain.BranchContext in project snow-owl by b2ihealthcare.
the class SnomedValidationIssueDetailExtension method extendConceptIssueLabels.
private void extendConceptIssueLabels(BranchContext context, Collection<ValidationIssue> issues, Map<String, Object> ruleParameters) {
final RevisionSearcher searcher = context.service(RevisionSearcher.class);
final List<ValidationIssue> conceptIssues = issues.stream().filter(issue -> SnomedConcept.TYPE == issue.getAffectedComponent().getComponentType()).collect(Collectors.toList());
final Map<String, ValidationIssue> memberIssues = issues.stream().filter(issue -> SnomedReferenceSetMember.TYPE == issue.getAffectedComponent().getComponentType()).collect(Collectors.toMap(issue -> issue.getAffectedComponent().getComponentId(), issue -> issue, (issue1, issue2) -> issue1));
if (conceptIssues.isEmpty() && memberIssues.isEmpty()) {
return;
}
final Builder<String, ValidationIssue> issuesByConceptId = ImmutableMultimap.builder();
conceptIssues.forEach(issue -> issuesByConceptId.put(issue.getAffectedComponent().getComponentId(), issue));
searcher.stream(Query.select(String[].class).from(SnomedRefSetMemberIndexEntry.class).fields(SnomedRefSetMemberIndexEntry.Fields.ID, SnomedRefSetMemberIndexEntry.Fields.REFERENCED_COMPONENT_ID).where(Expressions.builder().filter(SnomedRefSetMemberIndexEntry.Expressions.active()).filter(SnomedRefSetMemberIndexEntry.Expressions.ids(memberIssues.keySet())).build()).limit(SCROLL_SIZE).build()).forEach(hits -> {
for (String[] hit : hits) {
final String memberId = hit[0];
final String containerConcpetId = hit[1];
issuesByConceptId.put(containerConcpetId, memberIssues.get(memberId));
}
});
final Multimap<String, ValidationIssue> issuesByConceptMap = issuesByConceptId.build();
final Map<String, String> affectedComponentLabelsByConcept = getAffectedComponentLabels(context, ruleParameters, issuesByConceptMap.keySet());
if (!affectedComponentLabelsByConcept.isEmpty()) {
issuesByConceptMap.keySet().forEach(conceptId -> {
issuesByConceptMap.get(conceptId).forEach(issue -> {
issue.setAffectedComponentLabels(ImmutableList.of(affectedComponentLabelsByConcept.get(conceptId)));
});
});
}
}
Aggregations