Skip to content

Commit

Permalink
#266 - Change validation information (#271)
Browse files Browse the repository at this point in the history
* #266 - Change validation information

- add mutable criterion and structured query classes that can be easily annotated during validation. Provide converters to convert immutable to mutable and vice versa
- remove validatedstructuredquery
- add validation issues
- remove invalidCriteria from entities
- rename TermCodeValidation to StructuredQueryValidation
- rename getinvalidcriteria
- modify tests
- add skipValidation parameter to get query and get template
- modify swagger file
  • Loading branch information
michael-82 authored Mar 22, 2024
1 parent ca4b4e2 commit e592f79
Show file tree
Hide file tree
Showing 28 changed files with 889 additions and 359 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import de.numcodex.feasibility_gui_backend.query.api.AttributeFilter;
import de.numcodex.feasibility_gui_backend.query.api.TimeRestriction;
import de.numcodex.feasibility_gui_backend.query.api.ValueFilter;
import de.numcodex.feasibility_gui_backend.query.api.status.ValidationIssue;
import lombok.Builder;

import java.util.List;
Expand All @@ -17,7 +18,17 @@ public record Criterion (
@JsonProperty("termCodes") List<TermCode> termCodes,
@JsonProperty("attributeFilters") List<AttributeFilter> attributeFilters,
@JsonProperty("valueFilter") ValueFilter valueFilter,
@JsonProperty("timeRestriction") TimeRestriction timeRestriction
@JsonProperty("timeRestriction") TimeRestriction timeRestriction,
@JsonProperty("issues") List<ValidationIssue> validationIssues
) {

public static Criterion createImmutableCriterion(MutableCriterion mutableCriterion) {
return Criterion.builder()
.termCodes(mutableCriterion.termCodes)
.context(mutableCriterion.context)
.attributeFilters(mutableCriterion.attributeFilters)
.valueFilter(mutableCriterion.valueFilter)
.timeRestriction(mutableCriterion.timeRestriction)
.validationIssues(mutableCriterion.validationIssues)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package de.numcodex.feasibility_gui_backend.common.api;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.numcodex.feasibility_gui_backend.query.api.AttributeFilter;
import de.numcodex.feasibility_gui_backend.query.api.TimeRestriction;
import de.numcodex.feasibility_gui_backend.query.api.ValueFilter;
import de.numcodex.feasibility_gui_backend.query.api.status.ValidationIssue;
import lombok.Builder;
import lombok.Data;

import java.util.List;

@JsonInclude(Include.NON_NULL)
@Builder
@Data
public class MutableCriterion {
@JsonProperty("context") TermCode context;
@JsonProperty("termCodes") List<TermCode> termCodes;
@JsonProperty("attributeFilters") List<AttributeFilter> attributeFilters;
@JsonProperty("valueFilter") ValueFilter valueFilter;
@JsonProperty("timeRestriction") TimeRestriction timeRestriction;
@JsonProperty("issues") List<ValidationIssue> validationIssues;

public static MutableCriterion createMutableCriterion (Criterion criterion) {
return MutableCriterion.builder()
.termCodes(criterion.termCodes())
.context(criterion.context())
.attributeFilters(criterion.attributeFilters())
.valueFilter(criterion.valueFilter())
.timeRestriction(criterion.timeRestriction())
.validationIssues(criterion.validationIssues())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.numcodex.feasibility_gui_backend.common.api.Criterion;
import de.numcodex.feasibility_gui_backend.query.api.Query;
import de.numcodex.feasibility_gui_backend.query.api.QueryTemplate;
import de.numcodex.feasibility_gui_backend.query.api.SavedQuery;
Expand All @@ -15,7 +14,7 @@
import de.numcodex.feasibility_gui_backend.query.result.ResultService;
import de.numcodex.feasibility_gui_backend.query.templates.QueryTemplateException;
import de.numcodex.feasibility_gui_backend.query.templates.QueryTemplateHandler;
import de.numcodex.feasibility_gui_backend.terminology.validation.TermCodeValidation;
import de.numcodex.feasibility_gui_backend.terminology.validation.StructuredQueryValidation;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataIntegrityViolationException;
Expand Down Expand Up @@ -61,7 +60,7 @@ public enum ResultDetail {
private final SavedQueryRepository savedQueryRepository;

@NonNull
private final TermCodeValidation termCodeValidation;
private final StructuredQueryValidation structuredQueryValidation;

@NonNull
private ObjectMapper jsonUtil;
Expand Down Expand Up @@ -242,35 +241,52 @@ public String getAuthorId(Long queryId) throws QueryNotFoundException {

public QueryListEntry convertQueryToQueryListEntry(de.numcodex.feasibility_gui_backend.query.persistence.Query query,
boolean skipValidation) {
List<Criterion> invalidCriteria;
if (skipValidation) {
invalidCriteria = List.of();
} else {
try {
var sq = jsonUtil.readValue(query.getQueryContent().getQueryContent(), StructuredQuery.class);
invalidCriteria = termCodeValidation.getInvalidCriteria(sq);
} catch (JsonProcessingException e) {
invalidCriteria = List.of();
}
boolean isValid = true;
if (!skipValidation) {
try {
var sq = jsonUtil.readValue(query.getQueryContent().getQueryContent(), StructuredQuery.class);
isValid = structuredQueryValidation.isValid(sq);
} catch (JsonProcessingException e) {
isValid = false;
}
}

if (query.getSavedQuery() != null) {
return
QueryListEntry.builder()
.id(query.getId())
.label(query.getSavedQuery().getLabel())
.comment(query.getSavedQuery().getComment())
.totalNumberOfPatients(query.getSavedQuery().getResultSize())
.createdAt(query.getCreatedAt())
.invalidCriteria(invalidCriteria)
.build();
if (skipValidation) {
return
QueryListEntry.builder()
.id(query.getId())
.label(query.getSavedQuery().getLabel())
.comment(query.getSavedQuery().getComment())
.totalNumberOfPatients(query.getSavedQuery().getResultSize())
.createdAt(query.getCreatedAt())
.build();
} else {
return
QueryListEntry.builder()
.id(query.getId())
.label(query.getSavedQuery().getLabel())
.comment(query.getSavedQuery().getComment())
.totalNumberOfPatients(query.getSavedQuery().getResultSize())
.createdAt(query.getCreatedAt())
.isValid(isValid)
.build();
}
} else {
return
QueryListEntry.builder()
.id(query.getId())
.createdAt(query.getCreatedAt())
.invalidCriteria(invalidCriteria)
.build();
if (skipValidation) {
return
QueryListEntry.builder()
.id(query.getId())
.createdAt(query.getCreatedAt())
.build();
} else {
return
QueryListEntry.builder()
.id(query.getId())
.createdAt(query.getCreatedAt())
.isValid(isValid)
.build();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package de.numcodex.feasibility_gui_backend.query.api;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.numcodex.feasibility_gui_backend.common.api.Criterion;
import de.numcodex.feasibility_gui_backend.common.api.MutableCriterion;
import de.numcodex.feasibility_gui_backend.query.api.validation.StructuredQueryValidation;
import lombok.Builder;
import lombok.Data;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

@JsonInclude(Include.NON_EMPTY)
@Builder
@Data
public class MutableStructuredQuery {
@JsonProperty URI version;
@JsonProperty("inclusionCriteria") List<List<MutableCriterion>> inclusionCriteria;
@JsonProperty("exclusionCriteria") List<List<MutableCriterion>> exclusionCriteria;
@JsonProperty("display") String display;

public static MutableStructuredQuery createMutableStructuredQuery(StructuredQuery structuredQuery) {
List<List<MutableCriterion>> mutableInclusionCriteria = new ArrayList<>();
if (structuredQuery.inclusionCriteria() != null) {
for (List<Criterion> outerList : structuredQuery.inclusionCriteria()) {
List<MutableCriterion> innerList = new ArrayList<>();
for (Criterion criterion : outerList) {
innerList.add(MutableCriterion.createMutableCriterion(criterion));
}
mutableInclusionCriteria.add(innerList);
}
}

List<List<MutableCriterion>> mutableExclusionCriteria = new ArrayList<>();
if (structuredQuery.exclusionCriteria() != null) {
for (List<Criterion> outerList : structuredQuery.exclusionCriteria()) {
List<MutableCriterion> innerList = new ArrayList<>();
for (Criterion criterion : outerList) {
innerList.add(MutableCriterion.createMutableCriterion(criterion));
}
mutableExclusionCriteria.add(innerList);
}
}
return MutableStructuredQuery.builder()
.version(structuredQuery.version())
.inclusionCriteria(mutableInclusionCriteria)
.exclusionCriteria(mutableExclusionCriteria)
.display(structuredQuery.display())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,15 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.numcodex.feasibility_gui_backend.common.api.Criterion;
import lombok.Builder;

import java.util.List;

@JsonInclude(Include.NON_NULL)
@Builder
public record Query(
@JsonProperty long id,
@JsonProperty StructuredQuery content,
@JsonProperty String label,
@JsonProperty String comment,
@JsonProperty List<Criterion> invalidCriteria
@JsonProperty String comment
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.numcodex.feasibility_gui_backend.common.api.Criterion;
import lombok.Builder;

import java.sql.Timestamp;
import java.util.List;

@JsonInclude(Include.NON_NULL)
@Builder
Expand All @@ -17,7 +15,7 @@ public record QueryListEntry(
@JsonProperty String comment,
@JsonProperty Timestamp createdAt,
@JsonProperty Long totalNumberOfPatients,
@JsonProperty List<Criterion> invalidCriteria
@JsonProperty Boolean isValid
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.numcodex.feasibility_gui_backend.common.api.Criterion;
import de.numcodex.feasibility_gui_backend.query.api.validation.QueryTemplateValidation;
import lombok.Builder;

import java.util.List;

@JsonInclude(Include.NON_NULL)
@QueryTemplateValidation
@Builder
Expand All @@ -19,7 +16,6 @@ public record QueryTemplate(
@JsonProperty String comment,
@JsonProperty String lastModified,
@JsonProperty String createdBy,
@JsonProperty List<Criterion> invalidCriteria,
@JsonProperty Boolean isValid
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import de.numcodex.feasibility_gui_backend.common.api.Criterion;
import de.numcodex.feasibility_gui_backend.common.api.TermCode;
import de.numcodex.feasibility_gui_backend.common.api.MutableCriterion;
import de.numcodex.feasibility_gui_backend.query.api.validation.StructuredQueryValidation;
import lombok.Builder;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

@JsonInclude(Include.NON_EMPTY)
Expand All @@ -20,5 +21,30 @@ public record StructuredQuery(
@JsonProperty("exclusionCriteria") List<List<Criterion>> exclusionCriteria,
@JsonProperty("display") String display
) {
public static StructuredQuery createImmutableStructuredQuery(MutableStructuredQuery mutableStructuredQuery) {
List<List<Criterion>> inclusionCriteria = new ArrayList<>();
for (List<MutableCriterion> outerList : mutableStructuredQuery.getInclusionCriteria()) {
List<Criterion> innerList = new ArrayList<>();
for (MutableCriterion criterion : outerList) {
innerList.add(Criterion.createImmutableCriterion(criterion));
}
inclusionCriteria.add(innerList);
}

List<List<Criterion>> exclusionCriteria = new ArrayList<>();
for (List<MutableCriterion> outerList : mutableStructuredQuery.getExclusionCriteria()) {
List<Criterion> innerList = new ArrayList<>();
for (MutableCriterion criterion : outerList) {
innerList.add(Criterion.createImmutableCriterion(criterion));
}
exclusionCriteria.add(innerList);
}

return StructuredQuery.builder()
.version(mutableStructuredQuery.getVersion())
.display(mutableStructuredQuery.getDisplay())
.inclusionCriteria(inclusionCriteria)
.exclusionCriteria(exclusionCriteria)
.build();
}
}

This file was deleted.

Loading

0 comments on commit e592f79

Please sign in to comment.