From 315c3cddd1239f6c4661b3bd7ed47a7589d08f09 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:43:47 -0500 Subject: [PATCH 1/4] [BI-2053] - fixed scale units bug --- .../daos/impl/TraitDAOImpl.java | 1 + .../java/org/breedinginsight/model/Scale.java | 2 ++ .../services/OntologyService.java | 2 +- .../services/TraitService.java | 15 +++--------- .../parsers/trait/TraitFileColumns.java | 2 +- .../parsers/trait/TraitFileParser.java | 4 +++- .../migration/V1.18.0__alter_scale_table.sql | 23 +++++++++++++++++++ 7 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/db/migration/V1.18.0__alter_scale_table.sql diff --git a/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java b/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java index c61702622..983c739c2 100644 --- a/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java +++ b/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java @@ -380,6 +380,7 @@ public List createTraitsBrAPI(List traits, User actingUser, Progra .min(trait.getScale().getValidValueMin()); BrAPIScale brApiScale = new BrAPIScale() .scaleName(String.format("%s [%s]", trait.getScale().getScaleName(), program.getKey())) + .units(trait.getScale().getUnits()) .externalReferences(List.of(scaleReference)) .dataType(brApiTraitDataType) .decimalPlaces(trait.getScale().getDecimalPlaces()) diff --git a/src/main/java/org/breedinginsight/model/Scale.java b/src/main/java/org/breedinginsight/model/Scale.java index f1c3ebf8f..b2458e80b 100644 --- a/src/main/java/org/breedinginsight/model/Scale.java +++ b/src/main/java/org/breedinginsight/model/Scale.java @@ -58,6 +58,7 @@ public class Scale extends ScaleEntity { public Scale(ScaleEntity scaleEntity){ this.setId(scaleEntity.getId()); this.setScaleName(scaleEntity.getScaleName()); + this.setUnits(scaleEntity.getUnits()); this.setProgramOntologyId(scaleEntity.getProgramOntologyId()); this.setDataType(scaleEntity.getDataType()); this.setCreatedAt(scaleEntity.getCreatedAt()); @@ -70,6 +71,7 @@ public static Scale parseSqlRecord(Record record) { return Scale.builder() .id(record.getValue(SCALE.ID)) .scaleName(record.getValue(SCALE.SCALE_NAME)) + .units(record.getValue(SCALE.UNITS)) .programOntologyId(record.getValue(SCALE.PROGRAM_ONTOLOGY_ID)) .dataType(record.getValue(SCALE.DATA_TYPE)) .createdAt(record.getValue(SCALE.CREATED_AT)) diff --git a/src/main/java/org/breedinginsight/services/OntologyService.java b/src/main/java/org/breedinginsight/services/OntologyService.java index 90de17ec8..a2a711535 100644 --- a/src/main/java/org/breedinginsight/services/OntologyService.java +++ b/src/main/java/org/breedinginsight/services/OntologyService.java @@ -505,7 +505,7 @@ public List> processData(List traits) { if(scale!=null) { row.put(TraitFileColumns.SCALE_CLASS.toString(), DataTypeTranslator.getDisplayNameFromType(scale.getDataType())); - row.put(TraitFileColumns.SCALE_NAME.toString(), scale.getScaleName()); + row.put(TraitFileColumns.UNITS.toString(), scale.getUnits()); row.put(TraitFileColumns.SCALE_DECIMAL_PLACES.toString(), scale.getDecimalPlaces()); row.put(TraitFileColumns.SCALE_LOWER_LIMIT.toString(), scale.getValidValueMin()); row.put(TraitFileColumns.SCALE_UPPER_LIMIT.toString(), scale.getValidValueMax()); diff --git a/src/main/java/org/breedinginsight/services/TraitService.java b/src/main/java/org/breedinginsight/services/TraitService.java index 5f240e025..c36296122 100644 --- a/src/main/java/org/breedinginsight/services/TraitService.java +++ b/src/main/java/org/breedinginsight/services/TraitService.java @@ -22,19 +22,10 @@ import io.micronaut.http.server.exceptions.HttpServerException; import io.micronaut.http.server.exceptions.InternalServerException; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.text.WordUtils; -import org.brapi.client.v2.model.exceptions.ApiException; -import org.brapi.v2.model.BrAPIOntologyReference; -import org.brapi.v2.model.core.BrAPIStudy; -import org.brapi.v2.model.core.BrAPITrial; -import org.brapi.v2.model.pheno.*; +import org.brapi.v2.model.pheno.BrAPIObservation; import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.api.model.v1.response.ValidationErrors; -import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; -import org.breedinginsight.brapi.v2.services.BrAPITrialService; -import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.MethodEntity; import org.breedinginsight.dao.db.tables.pojos.ProgramSharedOntologyEntity; @@ -46,8 +37,6 @@ import org.breedinginsight.services.exceptions.ValidatorException; import org.breedinginsight.services.validators.TraitValidatorError; import org.breedinginsight.services.validators.TraitValidatorService; -import org.breedinginsight.utilities.Utilities; -import org.jetbrains.annotations.NotNull; import org.jooq.DSLContext; import javax.inject.Inject; @@ -203,6 +192,7 @@ public List createTraits(UUID programId, List traits, Authenticate // Create scale ScaleEntity jooqScale = ScaleEntity.builder() .scaleName(trait.getScale().getScaleName()) + .units(trait.getScale().getUnits()) .dataType(trait.getScale().getDataType()) .programOntologyId(programOntology.getId()) .createdBy(actingUser.getId()) @@ -419,6 +409,7 @@ public List updateTraits(UUID programId, List traits, Authenticate // Jump to scale ScaleEntity existingScaleEntity = scaleDAO.fetchOneById(existingTraitEntity.getScaleId()); existingScaleEntity.setScaleName(updatedTrait.getScale().getScaleName()); + existingScaleEntity.setUnits(updatedTrait.getScale().getUnits()); existingScaleEntity.setDataType(updatedTrait.getScale().getDataType()); existingScaleEntity.setUpdatedBy(user.getId()); scaleDAO.update(existingScaleEntity); diff --git a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileColumns.java b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileColumns.java index f3782adf7..303671c76 100644 --- a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileColumns.java +++ b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileColumns.java @@ -38,7 +38,7 @@ public enum TraitFileColumns { METHOD_CLASS("Method class", Column.ColumnDataType.STRING), METHOD_FORMULA("Method formula", Column.ColumnDataType.STRING), SCALE_CLASS("Scale class", Column.ColumnDataType.STRING), - SCALE_NAME("Units", Column.ColumnDataType.STRING), + UNITS("Units", Column.ColumnDataType.STRING), SCALE_DECIMAL_PLACES("Scale decimal places", Column.ColumnDataType.INTEGER), SCALE_LOWER_LIMIT("Scale lower limit", Column.ColumnDataType.INTEGER), SCALE_UPPER_LIMIT("Scale upper limit", Column.ColumnDataType.INTEGER), diff --git a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java index 66c7134f6..e93f91760 100644 --- a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java @@ -242,8 +242,10 @@ private List excelRecordsToTraits(List records) throws Valid } } + String units = parseExcelValueAsString(record, TraitFileColumns.UNITS); Scale scale = Scale.builder() - .scaleName(parseExcelValueAsString(record, TraitFileColumns.SCALE_NAME)) + .scaleName(units == null ? parseExcelValueAsString(record, TraitFileColumns.SCALE_CLASS) : units) + .units(units) .dataType(dataType) .decimalPlaces(decimalPlaces) .validValueMin(validValueMin) diff --git a/src/main/resources/db/migration/V1.18.0__alter_scale_table.sql b/src/main/resources/db/migration/V1.18.0__alter_scale_table.sql new file mode 100644 index 000000000..e27cfef5a --- /dev/null +++ b/src/main/resources/db/migration/V1.18.0__alter_scale_table.sql @@ -0,0 +1,23 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +-- Add units to scale table, units is an optional BrAPI field. +ALTER TABLE scale ADD COLUMN units text; +-- Update existing scale records. +UPDATE scale +SET units = scale_name +WHERE data_type = 'NUMERICAL'; \ No newline at end of file From 03a42f7440e0c2cb3e46ab6f25fbc46308d2a97f Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:43:29 -0500 Subject: [PATCH 2/4] [BI-2053] - added error message for non-numeric scale with units --- .../services/parsers/ParsingExceptionType.java | 3 ++- .../services/parsers/trait/TraitFileParser.java | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java b/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java index 31e7356d2..4ae0d0c1d 100644 --- a/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java +++ b/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java @@ -36,7 +36,8 @@ public enum ParsingExceptionType { INVALID_SCALE_LOWER_LIMIT("Invalid scale lower limit value. Value must be numeric and be a whole number."), INVALID_SCALE_UPPER_LIMIT("Invalid scale upper limit value. Value must be numeric and be a whole number."), INVALID_SCALE_CATEGORIES("Invalid scale categories format"), - INVALID_TERM_TYPE("Invalid term type"); + INVALID_TERM_TYPE("Invalid term type"), + SCALE_UNIT_NOT_ALLOWED("Units identified for non-numeric scale class."); private String value; diff --git a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java index e93f91760..17a9e46f6 100644 --- a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java @@ -243,6 +243,11 @@ private List excelRecordsToTraits(List records) throws Valid } String units = parseExcelValueAsString(record, TraitFileColumns.UNITS); + if (dataType != DataType.NUMERICAL && units != null && !units.isEmpty()) { + ValidationError error = new ValidationError(TraitFileColumns.UNITS.toString(), + ParsingExceptionType.SCALE_UNIT_NOT_ALLOWED.toString(), HttpStatus.UNPROCESSABLE_ENTITY); + validationErrors.addError(traitValidatorError.getRowNumber(i), error); + } Scale scale = Scale.builder() .scaleName(units == null ? parseExcelValueAsString(record, TraitFileColumns.SCALE_CLASS) : units) .units(units) From 72130a937c6eb8b225a0e141778b9088781adad7 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 15 Feb 2024 16:36:25 -0500 Subject: [PATCH 3/4] [BI-2053] - fixed tests --- .../parsers/trait/TraitFileParser.java | 11 +++++++---- .../validators/TraitFileValidatorError.java | 2 +- .../validators/TraitValidatorError.java | 4 ++-- .../TraitValidatorErrorInterface.java | 2 +- .../validators/TraitValidatorService.java | 5 ++--- .../TraitControllerIntegrationTest.java | 2 ++ .../TraitUploadControllerIntegrationTest.java | 2 +- ...ionVariablesControllerIntegrationTest.java | 1 + ...vationLevelsControllerIntegrationTest.java | 1 + ...ervationUnitControllerIntegrationTest.java | 1 + ...ObservationsControllerIntegrationTest.java | 1 + ...BrAPIStudiesControllerIntegrationTest.java | 1 + ...tionVariableControllerIntegrationTest.java | 1 + .../ExperimentControllerIntegrationTest.java | 1 + .../brapps/importer/ImportTestUtils.java | 1 + .../parsers/TraitFileParserUnitTest.java | 2 +- .../resources/files/data_mismatched_cases.csv | 2 +- .../resources/files/data_multiple_rows.csv | 6 +++--- .../resources/files/data_multiple_rows.xls | Bin 21504 -> 21504 bytes .../resources/files/data_multiple_rows.xlsx | Bin 10589 -> 10541 bytes src/test/resources/files/data_one_row.csv | 2 +- src/test/resources/files/data_one_row.xls | Bin 24576 -> 24576 bytes src/test/resources/files/data_one_row.xlsx | Bin 12644 -> 12636 bytes .../files/data_one_row_blank_active_value.csv | 2 +- .../files/data_one_row_blank_scale_class.csv | 2 +- .../files/data_one_row_computation.csv | 2 +- .../files/data_one_row_empty_active_value.xls | Bin 24576 -> 24576 bytes .../data_one_row_empty_formula_headers.xls | Bin 24576 -> 24576 bytes .../files/data_one_row_empty_headers.csv | 2 +- .../files/data_one_row_empty_headers.xls | Bin 24576 -> 24576 bytes .../data_one_row_invalid_active_value.csv | 2 +- .../data_one_row_invalid_scale_class.csv | 2 +- .../data_one_row_scale_categories_blank.csv | 2 +- .../data_one_row_scale_decimal_blank.csv | 2 +- .../data_one_row_scale_decimal_invalid.csv | 2 +- .../data_one_row_trait_level_not_exist.csv | 2 +- src/test/resources/files/duplicatesInFile.csv | 4 ++-- .../files/missing_category_label_nominal.csv | 2 +- .../resources/files/missing_scale_unit.xlsx | Bin 17927 -> 17926 bytes .../files/multiple_rows_parsing_errors.csv | 6 +++--- .../data_nominal_missing_categories.xlsx | Bin 18004 -> 17936 bytes .../data_ordinal_missing_categories.xlsx | Bin 17944 -> 17891 bytes .../resources/files/parsing_exceptions.csv | 2 +- 43 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java index 17a9e46f6..2dc710483 100644 --- a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java @@ -243,10 +243,13 @@ private List excelRecordsToTraits(List records) throws Valid } String units = parseExcelValueAsString(record, TraitFileColumns.UNITS); - if (dataType != DataType.NUMERICAL && units != null && !units.isEmpty()) { - ValidationError error = new ValidationError(TraitFileColumns.UNITS.toString(), - ParsingExceptionType.SCALE_UNIT_NOT_ALLOWED.toString(), HttpStatus.UNPROCESSABLE_ENTITY); - validationErrors.addError(traitValidatorError.getRowNumber(i), error); + // Note: if method class is "Computation", scale class will be overwritten to "Numerical", so treat accordingly. + if (dataType != DataType.NUMERICAL && (method.getMethodClass() == null || !method.getMethodClass().equalsIgnoreCase(Method.COMPUTATION_TYPE))) { + if (units != null && !units.isEmpty()) { + ValidationError error = new ValidationError(TraitFileColumns.UNITS.toString(), + ParsingExceptionType.SCALE_UNIT_NOT_ALLOWED.toString(), HttpStatus.UNPROCESSABLE_ENTITY); + validationErrors.addError(traitValidatorError.getRowNumber(i), error); + } } Scale scale = Scale.builder() .scaleName(units == null ? parseExcelValueAsString(record, TraitFileColumns.SCALE_CLASS) : units) diff --git a/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java b/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java index 0eab0ad37..4ba0f99d7 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitFileValidatorError.java @@ -56,7 +56,7 @@ public ValidationError getMissingScaleMsg() { } @Override - public ValidationError getMissingScaleNameMsg() { + public ValidationError getMissingScaleUnitMsg() { return new ValidationError("Unit", "Missing unit", HttpStatus.UNPROCESSABLE_ENTITY); } diff --git a/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java b/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java index 107f5e28f..b2db156f6 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitValidatorError.java @@ -56,8 +56,8 @@ public ValidationError getMissingScaleMsg() { } @Override - public ValidationError getMissingScaleNameMsg() { - return new ValidationError("scale.scaleName", "Missing scale name", HttpStatus.BAD_REQUEST); + public ValidationError getMissingScaleUnitMsg() { + return new ValidationError("scale.units", "Missing units", HttpStatus.BAD_REQUEST); } @Override diff --git a/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java b/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java index a6bb314f4..49ef88da5 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitValidatorErrorInterface.java @@ -28,7 +28,7 @@ public interface TraitValidatorErrorInterface { ValidationError getMissingMethodMsg(); ValidationError getMissingMethodClassMsg(); ValidationError getMissingScaleMsg(); - ValidationError getMissingScaleNameMsg(); + ValidationError getMissingScaleUnitMsg(); ValidationError getMissingScaleDataTypeMsg(); ValidationError getMissingObsVarNameMsg(); ValidationError getMissingTraitEntityMsg(); diff --git a/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java b/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java index 1b893c8bc..20d811125 100644 --- a/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java +++ b/src/main/java/org/breedinginsight/services/validators/TraitValidatorService.java @@ -18,7 +18,6 @@ import org.breedinginsight.api.model.v1.response.ValidationError; import org.breedinginsight.api.model.v1.response.ValidationErrors; -import org.breedinginsight.brapi.v1.model.TraitDataType; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.daos.TraitDAO; import org.breedinginsight.model.Method; @@ -65,8 +64,8 @@ public ValidationErrors checkRequiredTraitFields(List traits, TraitValida errors.addError(traitValidatorErrors.getRowNumber(i), error); } else { if (scale.getDataType() != null & scale.getDataType() == DataType.NUMERICAL && - (isBlank(scale.getScaleName()) || scale.getScaleName() == null )) { - ValidationError error = traitValidatorErrors.getMissingScaleNameMsg(); + (isBlank(scale.getUnits()))) { + ValidationError error = traitValidatorErrors.getMissingScaleUnitMsg(); errors.addError(traitValidatorErrors.getRowNumber(i), error); } if (scale.getDataType() == null || scale.getDataType() == null) { diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java index 9f43c37b8..71f471f1b 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java @@ -1367,6 +1367,8 @@ public void postTraitComputation() { // Set scale class to computation trait1.getMethod().setMethodClass("Computation"); + // Since method class of "Computation" will change scale class to "Numerical", units is reauired. + trait1.getScale().setUnits("test unit"); List traits = List.of(trait1); diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java index 4763b7af8..f52cd917a 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -581,7 +581,7 @@ private void checkValidTraitUpload(JsonObject traitUpload) { assertEquals("a^2 + b^2 = c^2", method.get("formula").getAsString(), "wrong method formula"); JsonObject scale = trait.get("scale").getAsJsonObject(); - assertEquals("1-4 Parlier field response score", scale.get("scaleName").getAsString(), "wrong scale name"); + assertEquals("Ordinal", scale.get("scaleName").getAsString(), "wrong scale name"); assertEquals(DataType.ORDINAL.getLiteral(), scale.get("dataType").getAsString(), "wrong scale dataType"); assertEquals(2, scale.get("decimalPlaces").getAsInt(), "wrong scale decimal places"); assertEquals(2, scale.get("validValueMin").getAsInt(), "wrong scale min value"); diff --git a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiV1ObservationVariablesControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiV1ObservationVariablesControllerIntegrationTest.java index 300fcd928..038a691ec 100644 --- a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiV1ObservationVariablesControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiV1ObservationVariablesControllerIntegrationTest.java @@ -163,6 +163,7 @@ Trait buildTestTrait(String name, String traitClass, String description, Scale scale = Scale.builder() .scaleName(name + " scale") + .units("test unit") .dataType(DataType.NUMERICAL) .build(); diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java index 0e57050ca..85f6c6773 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java @@ -290,6 +290,7 @@ private List createTraits(int numToCreate) { .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) .scale(Scale.builder() .scaleName("test scale") + .units("test unit") .dataType(DataType.NUMERICAL) .validValueMin(0) .validValueMax(100) diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java index a45dbb6f6..3a3d8ffa3 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java @@ -422,6 +422,7 @@ private List createTraits(int numToCreate) { .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) .scale(Scale.builder() .scaleName("test scale") + .units("test unit") .dataType(DataType.NUMERICAL) .validValueMin(0) .validValueMax(100) diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java index 4a0a78526..16d7261fb 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java @@ -378,6 +378,7 @@ private List createTraits(int numToCreate) { .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) .scale(Scale.builder() .scaleName("test scale") + .units("test unit") .dataType(DataType.NUMERICAL) .validValueMin(0) .validValueMax(100) diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIStudiesControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIStudiesControllerIntegrationTest.java index 955c6e619..ac276003c 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIStudiesControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIStudiesControllerIntegrationTest.java @@ -376,6 +376,7 @@ private List createTraits(int numToCreate) { .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) .scale(Scale.builder() .scaleName("test scale") + .units("test unit") .dataType(DataType.NUMERICAL) .validValueMin(0) .validValueMax(100) diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java index d54aaafc1..58c20194f 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java @@ -386,6 +386,7 @@ private List createTraits(int numToCreate) { .scale(Scale.builder() .scaleName("test scale") .dataType(DataType.NUMERICAL) + .units("test unit") .validValueMin(0) .validValueMax(100) .build()) diff --git a/src/test/java/org/breedinginsight/brapi/v2/ExperimentControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/ExperimentControllerIntegrationTest.java index c3496ba41..de17556aa 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/ExperimentControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/ExperimentControllerIntegrationTest.java @@ -314,6 +314,7 @@ private List createTraits(int numToCreate) { .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) .scale(Scale.builder() .scaleName("test scale") + .units("test unit") .dataType(DataType.NUMERICAL) .validValueMin(0) .validValueMax(100) diff --git a/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java b/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java index 3a521aa55..445542e6c 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java +++ b/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java @@ -182,6 +182,7 @@ public List createTraits(int numToCreate) { .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) .scale(Scale.builder() .scaleName("test scale") + .units("test unit") .dataType(DataType.NUMERICAL) .validValueMin(0) .validValueMax(100) diff --git a/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java b/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java index af195b790..e99587fd2 100644 --- a/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java +++ b/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java @@ -295,7 +295,7 @@ private void assertTestTraitEquals(Trait trait) { assertEquals("Estimation", method.getMethodClass(), "wrong method class"); assertEquals("a^2 + b^2 = c^2", method.getFormula(), "wrong method formula"); Scale scale = trait.getScale(); - assertEquals("1-4 Parlier field response score", scale.getScaleName(), "wrong scale name"); + assertEquals("Ordinal", scale.getScaleName(), "wrong scale name"); assertEquals(DataType.ORDINAL, scale.getDataType(), "wrong scale dataType"); assertEquals(2, scale.getDecimalPlaces(), "wrong scale decimal places"); assertEquals(2, scale.getValidValueMin(), "wrong scale min value"); diff --git a/src/test/resources/files/data_mismatched_cases.csv b/src/test/resources/files/data_mismatched_cases.csv index 4e31b2eb0..c74ab1152 100644 --- a/src/test/resources/files/data_mismatched_cases.csv +++ b/src/test/resources/files/data_mismatched_cases.csv @@ -1,2 +1,2 @@ name,synoNyms,deScription,Trait entity,Trait attribute,StaTus,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,ScALe Upper limit,Scale CAtegories,Tags,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,,Germplasm PASSPORT \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,,Germplasm PASSPORT \ No newline at end of file diff --git a/src/test/resources/files/data_multiple_rows.csv b/src/test/resources/files/data_multiple_rows.csv index 636c6e376..7812d6a3b 100644 --- a/src/test/resources/files/data_multiple_rows.csv +++ b/src/test/resources/files/data_multiple_rows.csv @@ -1,4 +1,4 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -PM_leaf,Powdery Mildew Leaf; Powdery Mildew Severity Leaf,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew deverity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,,,,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity Leaf,Germplasm Attribute -PM_bud,Powdery Mildew Bud; Powdery Mildew Severity Bud,"Powdery mildew (PM) due to Erysiphe necator severity in field, bud only ",bud,powdery mildew deverity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, bud",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,,,,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity Bud, -PM_stem,Powdery Mildew Stem; Powdery Mildew Severity Stem,"Powdery mildew (PM) due to Erysiphe necator severity in field, stem only ",stem,powdery mildew deverity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, stem",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,,,,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity Stem,phenotype \ No newline at end of file +PM_leaf,Powdery Mildew Leaf; Powdery Mildew Severity Leaf,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew deverity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,,,,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity Leaf,Germplasm Attribute +PM_bud,Powdery Mildew Bud; Powdery Mildew Severity Bud,"Powdery mildew (PM) due to Erysiphe necator severity in field, bud only ",bud,powdery mildew deverity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, bud",Estimation,a^2 + b^2 = c^2,,Ordinal,,,,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity Bud, +PM_stem,Powdery Mildew Stem; Powdery Mildew Severity Stem,"Powdery mildew (PM) due to Erysiphe necator severity in field, stem only ",stem,powdery mildew deverity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, stem",Estimation,a^2 + b^2 = c^2,,Ordinal,,,,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity Stem,phenotype \ No newline at end of file diff --git a/src/test/resources/files/data_multiple_rows.xls b/src/test/resources/files/data_multiple_rows.xls index 33e6590117d89e774572d4d5174c459aa5ed0880..be871c7da37f37cf8db549843be4c7f1bccc8809 100644 GIT binary patch delta 707 zcmZXS&ubGw6vyA2*`}LKP12V2SKRc6_D5=Kk;ESXY0-lLw;KYbc$Bt^J+z7#5j_Q@ z;4e^k7teywi%{9(kH0|BgW#p0(z`cLwmnGwPT7tJ4{v5ZGjHE#c4k^D+*;w)MW?+n zH~RR&m2Yy}S>{)=?dLk8UYVYd;^MI%_%UcB5pRO80X*MYOcIR5@Fg^WJ4?czJo@UEnSG zj+UgD3I1yf8aAw;XNuP{_lNnpj8|sbSDi_y$KofI9gbh0{-pfQF`{S4j!qDL)O$}V{z{t1rdC-1Kois_kmQ0=F37LbOpaYf|bkLFl9kQfBhvm!E8S7Vx z-;a8HRw-Od207;66m?+aOB4mQy?rP$`{+yR;dqcyuw=|fEE#iP$(W1sCi-XAiFq?I zYirhtdAuG}_sn|N+;8id6Bq@pBlkBpa*jOyN*gqxy67!lNJ^ILgIPvRb4N_5o{2xy MYb?L&)t3$DFW63fM*si- delta 873 zcmZ{j&ubGw6vw|ayG_$gY~pHTG$yXCtxYv8mEaGQE%acZNot`KdQ{R41cK3B@gRld zB1lCL#)D^1ISN|@4_eQHCj}89NdJo-G`>l8$BMYao7wNYH}8FRX13F1oi2Ob)JJcB z+57a+_$EC4G3$u~z0W@Q2P0+9;}LN)I>(-i`_atxO#ny8w#kl>Jt5;{$@4&t#xz;A zQFB{ftNy^cRj)T{j(h|=6SVOFNwF?yrD z7{oHfNu`uZk~*Q(Q7qxCQZnnsK*=+)2d5$VIPuvyseGK&DWx=08Krd5trSWj7awvd z?-<3(b020kNF7%yMk?gy#BC!b($#D!<^0X9x6B?+@iNkVy_WF3u~jWc4q zdZit5X@7BPILxKdnm=3`4s&TkF3S9#-ZZ+)_Mjz#N=Z^7uQuSFQWUhmIncepS6Uj^ lfg3Q`5A4I{Cf-EoClHm@nQjABZ zN!Gp}Q%Uno7dWj1EG8}N)aUS{L#7FG`P27f#y2C+S!d*n>(SO%cUx4%(I!*B~`)06Y$D_ zIP=m1vsHcy472tE03 z;*)4jd2aAfrcKqkc@u5L8)ZUO7DF$+X^v$NxZfdwTDQ@KlKsv59$6MUSiT`uM`vDc zB@SB+tB7f&;0@mMk)Rs?f+lR23RFCzW4_uM8v@;pOLsM3}FvrZnHFRc{O(%stz@TL-^SngM=U2jShF$dAUfkO~OnQU~DD8sL>2NGVTdlO7eZhSp7p2<_Qj1CKM6H^5 zD7(##c87=fv7NL-Z-h^9r{(MRdM>0OFVHz((xFgS?BVU4Br||YAewF5x3W`&Dwk0R_3IG6HT>$}DN)RnA0W_NxLk0kFQvm>s0Bp4YGwOp` zpZAOeT?@;G@(psCCnHe5TnY_Op^fwvl4xWe7jT#~$*+_jHTn_Q%^ZsW?D+G|n>o#xZxAwC7vd?`pL* zPQylW@k*(VnFG~yJHt5ql(Z}nMc36D#N13O?w#XEqh>lrw$wJzA+#{8l|u1@DYy5m zE{{&0IV-@ENk!OA45^wa9m1&dCRVbnvw^654B`_J$gf&tmS&mu#;oyEiX~{COus1U zeN@1m2k4$3-_mhX7k}jkt|<^ zYITlj3eC-OmFlR2{mZpmD_rOsHq)Q`{89?jUPGF@g${M`c7!)Pp0`G+BuiJbPtO{_ z-zChPpe*2l*|2`RNE<4~=z=S2t z4mDX{tUQ`)6S{NUz7IC~z!)-7rB3OSyCuZd=C%uDx5PNa0u@j?M=mlU-ZZJxMXT{c z!A{}dL+ewfPMM`#aNBHO!O9;#q*P6|hjj7I;XHP&ecq#qSnm>_RZG!&vBaND>>F-V z@5CoZiS7oC(u6WaH}-eNWy$Xodi<_NE*6xY=nQ;{BtMM}Od>}5n#q}u$ts?h`BH>$ zhY5z3xIYm0bBq8kjJBqOm}GNfgK==n)s zFIURyA&q@fV5X}^#x45(1L!I#`SO^vuU@TC795|-x8BT=H)Q!WS7Vhki)8aByd&a2 zO6De(dto^x1YrUhfV-&BQ2K;_}k!iAgc1cjushd#jNus<_H#jo*lAnf5KUj}$ zyFYf^=N0ZD9qN}0a>L0Er9M2y6vmKpG|vZ3u?OYlKD{+7xH+9Lx_5G7@eWLq3%0u< zB}h5dSHqy=q$>)dYNK@>5pmeR8IIl>j%)difMc2DWFS|MXS^DVmZ_J!y)SEpK+ zvPNgK7bTRFCn9Ab#ib6mUVQeq;xK_ZOUXE7|1niB-SfKT>W=4Z5l&*C*l5+Se9iwf zCI+F*quTr3;qQ^Q$9K-=arL~}bDzJ-i+>sX##dQp< z=W*%;h4a70Zt-T0;qI z7$Zd|sqgD17`q|fqM%-xn!FFZ83A;7PA8P)0BrbfMF3!F*l-l8H}AIF1XSCeu|5eQ zqq{uMqn~ApK@#gQ&$9>=c&MKRG@g zzq%;6dvz|9_>{DVE3^L|hl1~ASO7kCk(My#mi~m-b?QDYl1r59A?(v+H_OB-lAnlp zOb{rQO!#fAae4QxurKagVw3MXdK|>C7rygK9Pi3?jDw$*#a>F~Jv9v&Nj`WrB>!2b zoI`LI0l3v@tRiG~4K~gw2zOE0l%#x!iRspk5=ApOQQ*K8=$axh%1Dk-2cg*!<-c$o zfq%r;DnHxd(7|vBs!|t{3!xcGYc>edMvB0?U$h+aTLSB9yBlnk5d170=??dqzQk$D0P zI`NZ=^S%ZEWY_+<&36qoVh}CC_)LDETYKITJVeE~ zqIgSM?C@F|e(8+ixG|(j=(TnsQ=@1#-DMrUAscd&8I3KOaj}%+z#J`;0{$mx6-wWJ+ z!20NG+u=O!3V@B|pZr&Uwil3L|Nrjr>n(oc9=1wA75sx100{9E_YVm5boR%h1sFMg z$2mO!0QtTBx2UJb?$NVhwFQOArkJt3EKJyVLE&o_Sc0Gm*#ZytNRW^HxADK~%CGx> Pp&BbK1ify~|M%#>Tx6*S delta 3088 zcmY*bcRbXO8^7aRl+D?NID2PZ`_(_azQ6Y$@8|t`UeEK_GhXj1Q>tk#jDf-EL69daEeN!PKgR$EIJD@c%13R< z=?^S#)}&@Rw=U$cmG#hh}RyE*GDS$ub&~73m_2VuGyzM-b0wsl4^&8aTU*gS}&sEKEGJcon34; zH}0Dx4-LZTUq;7AJF0IV?1<7kc=JF=Mc46$d_=;SYqYwgB6B)5m5p5d7H10lbb*>_Ub zE^IBDp8<2~IW zHlOMTD6){$@WPbK8JU<%s&LHCKr$c;*>bp)YUgot(K}K<7I)AxCnOg$#^&7RY4GTc z5KYa}z0{ABaql%VQ}T`UGL0+K-d;~H#c-Nk#Cab06$!n-t})Oy<~BX~#^>RP9eG6G zu2wBz=jwtQ(AUF0iCLGj?btC;zR*oDp|48xv`it$#6+1UGDa_~^SD^JYxV+KrXgVt z*(c0Bkoj3F-a;QY3&iy4>c@S)bj-Io2h;~dD-KyXaZ7WhMG~&s?&f^=q{ruUXX>Md zYf-km9M5avy!GkawkY z3A*=%BKyO&qDNnjc5pVZ-_8<kAtkr|qk?>Qv zxXqWpQy$8o6}yG=#ZLM0Asbavr%R5?hkrYV{tRl|_^_wpJZ#tC84er__HWQ9T}kK` z7-f37bIdYuzvLTfM#wgptN(ic0?^qNY;8)Z!cJRjSGFZn0g4YP=FG z3z3x!y{w-}9#6S2!}-eN zB&^$5AT4dWj2@fZ5r9BCSj`EPCKTqX+SbF`eR1a}OmF>sU{);n@w>dMgiWy# zvMdKGFex}Lwy?c8FV5`2(-q?v6FZ`L40qnV{_tZ6qKbMtf_fwvK&89&f)=O3J&O!6 zmyoOC_>5?-2>e=d!v&-YM5o@V_eLgoY2O>!^_`>@j+TEJ^phiqI|ZZ zc~^YZ+C*;cr~-z&*u}mS=RN-3zVv~!Ird)z?TTNoZoZ1ZQQ=qY+gpH@;M;z=wd+!& zmE|L+nyp|GFYWga4;Q`e8Be6c*I^vV)=)kk9gF)#R!;W_tg!vl{6J=gv;pMcD?0;G zJ+`umvnDIpKa?fHNOLOioVZch(v8YxE4%jS%^90WIIyd)EAn(5y*9UeoRl*0w$=t7 zzBTP#Ac4b7q!rYP6V;(V91n=ofOBYF{iaiZms~*7{$2|2>Bv*@iaS5d8AhT!MPG(s zg=-f-t+(d%{Zt>WQ|{(XdtdO}0Ln3RoDicKB02`XZQE5Rsb9OCZgR?*@Y2|xRT@e^ z239Ki0ekQ&ZgeX&A?2?7Pl=camvs);7djbLhpp!rRhcYK-jN7kr#?D&`hk*=P%F;&P zHsov46_U!YH*0A#tj%0HH@X4%b{6aoW)fPsB1?m+*3E7f_9-J;!?shL*wF*Bz`WNZEVx_F!ZFI?wgjq`_QdVR+Z~JW$Rtuz(H?b@&T_I zKHWPKn|D^1O>2wov+vXBdg zry@*fZd)lG{z39hp4AzgUa9_3`2x94e76}<+;zHHMDgL(KJq-jGxt@?K|=# z&AtZp9f@C_ODT=rF}=$lbV%^6sPn$rtiWyIr@nqo)qPrQB6Sq)6u8q)wwB^juLjmV(9 zJ!pF%+PXGxrnYg55|V-P9;yw@G*M<{#o*YKC()UO6#53=lW^9w3$7wt=)>!JP0Q0! z0qEhmOCLA_ny6?sM%Ct%%+}$;<@qtI3RP+5QW?nb%{xpknm2BoV2Q)>pQfq~-q6m{ zXy3g=61*(b<}1y#ALn&(^Ui!o8KHwvQ<))jj(N!l`>dc^A-G(sSJ?VuE!~l!*Cldo z*4^Jr5(@k84p@Ab25+kWU|6)Xe?2m@x#gh*g-b8HbKWea4?l`G;%x2ysm&HWm;l&`aLW zKgi3)4}VjflmFj)X9IzF{#E}KWB4O+9U3}r{51&;a11_1;wlZJFuqITJpaF$|8X>b R+WrG7o>o#68YlKQ^*`mzs}ukL diff --git a/src/test/resources/files/data_one_row.csv b/src/test/resources/files/data_one_row.csv index 53e09c795..39839d30b 100644 --- a/src/test/resources/files/data_one_row.csv +++ b/src/test/resources/files/data_one_row.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity,germplasm passport \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity,germplasm passport \ No newline at end of file diff --git a/src/test/resources/files/data_one_row.xls b/src/test/resources/files/data_one_row.xls index c08d525b4c1cdac4638abe67abacfcfcdcb7c7c9..8567ec081ea82fe4f4bc7fddadd22c8d644b1aef 100644 GIT binary patch delta 285 zcmZoTz}RqraYGIZJ43(Nc!9VCh=qZ;0f?D^SU{bDK@LO%v2S8YNk(e9f^TA8N@a4!NOM43qbB zXo@w+2Y_s0WCp4Ofq(xQ7Oue__VS;^9{&{|k&HHzmqeNIF@b%?2=o__CA|4Xlmz2s0~Ve|F)RQv5>Cwk diff --git a/src/test/resources/files/data_one_row.xlsx b/src/test/resources/files/data_one_row.xlsx index 57a616386e9553323540b3e385ccf40578156ec9..9514a98158fd7d74e68e9c95e4d8e692e54a8f58 100644 GIT binary patch delta 3634 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 E00j-fL;wH) delta 3721 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 diff --git a/src/test/resources/files/data_one_row_blank_active_value.csv b/src/test/resources/files/data_one_row_blank_active_value.csv index 5c6021a72..a5060e5c8 100644 --- a/src/test/resources/files/data_one_row_blank_active_value.csv +++ b/src/test/resources/files/data_one_row_blank_active_value.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Tags,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",Leaf,powdery mildew severity,,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",Leaf,powdery mildew severity,,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_blank_scale_class.csv b/src/test/resources/files/data_one_row_blank_scale_class.csv index 10274194b..b2b6c8064 100644 --- a/src/test/resources/files/data_one_row_blank_scale_class.csv +++ b/src/test/resources/files/data_one_row_blank_scale_class.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_computation.csv b/src/test/resources/files/data_one_row_computation.csv index 99d968aed..50eb06167 100644 --- a/src/test/resources/files/data_one_row_computation.csv +++ b/src/test/resources/files/data_one_row_computation.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Computation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Computation,a^2 + b^2 = c^2,test unit,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_empty_active_value.xls b/src/test/resources/files/data_one_row_empty_active_value.xls index a799cd957cf8c664f769b837f7d883d59d55064c..a77a8e470e1d9bf5f23a74642327864316048207 100644 GIT binary patch delta 239 zcmZoTz}RqraYGIZ`vN-~gXZ{KlZ#ne87EBs$?~6Z$L61`-b_q<%#+eNHl*;6c$;UY~IUC-+&>Dlb(97V YH_#c3V93qAIX`M5<75LCmPIiv0AaU0vH$=8 delta 264 zcmZoTz}RqraYGIZyTaG5tL0obCl|A{GESNNljT3-fz3Zzy_uMJ*e1JiXfaNhT*x79 z9l^lBzzf7RKr9Tz9YD+k!~*IJ401qP0*HMxlZ*0;^V3Qc{L|7hlT#H!i&Kjj7$)!M z&=h0P^#<9($P82m0{{LqFz~Q#X5&<1ln}+Cb+RE>#N-)V4y^y{zcBvae3$F3CS%Cv z(Olkp}U-=0$ZhjH=gNgSq0~Z4$12=;MgBsAbmyx!Dd_bp(FmN&2F$pnjV*|Q; ZvU!vSj}XvaMlci-+MFFVk#SKB3jn9=MDhRt diff --git a/src/test/resources/files/data_one_row_empty_formula_headers.xls b/src/test/resources/files/data_one_row_empty_formula_headers.xls index c52f828ad33b5f6785232e05311e56fe6e86f9e4..3def6652920d7b5c71798199d74a47f4f1921fa9 100644 GIT binary patch delta 37 tcmZoTz}RqraYGIZ`-WXQ63y|qHW#yOW#wdJV93qMHL)<>Y{+#!6aWYx4E_KB delta 33 pcmZoTz}RqraYGIZdqTTcq8Ing&BZKRSs6tquj3Hk?7(#(6adis3)TPt diff --git a/src/test/resources/files/data_one_row_empty_headers.csv b/src/test/resources/files/data_one_row_empty_headers.csv index 212c8db5d..2f1514357 100644 --- a/src/test/resources/files/data_one_row_empty_headers.csv +++ b/src/test/resources/files/data_one_row_empty_headers.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Tags,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_empty_headers.xls b/src/test/resources/files/data_one_row_empty_headers.xls index ec41889c20e0e7bf84019f3b25aebaae5a5bd493..f4b24f44a57d476a1b4ef1df8b32db4f79db590d 100644 GIT binary patch delta 277 zcmZoTz}RqraYGIZyTa#im*)6elZ#ne88=M+$?~6Z$L61`-b_q<%#+eNHl*;6c$;UY~IU8QbQ@CmRDpZceU=h4ExZuJFkLTmqA4a5=F4sQ<$FWAa@tCq{}nv5ZvPn&QkGC2ioe&r|3xcNmG7c(a#6B`2~12==i3mJtlOxi|Mm6*5jXU}0Gl!vX;1vO$sn delta 302 zcmZoTz}RqraYGIZdxEm$r*f{FlZ#ne8MjRS$?~7^z~-N<-b_q9Y?IwMv=}E$F65B5 zj$mM5;059uAQlGV4j^U%VgYpq200)t0mQzU$wm3a`DrBz{%L8M$*BsV#i>OM43qbB zXo@kUKK}@`g^?Mk4g~)FXJFuA+swwP#3&((L+fNiu87GqxExsj*MDLBKlv_~6Jz~k z1#Ve1vI;69&CJA5zj+(Ch$ds`=F=t|icD?+n_u|}Gj4tn#>LG0mw}6ck%61Rfk6%E urr(j?f_gv?h%iVn+A#?+Y-0oZWpa3w29F5Pb&OyrBC@$Vs*rI}3=0535KSil diff --git a/src/test/resources/files/data_one_row_invalid_active_value.csv b/src/test/resources/files/data_one_row_invalid_active_value.csv index eb181ba35..cc1ebd433 100644 --- a/src/test/resources/files/data_one_row_invalid_active_value.csv +++ b/src/test/resources/files/data_one_row_invalid_active_value.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powder mildew severity,blah,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powder mildew severity,blah,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_invalid_scale_class.csv b/src/test/resources/files/data_one_row_invalid_scale_class.csv index ba37dcf37..942743d9c 100644 --- a/src/test/resources/files/data_one_row_invalid_scale_class.csv +++ b/src/test/resources/files/data_one_row_invalid_scale_class.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,blah,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,blah,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_scale_categories_blank.csv b/src/test/resources/files/data_one_row_scale_categories_blank.csv index b4b0906a8..41c726109 100644 --- a/src/test/resources/files/data_one_row_scale_categories_blank.csv +++ b/src/test/resources/files/data_one_row_scale_categories_blank.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Tags,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,,, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,,, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_scale_decimal_blank.csv b/src/test/resources/files/data_one_row_scale_decimal_blank.csv index 585d81ba2..4fda9344b 100644 --- a/src/test/resources/files/data_one_row_scale_decimal_blank.csv +++ b/src/test/resources/files/data_one_row_scale_decimal_blank.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Tags,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_scale_decimal_invalid.csv b/src/test/resources/files/data_one_row_scale_decimal_invalid.csv index a7d774994..e504fb732 100644 --- a/src/test/resources/files/data_one_row_scale_decimal_invalid.csv +++ b/src/test/resources/files/data_one_row_scale_decimal_invalid.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2t,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2t,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file diff --git a/src/test/resources/files/data_one_row_trait_level_not_exist.csv b/src/test/resources/files/data_one_row_trait_level_not_exist.csv index edcbb3a3f..a8f8770a1 100644 --- a/src/test/resources/files/data_one_row_trait_level_not_exist.csv +++ b/src/test/resources/files/data_one_row_trait_level_not_exist.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",bud,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity,Phenotype \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",bud,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,Powdery Mildew Severity,Phenotype \ No newline at end of file diff --git a/src/test/resources/files/duplicatesInFile.csv b/src/test/resources/files/duplicatesInFile.csv index 55e7b9605..3f88503f3 100644 --- a/src/test/resources/files/duplicatesInFile.csv +++ b/src/test/resources/files/duplicatesInFile.csv @@ -1,3 +1,3 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,, -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,, +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinal,2,2,9999,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",,, \ No newline at end of file diff --git a/src/test/resources/files/missing_category_label_nominal.csv b/src/test/resources/files/missing_category_label_nominal.csv index 7998bf97b..5e67bb65a 100644 --- a/src/test/resources/files/missing_category_label_nominal.csv +++ b/src/test/resources/files/missing_category_label_nominal.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Nominal,2,2,9999,"No visible infection; Very few, small colonies; < 50% coverage; >50% coverage",,, \ No newline at end of file +PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,active,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Nominal,2,2,9999,"No visible infection; Very few, small colonies; < 50% coverage; >50% coverage",,, \ No newline at end of file diff --git a/src/test/resources/files/missing_scale_unit.xlsx b/src/test/resources/files/missing_scale_unit.xlsx index 466b531c0fffb90672eadc613e65e19ddc7799af..ae300d40d66464ffb896505fc9d9aec9f1ac0e08 100644 GIT binary patch delta 4212 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 z zyp|uMu%`wn^-#pb=y%4M*>-6fCAB0K4O`yC3wHY#`mb(ur7KG>f_Y+rhuonNr^Y)J zbwe;S3Y?r#WuPo62z2!_aMArQa|Hz6L%Rq3H*wWl+xZnL!J?eJFGzM(m!QuXA0`Q6 z@VeQ#9IqU_ojBl$^1ZsfYpD*yxCK`dDvT^3H!E!Bdo6z}V$~=7{6%HfzK)wVnK51w zi${h^QV$YEj@PB@T;1fU_aL%es7JxLA}ubK&I<*<$z*&y9nTRM{psP zT9Mh5nchjCN36nGlxSpb5c^n{#&T%KLD65-Q28gLhh-GK-ox)r7|d!xS#5#XVCf8- zxSQqCuZe7$L~Gj8M#t!Y@_pVlyGr)7tWVZqqS*%H31&AzL?(Asz;5=Pul)455eB{J z2sXl1m8y%OKUR(jFeQSTDaZBttjyT*-of`7;kCy*->Tvg zu)-rFdmamkUwjio^0@M(#wc}ZhFv0kcZ&}ESJv}m*rX?RG~(YIj9ov1x`~wS5p(DG zQP6Nx_C6GRKlW{@?LND(l%ByO7_v)MmU00fgC!#k6mSDO1eXqrDAnQYY=_uHuJD%? ztv@-h)}g~$BSe1aJie#3V|#Zf(1s4`iuy4!mSA3_Fs2u;5@ku2Z1r(n$-H}8I&cIA z`bx4TE1<$BRbOj-6-SwoYe-lYOfFWu1JBhp{S|i*oS9RSgd>@xs%`_XrM1q3_Qf>* zph!frn0q+`U!OW`?v3H%)4UBH`;}LiuP%VEQeZbA$a=3q; zmGgm`+fs{1tJJIy(#=DXO!t}1S^tl0>mG~9&Yg1Dqvb(+1AFsD*YjL?K5exFUW1B8 zHE*a1mmy>;>8vJm6FqSQjSD>=QlB7Up=G$WSe`tvSOPA;L7s{8S-#UK*S;KabM%&z zC9}P9l{a8C;>z}>iAo_WLM62HS<0?~Q}p8XiI>mz9ljpp>$RtI8r8}iW8U#&UHq{Mj*VhA3##r|+xX-B=*T8$VvysU$1m38^gFp)s^8tC`vWWLu`A|0;4%+nz0jg= zspMujad27#OvrhW@jIT8J>mFGkJNztYfAW~&W3b3Nu z>leJ)Vg8GI;(BY7hHiD%#ZH`bilknkRF*ugqsnW=MxhJiySEI+y*`dBwzGPryb+38 zj-pj3jucmUQZOZBloGU6Y1A(ysWT34vm`giU+oC8@7rs!1_ZfAV3m}G5ec6dU+jpI zQWbZ?yV-b`*d6NuXYQ-O34;Ez%OL9B^HqQWIVDaYj8~!#rvy*{DpIsS2sa;)#V1kM z$DIzQl6>vkW(x*^uytVqa4-&Q1Q8#1HUsU<}ESv`2U$9eqkQ1f8 zTDT0toenaojsWLEz zjCB-Wgt`U1Xm7X~TYEda^c7W(wo0u@OYsy(P~x@0>t0k!yl!#6HEB3=11!bwXZQpo zy%Alvy;tR&Z`tCgeNv|u;gmZm#Mr9g{HtN^Un?G}D^yL0Y^Du==1$(c&s128nSK7` zgjEuk;6zN3inMgix*TVi;Hf#k+HuN%r1*C{Jrh!71nhY^0W&2DpoF&@ zfNG9W{R7y*x~3fa-*|C}+m@HO4ZCdp|E?ffAeEK{kk?@Zj_4Tytdv8)v^X_ z1I!3Pq5nTS{(XRg{cn2z-y{K~bzqmC_zUa~q#(qAPUK&g81o4scKyAWL)-dC0s`e!Xppd*3p1a zD*zT!BESb7QOL3qkb-0Z=#X-dpDKTE_2sC6t4Ky50QnbWNA2No visible infection; 2->Very few, small colonies; 3->50% coverage; 4->50% coverage",, -PM_Bud,Powdery Mildew Bud: Powdery Mildew Severity Bud,"Powdery mildew (PM) due to Erysiphe necator severity in field, bud only ",bud,powdery mildew severity,FALSE,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, bud",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Txt,,,,"1=No visible infection: 2=Very few, small colonies: 3=< 50% coverage: 4=>50% coverage",, -PM_Stem,Powdery Mildew Stem. Powdery Mildew Severity Stem,"Powdery mildew (PM) due to Erysiphe necator severity in field, stem only ",stem,powdery mildew severity,actv,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, stem",Estimation,a^2 + b^2 = c^2,1-4 Parlier field response score,Nmber,Four,One,Ten,"No visible infection; Very few, small colonies; 50% coverage; 50% coverage",,NotATermType \ No newline at end of file +PM_Leaf,Powdery Mildew Leaf Powdery Mildew Severity Leaf,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powdery mildew severity,TRUE,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, leaf",Estimation,a^2 + b^2 = c^2,,Ordinl,,,,"1->No visible infection; 2->Very few, small colonies; 3->50% coverage; 4->50% coverage",, +PM_Bud,Powdery Mildew Bud: Powdery Mildew Severity Bud,"Powdery mildew (PM) due to Erysiphe necator severity in field, bud only ",bud,powdery mildew severity,FALSE,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, bud",Estimation,a^2 + b^2 = c^2,,Txt,,,,"1=No visible infection: 2=Very few, small colonies: 3=< 50% coverage: 4=>50% coverage",, +PM_Stem,Powdery Mildew Stem. Powdery Mildew Severity Stem,"Powdery mildew (PM) due to Erysiphe necator severity in field, stem only ",stem,powdery mildew severity,actv,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation ","Powdery Mildew severity, stem",Estimation,a^2 + b^2 = c^2,,Nmber,Four,One,Ten,"No visible infection; Very few, small colonies; 50% coverage; 50% coverage",,NotATermType \ No newline at end of file diff --git a/src/test/resources/files/ontology/data_nominal_missing_categories.xlsx b/src/test/resources/files/ontology/data_nominal_missing_categories.xlsx index dee1c7dc24bb97f237e89a1548a9dd5c275a5571..52de1dd023f909a06257693ce7e75bb7276c5f02 100644 GIT binary patch delta 4464 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 diff --git a/src/test/resources/files/parsing_exceptions.csv b/src/test/resources/files/parsing_exceptions.csv index 83f273e30..6590cc858 100644 --- a/src/test/resources/files/parsing_exceptions.csv +++ b/src/test/resources/files/parsing_exceptions.csv @@ -1,2 +1,2 @@ Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Tags,Full Name,Term Type -,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powder mildew severity,inactive,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",bad,a^2 + b^2 = c^2,1-4 Parlier field response score,paragraph,two,one,nine-nine-nine-nine,"1=No visible infection... 2=Very few, small colonies... 3=< 50% coverage... 4=>50% coverage",,, +,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",leaf,powder mildew severity,inactive,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation","Powdery Mildew severity, leaf",bad,a^2 + b^2 = c^2,,paragraph,two,one,nine-nine-nine-nine,"1=No visible infection... 2=Very few, small colonies... 3=< 50% coverage... 4=>50% coverage",,, \ No newline at end of file From a4a8091c9a76815debec2fe00fcbf3372a45f627 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Fri, 16 Feb 2024 11:49:11 -0500 Subject: [PATCH 4/4] [BI-2053] - added test --- .../parsers/ParsingExceptionType.java | 2 +- .../TraitUploadControllerIntegrationTest.java | 21 ++++++++++++++++++ .../ontology/non_numerical_with_unit.xlsx | Bin 0 -> 17673 bytes 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/files/ontology/non_numerical_with_unit.xlsx diff --git a/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java b/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java index 4ae0d0c1d..56ce72e69 100644 --- a/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java +++ b/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java @@ -37,7 +37,7 @@ public enum ParsingExceptionType { INVALID_SCALE_UPPER_LIMIT("Invalid scale upper limit value. Value must be numeric and be a whole number."), INVALID_SCALE_CATEGORIES("Invalid scale categories format"), INVALID_TERM_TYPE("Invalid term type"), - SCALE_UNIT_NOT_ALLOWED("Units identified for non-numeric scale class."); + SCALE_UNIT_NOT_ALLOWED("Units identified for non-numeric scale class"); private String value; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java index f52cd917a..01a478bdf 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -811,6 +811,27 @@ void putNominalCategoryLabelPresentError() { assertEquals("Scale label cannot be populated for Nominal scale type", labelError.get("errorMessage").getAsString()); } + @Test + void putNonNumericalClassWithUnitError() { + + File file = new File("src/test/resources/files/ontology/non_numerical_with_unit.xlsx"); + + HttpClientResponseException e = Assertions.assertThrows(HttpClientResponseException.class, () -> { + HttpResponse response = uploadFile(validProgram.getId().toString(), file, "test-registered-user"); + }); + assertEquals(HttpStatus.UNPROCESSABLE_ENTITY, e.getStatus()); + + JsonArray rowErrors = JsonParser.parseString((String) e.getResponse().getBody().get()).getAsJsonObject().getAsJsonArray("rowErrors"); + assertTrue(rowErrors.size() == 1, "Wrong number of row errors returned"); + + JsonObject rowError1 = rowErrors.get(0).getAsJsonObject(); + JsonArray errors = rowError1.getAsJsonArray("errors"); + assertTrue(errors.size() == 1, "Not enough errors were returned"); + JsonObject error = errors.get(0).getAsJsonObject(); + assertEquals(422, error.get("httpStatusCode").getAsInt(), "Incorrect http status code"); + assertEquals("Units identified for non-numeric scale class", error.get("errorMessage").getAsString(), "Incorrect http status code"); + } + @Test void putOrdinalMissingCategories() { diff --git a/src/test/resources/files/ontology/non_numerical_with_unit.xlsx b/src/test/resources/files/ontology/non_numerical_with_unit.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f038a57aadd21b5308a775694166a730adeeb8eb GIT binary patch literal 17673 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 G)&B$cO^I#* literal 0 HcmV?d00001