Skip to content
Closed
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 @@ -765,6 +765,16 @@ private void validateObservations(ValidationErrors validationErrors,
// had been saved prior to import
} else if (existingObsByObsHash.containsKey(importHash) && !isObservationMatched(importHash, importObsValue, phenoCol, rowNum)) {

// different data means validations still need to happen
// TODO consider moving these two calls into a separate method since called twice together
validateObservationValue(colVarMap.get(phenoCol.name()), phenoCol.getString(rowNum), phenoCol.name(), validationErrors, rowNum);

//Timestamp validation
if(timeStampColByPheno.containsKey(phenoCol.name())) {
Column<?> timeStampCol = timeStampColByPheno.get(phenoCol.name());
validateTimeStampValue(timeStampCol.getString(rowNum), timeStampCol.name(), validationErrors, rowNum);
}

// add a change log entry when updating the value of an observation
if (commit) {
BrAPIObservation pendingObservation = observationByHash.get(importHash).getBrAPIObject();
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/org/breedinginsight/services/TraitService.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import javax.inject.Singleton;
import java.util.*;
import java.util.stream.Collectors;
import org.breedinginsight.utilities.Utilities;

@Slf4j
@Singleton
Expand Down Expand Up @@ -255,21 +256,26 @@ public void assignTraitsProgramObservationLevel(List<Trait> traits, UUID program
}

public void preprocessTraits(List<Trait> traits) {

// Set data type to numerical when method class is computation and include name and full name as synonyms
for (Trait trait: traits) {
List<String> brApiSynonyms = trait.getSynonyms() == null ? new ArrayList<>() : trait.getSynonyms();
// Include name and full name as synonyms.
if (trait.getObservationVariableName() != null && !brApiSynonyms.contains(trait.getObservationVariableName())) {
brApiSynonyms.add(trait.getObservationVariableName());
}
if (trait.getFullName() != null && !brApiSynonyms.contains(trait.getFullName())) {
brApiSynonyms.add(trait.getFullName());
}
if (trait.getMethod() != null && trait.getMethod().getMethodClass() != null &&

if (trait.getScale() != null) {
// Set data type to numerical when method class is computation.
if (trait.getMethod() != null && trait.getMethod().getMethodClass() != null &&
trait.getMethod().getMethodClass().equalsIgnoreCase(Method.COMPUTATION_TYPE)) {
if (trait.getScale() != null) {
trait.getScale().setDataType(DataType.NUMERICAL);
}
// Set scaleName to units, fallback to scale class if units is null.
String units = trait.getScale().getUnits();
String dataType = trait.getScale().getDataType() == null ? null : Utilities.capitalize(trait.getScale().getDataType().getLiteral());
trait.getScale().setScaleName(units == null ? dataType : units);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,12 @@ public ValidationErrors checkRequiredTraitFields(List<Trait> traits, TraitValida
ValidationError error = traitValidatorErrors.getMissingScaleMsg();
errors.addError(traitValidatorErrors.getRowNumber(i), error);
} else {
if (scale.getDataType() != null & scale.getDataType() == DataType.NUMERICAL &&
if (scale.getDataType() != null && scale.getDataType() == DataType.NUMERICAL &&
(isBlank(scale.getUnits()))) {
ValidationError error = traitValidatorErrors.getMissingScaleUnitMsg();
errors.addError(traitValidatorErrors.getRowNumber(i), error);
}
if (scale.getDataType() == null || scale.getDataType() == null) {
if (scale.getDataType() == null) {
ValidationError error = traitValidatorErrors.getMissingScaleDataTypeMsg();
errors.addError(traitValidatorErrors.getRowNumber(i), error);
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/breedinginsight/utilities/Utilities.java
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,14 @@ public static List<Program> getAllProgramsFlyway(Context context, String default
return programs;
}

/**
* Returns the input string with the first character capitalized, the rest lower cased.
* Note: does not account for whitespace, does not capitalize multiple words.
*/
public static String capitalize(String input) {
return input.substring(0, 1).toUpperCase() + input.substring(1).toLowerCase();
}

private static boolean isSafeChar(char c) {
// Check if c is in the portable filename character set.
// See https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import org.breedinginsight.daos.cache.ProgramCacheProvider;
import org.breedinginsight.model.*;
import org.breedinginsight.services.SpeciesService;
import org.breedinginsight.utilities.Utilities;
import org.jooq.DSLContext;
import org.junit.jupiter.api.*;
import org.mockito.stubbing.Answer;
Expand Down Expand Up @@ -455,7 +456,8 @@ public void checkBrapiValues() {
String methodName = String.format("%s %s", trait1.getMethod().getDescription(), trait1.getMethod().getMethodClass());
assertEquals(String.format("%s [%s]", methodName, validProgramKey),
variable.getMethod().getMethodName(), "Unexpected method name");
assertEquals(String.format("%s [%s]", trait1.getScale().getScaleName(), validProgramKey),
String expectedScaleName = trait1.getScale().getUnits() == null ? Utilities.capitalize(trait1.getScale().getDataType().getLiteral()) : trait1.getScale().getUnits();
assertEquals(String.format("%s [%s]", expectedScaleName, validProgramKey),
variable.getScale().getScaleName(), "Unexpected scale name");
String traitName = String.format("%s %s", trait1.getEntity(), trait1.getAttribute());
assertEquals(String.format("%s [%s]", traitName, validProgramKey),
Expand Down Expand Up @@ -484,7 +486,8 @@ public void checkBrapiValues() {
methodName = String.format("%s %s", trait1.getMethod().getDescription(), trait1.getMethod().getMethodClass());
assertEquals(String.format("%s [%s]", methodName, validProgramKey),
variable.getMethod().getMethodName(), "Unexpected method name");
assertEquals(String.format("%s [%s]", trait1.getScale().getScaleName(), validProgramKey),
expectedScaleName = trait1.getScale().getUnits() == null ? Utilities.capitalize(trait1.getScale().getDataType().getLiteral()) : trait1.getScale().getUnits();
assertEquals(String.format("%s [%s]", expectedScaleName, validProgramKey),
variable.getScale().getScaleName(), "Unexpected scale name");
traitName = String.format("%s %s", trait1.getEntity(), trait1.getAttribute());
assertEquals(String.format("%s [%s]", traitName, validProgramKey),
Expand Down Expand Up @@ -1060,7 +1063,8 @@ public void checkTraitResponse(JsonObject traitJson, Trait trait) {
}

JsonObject scale = traitJson.getAsJsonObject("scale");
assertEquals(trait.getScale().getScaleName(), scale.get("scaleName").getAsString(), "Scale names don't match");
String expectedScaleName = trait.getScale().getUnits() == null ? Utilities.capitalize(trait.getScale().getDataType().getLiteral()) : trait.getScale().getUnits();
assertEquals(expectedScaleName, scale.get("scaleName").getAsString(), "Scale names don't match");
assertEquals(trait.getScale().getDataType().toString(), scale.get("dataType").getAsString(), "Scale data types don't match");

JsonObject programOntology = traitJson.getAsJsonObject("programOntology");
Expand Down Expand Up @@ -1433,7 +1437,8 @@ public void putTraitComputation() {
assertEquals(updateTrait.getObservationVariableName(), trait.get("observationVariableName").getAsString(), "wrong trait name");
assertEquals(updateTrait.getProgramObservationLevel().getName(),
trait.get("programObservationLevel").getAsJsonObject().get("name").getAsString(), "wrong observation level");
assertEquals(updateTrait.getScale().getScaleName(),
String expectedScaleName = updateTrait.getScale().getUnits() == null ? Utilities.capitalize(updateTrait.getScale().getDataType().getLiteral()) : updateTrait.getScale().getUnits();
assertEquals(expectedScaleName,
trait.get("scale").getAsJsonObject().get("scaleName").getAsString(), "wrong scale name");
assertEquals(updateTrait.getScale().getDataType().toString(),
trait.get("scale").getAsJsonObject().get("dataType").getAsString(), "wrong scale data type");
Expand Down Expand Up @@ -1590,8 +1595,4 @@ public void archiveTraitIdNotExist() {

}





}