diff --git a/src/main/java/org/breedinginsight/daos/TraitDAO.java b/src/main/java/org/breedinginsight/daos/TraitDAO.java index 4a14f94f0..a80e8ad1f 100644 --- a/src/main/java/org/breedinginsight/daos/TraitDAO.java +++ b/src/main/java/org/breedinginsight/daos/TraitDAO.java @@ -7,6 +7,7 @@ import org.breedinginsight.model.Program; import org.breedinginsight.model.Trait; import org.breedinginsight.model.User; +import org.breedinginsight.services.exceptions.DoesNotExistException; import org.jooq.DAO; import java.util.List; @@ -24,7 +25,7 @@ public interface TraitDAO extends DAO { List getTraitsById(UUID... traitIds); - Optional getTraitFull(UUID programId, UUID traitId); + Optional getTraitFull(UUID programId, UUID traitId) throws DoesNotExistException; // could be more efficient to do a single get instead of search in saved search case but less code this way // and search stuff is working in breedbase diff --git a/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java b/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java index 544a70510..b9c317db2 100644 --- a/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java +++ b/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java @@ -34,6 +34,7 @@ import org.brapi.v2.model.pheno.*; import org.brapi.v2.model.pheno.request.BrAPIObservationVariableSearchRequest; import org.brapi.v2.model.pheno.response.BrAPIObservationVariableListResponse; +import org.brapi.v2.model.pheno.response.BrAPIObservationVariableListResponseResult; import org.brapi.v2.model.pheno.response.BrAPIObservationVariableSingleResponse; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.dao.db.tables.BiUserTable; @@ -48,6 +49,7 @@ import org.breedinginsight.model.User; import org.breedinginsight.services.brapi.BrAPIEndpointProvider; import org.breedinginsight.services.brapi.BrAPIProvider; +import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.utilities.BrAPIDAOUtil; import org.breedinginsight.utilities.Utilities; import org.jooq.*; @@ -61,7 +63,6 @@ import java.util.stream.Stream; import static org.breedinginsight.dao.db.Tables.*; -import static org.jooq.impl.DSL.lower; @Singleton @Slf4j @@ -143,15 +144,7 @@ public List getTraitsFullByProgramId(UUID programId) { public List getTraitsFullByProgramIds(List programIds) { List saturatedTraits = new ArrayList<>(); for(UUID id : programIds) { - Map programTraits = null; - try { - programTraits = cache.get(id); - } catch (ApiException e) { - throw new RuntimeException(e); - } - if(programTraits != null) { - saturatedTraits.addAll(programTraits.values()); - } + saturatedTraits.addAll(fetchTraitsFullByProgramId(id)); } return saturatedTraits; @@ -215,6 +208,40 @@ private List fetchTraitsFullByProgramId(UUID programId) { return saturatedTraits; } + private Trait fetchTraitFullByBiTraitAndProgramId(UUID traitId, UUID programId) throws DoesNotExistException { + // Get our db trait (equivalent to brapi variables) + Optional biTraitOpt = getTrait(programId, traitId); + if (biTraitOpt.isEmpty()) { + throw new DoesNotExistException(String.format("Unable to find BI trait with id [%s]", traitId)); + } + + Trait trait = biTraitOpt.get(); + + String brapiProgramDbId; + + try { + brapiProgramDbId = brAPIDAOUtil.getBrAPIProgramDbId(programId); + } catch (ApiException e) { + throw new InternalServerException(String.format("While fetching an individual trait in full, unable to retrieve brapi programDbId using bi program ID [%s]", programId), e); + } + + // Get brapi variables + VariableQueryParams variablesRequest = new VariableQueryParams(); + variablesRequest.programDbId(brapiProgramDbId); + variablesRequest.pageSize(1); + + variablesRequest.setExternalReferenceId(traitId.toString()); + variablesRequest.externalReferenceSource(referenceSource); + + ObservationVariablesApi variablesApi = brAPIEndpointProvider.get(programDAO.getCoreClient(programId), ObservationVariablesApi.class); + + BrAPIObservationVariable brAPIObservationVariable = getBrAPIVariable(variablesApi, traitId, programId); + + saturateTrait(trait, brAPIObservationVariable); + + return trait; + } + @Override public List getTraitsByProgramId(UUID programId) { return getTraitsByProgramIds(programId); @@ -259,14 +286,8 @@ public List getTraitsById(UUID... traitIds){ } @Override - public Optional getTraitFull(UUID programId, UUID traitId){ - - try { - return Optional.ofNullable(cache.get(programId).get(traitId.toString())); - } catch (ApiException e) { - log.warn(Utilities.generateApiExceptionLogMessage(e)); - throw new InternalServerException("Error making BrAPI call", e); - } + public Optional getTraitFull(UUID programId, UUID traitId) throws DoesNotExistException { + return Optional.of(fetchTraitFullByBiTraitAndProgramId(traitId, programId)); } // could be more efficient to do a single get instead of search in saved search case but less code this way @@ -501,7 +522,7 @@ public Trait updateTraitBrAPI(Trait trait, Program program) { List variablesAPIS = brAPIProvider.getAllUniqueVariablesAPI(); for (ObservationVariablesApi variablesAPI: variablesAPIS){ // GET brapi trait - BrAPIObservationVariable existingVariable = getBrAPIVariable(variablesAPI, trait.getId()); + BrAPIObservationVariable existingVariable = getBrAPIVariable(variablesAPI, trait.getId(), program.getId()); // Change method existingVariable.getMethod().setMethodName(constructMethodName(trait, program)); @@ -561,11 +582,17 @@ private String constructMethodName(Trait trait, Program program) { String.format("%s [%s]", trait.getMethod().getMethodClass(), program.getKey()); } - private BrAPIObservationVariable getBrAPIVariable(ObservationVariablesApi variablesAPI, UUID traitId) { + private BrAPIObservationVariable getBrAPIVariable(ObservationVariablesApi variablesAPI, + UUID traitId, + UUID biProgramId) { BrAPIObservationVariable existingVariable; try { - VariableQueryParams queryParams = new VariableQueryParams(); + + String brapiProgramDbId = brAPIDAOUtil.getBrAPIProgramDbId(biProgramId); + + VariableQueryParams queryParams = new VariableQueryParams() + .programDbId(brapiProgramDbId); queryParams.externalReferenceID(traitId.toString()); queryParams.externalReferenceSource(referenceSource); ApiResponse existingVariableResponse = 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 01a478bdf..1679da0fc 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -30,18 +30,16 @@ import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import org.breedinginsight.BrAPITest; -import org.breedinginsight.DatabaseTest; import org.breedinginsight.TestUtils; import org.breedinginsight.api.model.v1.request.ProgramRequest; import org.breedinginsight.api.model.v1.request.SpeciesRequest; import org.breedinginsight.api.model.v1.request.query.FilterRequest; import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.v1.controller.metadata.SortOrder; +import org.breedinginsight.brapi.v2.dao.BrAPIProgramDAO; 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; import org.breedinginsight.daos.TraitDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.Program; @@ -59,7 +57,6 @@ import java.util.stream.Collectors; import static io.micronaut.http.HttpRequest.*; -import static org.breedinginsight.TestUtils.insertAndFetchTestProgram; import static org.junit.jupiter.api.Assertions.*; @MicronautTest @@ -79,6 +76,8 @@ public class TraitUploadControllerIntegrationTest extends BrAPITest { private TraitDAO traitDAO; @Inject private SpeciesService speciesService; + @Inject + private BrAPIProgramDAO programDAO; private Species validSpecies; @@ -135,7 +134,6 @@ public void setup() { //dsl.execute(fp.get("InsertProgramOntology")); dsl.execute(fp.get("InsertMethod")); dsl.execute(fp.get("InsertScale")); - dsl.execute(fp.get("InsertTrait")); }