Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

#266 - Change validation information #271

Merged
merged 6 commits into from
Mar 22, 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 @@ -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