Skip to content

Commit 3187594

Browse files
authored
Merge pull request #324 from MeasureAuthoringTool/feature/MAT-9425-composite-updates
Feature/mat 9425 composite updates
2 parents 157de8b + 9ca538a commit 3187594

16 files changed

Lines changed: 295 additions & 12 deletions

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>gov.cms.madie</groupId>
88
<artifactId>madie-java-models</artifactId>
9-
<version>0.7.4-SNAPSHOT</version>
9+
<version>0.8.0-SNAPSHOT</version>
1010
<name>madie-java-models</name>
1111
<description>Java based models for MADiE microservices</description>
1212
<properties>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package gov.cms.madie.models.measure;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder(toBuilder = true)
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class Component {
13+
private String measureId;
14+
private String groupId;
15+
private Double weight;
16+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package gov.cms.madie.models.measure;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
import java.util.Arrays;
6+
7+
public enum CompositeMeasureScoring {
8+
@JsonProperty("All-or-nothing")
9+
ALL_OR_NOTHING("All-or-nothing"),
10+
@JsonProperty("Opportunity")
11+
OPPORTUNITY("Opportunity"),
12+
@JsonProperty("Linear")
13+
LINEAR("Linear");
14+
15+
private final String text;
16+
17+
CompositeMeasureScoring(String text) {
18+
this.text = text;
19+
}
20+
21+
@Override
22+
public String toString() {
23+
return this.text;
24+
}
25+
26+
public String toCode() {
27+
return this.text.toLowerCase();
28+
}
29+
30+
public static CompositeMeasureScoring valueOfText(String text) {
31+
return Arrays.stream(CompositeMeasureScoring.values())
32+
.filter(s -> s.text.equals(text))
33+
.findFirst()
34+
.orElse(null);
35+
}
36+
}

src/main/java/gov/cms/madie/models/measure/Group.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class Group implements GroupScoringPopulation, Serializable {
2727

2828
@NotNull(
2929
message = "Scoring is required.",
30-
groups = {Measure.ValidationOrder5.class})
30+
groups = {Measure.ValidationOrder4.class})
3131
@EnumValidator(
3232
enumClass = MeasureScoring.class,
3333
message = "Scoring must be a valid MADiE scoring type",
@@ -59,4 +59,14 @@ public class Group implements GroupScoringPopulation, Serializable {
5959
private Integer scoringPrecision;
6060

6161
private String displayId;
62+
63+
// Composite attributes
64+
@EnumValidator(
65+
enumClass = CompositeMeasureScoring.class,
66+
message = "Composite Scoring must be a valid MADiE Composite scoring type",
67+
allowNull = true,
68+
groups = {Measure.ValidationOrder5.class})
69+
private String compositeScoring;
70+
71+
private List<Component> components;
6272
}

src/main/java/gov/cms/madie/models/measure/Measure.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
import java.util.Set;
88

99
import gov.cms.madie.models.common.IncludedLibrary;
10-
import gov.cms.madie.models.validators.ValidIntendedVenue;
11-
import gov.cms.madie.models.validators.ValidPurpose;
10+
import gov.cms.madie.models.validators.*;
1211
import jakarta.validation.GroupSequence;
1312
import jakarta.validation.Valid;
1413
import jakarta.validation.constraints.NotBlank;
@@ -31,8 +30,6 @@
3130
import gov.cms.madie.models.common.ModelType;
3231
import gov.cms.madie.models.common.Version;
3332
import gov.cms.madie.models.utils.VersionJsonSerializer;
34-
import gov.cms.madie.models.validators.EnumValidator;
35-
import gov.cms.madie.models.validators.ValidLibraryName;
3633
import lombok.Data;
3734
import lombok.NoArgsConstructor;
3835
import lombok.experimental.SuperBuilder;
@@ -56,6 +53,7 @@
5653
@ValidLibraryName
5754
@ValidIntendedVenue
5855
@ValidPurpose
56+
@ValidComposite
5957
public class Measure implements Serializable, Cloneable {
6058

6159
@Id private String id;

src/main/java/gov/cms/madie/models/measure/MeasureMetaData.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class MeasureMetaData implements Serializable {
3636
private CqlMetaData cqlMetaData;
3737
private CodeConcept intendedVenue;
3838
private String purpose;
39+
private boolean composite;
3940

4041
@Valid private List<MeasureDefinition> measureDefinitions;
4142
}

src/main/java/gov/cms/madie/models/measure/MeasureScoring.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ public enum MeasureScoring {
1212
@JsonProperty("Proportion")
1313
PROPORTION("Proportion"),
1414
@JsonProperty("Ratio")
15-
RATIO("Ratio");
15+
RATIO("Ratio"),
16+
@JsonProperty("Composite")
17+
COMPOSITE("Composite");
1618

1719
private final String text;
1820

src/main/java/gov/cms/madie/models/validators/EnumValidator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
import jakarta.validation.Constraint;
44
import jakarta.validation.Payload;
55
import jakarta.validation.ReportAsSingleViolation;
6-
import jakarta.validation.constraints.NotNull;
6+
77
import java.lang.annotation.Documented;
88
import java.lang.annotation.ElementType;
99
import java.lang.annotation.Retention;
1010
import java.lang.annotation.RetentionPolicy;
1111
import java.lang.annotation.Target;
1212

13-
@NotNull(message = "Value cannot be null")
1413
@ReportAsSingleViolation
1514
@Target({ElementType.FIELD})
1615
@Retention(RetentionPolicy.RUNTIME)
@@ -25,4 +24,6 @@
2524
Class<?>[] groups() default {};
2625

2726
Class<? extends Payload>[] payload() default {};
27+
28+
boolean allowNull() default false;
2829
}

src/main/java/gov/cms/madie/models/validators/EnumValidatorImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,30 @@
22

33
import jakarta.validation.ConstraintValidator;
44
import jakarta.validation.ConstraintValidatorContext;
5+
56
import java.util.List;
67
import java.util.stream.Collectors;
78
import java.util.stream.Stream;
89

910
public class EnumValidatorImpl implements ConstraintValidator<EnumValidator, String> {
1011

1112
private List<String> acceptedValues;
13+
private boolean allowNull;
1214

1315
@Override
1416
public void initialize(EnumValidator annotation) {
1517
acceptedValues =
1618
Stream.of(annotation.enumClass().getEnumConstants())
1719
.map(Enum::toString)
1820
.collect(Collectors.toList());
21+
allowNull = annotation.allowNull();
1922
}
2023

2124
@Override
2225
public boolean isValid(String value, ConstraintValidatorContext context) {
26+
if (value == null) {
27+
return allowNull;
28+
}
2329
return acceptedValues.contains(value);
2430
}
2531
}

src/main/java/gov/cms/madie/models/validators/MeasureScoringValidator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ public class MeasureScoringValidator
1212
@Override
1313
public boolean isValid(QdmMeasure measure, ConstraintValidatorContext context) {
1414
if (measure != null && measure.getScoring() != null) {
15-
return MeasureScoring.valueOfText(measure.getScoring()) == null ? false : true;
15+
MeasureScoring scoring = MeasureScoring.valueOfText(measure.getScoring());
16+
if (scoring == MeasureScoring.COMPOSITE) {
17+
return false;
18+
}
19+
return scoring != null;
1620
}
1721
return true;
1822
}

0 commit comments

Comments
 (0)