Skip to content

Commit 5503404

Browse files
committed
Changes to support filtering/sorting for germplasm
- Additional changes made to support sorting by numbers, especially for additionalInfo fields - Bugs fixed when left join fetches were made but filters were required for specific fields
1 parent 1ec9363 commit 5503404

5 files changed

Lines changed: 70 additions & 15 deletions

File tree

‎src/main/java/io/swagger/model/germ/GermplasmSearchRequest.java‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,34 @@
33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.fasterxml.jackson.annotation.JsonProperty;
55
import io.swagger.model.SearchRequest;
6+
import org.brapi.test.BrAPITestServer.model.dto.EntityColumnNameAndType;
7+
import org.brapi.test.BrAPITestServer.model.dto.EntityType;
68

79
import java.util.ArrayList;
810
import java.util.List;
11+
import java.util.Map;
912
import java.util.Objects;
1013

1114
public class GermplasmSearchRequest extends SearchRequest {
15+
16+
// Key - allowed sort or field filter name for this entity
17+
// Value = entity field name and type that represents the submitted field. Used later on in query building.
18+
private static final Map<String, EntityColumnNameAndType> ALLOWED_SORT_AND_FILTER_FIELDS =
19+
Map.ofEntries(
20+
// accessionNumber = GID for DeltaBreed
21+
Map.entry("accessionNumber", new EntityColumnNameAndType("accessionNumber", EntityType.NUMBER)),
22+
Map.entry("defaultDisplayName", new EntityColumnNameAndType("defaultDisplayName", EntityType.TEXT)),
23+
Map.entry("breedingMethod", new EntityColumnNameAndType("methodName", EntityType.TEXT)),
24+
Map.entry("seedSource", new EntityColumnNameAndType("seedSource", EntityType.TEXT)),
25+
Map.entry("pedigree",new EntityColumnNameAndType("pedigree.pedigreeString", EntityType.TEXT)),
26+
Map.entry("femaleParentGID", new EntityColumnNameAndType("femaleParentGid", EntityType.NUMBER)),
27+
Map.entry("maleParentGID", new EntityColumnNameAndType("maleParentGid", EntityType.NUMBER)),
28+
Map.entry("createdDate", new EntityColumnNameAndType("createdDate", EntityType.TEXT)),
29+
Map.entry("createdBy", new EntityColumnNameAndType("createdBy", EntityType.TEXT)),
30+
Map.entry("importEntryNumber", new EntityColumnNameAndType("importEntryNumber", EntityType.NUMBER)),
31+
Map.entry("synonyms", new EntityColumnNameAndType("*synonyms.synonym", EntityType.TEXT))
32+
);
33+
1234
@JsonProperty("accessionNumbers")
1335
private List<String> accessionNumbers = null;
1436

@@ -621,4 +643,9 @@ public Integer getTotalParameterCount() {
621643

622644
return count;
623645
}
646+
647+
@Override
648+
public Map<String, EntityColumnNameAndType> getEntityColAndTypeBySubmittedNameMap() {
649+
return ALLOWED_SORT_AND_FILTER_FIELDS;
650+
}
624651
}

‎src/main/java/org/brapi/test/BrAPITestServer/model/dto/EntityType.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
public enum EntityType {
44
TEXT,
55
UUID,
6-
BOOLEAN
6+
BOOLEAN,
7+
// Sorting is done at the database schema/formula level for numbers. See GermplasmEntity.maleParentGid. No changes to filtering required for this datatype.
8+
NUMBER
79
// Add any other entity data types we should filter different in SearchQueryBuilder here
810
}

‎src/main/java/org/brapi/test/BrAPITestServer/model/entity/germ/GermplasmEntity.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.brapi.test.BrAPITestServer.model.entity.pheno.TaxonEntity;
1616

1717
import org.hibernate.annotations.BatchSize;
18+
import org.hibernate.annotations.Formula;
1819
import org.hibernate.annotations.Where;
1920

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

104+
@Formula("(additional_info #>> '{createdDate}')")
105+
private String createdDate;
106+
107+
@Formula("(additional_info #>> '{createdBy,userName}')")
108+
private String createdBy;
109+
110+
@Formula("(additional_info #>> '{breedingMethod}')")
111+
private String methodName;
112+
113+
@Formula("cast(additional_info #>> '{femaleParentGid}' AS INTEGER)")
114+
private Integer femaleParentGid;
115+
116+
@Formula("cast(additional_info #>> '{maleParentGid}' AS INTEGER)")
117+
private Integer maleParentGid;
118+
119+
@Formula("cast(additional_info #>> '{importEntryNumber}' AS INTEGER)")
120+
private Integer importEntryNumber;
121+
103122
public GermplasmInstituteEntity getHostInstitute() {
104123
if (getInstitutes() != null) {
105124
for (GermplasmInstituteEntity institute : getInstitutes()) {

‎src/main/java/org/brapi/test/BrAPITestServer/service/SearchQueryBuilder.java‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,7 @@ public String getQuery() {
4646
}
4747

4848
public String getIdQuery() {
49-
if (sortClause.isEmpty()) {
50-
// By default, sort on entity id to have query result remain idempotent
51-
sortClause = defaultSort;
52-
}
53-
54-
return selectOnlyIds + whereClause + sortClause;
49+
return selectOnlyIds + whereClause;
5550
}
5651

5752
public Map<String, Object> getParams() {
@@ -150,7 +145,8 @@ public SearchQueryBuilder<T> appendLike(String like, String columnName) {
150145
return this;
151146
}
152147

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

156152
if (like != null) {
@@ -290,6 +286,8 @@ public SearchQueryBuilder<T> join(String join, String name) {
290286
this.selectClause += "JOIN " + entityPrefix(join) + " " + paramFilter(name) + " ";
291287
this.selectOnlyIds += "JOIN " + entityPrefix(join) + " " + paramFilter(name) + " ";
292288
this.joinedTables.add(join);
289+
} else if (joinedFetchedTables.contains(join) && !this.joinedTables.contains(join)) {
290+
this.selectOnlyIds += "JOIN " + entityPrefix(join) + " " + paramFilter(name) + " ";
293291
}
294292
return this;
295293
}
@@ -416,6 +414,12 @@ public SearchQueryBuilder<T> sortBy(List<SortBy> sortBy, Map<String, EntityColum
416414
return this;
417415
}
418416

417+
// Used to continue utilizing the same search query, like in GermplasmService fetching without pagination use case
418+
public SearchQueryBuilder<T> resetSortClause() {
419+
this.sortClause = "";
420+
return this;
421+
}
422+
419423
private void buildSort(SortBy sort) {
420424
this.sortClause += entityPrefix(sort.getSortedOn()) + " " + sort.getSortOrder() + " ";
421425
}
@@ -446,8 +450,8 @@ public SearchQueryBuilder<T> filterBy(List<FilterBy> filterBy, Map<String, Entit
446450

447451
if (entityColumnNameAndType.getEntityType() == EntityType.TEXT) {
448452
searchQuery = appendLike(filter.getValue().toLowerCase(), entityColumnNameAndType.getEntityColumnName());
449-
} else if (entityColumnNameAndType.getEntityType() == EntityType.UUID) {
450-
searchQuery = appendLikeIDs(filter.getValue(), entityColumnNameAndType.getEntityColumnName());
453+
} else if (entityColumnNameAndType.getEntityType() == EntityType.UUID || entityColumnNameAndType.getEntityType() == EntityType.NUMBER) {
454+
searchQuery = appendLikeString(filter.getValue(), entityColumnNameAndType.getEntityColumnName());
451455
}
452456
}
453457

‎src/main/java/org/brapi/test/BrAPITestServer/service/germ/GermplasmService.java‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public List<Germplasm> findGermplasm(@Valid GermplasmSearchRequest request, Meta
117117
return germplasms;
118118
}
119119

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

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

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

173-
private SearchQueryBuilder<GermplasmEntity> buildGermplasmSearchQuery(GermplasmSearchRequest request) {
173+
private SearchQueryBuilder<GermplasmEntity> buildGermplasmSearchQuery(GermplasmSearchRequest request) throws BrAPIServerException {
174174
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
175175
GermplasmEntity.class);
176176
searchQuery.leftJoinFetch("synonyms", "synonyms")
@@ -207,7 +207,9 @@ private SearchQueryBuilder<GermplasmEntity> buildGermplasmSearchQuery(GermplasmS
207207
// .appendList(request.getProgenyDbIds(), "*progeny.germplasmDbId")
208208
.appendList(request.getGenus(), "genus").appendList(request.getSpecies(), "species")
209209
.appendNamesList(request.getBinomialNames(), "genus", "genus", "species")
210-
.appendList(request.getFamilyCodes(), "familyCode");
210+
.appendList(request.getFamilyCodes(), "familyCode")
211+
.filterBy(request.getFilterBy(), request.getEntityColAndTypeBySubmittedNameMap())
212+
.sortBy(request.getSortByElements(), request.getEntityColAndTypeBySubmittedNameMap());
211213
return searchQuery;
212214
}
213215

@@ -339,7 +341,8 @@ private void fetchRemainingGermCollectionsUsingQuery(SearchQueryBuilder<Germplas
339341
.removeLeftJoinFetch("breedingMethod", "breedingMethod")
340342
.removeLeftJoinFetch("crop", "crop")
341343
.removeLeftJoinFetch("pedigree", "pedigree")
342-
.removeLeftJoinFetch("*pedigree.crossingProject", "crossingProject");
344+
.removeLeftJoinFetch("*pedigree.crossingProject", "crossingProject")
345+
.resetSortClause();
343346
// Fetch xrefs
344347
log.debug("Fetching xrefs");
345348
searchQuery.leftJoinFetch("externalReferences",

0 commit comments

Comments
 (0)