From ae87f246edc2155c1631d90a5ae7c6e597362dc4 Mon Sep 17 00:00:00 2001 From: hms243 Date: Fri, 2 Dec 2022 13:42:16 -0500 Subject: [PATCH 01/11] [BI-1615] - Add termType to Trait DB Table --- .../java/org/breedinginsight/model/Trait.java | 2 ++ .../services/TraitService.java | 2 ++ .../response/mappers/TraitQueryMapper.java | 3 ++- .../migration/V1.0.10__add_onto_term_type.sql | 25 +++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/db/migration/V1.0.10__add_onto_term_type.sql diff --git a/src/main/java/org/breedinginsight/model/Trait.java b/src/main/java/org/breedinginsight/model/Trait.java index 7ad7cc9e1..04611a5df 100644 --- a/src/main/java/org/breedinginsight/model/Trait.java +++ b/src/main/java/org/breedinginsight/model/Trait.java @@ -91,6 +91,7 @@ public Trait(TraitEntity traitEntity) { this.setUpdatedAt(traitEntity.getUpdatedAt()); this.setUpdatedBy(traitEntity.getUpdatedBy()); this.setActive(traitEntity.getActive()); + this.setTermType(traitEntity.getTermType()); } public static Trait parseSqlRecord(Record record) { @@ -106,6 +107,7 @@ public static Trait parseSqlRecord(Record record) { .updatedAt(record.getValue(TRAIT.UPDATED_AT)) .updatedBy(record.getValue(TRAIT.UPDATED_BY)) .active(record.getValue(TRAIT.ACTIVE)) + .termType(record.getValue(TRAIT.TERM_TYPE)) .build(); } diff --git a/src/main/java/org/breedinginsight/services/TraitService.java b/src/main/java/org/breedinginsight/services/TraitService.java index f2b2953aa..ee6ea3347 100644 --- a/src/main/java/org/breedinginsight/services/TraitService.java +++ b/src/main/java/org/breedinginsight/services/TraitService.java @@ -217,6 +217,7 @@ public List createTraits(UUID programId, List traits, Authenticate .createdBy(actingUser.getId()) .updatedBy(actingUser.getId()) .active(true) + .termType(trait.getTermType()) .build(); traitDAO.insert(jooqTrait); trait.setId(jooqTrait.getId()); @@ -416,6 +417,7 @@ public List updateTraits(UUID programId, List traits, Authenticate existingTraitEntity.setObservationVariableName(updatedTrait.getObservationVariableName()); existingTraitEntity.setProgramObservationLevelId(updatedTrait.getProgramObservationLevel().getId()); existingTraitEntity.setUpdatedBy(user.getId()); + existingTraitEntity.setTermType(updatedTrait.getTermType()); traitDAO.update(existingTraitEntity); // Update in brapi diff --git a/src/main/java/org/breedinginsight/utilities/response/mappers/TraitQueryMapper.java b/src/main/java/org/breedinginsight/utilities/response/mappers/TraitQueryMapper.java index 3afac5e67..ac8cccc22 100644 --- a/src/main/java/org/breedinginsight/utilities/response/mappers/TraitQueryMapper.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/TraitQueryMapper.java @@ -73,7 +73,8 @@ public TraitQueryMapper() { Map.entry("updatedByUserId", trait -> trait.getUpdatedByUser() != null ? trait.getUpdatedByUser().getId() : null), Map.entry("updatedByUserName", - trait -> trait.getUpdatedByUser() != null ? trait.getUpdatedByUser().getName() : null) + trait -> trait.getUpdatedByUser() != null ? trait.getUpdatedByUser().getName() : null), + Map.entry("termType", Trait::getTermType) ); } diff --git a/src/main/resources/db/migration/V1.0.10__add_onto_term_type.sql b/src/main/resources/db/migration/V1.0.10__add_onto_term_type.sql new file mode 100644 index 000000000..872df67e7 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.10__add_onto_term_type.sql @@ -0,0 +1,25 @@ +/* + * 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. + */ + +CREATE TYPE "term_type" AS ENUM ( + 'PHENOTYPE', + 'GERM_ATTRIBUTE', + 'GERM_PASSPORT' +); + +ALTER TABLE trait ADD COLUMN term_type term_type NOT NULL DEFAULT 'PHENOTYPE'; +UPDATE trait SET term_type='PHENOTYPE'; \ No newline at end of file From d965287a7c727808544e7c7e5903095dcb69146f Mon Sep 17 00:00:00 2001 From: hms243 Date: Wed, 7 Dec 2022 14:41:31 -0500 Subject: [PATCH 02/11] [BI-1613] - Add Term Type to Ontology Term Import --- .../model/imports/TermTypeTranslator.java | 49 +++++++++++++++++++ .../parsers/ParsingExceptionType.java | 3 +- .../parsers/trait/TraitFileColumns.java | 4 +- .../parsers/trait/TraitFileParser.java | 18 +++++++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java new file mode 100644 index 000000000..02336a39c --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java @@ -0,0 +1,49 @@ +/* + * 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. + */ + +package org.breedinginsight.brapps.importer.model.imports; + +import lombok.Getter; + +/** + Defines Ontology Term Type backend and user readable values for easy translation + */ +@Getter +public enum TermTypeTranslator { + PHENOTYPE("PHENOTYPE", "Phenotype"), + + GERM_ATTRIBUTE("GERM_ATTRIBUTE", "Germplasm Attribute"), + + GERM_PASSPORT("GERM_PASSPORT", "Germplasm Passport"); + + public String name; + public String userDisplay; + + TermTypeTranslator(String name, String userDisplay) { + this.name = name; + this.userDisplay = userDisplay; + } + + public static String nameFromUserDisplay(String userDisplay){ + for (TermTypeTranslator term: values()){ + if (term.userDisplay.equals(userDisplay)){ + return term.name(); + } + } + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java b/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java index 96a84e294..d7d33ae03 100644 --- a/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java +++ b/src/main/java/org/breedinginsight/services/parsers/ParsingExceptionType.java @@ -32,7 +32,8 @@ public enum ParsingExceptionType { INVALID_SCALE_DECIMAL_PLACES("Invalid scale decimal places value"), 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_SCALE_CATEGORIES("Invalid scale categories format"), + INVALID_TERM_TYPE("Invalid term type"); private String value; 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 e7c2b51a7..a9d7d1e45 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,9 @@ public enum TraitFileColumns { SCALE_UPPER_LIMIT("Scale upper limit"), SCALE_CATEGORIES("Scale categories"), TAGS("Tags"), - FULL_NAME("Full name"); + FULL_NAME("Full name"), + TERM_TYPE("Term Type"); + 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 76d8c0e97..81da7514f 100644 --- a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java @@ -22,12 +22,15 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVRecord; +import org.apache.commons.text.WordUtils; import org.apache.poi.EncryptedDocumentException; import org.apache.poi.ss.usermodel.*; import org.brapi.v2.model.pheno.BrAPIScaleValidValuesCategories; import org.breedinginsight.api.model.v1.response.ValidationError; import org.breedinginsight.api.model.v1.response.ValidationErrors; +import org.breedinginsight.brapps.importer.model.imports.TermTypeTranslator; import org.breedinginsight.dao.db.enums.DataType; +import org.breedinginsight.dao.db.enums.TermType; import org.breedinginsight.model.*; import org.breedinginsight.services.exceptions.UnprocessableEntityException; import org.breedinginsight.services.exceptions.ValidatorException; @@ -250,6 +253,20 @@ private List excelRecordsToTraits(List records) throws Valid String tagsString = parseExcelValueAsString(record, TraitFileColumns.TAGS); List traitTags = parseListValue(tagsString); + //Set to backend value for user input term type, if none, set to default + TermType termType = TermType.PHENOTYPE; + try { + String termTypeVal = parseExcelValueAsString(record, TraitFileColumns.TERM_TYPE); + if ((!Objects.isNull(termTypeVal)) && (!termTypeVal.isBlank())) { + String termTypeName = TermTypeTranslator.nameFromUserDisplay(WordUtils.capitalizeFully(termTypeVal)); + termType = TermType.valueOf(termTypeName); + } + } catch (IllegalArgumentException e) { + ValidationError error = new ValidationError(TraitFileColumns.TERM_TYPE.toString(), + ParsingExceptionType.INVALID_TERM_TYPE.toString(), HttpStatus.UNPROCESSABLE_ENTITY); + validationErrors.addError(traitValidatorError.getRowNumber(i), error); + } + Trait trait = Trait.builder() .observationVariableName(parseExcelValueAsString(record, TraitFileColumns.NAME)) .traitDescription(parseExcelValueAsString(record, TraitFileColumns.DESCRIPTION)) @@ -263,6 +280,7 @@ private List excelRecordsToTraits(List records) throws Valid .method(method) .scale(scale) .tags(traitTags) + .termType(termType) .build(); traits.add(trait); From 5c3dbfda469be788fed8607e63bfad91414bd255 Mon Sep 17 00:00:00 2001 From: hms243 Date: Wed, 7 Dec 2022 15:18:50 -0500 Subject: [PATCH 03/11] [BI-1613] - Updating test files --- src/test/resources/files/columns_no_data.csv | 2 +- .../files/data_duplicate_headers.csv | 4 ++-- .../files/data_duplicate_method_name.csv | 4 ++-- .../resources/files/data_min_max_swap.csv | 4 ++-- .../resources/files/data_mismatched_cases.csv | 4 ++-- .../resources/files/data_multiple_rows.csv | 8 ++++---- .../resources/files/data_multiple_rows.xls | Bin 21504 -> 21504 bytes .../resources/files/data_multiple_rows.xlsx | Bin 10608 -> 10589 bytes src/test/resources/files/data_one_row.csv | 4 ++-- src/test/resources/files/data_one_row.xls | Bin 24576 -> 24576 bytes src/test/resources/files/data_one_row.xlsx | Bin 12666 -> 12644 bytes .../files/data_one_row_blank_active_value.csv | 4 ++-- .../files/data_one_row_blank_scale_class.csv | 4 ++-- .../files/data_one_row_computation.csv | 4 ++-- .../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 | 4 ++-- .../files/data_one_row_empty_headers.xls | Bin 24576 -> 24576 bytes .../data_one_row_invalid_active_value.csv | 4 ++-- .../data_one_row_invalid_scale_class.csv | 4 ++-- .../data_one_row_scale_categories_blank.csv | 4 ++-- .../data_one_row_scale_decimal_blank.csv | 4 ++-- .../data_one_row_scale_decimal_invalid.csv | 4 ++-- .../data_one_row_trait_level_not_exist.csv | 4 ++-- src/test/resources/files/duplicatesInFile.csv | 6 +++--- .../resources/files/empty_then_2_rows.xlsx | Bin 12792 -> 12765 bytes .../data_category_label_nominal_trait.xls | Bin 31744 -> 31744 bytes .../data_nominal_missing_categories.xlsx | Bin 17635 -> 18004 bytes .../data_ordinal_missing_categories.xlsx | Bin 17876 -> 18024 bytes 29 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/test/resources/files/columns_no_data.csv b/src/test/resources/files/columns_no_data.csv index 279144ebc..64504fa6f 100644 --- a/src/test/resources/files/columns_no_data.csv +++ b/src/test/resources/files/columns_no_data.csv @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/test/resources/files/data_duplicate_headers.csv b/src/test/resources/files/data_duplicate_headers.csv index 603f62657..a323c0a3c 100644 --- a/src/test/resources/files/data_duplicate_headers.csv +++ b/src/test/resources/files/data_duplicate_headers.csv @@ -1,2 +1,2 @@ -Name,ONTOLOgY TErM NaME,Trait Abbreviations,trAit synoNyms,trait 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 -PM_Leaf,Powdery Mildew; Powdery Mildew Severity,"Powdery mildew (PM) due to Erysiphe necator severity in field, leaves only ",Plant,active,mildew,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation",Observed severity of Powdery Mildew on leaves,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 +Name,ONTOLOgY TErM NaME,Trait Abbreviations,trAit synoNyms,trait 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 ",Plant,active,mildew,Nursery evaluation; Greenhouse evaluation; Trial evaluation,"Powdery Mildew severity, leaves - Estimation",Observed severity of Powdery Mildew on leaves,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 diff --git a/src/test/resources/files/data_duplicate_method_name.csv b/src/test/resources/files/data_duplicate_method_name.csv index a4305fcef..0eee208d4 100644 --- a/src/test/resources/files/data_duplicate_method_name.csv +++ b/src/test/resources/files/data_duplicate_method_name.csv @@ -1,2 +1,2 @@ -Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name -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 ",blah,"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 +Name,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method name,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 ",blah,"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 diff --git a/src/test/resources/files/data_min_max_swap.csv b/src/test/resources/files/data_min_max_swap.csv index 27e131da9..5237d1131 100644 --- a/src/test/resources/files/data_min_max_swap.csv +++ b/src/test/resources/files/data_min_max_swap.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 -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,2.11,"1=No visible infection; 2=Very few, small colonies; 3=< 50% coverage; 4=>50% coverage",, \ No newline at end of file +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,9999,2.11,"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_mismatched_cases.csv b/src/test/resources/files/data_mismatched_cases.csv index d86051cd1..dda2ad1a5 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 -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 +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",,, \ 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 67faea02b..636c6e376 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 -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 -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 \ No newline at end of file +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 diff --git a/src/test/resources/files/data_multiple_rows.xls b/src/test/resources/files/data_multiple_rows.xls index 36f6ccf2184f651092a35341b8cc96f40d7fb3ac..33e6590117d89e774572d4d5174c459aa5ed0880 100644 GIT binary patch delta 388 zcmZoz!Pu~ZaYGIZd%~6dXUn*5PA+C?WxTifCyO^TBhO@4j@6R8f$TnwMV! zRIypxvW`#E!k&R4$Ay7`mw}0ak%0$DrZDh>*qaZz=P-E!jbY$m5&*kdn1O{6%wXgP zi-9=kVoX@XKwcK!T<*oq$j-nZ1Tgzy< y@USp2*f4N0K45snV8%wXgPi-9=kVnB@yLX#(Y2{Q_9Uh2ioIC-DQ42{CMA11g`~>ZiuXz`zP*LX2l+-MrJ!opJI9zlcQvEC3}mLht|p diff --git a/src/test/resources/files/data_multiple_rows.xlsx b/src/test/resources/files/data_multiple_rows.xlsx index 5148ab480275dba0f5f1fffaec3210a6ae8d6f80..c1de09872010294918b566e37be46a33cca9345d 100644 GIT binary patch delta 3738 zcmY*cWmMD;)7^z-35iu$8d-#;Tb2+dC6?}vMY?5CLFz}h)FPdN3P`D>gs?PH(gF*D zAP9^v2>R7NQf|-@peO7hZ=}7SnDMnyKN)vN>a&vF?eEZZi zSg29kkmejYm=MQqCz+dgprAZw?k}T~BHf_lE~;Hr!ZEkyb$Gt`O}#4aX(k;lDD#$b zu7qjwYZn%=3WapISofPOpsEC#wS9d@%P(&`+2445{!crM$t1HvEq+Erd_72nxme4L zsa;AWeoYRgWbgWHlEbQ7fyCV4w}H7RPK^vElz!!{r&79ceW0JcmYTU-O9wL4_0?x4 zd~u-o5h1_p!C{q(II__upFX@_ddm;2opfd-vx%6ICa=SMn>_<>Y2uvZ#8dAT$^OnX}Q@ zs#m|P)-lNYzhT!o*4s_=hUXf_M&T5#QE^cYvWKTc9ty_-wpuNZqq|wq2Q7bgUgde# z^W{QfowyO>)KfbnoLu8DeRLg4HubH_sWP3IkzTge#p;M#`!&%T z$ZVnmX|3vXLpA&h>tc@knO56ji@}9zN9LzAOg#ESTL-|&SyH#ASE^mc-eRudsBd>?~Gbv=nhJSaN`gs}rr_ZRYGukJ&aZ_1Y8 zbI?}#USi}|3QIs(!0AM-xiBWsPh^sbRe$*c`{T@K%WHhrVe!ZZva-drI{*A_2i#du z=CcYzxN(~g%UuOwnJ4>Z<-FPkE!vbwW40y+6F74rFOy}Ast+@ z-jrjj*dKd9EF!G0{##2|LvG=l$_ybplL?fZRKQ|teg(HiA5p|3J%jfZAu9PR^)_CQ zSmOF5#52reY9#pg<~3r<_AMr%zD4MK2n6P49?lmvLC0sf)pn6{Xrtm1`lp@gkZ|m! zkUDr@vXFXnyyO&$g07>rRoKXiUtHa5mIzfZ34GqByLBX-knBBIWjx2fH-Qe@|OEn8&&UQcS`ux(v6q-ogal9$7aU$8CjSA0Hw~G*mWK zSe~FwN|VN>ntj#BuHLVGgl<3xj<3x-UlER$mqvOJN0LPV$iBUNs;#@>x=(~=OyX(B zGD0+Z`l?gEr`EG>1WDb7Z|cfi?38k5N`a0>re1YguWov|2ZQmgM9)+IV#FKlHYI6u zPTPwgtnLojiDwjenOb&R7iaW{rUv#!^p2oS4^d0%=0L6iMNNXIc}lKubfi%Nb=2Ap zv$L6-@{kH(6dY=wbxAu2SzWSVDZ1}!CbvLU`+V4sjMkE2M0SLy>I}w^xUpPb%TTFcSqUOXBM`h38?P z1et3D-6ng*^X`;yK##w+h#a_74Qh&#jxGg$ur&_{v`gD7P&cE6k}8<`(@q%vTVcCz8MTAWd;|JXjYd~Lrkd#K9EOEq#>^wpmfs(y{F0_P15a{F&D#n9Wt`=89aMk*CW>ZP!lhDW6kr%J&w3=Jl9Q$J1zcAu2S@$0FR zYi5h<&n=it;8j;&8Wd5P$s;_DTz1S~vK`en`Xl^{%nE#fhG+Qf$*2Mv{+CWFw@;)m z&FnGFC?k1G%|8at%+P*&{7|$?ic9L8{Bfjb$r45{U*nUTQ>H42o|E`09O`M^4?xdx7 zz8#-(`rUnxTb9dwYLaV3?FV-#&gwEZXl0Q)}TN#(uG!ky0sR@#3o$6b&c%V?-9W5L( zli&LwFMT1ZT=R{T2t7J5DJV9k2w$2PYy9Ztmfo9LB2OOWz3%s)4#ptT=$8}dXPf~9 zGSfGti72KegNJcj1Wy7P@-BRE-IIYHiT0q1YEJ2^XB_wv=7O-Js)>65LXtjua=4~s1veRE;(6Dl?! zGebxVa{B!mWxi}obsIz7)1U_-bm2P6^MTj-bSgIVt2Zrd@lkt=fOQ1&NK>8rz{Wzvxk4lj=z-}U`d-Qe60ngAG?T;Ru1Nw23y+nzZKA|-%K|k zcgk(mvx5miDW<`IWbxN)ZXITFBz~;f&gofo4FM=nX)N)pL=h-jQK60kRj}oiu@(YS zp-KGKz-xQ!MBtqpZNd=my#Ywq4NOwPd>S}}TG^~qQY(9G`Mci*bAx@30_~T8q|biR zB3@}H%Cw9F7rbO}Rga)oeEW~(DrDFDMWC%h_d}O$*NS_AOArWj`TvkPyQqg(Vu)Ea z=L!XB(^aHR_BItLlNFUz>b9$>Qf@EGU!U9s{Q3%yMl*9e7$eFb*X$S@77a_ub%q|M zIEw8BjRrq8uf*>4q-%H0pLW&w zXv4G+ECwV)5!W=qnM%Bjq#|GgZP4^JP$NV(EelkE1bI+~TalFf6V@|7q*oc+H_y9NAdBCE<|-1C_W;lEg_9l4*LlrZ?G|%XeK*O|K8jofp>! z1l)yM9tZH2eadCPg&J#E*Xwzpc)uaIuJYH$n7op(6n(LOCxKlOX;A}D9s;xHX3m+D z$;izy+SN#73?q};Gq7?pj&IbZ23O?v389JJWFj{bz$; z{N&>)o!`c&q3i+Wx~<*&iN(ErcL}6(mXl?HiyyXmFyr>nLH%q;8u$CM zOV&1S-<_(9jQ9Xloq=&U-ueG}1|RTA{kQUc!zauBZ*2hufoT2?%YW=D9S+LR$@afX w{Xc0CXd0))uLdT=#qukGqj3X&ks3!K!2N&y#fb?pf(bZv0Ul^9?>|NV0gK}C8IB&g(h@7y=HoF9A7tU3GFUT4jBmQeesS_mVfpTj0Mhz0=IOch|{!rt^Q zf`K|}8Yxs{lNScs3{2(hlW1vAYs<61Nh6rv&B8a7hyl=KNo#;z8nNG5!2A9( z3+c!+*>22O>dFu(S%KcBG9KA892mRn#o3%FQ;f+Tw@;HnsFjS9*S{qm=nj^qgG@O9 zX;O&n8OzAJI0Y-SKrtz+Xi*5ZKA*?y3r~fiJiaXc>Ya6BARjAdT4ouNVciXez#nFP zMA~y!PRqu+sD9FNbZtlR+p=Nls`C%atG921AzGEeqsP@$NGmq_%q^6D+Yn(#mix9H zqbBQlZxmr?`9evmHRO7R_A`q-D!7+H-l-{{@t`?FbLrJnJ`~jGWCVK?$XfaOC(>$} zYB-GM^61+M2K|Z&Ljd8I@ce4`M`Wt+kblsM;cTJh@ly`5TdMVbZ+;+q6pgguPweWP z^myy5?<D9g0fg=W>e)z0$hDC#Z8c#sW&#iZO z_u3-k$et?EUv~Z<@@uhLj;qq~aNvgFom;PLnnrYWF4dBvXUBtt$^T6+89xK_SJ7n}a*&ORV10Ch8S&jb@eS6&2 zElh}O19U93C0-)kwjp%J+ zfL+eBKWy&KjaXslru${3r8d%8Y}>x~-0V#jr8(jV$xae0T6%o-qjMRZLiS@Vv-%%~ zB1ui6&+rW%6T^KnN!6y=nt z?-lMTs~U7aZ{bVVN=!32B>*DVju`rL7_kze!8%6ap!>ScUT0;YW@Ap!+I#N3P3yRCH#^|1Iv&c7HoM((XabocPSBXrz0tMgisH`n* z9*Gwtb(Z1W&WqIQTzAme&1&fIA%&_{`F z^r6@vZB=fqqDl0f@)M=`YDfTwq3%nj41Fz4z2qup@UWG}vO@$lgl&)zQxko~je&zZ z?kGp2DPm4a#a#+L*$cy~yL@3HZ?-5N-hVS>jfD2x{-n$CJ}zjJ0DMz&6}J)+{BaC8h7WsHk-48H{QE(9Vy5B zE?5bG^1tk^`k~tZhJK>CJ~wGoa(R99twj4lyXR|6xuZ61iq>r?ktx zN4$mjv|G7{Wnr@~f*$Wi`*7RH%s#RCkr-Ix~ zL)_8yYBtt(MMKx@AXNja11I#G%MTuC3W!K*G>H8Ua-*a$La>Q_9hDV-UHOy_0JsPM z0D?W_`~yNfT>Y;EdwRUKT<}_eu|z;?v7jHjLqQ}NMi0)Lw`geFoV3*L*2Kw*YX@Ex z5%pKvUeTNL{apC|%8n6Ya&k?GwfMDl6&O7h|Hal-rH$e0y*JYk>l_wrh)guM?u@ym zc>!d2KguRN9ovP?w0#KLb{fvo0Tg)P-i|6VYkRc1rpz-h!Dt;Hc!~tB;xE>{aB8eS zPXdbo-%BQ^NiSZOaUshIrr=BOTuQT5nm$nET;#td6YtX6vLNBPVGH=Agdb;bnwah_ zQ`AYhaweR(UOZtnyG!l!tlHh7J~QB(iwQbJmwJ6x2#aK7B)K)c{hF?S=^imRjO>#; zW2^eyu;Ui6_d;PO?Q`+suJRu2A>omA?))Cwlop|Fd}v|*A(S%jBNbj&lJZ;!8Xu9r zh;qKMcb=69%G+-#L9iWY0NCw*OwfNZo!IlJfSI+yZy_@qt?+kjO;TlzKRav68 zCSVFx2yfP`kK1zzpFhstYuXZ&4{zS<*qoTo?6rO9?PTGERC}-Rn-oNL>THw!e3#>j z8(}>~lyKdqI@-mr!M-XkgzKrYrd~}y?{fTZGEG#`haRS2n~^%A^E1|Ow{dzVrd^jV zpmh^l$4HpqR|qFFdz?8ed(sA$;~;h;8FBF7n$5BpQvP#p`=KYJ0ru6$S=q`h~jW**LEE~8(UFnv_G_iPr^kw`-XC-Rf{K$C!{E~lLRf=u}fFZw<1(=g)zD6q-acSr!TWMs8~Lnz#knf6u+ zccadE9kC%YvGB)BD}9lwFNN95QC%`lyItrc;55YH=kxWeg|8~rtok_IMC z@()~{@0#H8H49L2(v$Io?`;$Zc#A$<%}2Rg!4i8?m$F|=8X9#W(|;IB7~#*%-40RI zp-i4AM8+2&NfdAQyaSpYNh^d`|A0o3LL`79Hjk<7#4o!{W}R zL>(pAwsREnBb&gLJI3!U9&D|e)?TIMCpnosH5+E#j$$Ns0)R&Y(mG7_2Bl%yPkA_& zv0qmL8%1#H5(hcfK_rB^MIB_0Ijk<0>(yI|G34A!qB zZki5|ZP876M-TaJV4@+wTYf$9=(>^rODfeR-U=6q!aimFtO`ACkK{g>!0`?35CO(I zWJdPZI_~y_wqSFTZ?YY4p#@W5Zq z%=nk$_r(e037dvMG$U@*pNphUa95W8#@}vk8nOyiC+;d=r`AF zh}yDK)gS$HEH6bj3omvcerq=O-G5Z@QcD@n^nA3YZ3q?7dPmR+^t+IxpWC zwr=Yubr=6=^z`C-Q8|*>Mdc_R^(VJ@*>eb%zAJn{WOMBtU~cmM*r1hc^;0$U{Vl1skpGX9#F@Zi}^&9zEStCN`uHl(=*U$t z5Bf$y5hi6)fs@d@yTVF+_+d{AHuRj`diH|StX%>4wFLhN> z%y=^#MG<3VL%-M=pvMgg`#YfQw##fp$R)1#8-Jd*9G-~qkuMx-)Ic`^ zfA6>8Q{{PGF)vGeGpg$0dGSXEC(CytBtgQMtT%5vPuVTn9dKxzCCrCxn!W-^jT9sP z$5+uw9M1G_E>6u8R}ueTAo=^A{&h})|A8l|QQ}~}e@8w5!1e#v{@F*_Quo<-QuQUI zsJS>(g*YLp&m^R%GE*BRw5Xt|#}b!$|FLvGDgYq=FZ{6m*X(|(f}{vtw%9+!{{wR{ B1t0(b diff --git a/src/test/resources/files/data_one_row.csv b/src/test/resources/files/data_one_row.csv index 26170ce13..53e09c795 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 -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 \ No newline at end of file +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 diff --git a/src/test/resources/files/data_one_row.xls b/src/test/resources/files/data_one_row.xls index 25c0ec588647718389ba0ff5704925ebe246e815..c08d525b4c1cdac4638abe67abacfcfcdcb7c7c9 100644 GIT binary patch delta 316 zcmZoTz}RqraYGIZ`vINc|7Bb^Cl|A{GBE~j{>9?O%*Zp@m1DJNgM0u;hLM>80{;DH zVBp!z%6XHKsUl$W1Fi;5;rA{eDK>^6S4S6L*H#7rhFg=1O+wi>b4LKh-8Y{%>E%}B zWMBwMEy`60sVqnpVqi!IvI}w&i*pqU5{ruq@{39~$2d&mlPqy#VDR#0VBlq7Vqj$8 z0g@>U{2=ybZvRVclJUL_43h(}NH6C0XWaZP%!W}>1ZXD*lK{v`3?d9Hj9>;MKUfUJ z5!oCZA<4+jz#zQKD*ylh delta 264 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 delta 5007 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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 bcbc35aca..5c6021a72 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 -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 +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 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 12976e931..10274194b 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 -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 +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 diff --git a/src/test/resources/files/data_one_row_computation.csv b/src/test/resources/files/data_one_row_computation.csv index acf076b15..99d968aed 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 -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 +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 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 c81e2778d1d37ee42b71848404a958343b5a3c2c..a799cd957cf8c664f769b837f7d883d59d55064c 100644 GIT binary patch delta 289 zcmZoTz}RqraYGIZyTaG5tL0obCl|A{GEUk2lf|2vk!P|i$7)dqU2l*CBQpa8{QJ+q zz_Xc^^Clx>#pe55jhey-TtG5x3_-4rF21g<3<3r)s2Bc+M9uamw}0ak%0$DrZDh>*qcB4U1F0o@MU073&0}1 z_@f`=<~w0JjEcfQ<2jfFK(;doGq5m%8I1g3F%U<1vt|T0BRd0w5Q80q%Vgci$AWxJ u3=AR+T#R;1LJZs3fTmAYj8fxc1gc;FIsycRgeF&os&1}|%3)j-!vX-aRXSz> delta 254 zcmZoTz}RqraYGIZ`-CL1#qaN5pIpq+%2>7eCyO^TBll!ij@6geL@+R7lnFn@BfNho^-cQ8=gW%GHHV(!g; z4%7G~E!`Lx_`Mkzco~=&7#VngWC{a6kYw2W*Y6UWq>3*C15W@J>BWEj7&pHN(_!Ql z0-DIdBmlCIL1?mKgfOGfX4436#>sw>cLYHui7@aYZo zLP_+31tA7?2`Y*)JQ;iN7$oAM4rYfu1RXlqL1^9H*`GS>=Ba__``&M!=Y78Sn{VE9 zhNUy?^<~aC^6d8KQQ;G&xH0w(H@FAzD!=V;4*0Lk|Fcd(HDue3Iy z8y^bC*>zkM*6@dHJ&?V)B=5wuWT97Xz!QW?!Z}*6i-Wj8^Ilp%ks9!;RF4Z{BfgS% z;}yBqRsyqbe6RbJ*+K!p%~)SR10Swb8>Ww5{>)hbf7pp4E7w$F9~ar?itLLmou`WI z^p?4m**E{exlc7rzU;j3^3FWotH{n3+4+iWp(-97XMdUV%Y3eYb(+CMJfw}%U)84= zOh)>8EPyMTVOEv0mZ5{fAV4OcrJ$@EOv&r3u~|3Fn!n2P6xNoMDh}xfnTFFe>WI1TUP9w1uOQF;HL;Q%$Et7yN?fVmEPN z`$N+sQKF-D#*;%<=Z%rLeW`USU=AJwXl-}e!UYT@8ZSbX6F+5L%no)edCXW8;3l1^ zOk%UHq+7~@KpUvg0!INS&#e0nP)lhL!inC-K%vi=Qy!=)&ct@v-+MJ?XV1F1-)4{8 A)c^nh delta 938 zcmb_aO=#0#7=FJtUGw*)*^)G*+qzLFJNUQFdJ$V3t^*l^Dp+wi*R~8?h_K^43?}tW?2u{L$%H50m+yI>CogZFQjL{r zY~g|sefLchvy1PsD9o@`To>x>nY$ht3NZz9;x0Cem&MlJJOFUQRf0h%5kdsL8zAYe zgtL>yzV!Y*;}etTE&{$1cZ+>rqU6lN*ee=LaU;?W7E`wtV!wP6^RkR{@*q2epX9GN z&wH?{p2xD9L|N^^F`mLU!Zc6f9aX@+Y6`RTo~Lz}z#wH*MB}2h3~C#8KU*NYV6|h%2V; zNSmr<@X|%?)qItV+_IVM*K3%uY`ytUkM(G{Ny)|G;o=hC;iD#q=>ngAJ%C1>%mlZ_{&%TRdFW zoHK&}=^-!nAz+}=a{^*s=pXO`b5r@Hh;wupV2Yamr^MxjE8*5AaLCgjRoMG5)a(AT n5vBy*I<*$fkeLbHczvWtW8lq$`L`tD!xKB*?;|F=e_HqjPtDQ= 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 89d928665..212c8db5d 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 -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 +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 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 6f4cc8c682b4854647ee0713b29bb2b8637efaf2..ec41889c20e0e7bf84019f3b25aebaae5a5bd493 100644 GIT binary patch delta 332 zcmZoTz}RqraYGIZdxEm$r*f{FlZ#ne8Mkcy$>Pn-$TQiMW3?zl>hq642}WiH2>AD( zfq`c;E9X^4wl9qT>nj2#Kj5-wte>pFEsI80K}DpQnHcIfZ{uF2A$-6EWC$BWkgKDM zuWKuV0K@9Z#U`QbE!?3%ao5e~O^UgBI2jm1Qj2mGLMjVVH#<2@W?50% coverage", \ No newline at end of file +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 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 33918da52..ba37dcf37 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 -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 +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 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 0376d239c..b4b0906a8 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 -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 +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 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 29a5d3461..585d81ba2 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 -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 +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 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 a01e82925..a7d774994 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 -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 +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 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 f0b5b3dcd..edcbb3a3f 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 -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 \ No newline at end of file +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 diff --git a/src/test/resources/files/duplicatesInFile.csv b/src/test/resources/files/duplicatesInFile.csv index c41d025b9..55e7b9605 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 -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 +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 diff --git a/src/test/resources/files/empty_then_2_rows.xlsx b/src/test/resources/files/empty_then_2_rows.xlsx index ab3cd9f7a5d6f98450c9802b9a6bda512f11adb5..7917eb89c4c30786b5caeaf39a353c77e710669f 100644 GIT binary patch delta 5154 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 delta 5190 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 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 3f8f85a12c07badbfcf878e078e411079a6d1f24..dee1c7dc24bb97f237e89a1548a9dd5c275a5571 100644 GIT binary patch delta 5169 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 delta 4779 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 S{|}7jW-miPpuHOy2=p)ArpEyQ diff --git a/src/test/resources/files/ontology/data_ordinal_missing_categories.xlsx b/src/test/resources/files/ontology/data_ordinal_missing_categories.xlsx index 85ebc0007b0625b27a4795b7aee72d405ce9e582..f8f6395514d6f63de9b82fa32be68d787cf509bb 100644 GIT binary patch delta 4752 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 delta 4548 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 Date: Wed, 7 Dec 2022 15:44:07 -0500 Subject: [PATCH 04/11] [BI-1613] - More unit test updates --- .../parsers/TraitFileParserUnitTest.java | 7 ++++++- .../data_one_row_empty_formula_headers.xls | Bin 24576 -> 24576 bytes .../resources/files/missing_categories.csv | 4 ++-- .../files/missing_category_label_nominal.csv | 4 ++-- .../files/missing_category_label_ordinal.csv | 4 ++-- src/test/resources/files/missing_column.csv | 2 +- src/test/resources/files/missing_formula.csv | 4 ++-- .../resources/files/missing_scale_class.xlsx | Bin 17570 -> 17924 bytes .../resources/files/missing_scale_unit.xlsx | Bin 17786 -> 17927 bytes .../resources/files/missing_trait_entity.xlsx | Bin 17558 -> 17911 bytes .../files/missing_trait_name_with_data.csv | 4 ++-- .../files/multiple_rows_parsing_errors.csv | 8 ++++---- .../resources/files/parsing_exceptions.csv | 4 ++-- 13 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java b/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java index db2bcab8e..259137d1a 100644 --- a/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java +++ b/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java @@ -168,7 +168,7 @@ void parseCsvConvertToTraitsError() { ValidatorException e = assertThrows(ValidatorException.class, () -> parser.parseCsv(inputStream), "expected parsing exception"); ValidationErrors rowErrors = e.getErrors(); - assertTrue(rowErrors.getRowErrors().size() == 3, "Wrong number of row errors returned"); + assertTrue(rowErrors.getRowErrors().size() == 4, "Wrong number of row errors returned"); Map expectedErrors1 = new HashMap<>(); expectedErrors1.put(TraitFileColumns.SCALE_CLASS.toString(), ParsingExceptionType.INVALID_SCALE_CLASS); @@ -183,9 +183,14 @@ void parseCsvConvertToTraitsError() { expectedErrors3.put(TraitFileColumns.SCALE_LOWER_LIMIT.toString(), ParsingExceptionType.INVALID_SCALE_LOWER_LIMIT); expectedErrors3.put(TraitFileColumns.SCALE_UPPER_LIMIT.toString(), ParsingExceptionType.INVALID_SCALE_UPPER_LIMIT); + Map expectedErrors4 = new HashMap<>(); + expectedErrors3.putAll(expectedErrors1); + expectedErrors3.put(TraitFileColumns.TERM_TYPE.toString(), ParsingExceptionType.INVALID_TERM_TYPE); + checkParsingExceptionErrors(rowErrors.getRowErrors().get(0), expectedErrors1); checkParsingExceptionErrors(rowErrors.getRowErrors().get(1), expectedErrors2); checkParsingExceptionErrors(rowErrors.getRowErrors().get(2), expectedErrors3); + checkParsingExceptionErrors(rowErrors.getRowErrors().get(3), expectedErrors4); } void checkParsingExceptionErrors(RowValidationErrors rowError, Map errorColumns) { 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 2205e77f4be283f212bf7f01c2d317688355871e..4cb99cb2b66fa9710454741ab238d8365c42e257 100644 GIT binary patch delta 20 bcmZoTz}RqraYGIZt3!pwzN*cIEd9{{Q^p74 delta 20 bcmZoTz}RqraYGIZYr&GHd*z!8S^A>^T2Kh3 diff --git a/src/test/resources/files/missing_categories.csv b/src/test/resources/files/missing_categories.csv index f30bec176..354223dbf 100644 --- a/src/test/resources/files/missing_categories.csv +++ b/src/test/resources/files/missing_categories.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 -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,,1-4 Parlier field response score,Ordinal,2,2,9999,,, \ No newline at end of file +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,,1-4 Parlier field response score,Ordinal,2,2,9999,,,, \ 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 f93ef99f9..7998bf97b 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 -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 +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 diff --git a/src/test/resources/files/missing_category_label_ordinal.csv b/src/test/resources/files/missing_category_label_ordinal.csv index 7d5711f58..df8c376c7 100644 --- a/src/test/resources/files/missing_category_label_ordinal.csv +++ b/src/test/resources/files/missing_category_label_ordinal.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 -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 visible infection; Very few, small colonies; < 50% coverage; >50% coverage",, \ No newline at end of file +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,"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_column.csv b/src/test/resources/files/missing_column.csv index acd8e2872..1d03024aa 100644 --- a/src/test/resources/files/missing_column.csv +++ b/src/test/resources/files/missing_column.csv @@ -1 +1 @@ -Name,Synonyms,Description,Trait entity,Trait attribute,Status,Method name,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name \ No newline at end of file +Name,Synonyms,Description,Trait entity,Trait attribute,Status,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 \ No newline at end of file diff --git a/src/test/resources/files/missing_formula.csv b/src/test/resources/files/missing_formula.csv index 1ae9c8608..16b6613d7 100644 --- a/src/test/resources/files/missing_formula.csv +++ b/src/test/resources/files/missing_formula.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 -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,,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 +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,,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 diff --git a/src/test/resources/files/missing_scale_class.xlsx b/src/test/resources/files/missing_scale_class.xlsx index b1ab129b2bca96b74fd6e523887607f0ed26aa36..78bb4c20ef9b2b5b59c0a05f7c8f63c821c57423 100644 GIT binary patch delta 5076 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 delta 4728 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�IoPxB*R> zZa|#}2HXkp*Ol<3V$`Jws$v3sB8&iw3_sv2k_Rjbu>t-({6&1i82I@juQ}8)Kp?w1 zMLsqRB>b}gW#lsUox)&XcKt)|hz2l2pa-*&PEg$7OB&~iWX0B-z)6=f1_~z6FN5ix z(807oecWY>a%Zo^wP-X**fnBGKhbQ+yGb_8TZ7O*4C3Jhic9M~c-Ch!^bo97;?O0I zFM7<5c;xC??^*ed)}#a6>%7h|AGgrQy?Ol=sn=w44d{nb$m^DW66~V?{8YeMh4l#w zHq+aK^itf=6ej2Tnw~a9xY(S{+)l^lfSu#`c3*6O#pY6z-wGgHs;@aZYME3}ihX!D~xxaefbb9k9WK5WIqq zl~T=3EPUzxk-9v+#6fA}4IPopgHo5Ib{NjUw&jPO0R33Z@Pq`yD0QhR^D5~W%)yAh zOIkEJm#ll)a_93_dJ1cgP;3*daz&LCQQg7=v{=)c_sX+}p03dgL8ux;Ze*){ejpxu z)$pluH}WmB@VM!_x`GS_G4M^51I58WRMOca!D@s2=ci+kHIv<=vCZh3cWc96!wo%} z^)woBf9EjddX=u%>IXVWInNn2_OWqaJ<-0f=o|Oxvzc;4kAl)Hq2o83vz1CG!_4vG zsk9nCoTOF>wauB1`Ka1kx*rripa}I^3r5WiU1V$dl1h6XmZ>R$%4@m^n)K+8Y$TUO zOPLyX%x16{t~Z&!eWe9j-$_-D-?+61=b!ZjKm2Xo9YeFVn@y;7iQ4t+mxhIzJ(%tg zqJxCI_FUNtYuVzfV|vz*i;rt>CX9sjZ6R~+?o)~KArg+xean*dJ=br@dwpA^#xOss8n2@^483xG7T7|KB|0A4?EO7;>L=@Bkk25KI~-AW@zNpb{k|`p1HT z1wbo4$2?#I^m0WQA)H|jUN#7!Kl=l2?#%=Q04fC@`u|YD zy*R(mivFvF3IZkyZ1n$eYA^^y`d`x^5QZ?2rN9a_$wThZ8$d09|-k* NUBL!{%BBDG{s)>!rzrpc diff --git a/src/test/resources/files/missing_scale_unit.xlsx b/src/test/resources/files/missing_scale_unit.xlsx index 732f8d5b434d61df36593d3834e2294e7eb65f24..466b531c0fffb90672eadc613e65e19ddc7799af 100644 GIT binary patch delta 4643 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 Zzf5ClM0VMK1A&+?=fWj}fi?bJ{TE`;3}65N delta 4679 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 diff --git a/src/test/resources/files/missing_trait_name_with_data.csv b/src/test/resources/files/missing_trait_name_with_data.csv index 3f651a41f..c7de3a3f2 100644 --- a/src/test/resources/files/missing_trait_name_with_data.csv +++ b/src/test/resources/files/missing_trait_name_with_data.csv @@ -1,2 +1,2 @@ -Trait abbreviations,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name -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, 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 +Trait abbreviations,Synonyms,Description,Trait entity,Trait attribute,Status,Trait lists,Method description,Method class,Method formula,Units,Scale class,Scale decimal places,Scale lower limit,Scale upper limit,Scale categories,Full Name,Term Type +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, 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",,Phenotype \ No newline at end of file diff --git a/src/test/resources/files/multiple_rows_parsing_errors.csv b/src/test/resources/files/multiple_rows_parsing_errors.csv index 0d595c994..a46e0b3bf 100644 --- a/src/test/resources/files/multiple_rows_parsing_errors.csv +++ b/src/test/resources/files/multiple_rows_parsing_errors.csv @@ -1,4 +1,4 @@ -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 -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,1-4 Parlier field response score,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,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", \ No newline at end of file +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 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,1-4 Parlier field response score,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,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 diff --git a/src/test/resources/files/parsing_exceptions.csv b/src/test/resources/files/parsing_exceptions.csv index 8a17c0484..83f273e30 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 -,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",, +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",,, From 56cb8be76b70fab0dec65272bde86aa81a78f308 Mon Sep 17 00:00:00 2001 From: hms243 Date: Thu, 8 Dec 2022 15:24:49 -0500 Subject: [PATCH 05/11] [BI-1613] - Even more unit test updates --- .../TraitUploadControllerIntegrationTest.java | 3 +++ .../parsers/TraitFileParserUnitTest.java | 8 +++----- .../data_one_row_empty_formula_headers.xls | Bin 24576 -> 24576 bytes .../data_ordinal_missing_categories.xlsx | Bin 18024 -> 17944 bytes 4 files changed, 6 insertions(+), 5 deletions(-) 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 1052a969c..89fde5702 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -38,6 +38,7 @@ import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.v1.controller.metadata.SortOrder; import org.breedinginsight.dao.db.enums.DataType; +import org.breedinginsight.dao.db.enums.TermType; import org.breedinginsight.dao.db.tables.daos.ProgramDao; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.breedinginsight.dao.db.tables.pojos.ProgramEntity; @@ -570,6 +571,8 @@ private void checkValidTraitUpload(JsonObject traitUpload) { assertEquals("Leaf", observationLevel.get("name").getAsString(), "wrong level name"); assertEquals(true, trait.get("active").getAsBoolean(), "wrong status"); + assertEquals(TermType.GERM_PASSPORT, trait.get("termType")); + // TODO: trait lists JsonObject method = trait.get("method").getAsJsonObject(); diff --git a/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java b/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java index 259137d1a..06f8a9e85 100644 --- a/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java +++ b/src/test/java/org/breedinginsight/services/parsers/TraitFileParserUnitTest.java @@ -22,6 +22,7 @@ import org.breedinginsight.api.model.v1.response.ValidationError; import org.breedinginsight.api.model.v1.response.ValidationErrors; import org.breedinginsight.dao.db.enums.DataType; +import org.breedinginsight.dao.db.enums.TermType; import org.breedinginsight.model.Method; import org.breedinginsight.model.Scale; import org.breedinginsight.model.Trait; @@ -168,7 +169,7 @@ void parseCsvConvertToTraitsError() { ValidatorException e = assertThrows(ValidatorException.class, () -> parser.parseCsv(inputStream), "expected parsing exception"); ValidationErrors rowErrors = e.getErrors(); - assertTrue(rowErrors.getRowErrors().size() == 4, "Wrong number of row errors returned"); + assertTrue(rowErrors.getRowErrors().size() == 3, "Wrong number of row errors returned"); Map expectedErrors1 = new HashMap<>(); expectedErrors1.put(TraitFileColumns.SCALE_CLASS.toString(), ParsingExceptionType.INVALID_SCALE_CLASS); @@ -182,15 +183,11 @@ void parseCsvConvertToTraitsError() { expectedErrors3.put(TraitFileColumns.SCALE_DECIMAL_PLACES.toString(), ParsingExceptionType.INVALID_SCALE_DECIMAL_PLACES); expectedErrors3.put(TraitFileColumns.SCALE_LOWER_LIMIT.toString(), ParsingExceptionType.INVALID_SCALE_LOWER_LIMIT); expectedErrors3.put(TraitFileColumns.SCALE_UPPER_LIMIT.toString(), ParsingExceptionType.INVALID_SCALE_UPPER_LIMIT); - - Map expectedErrors4 = new HashMap<>(); - expectedErrors3.putAll(expectedErrors1); expectedErrors3.put(TraitFileColumns.TERM_TYPE.toString(), ParsingExceptionType.INVALID_TERM_TYPE); checkParsingExceptionErrors(rowErrors.getRowErrors().get(0), expectedErrors1); checkParsingExceptionErrors(rowErrors.getRowErrors().get(1), expectedErrors2); checkParsingExceptionErrors(rowErrors.getRowErrors().get(2), expectedErrors3); - checkParsingExceptionErrors(rowErrors.getRowErrors().get(3), expectedErrors4); } void checkParsingExceptionErrors(RowValidationErrors rowError, Map errorColumns) { @@ -291,6 +288,7 @@ private void assertTestTraitEquals(Trait trait) { assertEquals("leaf", trait.getEntity(), "wrong entity"); assertEquals("powdery mildew severity", trait.getAttribute(), "wrong attribute"); assertEquals(true, trait.getActive(), "wrong status"); + assertEquals(TermType.GERM_PASSPORT, trait.getTermType(), "wrong term type"); // TODO: trait lists Method method = trait.getMethod(); assertEquals("Powdery Mildew severity, leaf", method.getDescription(), "wrong method description"); 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 4cb99cb2b66fa9710454741ab238d8365c42e257..731fc934a1c1f26adeccc23c9f9099056d3b9161 100644 GIT binary patch delta 494 zcmZ9HJ4?e*6oAi7leA6j15)fz#3EE39s2N@rnYfVYDEo_Do7C#!B%MMP?vVG&{6L{ z5C^eK;ew;o!C8NRbZ`*doJ0q~6IwEOhs*iCbI;>8d!*ST-4kAXF-S<2X_ar0NA|;i zyM*zMqRQ;c^G5hjp%SGbOz;5frShQ%V5?p^t<=kwh+(Z%JF_sgT{^O;rK!G~1VCQ` zh$R8`*@L#`7gkpQqRd}-7sW&#Yc^P*pb+NUsggzp2mJ!R2LdW+4sl4!4!MwsLp)O4 zApr?z4!ej*S%=(6_8$imJV?0Jki1AKzk?FuEFCc;fjP(d(9P4NsmGSk5e`2L3Oc); zy^e;vh&Q)J24Ymq)VZU=B0$`|p!yX0nBIQaC3kDM3^>TxVMn)rDR1$UcO3 zv*pWuvo5i>l3OBt=U)lEmiz>$VsH32Zy8Cw*#y8&?Z-{>eE@KXFdFm)LctvNIv)m_FZA$#c4RK3H^vr^1@X-zcPqVi0}%x{R`s)CP;p!xu4A=>Eh@YI5-m!3wu jNIxw`lh#)JK~+#oXQ$incp2+{``}Jy`_sMTa7Oq6WyEtt diff --git a/src/test/resources/files/ontology/data_ordinal_missing_categories.xlsx b/src/test/resources/files/ontology/data_ordinal_missing_categories.xlsx index f8f6395514d6f63de9b82fa32be68d787cf509bb..7214e33b977b10af6b76a20a27dffeae406400c9 100644 GIT binary patch delta 4435 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 delta 4560 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 From 5802d2a83dd9195d53c3649f1dc5e815702bd0f9 Mon Sep 17 00:00:00 2001 From: hms243 Date: Thu, 8 Dec 2022 16:19:25 -0500 Subject: [PATCH 06/11] [BI-1613] - Unit test fix --- .../data_one_row_empty_formula_headers.xls | Bin 24576 -> 24576 bytes 1 file changed, 0 insertions(+), 0 deletions(-) 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 731fc934a1c1f26adeccc23c9f9099056d3b9161..c52f828ad33b5f6785232e05311e56fe6e86f9e4 100644 GIT binary patch delta 375 zcmXv|J4ixd7(M^(zt@{L%<|e~V2guf4>4#cxs^Ix@ zAo`=J!Lg8=M3kZN`q7y_TNUfBn2chDVQ zUT5#}9kDd&8)}6o46DKG}ekeNK!HiR1@qu<{<1TH9-cPyjvFR z<}^4#c?k#U{_#xVH1zZ#nKs(#1=lBdCL9PN%(*O>O698JI@gRsrqwgfx2f=upwNp` YzKa@*S&z;1cqTvoscb*%CkHwD4IZOV?*IS* delta 314 zcmW-bK_~=a7>3_({5!Kd%kG+)hKq2p2a!y>H%(TvWV6ji6T94%T->%4TL^LCzj2Y= zq&9yXoW{Xba&oc<#Z4}X)B4x@)mQKH)%U)&kZK{-S6SpKAj{=zY?toEFZ*d@y_cpd zzN2rXeMQ2q=4Mqi^rJZ6vki3uhc^vdoY^lu=7R?*6|?!ASIqAqg*rdT1loQ)kUTFw zGTZT~CJKn+c@Suq&=>+{2*?cs>k3dE0j?Qfj{+qXn0A0I4e&C+Mhv*f0u-z3p7KSuqQd>>U(asw8a43VPbKWiC_uPj`V%e%|VIw>*> rCS35-@@HpSHnCuls~EU#UHC~QozNi*fS}8X#l&O9q2op8e2M)5EyzSx From 5d21d3290ee6e86c913998e19eb47b1c918d74f9 Mon Sep 17 00:00:00 2001 From: hms243 Date: Thu, 8 Dec 2022 16:35:05 -0500 Subject: [PATCH 07/11] [BI-1613] - Unit test fix, toString --- .../api/v1/controller/TraitUploadControllerIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 89fde5702..316f892d8 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -571,7 +571,7 @@ private void checkValidTraitUpload(JsonObject traitUpload) { assertEquals("Leaf", observationLevel.get("name").getAsString(), "wrong level name"); assertEquals(true, trait.get("active").getAsBoolean(), "wrong status"); - assertEquals(TermType.GERM_PASSPORT, trait.get("termType")); + assertEquals(TermType.GERM_PASSPORT.toString(), trait.get("termType")); // TODO: trait lists From 530a1e5701dc97834b80b9306a2fd77a19532881 Mon Sep 17 00:00:00 2001 From: hms243 Date: Fri, 9 Dec 2022 10:51:00 -0500 Subject: [PATCH 08/11] [BI-1613] - Unit test fix once more --- .../api/v1/controller/TraitUploadControllerIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 316f892d8..4763b7af8 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -571,7 +571,7 @@ private void checkValidTraitUpload(JsonObject traitUpload) { assertEquals("Leaf", observationLevel.get("name").getAsString(), "wrong level name"); assertEquals(true, trait.get("active").getAsBoolean(), "wrong status"); - assertEquals(TermType.GERM_PASSPORT.toString(), trait.get("termType")); + assertEquals(TermType.GERM_PASSPORT.toString(), trait.get("termType").getAsString()); // TODO: trait lists From eb3d34bf5b42ba8b1da586ee207894754a37d88d Mon Sep 17 00:00:00 2001 From: hms243 Date: Fri, 9 Dec 2022 11:06:44 -0500 Subject: [PATCH 09/11] [BI-1613] - Small file fix --- src/test/resources/files/data_mismatched_cases.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/files/data_mismatched_cases.csv b/src/test/resources/files/data_mismatched_cases.csv index dda2ad1a5..4e31b2eb0 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",,, \ 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,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 From ad4f82bc92b8796c7497460d84f0e3f082b4e315 Mon Sep 17 00:00:00 2001 From: Nick Palladino Date: Wed, 18 Jan 2023 10:34:10 -0500 Subject: [PATCH 10/11] Code review changes --- .../importer/model/imports/TermTypeTranslator.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java index 02336a39c..06c6d4568 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java @@ -24,17 +24,15 @@ */ @Getter public enum TermTypeTranslator { - PHENOTYPE("PHENOTYPE", "Phenotype"), + PHENOTYPE("Phenotype"), - GERM_ATTRIBUTE("GERM_ATTRIBUTE", "Germplasm Attribute"), + GERM_ATTRIBUTE("Germplasm Attribute"), - GERM_PASSPORT("GERM_PASSPORT", "Germplasm Passport"); + GERM_PASSPORT("Germplasm Passport"); - public String name; public String userDisplay; - TermTypeTranslator(String name, String userDisplay) { - this.name = name; + TermTypeTranslator(String userDisplay) { this.userDisplay = userDisplay; } From 4617de6ed0bf6705a49fcb40bdcf2aff544fae7b Mon Sep 17 00:00:00 2001 From: Nick Palladino Date: Wed, 18 Jan 2023 13:39:09 -0500 Subject: [PATCH 11/11] Simplified term type mapping --- .../model/imports/TermTypeTranslator.java | 50 ++++--------------- .../parsers/trait/TraitFileParser.java | 20 ++++---- 2 files changed, 20 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java index 06c6d4568..b53af17d7 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/TermTypeTranslator.java @@ -1,47 +1,17 @@ -/* - * 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. - */ - package org.breedinginsight.brapps.importer.model.imports; -import lombok.Getter; - -/** - Defines Ontology Term Type backend and user readable values for easy translation - */ -@Getter -public enum TermTypeTranslator { - PHENOTYPE("Phenotype"), - - GERM_ATTRIBUTE("Germplasm Attribute"), +import org.breedinginsight.dao.db.enums.TermType; +import java.util.Map; +import java.util.Optional; - GERM_PASSPORT("Germplasm Passport"); +public class TermTypeTranslator { - public String userDisplay; - - TermTypeTranslator(String userDisplay) { - this.userDisplay = userDisplay; - } + private static final Map userDisplayToTermTypeMap = Map.of( + "Phenotype", TermType.PHENOTYPE, + "Germplasm Attribute", TermType.GERM_ATTRIBUTE, + "Germplasm Passport", TermType.GERM_PASSPORT); - public static String nameFromUserDisplay(String userDisplay){ - for (TermTypeTranslator term: values()){ - if (term.userDisplay.equals(userDisplay)){ - return term.name(); - } - } - throw new IllegalArgumentException(); + public static Optional getTermTypeFromUserDisplayName(String userDisplayName) { + return Optional.ofNullable(userDisplayToTermTypeMap.get(userDisplayName)); } } 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 81da7514f..906115f3d 100644 --- a/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/trait/TraitFileParser.java @@ -16,7 +16,6 @@ */ package org.breedinginsight.services.parsers.trait; -import io.micronaut.core.util.StringUtils; import io.micronaut.http.HttpStatus; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -255,16 +254,17 @@ private List excelRecordsToTraits(List records) throws Valid //Set to backend value for user input term type, if none, set to default TermType termType = TermType.PHENOTYPE; - try { - String termTypeVal = parseExcelValueAsString(record, TraitFileColumns.TERM_TYPE); - if ((!Objects.isNull(termTypeVal)) && (!termTypeVal.isBlank())) { - String termTypeName = TermTypeTranslator.nameFromUserDisplay(WordUtils.capitalizeFully(termTypeVal)); - termType = TermType.valueOf(termTypeName); + + String termTypeVal = parseExcelValueAsString(record, TraitFileColumns.TERM_TYPE); + if ((!Objects.isNull(termTypeVal)) && (!termTypeVal.isBlank())) { + Optional termTypeOpt = TermTypeTranslator.getTermTypeFromUserDisplayName(WordUtils.capitalizeFully(termTypeVal)); + if (termTypeOpt.isPresent()) { + termType = termTypeOpt.get(); + } else { + ValidationError error = new ValidationError(TraitFileColumns.TERM_TYPE.toString(), + ParsingExceptionType.INVALID_TERM_TYPE.toString(), HttpStatus.UNPROCESSABLE_ENTITY); + validationErrors.addError(traitValidatorError.getRowNumber(i), error); } - } catch (IllegalArgumentException e) { - ValidationError error = new ValidationError(TraitFileColumns.TERM_TYPE.toString(), - ParsingExceptionType.INVALID_TERM_TYPE.toString(), HttpStatus.UNPROCESSABLE_ENTITY); - validationErrors.addError(traitValidatorError.getRowNumber(i), error); } Trait trait = Trait.builder()