Skip to content
Open
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
27 changes: 27 additions & 0 deletions src/main/java/io/swagger/model/germ/GermplasmSearchRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,34 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.model.SearchRequest;
import org.brapi.test.BrAPITestServer.model.dto.EntityColumnNameAndType;
import org.brapi.test.BrAPITestServer.model.dto.EntityType;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class GermplasmSearchRequest extends SearchRequest {

// Key - allowed sort or field filter name for this entity
// Value = entity field name and type that represents the submitted field. Used later on in query building.
private static final Map<String, EntityColumnNameAndType> ALLOWED_SORT_AND_FILTER_FIELDS =
Map.ofEntries(
// accessionNumber = GID for DeltaBreed
Map.entry("accessionNumber", new EntityColumnNameAndType("accessionNumber", EntityType.NUMBER)),
Map.entry("defaultDisplayName", new EntityColumnNameAndType("defaultDisplayName", EntityType.TEXT)),
Map.entry("breedingMethod", new EntityColumnNameAndType("methodName", EntityType.TEXT)),
Map.entry("seedSource", new EntityColumnNameAndType("seedSource", EntityType.TEXT)),
Map.entry("pedigree",new EntityColumnNameAndType("pedigree.pedigreeString", EntityType.TEXT)),
Map.entry("femaleParentGID", new EntityColumnNameAndType("femaleParentGid", EntityType.NUMBER)),
Map.entry("maleParentGID", new EntityColumnNameAndType("maleParentGid", EntityType.NUMBER)),
Map.entry("createdDate", new EntityColumnNameAndType("createdDate", EntityType.TEXT)),
Map.entry("createdBy", new EntityColumnNameAndType("createdBy", EntityType.TEXT)),
Map.entry("importEntryNumber", new EntityColumnNameAndType("importEntryNumber", EntityType.NUMBER)),
Map.entry("synonyms", new EntityColumnNameAndType("*synonyms.synonym", EntityType.TEXT))
);

@JsonProperty("accessionNumbers")
private List<String> accessionNumbers = null;

Expand Down Expand Up @@ -621,4 +643,9 @@ public Integer getTotalParameterCount() {

return count;
}

@Override
public Map<String, EntityColumnNameAndType> getEntityColAndTypeBySubmittedNameMap() {
return ALLOWED_SORT_AND_FILTER_FIELDS;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
public enum EntityType {
TEXT,
UUID,
BOOLEAN
BOOLEAN,
// Sorting is done at the database schema/formula level for numbers. See GermplasmEntity.maleParentGid. No changes to filtering required for this datatype.
NUMBER
// Add any other entity data types we should filter different in SearchQueryBuilder here
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.brapi.test.BrAPITestServer.model.entity.pheno.TaxonEntity;

import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.Formula;
import org.hibernate.annotations.Where;

import java.util.ArrayList;
Expand Down Expand Up @@ -100,6 +101,24 @@ public class GermplasmEntity extends BrAPIPrimaryEntity {
@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
private ProgramEntity program;

@Formula("(additional_info #>> '{createdDate}')")
private String createdDate;

@Formula("(additional_info #>> '{createdBy,userName}')")
private String createdBy;

@Formula("(additional_info #>> '{breedingMethod}')")
private String methodName;

@Formula("cast(additional_info #>> '{femaleParentGid}' AS INTEGER)")
private Integer femaleParentGid;

@Formula("cast(additional_info #>> '{maleParentGid}' AS INTEGER)")
private Integer maleParentGid;

@Formula("cast(additional_info #>> '{importEntryNumber}' AS INTEGER)")
private Integer importEntryNumber;

public GermplasmInstituteEntity getHostInstitute() {
if (getInstitutes() != null) {
for (GermplasmInstituteEntity institute : getInstitutes()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,7 @@ public String getQuery() {
}

public String getIdQuery() {
if (sortClause.isEmpty()) {
// By default, sort on entity id to have query result remain idempotent
sortClause = defaultSort;
}

return selectOnlyIds + whereClause + sortClause;
return selectOnlyIds + whereClause;
}

public Map<String, Object> getParams() {
Expand Down Expand Up @@ -150,7 +145,8 @@ public SearchQueryBuilder<T> appendLike(String like, String columnName) {
return this;
}

public SearchQueryBuilder<T> appendLikeIDs(String like, String columnName) {
// Used to convert non-string fields to string and use a like filter comparison
public SearchQueryBuilder<T> appendLikeString(String like, String columnName) {
String paramName = paramFilterPattern(columnName);

if (like != null) {
Expand Down Expand Up @@ -290,6 +286,8 @@ public SearchQueryBuilder<T> join(String join, String name) {
this.selectClause += "JOIN " + entityPrefix(join) + " " + paramFilter(name) + " ";
this.selectOnlyIds += "JOIN " + entityPrefix(join) + " " + paramFilter(name) + " ";
this.joinedTables.add(join);
} else if (joinedFetchedTables.contains(join) && !this.joinedTables.contains(join)) {
this.selectOnlyIds += "JOIN " + entityPrefix(join) + " " + paramFilter(name) + " ";
}
return this;
}
Expand Down Expand Up @@ -416,6 +414,12 @@ public SearchQueryBuilder<T> sortBy(List<SortBy> sortBy, Map<String, EntityColum
return this;
}

// Used to continue utilizing the same search query, like in GermplasmService fetching without pagination use case
public SearchQueryBuilder<T> resetSortClause() {
this.sortClause = "";
return this;
}

private void buildSort(SortBy sort) {
this.sortClause += entityPrefix(sort.getSortedOn()) + " " + sort.getSortOrder() + " ";
}
Expand Down Expand Up @@ -446,8 +450,8 @@ public SearchQueryBuilder<T> filterBy(List<FilterBy> filterBy, Map<String, Entit

if (entityColumnNameAndType.getEntityType() == EntityType.TEXT) {
searchQuery = appendLike(filter.getValue().toLowerCase(), entityColumnNameAndType.getEntityColumnName());
} else if (entityColumnNameAndType.getEntityType() == EntityType.UUID) {
searchQuery = appendLikeIDs(filter.getValue(), entityColumnNameAndType.getEntityColumnName());
} else if (entityColumnNameAndType.getEntityType() == EntityType.UUID || entityColumnNameAndType.getEntityType() == EntityType.NUMBER) {
searchQuery = appendLikeString(filter.getValue(), entityColumnNameAndType.getEntityColumnName());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public List<Germplasm> findGermplasm(@Valid GermplasmSearchRequest request, Meta
return germplasms;
}

public List<Germplasm> findGermplasmWithoutPaging(@Valid GermplasmSearchRequest request) {
public List<Germplasm> findGermplasmWithoutPaging(@Valid GermplasmSearchRequest request) throws BrAPIServerException {
List<GermplasmEntity> entities = findGermplasmEntitiesWithoutPaging(request);
return entities.stream().map(this::convertFromEntity).collect(Collectors.toList());
}
Expand Down Expand Up @@ -159,7 +159,7 @@ public Page<GermplasmEntity> findGermplasmEntities(@Valid GermplasmSearchRequest
}

// TODO: Investigate/consider removing this code. It is largely unused by DeltaBreed now, as paginating is the least memory exhaustive option. [BI-3020]
public List<GermplasmEntity> findGermplasmEntitiesWithoutPaging(@Valid GermplasmSearchRequest request) {
public List<GermplasmEntity> findGermplasmEntitiesWithoutPaging(@Valid GermplasmSearchRequest request) throws BrAPIServerException {
SearchQueryBuilder<GermplasmEntity> searchQuery = buildGermplasmSearchQuery(request);

List<GermplasmEntity> germs = germplasmRepository.findAllBySearch(searchQuery);
Expand All @@ -170,7 +170,7 @@ public List<GermplasmEntity> findGermplasmEntitiesWithoutPaging(@Valid Germplasm
return germs;
}

private SearchQueryBuilder<GermplasmEntity> buildGermplasmSearchQuery(GermplasmSearchRequest request) {
private SearchQueryBuilder<GermplasmEntity> buildGermplasmSearchQuery(GermplasmSearchRequest request) throws BrAPIServerException {
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
GermplasmEntity.class);
searchQuery.leftJoinFetch("synonyms", "synonyms")
Expand Down Expand Up @@ -207,7 +207,9 @@ private SearchQueryBuilder<GermplasmEntity> buildGermplasmSearchQuery(GermplasmS
// .appendList(request.getProgenyDbIds(), "*progeny.germplasmDbId")
.appendList(request.getGenus(), "genus").appendList(request.getSpecies(), "species")
.appendNamesList(request.getBinomialNames(), "genus", "genus", "species")
.appendList(request.getFamilyCodes(), "familyCode");
.appendList(request.getFamilyCodes(), "familyCode")
.filterBy(request.getFilterBy(), request.getEntityColAndTypeBySubmittedNameMap())
.sortBy(request.getSortByElements(), request.getEntityColAndTypeBySubmittedNameMap());
return searchQuery;
}

Expand Down Expand Up @@ -339,7 +341,8 @@ private void fetchRemainingGermCollectionsUsingQuery(SearchQueryBuilder<Germplas
.removeLeftJoinFetch("breedingMethod", "breedingMethod")
.removeLeftJoinFetch("crop", "crop")
.removeLeftJoinFetch("pedigree", "pedigree")
.removeLeftJoinFetch("*pedigree.crossingProject", "crossingProject");
.removeLeftJoinFetch("*pedigree.crossingProject", "crossingProject")
.resetSortClause();
// Fetch xrefs
log.debug("Fetching xrefs");
searchQuery.leftJoinFetch("externalReferences",
Expand Down
Loading