diff --git a/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java b/src/main/java/org/breedinginsight/daos/impl/TraitDAOImpl.java index 544a70510..eff783a44 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; @@ -61,7 +62,6 @@ import java.util.stream.Stream; import static org.breedinginsight.dao.db.Tables.*; -import static org.jooq.impl.DSL.lower; @Singleton @Slf4j @@ -143,15 +143,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 +207,53 @@ private List fetchTraitsFullByProgramId(UUID programId) { return saturatedTraits; } + private Trait fetchTraitFullByBiTraitAndProgramId(UUID traitId, UUID programId) { + // Get our db trait (equivalent to brapi variables) + Optional biTraitOpt = getTrait(programId, traitId); + if (biTraitOpt.isEmpty()) { + throw new InternalServerException(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); + + ApiResponse brApiVariables = null; + BrAPIObservationVariable brAPIObservationVariable; + try { + brApiVariables = brAPIEndpointProvider.get(programDAO.getCoreClient(programId), ObservationVariablesApi.class) + .variablesGet(variablesRequest); + } catch (ApiException e) { + log.warn(Utilities.generateApiExceptionLogMessage(e)); + throw new InternalServerException("Error making BrAPI call", e); + } finally { + brAPIObservationVariable = Optional.ofNullable(brApiVariables) + .map(ApiResponse::getBody) + .map(BrAPIObservationVariableListResponse::getResult) + .map(BrAPIObservationVariableListResponseResult::getData) + .orElseThrow() + .get(0); + } + + saturateTrait(trait, brAPIObservationVariable); + + return trait; + } + @Override public List getTraitsByProgramId(UUID programId) { return getTraitsByProgramIds(programId); @@ -260,13 +299,7 @@ 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); - } + 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 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")); }