Skip to content

Commit

Permalink
Merge branch 'development' into add-token-encoder-interface
Browse files Browse the repository at this point in the history
  • Loading branch information
Steffengreiner authored Mar 22, 2024
2 parents c1d68e5 + 3db69f8 commit b7397b0
Show file tree
Hide file tree
Showing 17 changed files with 395 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ private Specification<ProteomicsMeasurement> generateProteomicsFilterSpecificati
filter);
Specification<ProteomicsMeasurement> facilityContains = ProteomicsMeasurementSpec.isFacility(
filter);
Specification<ProteomicsMeasurement> fractionContains = ProteomicsMeasurementSpec.isFraction(
filter);
Specification<ProteomicsMeasurement> digestionMethodContains = ProteomicsMeasurementSpec.isDigestionMethod(
filter);
Specification<ProteomicsMeasurement> digestionEnzymeContains = ProteomicsMeasurementSpec.isDigestionEnzyme(
Expand All @@ -93,6 +95,8 @@ private Specification<ProteomicsMeasurement> generateProteomicsFilterSpecificati
filter);
Specification<ProteomicsMeasurement> lcmsMethodContains = ProteomicsMeasurementSpec.isLcmsMethod(
filter);
Specification<ProteomicsMeasurement> registrationDateContains = ProteomicsMeasurementSpec.isRegistrationDate(
filter);
Specification<ProteomicsMeasurement> commentContains = ProteomicsMeasurementSpec.isComment(
filter);

Expand All @@ -113,6 +117,7 @@ private Specification<ProteomicsMeasurement> generateProteomicsFilterSpecificati
injectionVolumeContains,
lcColumnContains,
lcmsMethodContains,
registrationDateContains,
commentContains);
return Specification.where(isBlankSpec)
.and(containsSampleId)
Expand Down Expand Up @@ -220,6 +225,11 @@ public static Specification<ProteomicsMeasurement> isFacility(String filter) {
builder.like(root.get("facility"), "%" + filter + "%");
}

public static Specification<ProteomicsMeasurement> isFraction(String filter) {
return (root, query, builder) ->
builder.like(root.get("fraction"), "%" + filter + "%");
}

public static Specification<ProteomicsMeasurement> isDigestionMethod(String filter) {
return (root, query, builder) ->
builder.like(root.get("digestionMethod"), "%" + filter + "%");
Expand Down Expand Up @@ -270,10 +280,10 @@ public static Specification<ProteomicsMeasurement> isSamplePoolGroup(String filt
builder.like(root.get("samplePool"), "%" + filter + "%");
}

// public static Specification<ProteomicsMeasurement> isRegistrationDate(String filter){
// return (root, query, builder) ->
// builder.like(root.get("registration"), "%" + filter + "%");
// }
public static Specification<ProteomicsMeasurement> isRegistrationDate(String filter){
return (root, query, builder) ->
builder.like(root.get("registration").as(String.class), "%" + filter + "%");
}
}

private static class NgsMeasurementSpec {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,8 @@ private Result<MeasurementId, ResponseCode> registerPxP(

measurement.setLabeling(labelingMethod);

measurement.setFraction(metadata.fractionName());

var parentCodes = sampleIdCodeEntries.stream().map(SampleIdCodeEntry::sampleCode).toList();

var result = measurementDomainService.addProteomics(measurement, parentCodes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@
import org.springframework.stereotype.Component;

/**
* <b><class short description - 1 Line!></b>
* <b>Measurement NGS Validator</b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
* <p>Validator employed to check the provided user input for a measurement in the ngs domain.
* The validator checks the for the provision of mandatory information, and will return a ValidationResult
* dependent on the presence or absence of data
* </p>
*
* @since <version tag>
*/
@Component
public class NGSValidator implements Validator<NGSMeasurementMetadata> {
public class MeasurementNGSValidator implements
MeasurementValidator<NGSMeasurementMetadata> {

private static final Set<String> NGS_PROPERTIES = new HashSet<>();

Expand All @@ -33,7 +36,7 @@ public class NGSValidator implements Validator<NGSMeasurementMetadata> {
"note"));
}
@Autowired
public NGSValidator(SampleInformationService sampleInformationService) {
public MeasurementNGSValidator(SampleInformationService sampleInformationService) {
this.sampleInformationService = sampleInformationService;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,24 @@
import org.springframework.stereotype.Component;

/**
* <b><class short description - 1 Line!></b>
* <b>Measurement Proteomics Validator</b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
* <p>Validator employed to check the provided user input for a measurement in the proteomics domain.
* The validator checks the for the provision of mandatory information, and will return a ValidationResult
* dependent on the presence or absence of data
* </p>
*
* @since <version tag>
*/
@Component
public class ProteomicsValidator implements Validator<ProteomicsMeasurementMetadata> {
public class MeasurementProteomicsValidator implements
MeasurementValidator<ProteomicsMeasurementMetadata> {

protected final SampleInformationService sampleInformationService;

protected final OntologyLookupService ontologyLookupService;

@Autowired
public ProteomicsValidator(SampleInformationService sampleInformationService,
public MeasurementProteomicsValidator(SampleInformationService sampleInformationService,
OntologyLookupService ontologyLookupService) {
this.sampleInformationService = Objects.requireNonNull(sampleInformationService);
this.ontologyLookupService = Objects.requireNonNull(ontologyLookupService);
Expand Down Expand Up @@ -129,7 +132,8 @@ ValidationResult validateSampleIds(Collection<SampleCode> sampleCodes) {
return ValidationResult.withFailures(1,
List.of("A measurement must contain at least one sample reference. Provided: none"));
}
ValidationResult validationResult = ValidationResult.successful(0);
ValidationResult validationResult = ValidationResult.successful(
0);
for (SampleCode sample : sampleCodes) {
validationResult = validationResult.combine(validateSampleId(sample));
}
Expand Down Expand Up @@ -158,33 +162,38 @@ ValidationResult validateInstrument(String instrument) {
if (result.isPresent()) {
return ValidationResult.successful(1);
}
return ValidationResult.withFailures(1, List.of(UNKNOWN_INSTRUMENT_ID.formatted(instrument)));
return ValidationResult.withFailures(1,
List.of(UNKNOWN_INSTRUMENT_ID.formatted(instrument)));
}

ValidationResult validateMandatoryDataProvided(
ProteomicsMeasurementMetadata measurementMetadata) {
var validation = ValidationResult.successful(0);
if (measurementMetadata.sampleCodes().isEmpty()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Sample id: missing sample id reference")));
ValidationResult.withFailures(1,
List.of("Sample id: missing sample id reference")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.organisationId().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Organisation: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("Organisation: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.instrumentCURI().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Instrument: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("Instrument: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.facility().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("Facility: missing mandatory meta;data")));
ValidationResult.withFailures(1,
List.of("Facility: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
Expand Down Expand Up @@ -214,13 +223,15 @@ ValidationResult validateMandatoryDataProvided(
}
if (measurementMetadata.lcColumn().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("LC Column: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("LC Column: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
if (measurementMetadata.lcmsMethod().isBlank()) {
validation = validation.combine(
ValidationResult.withFailures(1, List.of("LCMS Method: missing mandatory metadata")));
ValidationResult.withFailures(1,
List.of("LCMS Method: missing mandatory metadata")));
} else {
validation = validation.combine(ValidationResult.successful(1));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,37 @@
* @since 1.0.0
*/
@Service
public class ValidationService {
public class MeasurementValidationService {

private final NGSValidator ngsValidator;
private final MeasurementNGSValidator measurementNgsValidator;

private final ProteomicsValidator pxValidator;
private final MeasurementProteomicsValidator pxpValidator;

@Autowired
public ValidationService(NGSValidator ngsValidator, ProteomicsValidator pxValidator) {
this.ngsValidator = ngsValidator;
this.pxValidator = pxValidator;
public MeasurementValidationService(MeasurementNGSValidator measurementNgsValidator,
MeasurementProteomicsValidator pxpValidator) {
this.measurementNgsValidator = measurementNgsValidator;
this.pxpValidator = pxpValidator;
}

public ValidationResult validateNGS(NGSMeasurementMetadata ngsMeasurementMetadata) {
return ngsValidator.validate(ngsMeasurementMetadata);
return measurementNgsValidator.validate(ngsMeasurementMetadata);
}

public ValidationResult validateProteomics(ProteomicsMeasurementMetadata pxMeasurementMetadata) {
return pxValidator.validate(pxMeasurementMetadata);
public ValidationResult validateProteomics(
ProteomicsMeasurementMetadata pxMeasurementMetadata) {
return pxpValidator.validate(pxMeasurementMetadata);
}

public Optional<Domain> inferDomainByPropertyTypes(Collection<String> propertyTypes) {
return Optional.ofNullable(determinDomain(propertyTypes));
}

private static Domain determinDomain(Collection<String> propertyTypes) {
if (NGSValidator.isNGS(propertyTypes)) {
if (MeasurementNGSValidator.isNGS(propertyTypes)) {
return Domain.NGS;
}
if (ProteomicsValidator.isProteomics(propertyTypes)) {
if (MeasurementProteomicsValidator.isProteomics(propertyTypes)) {
return Domain.PROTEOMICS;
}
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package life.qbic.projectmanagement.application.measurement.validation;

import life.qbic.projectmanagement.application.measurement.MeasurementMetadata;

/**
* <b>Measurement Validator</b>
*
* <p>Validation interface employed to check the provided user input for a measurement.
* Implementations of this interface are supposed to be domain specific and will
* return a ValidationResult dependent on the presence or absence of data
* </p>
*
*/
public interface MeasurementValidator<T extends MeasurementMetadata> {

ValidationResult validate(T measurementMetadata);

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
import java.util.stream.Stream;

/**
* <b><class short description - 1 Line!></b>
* <b>Validation Result</b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
* <p>Validation Result in a measurement context which contains an extendable collection of Strings
* indicating failure or warnings occurring during the measurement validation
* </p>
*
* @since <version tag>
*/
public class ValidationResult {

Expand Down Expand Up @@ -49,7 +50,8 @@ public static ValidationResult withFailures(int validatedEntries,
return new ValidationResult(validatedEntries, new ArrayList<>(), failureReports);
}

public static ValidationResult successful(int validatedEntries, Collection<String> warnings) {
public static ValidationResult successful(int validatedEntries,
Collection<String> warnings) {
return new ValidationResult(validatedEntries, warnings, new ArrayList<>());
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
Expand Down Expand Up @@ -197,6 +196,10 @@ public void setLabeling(Collection<ProteomicsLabeling> labeling) {
this.labeling = Set.copyOf(labeling.stream().toList());
}

public void setFraction(String fraction) {
this.fraction = fraction;
}

/**
* Convenience method to query if the measurement was derived from a pooled sample.
*
Expand Down Expand Up @@ -243,6 +246,10 @@ public String enrichmentMethod() {
return enrichmentMethod;
}

public Optional<String> fraction() {
return Optional.ofNullable(fraction.isBlank() ? null : fraction);
}

public int injectionVolume() {
return injectionVolume;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package life.qbic.projectmanagement.application.measurement.validation

import spock.lang.Specification

class NGSValidatorSpec extends Specification {
class MeasurementNGSValidatorSpec extends Specification {

def "Given a valid NGS measurement metadata property collection, pass the validation"() {
given:
def validNGSproperties = ["qbic sample id", "organisation id", "facility", "instrument", "sequencing read type", "library kit", "flow cell", "run protocol", "index i5", "index i7", "note"]

when:
def isNGSMetadata = NGSValidator.isNGS(validNGSproperties)
def isNGSMetadata = MeasurementNGSValidator.isNGS(validNGSproperties)

then:
isNGSMetadata
Expand All @@ -21,7 +21,7 @@ class NGSValidatorSpec extends Specification {
def missingProperties= ["organism id", "facility", "instrument", "sequencing read type", "library kit", "flow cell", "run protocol", "index i5", "index i7", "note"]

when:
def isNGSMetadata = NGSValidator.isNGS(missingProperties)
def isNGSMetadata = MeasurementNGSValidator.isNGS(missingProperties)

then:
!isNGSMetadata
Expand All @@ -32,7 +32,7 @@ class NGSValidatorSpec extends Specification {
def missingProperties= []

when:
def isNGSMetadata = NGSValidator.isNGS(missingProperties)
def isNGSMetadata = MeasurementNGSValidator.isNGS(missingProperties)

then:
!isNGSMetadata
Expand All @@ -43,7 +43,7 @@ class NGSValidatorSpec extends Specification {
def chaosCasing= ["QbiC SaMpLe ID", "organisation ID", "FACiLity", "Instrument", "sequencing read type", "library kit", "flow cell", "run protocol", "index i5", "index i7", "note"]

when:
def isNGSMetadata = NGSValidator.isNGS(chaosCasing)
def isNGSMetadata = MeasurementNGSValidator.isNGS(chaosCasing)

then:
isNGSMetadata
Expand Down
Loading

0 comments on commit b7397b0

Please sign in to comment.