Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,29 @@ public HttpResponse<Response<List<DatasetMetadata>>> getDatasets(

}

@Get("/${micronaut.bi.api.version}/programs/{programId}/experiments/{experimentId}/recommended-sub-entity-dataset-names")
@ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.PROGRAM_SCOPED_ROLES})
@Produces(MediaType.APPLICATION_JSON)
public HttpResponse<Response<List<String>>> getRecommendedSubEntityDatasetNames(
@PathVariable("programId") UUID programId,
@PathVariable("experimentId") UUID experimentId) {
try {
Optional<Program> programOptional = programService.getById(programId);
if (programOptional.isEmpty()) {
return HttpResponse.status(HttpStatus.NOT_FOUND, "Program does not exist");
}

Response<List<String>> response = new Response<>(experimentService.getRecommendedSubEntityDatasetNames(programOptional.get(), experimentId));
return HttpResponse.ok(response);
} catch (DoesNotExistException e) {
log.info(e.getMessage());
return HttpResponse.status(HttpStatus.NOT_FOUND, e.getMessage());
} catch (Exception e) {
log.error("Error finding recommended sub-entity dataset names", e);
return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error finding recommended sub-entity dataset names");
}
}

/**
* Adds a record to the experiment_program_user_role table
* @param programId The UUID of the program
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,86 +17,39 @@

package org.breedinginsight.brapi.v2.dao;

import com.google.gson.Gson;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.server.exceptions.InternalServerException;
import lombok.extern.slf4j.Slf4j;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.brapi.client.v2.ApiResponse;
import org.brapi.client.v2.JSON;
import org.brapi.client.v2.model.exceptions.ApiException;
import org.brapi.client.v2.modules.phenotype.ObservationLevelNamesApi;
import org.brapi.client.v2.modules.phenotype.ObservationUnitsApi;
import org.brapi.v2.model.pheno.BrAPIObservationUnitHierarchyLevel;
import org.brapi.v2.model.pheno.BrAPIObservationUnitLevelRelationship;
import org.brapi.v2.model.pheno.response.BrAPIObservationLevelListResponse;
import org.brapi.v2.model.pheno.response.BrAPIObservationLevelListResponseResult;
import org.brapi.v2.model.pheno.response.BrAPIObservationLevelSingleResponse;
import org.breedinginsight.daos.ProgramDAO;
import org.breedinginsight.model.DatasetLevel;
import org.breedinginsight.model.Program;
import org.breedinginsight.services.brapi.BrAPIEndpointProvider;
import org.breedinginsight.services.exceptions.DoesNotExistException;
import org.breedinginsight.utilities.BrAPIDAOUtil;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.breedinginsight.utilities.Utilities;

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List;
import org.breedinginsight.utilities.Utilities;
import java.util.Optional;

@Slf4j
@Singleton
public class BrAPIObservationLevelDAO {

private static final MediaType JSON_MEDIA_TYPE = MediaType.get("application/json");
private final BrAPIDAOUtil brAPIDAOUtil;
private final Gson gson = new JSON().getGson();

private final BrAPIEndpointProvider brAPIEndpointProvider;
private final ProgramDAO programDAO;

@Inject
public BrAPIObservationLevelDAO(BrAPIDAOUtil brAPIDAOUtil,
BrAPIEndpointProvider brAPIEndpointProvider,
public BrAPIObservationLevelDAO(BrAPIEndpointProvider brAPIEndpointProvider,
ProgramDAO programDAO) {
this.brAPIDAOUtil = brAPIDAOUtil;
this.brAPIEndpointProvider = brAPIEndpointProvider;
this.programDAO = programDAO;
}

public HttpResponse<String> createObservationLevelName(Program program, String levelName, DatasetLevel levelOrder, String programDbId) {
HttpUrl url = HttpUrl.parse(brAPIDAOUtil.getProgramBrAPIBaseUrl(program.getId()))
.newBuilder()
.addPathSegment("observationlevelnames")
.build();
JsonObject levelJson = new JsonObject();
levelJson.addProperty("levelName", levelName);
if (levelOrder != null) {
levelJson.addProperty("levelOrder", levelOrder.getValue());
}
if (programDbId != null) {
levelJson.addProperty("programDbId", programDbId);
}
JsonArray bodyArray = new JsonArray();
bodyArray.add(levelJson);
RequestBody body = RequestBody.create(gson.toJson(bodyArray), JSON_MEDIA_TYPE);
var request = new Request.Builder()
.url(url)
.post(body)
.addHeader("Content-Type", "application/json")
.build();
return brAPIDAOUtil.makeCall(request);
}

public BrAPIObservationUnitHierarchyLevel createLevelName(Program program,
String programDbId,
String levelName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import org.breedinginsight.model.DownloadFile;
import org.breedinginsight.model.Program;
import org.breedinginsight.model.*;
import org.breedinginsight.model.delta.DeltaEntityFactory;
import org.breedinginsight.model.delta.Experiment;
import org.breedinginsight.services.TraitService;
import org.breedinginsight.services.exceptions.AlreadyExistsException;
import org.breedinginsight.services.exceptions.DoesNotExistException;
Expand Down Expand Up @@ -79,6 +81,7 @@ public class BrAPITrialService {
private final DistributedLockService lockService;
private static final String SHEET_NAME = "Data";
private final DatasetService datasetService;
private final DeltaEntityFactory deltaEntityFactory;
private final BrAPIObservationLevelService observationLevelService;

@Inject
Expand All @@ -96,6 +99,7 @@ public BrAPITrialService(@Property(name = "brapi.server.reference-source") Strin
FileMappingUtil fileMappingUtil,
DistributedLockService lockService,
DatasetService datasetService,
DeltaEntityFactory deltaEntityFactory,
BrAPIObservationLevelService observationLevelService) {

this.referenceSource = referenceSource;
Expand All @@ -112,6 +116,7 @@ public BrAPITrialService(@Property(name = "brapi.server.reference-source") Strin
this.fileMappingUtil = fileMappingUtil;
this.lockService = lockService;
this.datasetService = datasetService;
this.deltaEntityFactory = deltaEntityFactory;
this.observationLevelService = observationLevelService;
}

Expand Down Expand Up @@ -430,6 +435,35 @@ public List<DatasetMetadata> getDatasetsMetadata(Program program, UUID experimen
return datasets;
}

/**
* Returns list of recommended sub entity names based on observation levels for the program that exclude
* level names already used in the experiment and is deduplicated for same name at multiple levels
* @param program Program
* @param experimentId Experiment Id
* @return list of dataset name recommendations
* @throws DoesNotExistException If trial does not exist
* @throws ApiException If BrAPI trial retrieval fails
*/
public List<String> getRecommendedSubEntityDatasetNames(Program program, UUID experimentId) throws DoesNotExistException, ApiException {
BrAPITrial experiment = trialDAO.getTrialById(program.getId(), experimentId).orElseThrow(() -> new DoesNotExistException("Trial does not exist"));
Experiment deltaExperiment = deltaEntityFactory.makeExperimentBean(experiment);
// set to eliminate possible duplicates like plant for exp unit and sub unit
Set<String> currentExperimentDatasetNames = deltaExperiment.getDatasetsMetadata()
.stream()
.map(DatasetMetadata::getName)
.filter(Objects::nonNull)
.map(String::toLowerCase)
.collect(Collectors.toSet());

return getProgramObservationLevelNames(program).stream()
.filter(Objects::nonNull)
.map(String::toLowerCase)
.filter(name -> !currentExperimentDatasetNames.contains(name))
.distinct()
.sorted()
.collect(Collectors.toList());
}

/**
* Creates sub-entity dataset
* TODO: Handle compensating transactions in event of failure. Currently brapi server does not support
Expand Down Expand Up @@ -796,6 +830,12 @@ public int deleteExperiment(Program program, UUID experimentId, boolean hard) th
return existingObservations.size();
}

private List<String> getProgramObservationLevelNames(Program program) {
String programDbId = program.getBrapiProgram() != null ? program.getBrapiProgram().getProgramDbId() : null;
List<BrAPIObservationUnitHierarchyLevel> levelNames = observationLevelService.getProgrammaticLevelNames(program, programDbId);
return levelNames.stream().map(BrAPIObservationUnitHierarchyLevel::getLevelName).collect(Collectors.toList());
}

private Map<String, Object> createExportRow(
BrAPITrial experiment,
Program program,
Expand Down
Loading
Loading