Skip to content

Commit

Permalink
#266 - Change validation information
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
michael-82 committed Mar 21, 2024
1 parent ca4b4e2 commit 9368876
Show file tree
Hide file tree
Showing 19 changed files with 405 additions and 98 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.ValidationIssues;
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") ValidationIssues 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.ValidationIssues;
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") ValidationIssues 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 @@ -242,35 +242,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 = termCodeValidation.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.

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

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import jakarta.annotation.Nullable;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@JsonSerialize(using = ValidationIssueSerializer.class)
public enum ValidationIssue {
TERMCODE_CONTEXT_COMBINATION_INVALID(20001, "The combination of context and termcode(s) is not found.");

private static final ValidationIssue[] VALUES;

static {
VALUES = values();
}

private final int code;
private final String detail;

ValidationIssue(int code, String detail) {
this.code = code;
this.detail = detail;
}

public int code() {
return this.code;
}

public String detail() {
return this.detail;
}

public static ValidationIssue valueOf(int validationIssueCode) {
ValidationIssue validationIssue = resolve(validationIssueCode);
if (validationIssue == null) {
throw new IllegalArgumentException("No matching Validation issue for code " + validationIssueCode);
}
return validationIssue;
}

@Nullable
public static ValidationIssue resolve(int validationIssueCode) {
for (ValidationIssue validationIssue : VALUES) {
if (validationIssue.code == validationIssueCode) {
return validationIssue;
}
}
return null;
}
}
Loading

0 comments on commit 9368876

Please sign in to comment.