Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
0f2b6d5
initial script for postgresql was added
ssuvorov-fls Apr 26, 2021
dc1a7c5
index were added to script
ssuvorov-fls Apr 27, 2021
511a8b3
index were added to script
ssuvorov-fls Apr 27, 2021
ecdfdc3
count of assigned tags was added
ssuvorov-fls Apr 29, 2021
23c7dce
Assets Tags implementation
anton-abushkevich May 4, 2021
4574d7b
added search endpoint
ssuvorov-fls May 5, 2021
06eb216
endpoints for assigning and unassigning of tags for assets were added
ssuvorov-fls May 6, 2021
34a96b9
mandatory tags checking was added
ssuvorov-fls May 7, 2021
fdcce17
tests were fixed
ssuvorov-fls May 8, 2021
c635941
Assets Tags implementation
anton-abushkevich May 10, 2021
ee1f15e
description was added to tag
ssuvorov-fls May 11, 2021
ed0c656
Design was changed to "Tags"
ssuvorov-fls May 11, 2021
5009bc8
Design was changed to "Tags"
ssuvorov-fls May 11, 2021
f3b972c
removed unused function from AbstractDaoService
ssuvorov-fls May 11, 2021
a56d7a5
removed unused sql statements
ssuvorov-fls May 13, 2021
beef356
Assets Tags i18n
anton-abushkevich May 13, 2021
970e6f6
Assets Tags implementation - tag reassign confirmation added
anton-abushkevich Jun 3, 2021
32b4426
Merge branch 'upstream_master' into asset_tags_pr
anton-abushkevich Aug 6, 2021
1e5d1be
Master merge - compilation fix
anton-abushkevich Jun 3, 2021
9afb989
Fix - enable tests
anton-abushkevich Aug 6, 2021
1849cde
tables with tags were renamed to singular form
ssuvorov-fls Aug 12, 2021
e4b6b7d
tests were added
ssuvorov-fls Aug 12, 2021
cc23480
sequence for tags was renamed to singular form
ssuvorov-fls Aug 12, 2021
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
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,12 @@
<!-- I18n -->
<i18n.enabled>true</i18n.enabled>
<i18n.defaultLocale>en</i18n.defaultLocale>

<!-- Tags -->
<tag.enabled>true</tag.enabled>
<!-- Period between refreshes of materialized view with statistics -->
<!-- 10 minutes by default -->
<tag.refreshStat.period>600000</tag.refreshStat.period>
</properties>
<build>
<finalName>WebAPI</finalName>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import org.ohdsi.webapi.cohortdefinition.CohortDefinition;
import org.ohdsi.webapi.cohortdefinition.CohortDefinitionDetails;
import org.ohdsi.webapi.converter.BaseConversionServiceAwareConverter;
import org.springframework.stereotype.Component;

@Component
public class AnalysisCohortDefinitionToCohortDefinitionConverter<T extends AnalysisCohortDefinition> extends BaseConversionServiceAwareConverter<T, CohortDefinition> {

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.ohdsi.webapi.check.builder.tag;

import org.ohdsi.webapi.check.builder.ValidatorBuilder;
import org.ohdsi.webapi.check.validator.Validator;
import org.ohdsi.webapi.check.validator.tag.MandatoryTagValidator;
import org.ohdsi.webapi.tag.TagService;
import org.ohdsi.webapi.tag.dto.TagDTO;

import java.util.Collection;

public class MandatoryTagValidatorBuilder<T extends Collection<? extends TagDTO>> extends ValidatorBuilder<T> {
private final TagService tagService;

public MandatoryTagValidatorBuilder(TagService tagService) {
this.tagService = tagService;
}

@Override
public Validator<T> build() {
return new MandatoryTagValidator<>(createChildPath(), severity, errorMessage, this.tagService);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import org.ohdsi.webapi.check.builder.ValidatorGroupBuilder;
import org.ohdsi.webapi.check.checker.BaseChecker;
import org.ohdsi.webapi.check.checker.tag.helper.TagHelper;
import org.ohdsi.webapi.cohortcharacterization.dto.CohortCharacterizationDTO;
import org.ohdsi.webapi.cohortdefinition.dto.CohortDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
Expand All @@ -15,6 +18,11 @@

@Component
public class CharacterizationChecker extends BaseChecker<CohortCharacterizationDTO> {
private final TagHelper<CohortCharacterizationDTO> tagHelper;

public CharacterizationChecker(TagHelper<CohortCharacterizationDTO> tagHelper) {
this.tagHelper = tagHelper;
}

@PostConstruct
public void init() {
Expand All @@ -25,6 +33,7 @@ public void init() {
protected List<ValidatorGroupBuilder<CohortCharacterizationDTO, ?>> getGroupBuilder() {

return Arrays.asList(
tagHelper.prepareTagBuilder(),
prepareCohortBuilder(),
prepareFeatureAnalysesBuilder(),
prepareStratifyRuleBuilder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.ohdsi.webapi.cohortcharacterization.dto.CcStrataDTO;
import org.ohdsi.webapi.cohortcharacterization.dto.CohortCharacterizationDTO;
import org.ohdsi.webapi.cohortdefinition.dto.CohortMetadataDTO;
import org.ohdsi.webapi.cohortdefinition.dto.CohortMetadataImplDTO;
import org.ohdsi.webapi.feanalysis.dto.FeAnalysisShortDTO;

import java.util.Collection;
Expand All @@ -22,9 +23,9 @@ public static ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<FeAnal
return builder;
}

public static ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<CohortMetadataDTO>> prepareCohortBuilder() {
public static ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<CohortMetadataImplDTO>> prepareCohortBuilder() {

ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<CohortMetadataDTO>> builder = new ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<CohortMetadataDTO>>()
ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<CohortMetadataImplDTO>> builder = new ValidatorGroupBuilder<CohortCharacterizationDTO, Collection<CohortMetadataImplDTO>>()
.attrName("cohorts")
.valueGetter(BaseCcDTO::getCohorts)
.validators(new NotNullNotEmptyValidatorBuilder<>());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.ohdsi.webapi.check.checker.cohort;

import org.ohdsi.analysis.estimation.comparativecohortanalysis.design.CohortMethodAnalysis;
import org.ohdsi.analysis.estimation.comparativecohortanalysis.design.ComparativeCohortAnalysis;
import org.ohdsi.webapi.check.builder.DuplicateValidatorBuilder;
import org.ohdsi.webapi.check.builder.IterableForEachValidatorBuilder;
import org.ohdsi.webapi.check.builder.NotNullNotEmptyValidatorBuilder;
import org.ohdsi.webapi.check.builder.ValidatorGroupBuilder;
import org.ohdsi.webapi.check.checker.BaseChecker;
import org.ohdsi.webapi.check.checker.tag.helper.TagHelper;
import org.ohdsi.webapi.cohortcharacterization.dto.BaseCcDTO;
import org.ohdsi.webapi.cohortcharacterization.dto.CohortCharacterizationDTO;
import org.ohdsi.webapi.cohortdefinition.dto.CohortDTO;
import org.ohdsi.webapi.feanalysis.dto.FeAnalysisShortDTO;
import org.ohdsi.webapi.service.dto.CommonEntityExtDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import static org.ohdsi.webapi.check.checker.characterization.helper.CharacterizationHelper.prepareCohortBuilder;
import static org.ohdsi.webapi.check.checker.characterization.helper.CharacterizationHelper.prepareFeatureAnalysesBuilder;
import static org.ohdsi.webapi.check.checker.characterization.helper.CharacterizationHelper.prepareStratifyRuleBuilder;

@Component
public class CohortChecker extends BaseChecker<CohortDTO> {
private final TagHelper<CohortDTO> tagHelper;

public CohortChecker(TagHelper<CohortDTO> tagHelper) {
this.tagHelper = tagHelper;
}

@PostConstruct
public void init() {
createValidator();
}

@Override
protected List<ValidatorGroupBuilder<CohortDTO, ?>> getGroupBuilder() {

return Arrays.asList(
tagHelper.prepareTagBuilder()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.ohdsi.webapi.check.checker.conceptset;

import org.ohdsi.webapi.check.builder.ValidatorGroupBuilder;
import org.ohdsi.webapi.check.checker.BaseChecker;
import org.ohdsi.webapi.check.checker.tag.helper.TagHelper;
import org.ohdsi.webapi.cohortdefinition.dto.CohortDTO;
import org.ohdsi.webapi.service.dto.ConceptSetDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;

@Component
public class ConceptSetChecker extends BaseChecker<ConceptSetDTO> {
private final TagHelper<ConceptSetDTO> tagHelper;

public ConceptSetChecker(TagHelper<ConceptSetDTO> tagHelper) {
this.tagHelper = tagHelper;
}

@PostConstruct
public void init() {
createValidator();
}

@Override
protected List<ValidatorGroupBuilder<ConceptSetDTO, ?>> getGroupBuilder() {

return Arrays.asList(
tagHelper.prepareTagBuilder()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,19 @@
import org.ohdsi.webapi.check.builder.ValidatorGroupBuilder;
import org.ohdsi.webapi.check.checker.BaseChecker;
import org.ohdsi.webapi.check.checker.ir.helper.IRHelper;
import org.ohdsi.webapi.check.checker.tag.helper.TagHelper;
import org.ohdsi.webapi.cohortcharacterization.dto.CohortCharacterizationDTO;
import org.ohdsi.webapi.service.dto.IRAnalysisDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class IRChecker extends BaseChecker<IRAnalysisDTO> {
private final TagHelper<IRAnalysisDTO> tagHelper;

public IRChecker(TagHelper<IRAnalysisDTO> tagHelper) {
this.tagHelper = tagHelper;
}

@PostConstruct
public void init() {
Expand All @@ -21,6 +29,7 @@ public void init() {
protected List<ValidatorGroupBuilder<IRAnalysisDTO, ?>> getGroupBuilder() {

return Arrays.asList(
tagHelper.prepareTagBuilder(),
IRHelper.prepareAnalysisExpressionBuilder()
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,19 @@
import org.ohdsi.webapi.check.builder.ValidatorGroupBuilder;
import org.ohdsi.webapi.check.checker.BaseChecker;
import org.ohdsi.webapi.check.checker.pathway.helper.PathwayHelper;
import org.ohdsi.webapi.check.checker.tag.helper.TagHelper;
import org.ohdsi.webapi.pathway.dto.PathwayAnalysisDTO;
import org.ohdsi.webapi.service.dto.IRAnalysisDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class PathwayChecker extends BaseChecker<PathwayAnalysisDTO> {
private final TagHelper<PathwayAnalysisDTO> tagHelper;

public PathwayChecker(TagHelper<PathwayAnalysisDTO> tagHelper) {
this.tagHelper = tagHelper;
}

@PostConstruct
public void init() {
Expand All @@ -20,6 +28,7 @@ public void init() {
@Override
protected List<ValidatorGroupBuilder<PathwayAnalysisDTO, ?>> getGroupBuilder() {
return Arrays.asList(
tagHelper.prepareTagBuilder(),
PathwayHelper.prepareTargetCohortsBuilder(),
PathwayHelper.prepareEventCohortsBuilder(),
PathwayHelper.prepareCombinationWindowBuilder(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.ohdsi.webapi.check.checker.tag.helper;

import org.ohdsi.webapi.check.builder.ValidatorGroupBuilder;
import org.ohdsi.webapi.check.builder.tag.MandatoryTagValidatorBuilder;
import org.ohdsi.webapi.check.warning.WarningSeverity;
import org.ohdsi.webapi.service.dto.CommonEntityExtDTO;
import org.ohdsi.webapi.tag.TagService;
import org.ohdsi.webapi.tag.dto.TagDTO;
import org.ohdsi.webapi.tag.repository.TagRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Collection;

@Component
public class TagHelper<T extends CommonEntityExtDTO> {
private final TagService tagService;

@Value("${tag.enabled}")
private boolean enabled;

public TagHelper(TagService tagService) {
this.tagService = tagService;
}

public ValidatorGroupBuilder<T, Collection<? extends TagDTO>> prepareTagBuilder() {
ValidatorGroupBuilder<T, Collection<? extends TagDTO>> builder =
new ValidatorGroupBuilder<T, Collection<? extends TagDTO>>()
.attrName("Tags")
.conditionGetter(t -> enabled)
.severity(WarningSeverity.WARNING)
.valueGetter(T::getTags)
.validators(
new MandatoryTagValidatorBuilder<>(tagService)
);
return builder;
}
}
8 changes: 6 additions & 2 deletions src/main/java/org/ohdsi/webapi/check/validator/Validator.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,18 @@ public Validator(Path path, WarningSeverity severity, String errorMessage, Funct

public abstract boolean validate(T value, Context context);

protected String getErrorMessage(T value) {
protected String getErrorMessage(T value, Object... params) {
StringBuilder sb = new StringBuilder();
if (this.attrNameValueGetter != null) {
sb.append("(")
.append(this.attrNameValueGetter.apply(value))
.append(") - ");
}
sb.append(this.errorMessage != null ? this.errorMessage : getDefaultErrorMessage());
String msg = this.errorMessage != null ? this.errorMessage : getDefaultErrorMessage();
if (params.length > 0) {
msg = String.format(msg, params);
}
sb.append(msg);
return sb.toString();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package org.ohdsi.webapi.check.validator.tag;

import org.ohdsi.webapi.check.validator.Context;
import org.ohdsi.webapi.check.validator.Path;
import org.ohdsi.webapi.check.validator.Validator;
import org.ohdsi.webapi.check.warning.WarningSeverity;
import org.ohdsi.webapi.tag.TagService;
import org.ohdsi.webapi.tag.domain.Tag;
import org.ohdsi.webapi.tag.dto.TagDTO;
import org.ohdsi.webapi.tag.repository.TagRepository;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

public class MandatoryTagValidator<T extends Collection<? extends TagDTO>> extends Validator<T> {
private static final String INVALID = "no assigned tags from mandatory groups %s";

private final TagService tagService;

public MandatoryTagValidator(Path path, WarningSeverity severity, String errorMessage,
TagService tagService) {
super(path, severity, errorMessage);
this.tagService = tagService;
}

@Override
public boolean validate(T value, Context context) {
boolean isValid = true;
if (Objects.nonNull(value)) {
Set<Integer> groupIds = new HashSet<>();
value.forEach(tagDTO -> {
Set<Integer> ids = tagService.getAllGroupsForTag(tagDTO.getId());
groupIds.addAll(ids);
});
List<Tag> mandatoryTags = tagService.findMandatoryTags();
List<Tag> absentTags = mandatoryTags.stream()
.filter(t -> !groupIds.contains(t.getId()))
.collect(Collectors.toList());

isValid = absentTags.size() == 0;
if (!isValid) {
String absentTagNames = absentTags.stream()
.map(Tag::getName)
.collect(Collectors.joining("], [", "[", "]"));
context.addWarning(getSeverity(), getErrorMessage(value, absentTagNames), path);
}
} else {
isValid = tagService.findMandatoryTags().size() == 0;
}
return isValid;
}

@Override
protected String getDefaultErrorMessage() {
return INVALID;
}
}
31 changes: 31 additions & 0 deletions src/main/java/org/ohdsi/webapi/check/warning/WarningUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.ohdsi.webapi.check.warning;

public class WarningUtils {
public static Warning convertCirceWarning(org.ohdsi.circe.check.Warning circeWarning) {
WarningSeverity severity = convertCirceWarningSeverity(
((org.ohdsi.circe.check.warnings.BaseWarning) circeWarning).getSeverity());
Warning warning;
if (circeWarning instanceof org.ohdsi.circe.check.warnings.ConceptSetWarning) {
warning = new ConceptSetWarning(severity, circeWarning.toMessage(), ((org.ohdsi.circe.check.warnings.ConceptSetWarning) circeWarning).getConceptSet());
} else {
warning = new DefaultWarning(severity, circeWarning.toMessage());
}
return warning;
}

private static WarningSeverity convertCirceWarningSeverity(
org.ohdsi.circe.check.WarningSeverity circeWarningSeverity) {
WarningSeverity severity = WarningSeverity.WARNING;
switch (circeWarningSeverity) {
case CRITICAL: {
severity = WarningSeverity.CRITICAL;
break;
}
case INFO: {
severity = WarningSeverity.INFO;
break;
}
}
return severity;
}
}
Loading