Skip to content

Commit 38a0272

Browse files
authored
Merge pull request plantbreeding#11 from plantbreeding/obs-opts
Observation and ObservationUnits Optimizations
2 parents 7498f44 + 3862f76 commit 38a0272

22 files changed

+508
-128
lines changed

src/main/java/org/brapi/test/BrAPITestServer/controller/pheno/ObservationsApiController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public ResponseEntity<ObservationSingleResponse> observationsObservationDbIdPut(
121121
log.debug("Request: " + request.getRequestURI());
122122
validateSecurityContext(request, "ROLE_USER");
123123
validateAcceptHeader(request);
124-
Observation data = observationService.updateObservation(observationDbId, body);
124+
Observation data = observationService.updateObservationAndConvert(observationDbId, body);
125125
return responseOK(new ObservationSingleResponse(), data);
126126
}
127127

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.brapi.test.BrAPITestServer.model.dto;
2+
3+
import java.util.UUID;
4+
5+
public class ObservationUnitGermplasmData {
6+
private String germplasmDbId;
7+
private String germplasmName;
8+
9+
public ObservationUnitGermplasmData(String germplasmDbId,
10+
String germplasmName) {
11+
this.germplasmDbId = germplasmDbId;
12+
this.germplasmName = germplasmName;
13+
}
14+
15+
public String getGermplasmDbId() {
16+
return germplasmDbId;
17+
}
18+
19+
public void setGermplasmDbId(String germplasmDbId) {
20+
this.germplasmDbId = germplasmDbId;
21+
}
22+
23+
public String getGermplasmName() {
24+
return germplasmName;
25+
}
26+
27+
public void setGermplasmName(String germplasmName) {
28+
this.germplasmName = germplasmName;
29+
}
30+
}

src/main/java/org/brapi/test/BrAPITestServer/model/entity/core/ExperimentalDesignEntity.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,12 @@
33
import jakarta.persistence.*;
44
import org.brapi.test.BrAPITestServer.model.entity.BrAPIBaseEntity;
55

6-
@Entity
7-
@Table(name = "study_experimental_design")
8-
public class ExperimentalDesignEntity extends BrAPIBaseEntity {
9-
@Column
6+
@Embeddable
7+
public class ExperimentalDesignEntity {
8+
@Column(name = "pui", table = "study_experimental_design")
109
private String PUI;
11-
@Column
10+
@Column(name = "description", table = "study_experimental_design")
1211
private String description;
13-
@OneToOne(fetch = FetchType.LAZY)
14-
private StudyEntity study;
15-
16-
public StudyEntity getStudy() {
17-
return study;
18-
}
19-
20-
public void setStudy(StudyEntity study) {
21-
this.study = study;
22-
}
2312

2413
public String getPUI() {
2514
return PUI;

src/main/java/org/brapi/test/BrAPITestServer/model/entity/core/GrowthFacilityEntity.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,12 @@
33
import jakarta.persistence.*;
44
import org.brapi.test.BrAPITestServer.model.entity.BrAPIBaseEntity;
55

6-
@Entity
7-
@Table(name = "study_growth_facility")
8-
public class GrowthFacilityEntity extends BrAPIBaseEntity {
9-
@Column
6+
@Embeddable
7+
public class GrowthFacilityEntity {
8+
@Column(name = "pui", table = "study_growth_facility")
109
private String PUI;
11-
@Column
10+
@Column(name = "description", table = "study_growth_facility")
1211
private String description;
13-
@OneToOne(fetch = FetchType.LAZY)
14-
private StudyEntity study;
15-
16-
public StudyEntity getStudy() {
17-
return study;
18-
}
19-
20-
public void setStudy(StudyEntity study) {
21-
this.study = study;
22-
}
2312

2413
public String getPUI() {
2514
return PUI;

src/main/java/org/brapi/test/BrAPITestServer/model/entity/core/StudyEntity.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212

1313
@Entity
1414
@Table(name = "study")
15+
@SecondaryTables({
16+
@SecondaryTable(name = "study_experimental_design", pkJoinColumns = @PrimaryKeyJoinColumn(name = "study_id")),
17+
@SecondaryTable(name = "study_growth_facility", pkJoinColumns = @PrimaryKeyJoinColumn(name = "study_id")),
18+
@SecondaryTable(name = "study_last_update", pkJoinColumns = @PrimaryKeyJoinColumn(name = "study_id"))
19+
})
1520
@Where(clause = "soft_deleted = false")
1621
public class StudyEntity extends BrAPIPrimaryEntity {
1722

@@ -32,11 +37,11 @@ public class StudyEntity extends BrAPIPrimaryEntity {
3237
private Date endDate;
3338
@OneToMany(mappedBy = "study")
3439
private List<EnvironmentParametersEntity> environmentParameters;
35-
@OneToOne(mappedBy = "study", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
40+
@Embedded
3641
private ExperimentalDesignEntity experimentalDesign;
37-
@OneToOne(mappedBy = "study", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
42+
@Embedded
3843
private GrowthFacilityEntity growthFacility;
39-
@OneToOne(mappedBy = "study", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
44+
@Embedded
4045
private StudyLastUpdateEntity lastUpdate;
4146
@Column
4247
private String license;

src/main/java/org/brapi/test/BrAPITestServer/model/entity/core/StudyLastUpdateEntity.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,12 @@
55

66
import java.util.Date;
77

8-
@Entity
9-
@Table(name = "study_last_update")
10-
public class StudyLastUpdateEntity extends BrAPIBaseEntity {
11-
@Column
8+
@Embeddable
9+
public class StudyLastUpdateEntity {
10+
@Column(name = "timestamp", table = "study_last_update")
1211
private Date timestamp;
13-
@Column
12+
@Column(name = "version", table = "study_last_update")
1413
private String version;
15-
@OneToOne(fetch = FetchType.LAZY)
16-
private StudyEntity study;
17-
18-
public StudyEntity getStudy() {
19-
return study;
20-
}
21-
22-
public void setStudy(StudyEntity study) {
23-
this.study = study;
24-
}
2514

2615
public Date getTimestamp() {
2716
return timestamp;

src/main/java/org/brapi/test/BrAPITestServer/model/entity/pheno/ObservationUnitEntity.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.brapi.test.BrAPITestServer.model.entity.germ.CrossEntity;
1111
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmEntity;
1212
import org.brapi.test.BrAPITestServer.model.entity.germ.SeedLotEntity;
13+
import org.hibernate.annotations.BatchSize;
1314
import org.hibernate.annotations.Where;
1415

1516
import java.util.List;
@@ -28,6 +29,7 @@ public class ObservationUnitEntity extends BrAPIPrimaryEntity {
2829
private String observationUnitPUI;
2930
@ManyToOne(fetch = FetchType.LAZY)
3031
private SeedLotEntity seedLot;
32+
@BatchSize(size = 50)
3133
@OneToMany(mappedBy="observationUnit", cascade=CascadeType.ALL)
3234
private List<TreatmentEntity> treatments;
3335
@OneToOne(mappedBy="observationUnit", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@@ -40,6 +42,7 @@ public class ObservationUnitEntity extends BrAPIPrimaryEntity {
4042
private TrialEntity trial;
4143
@ManyToOne(fetch = FetchType.LAZY)
4244
private StudyEntity study;
45+
@BatchSize(size = 50)
4346
@OneToMany(mappedBy="observationUnit", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
4447
private List<ObservationEntity> observations;
4548

src/main/java/org/brapi/test/BrAPITestServer/repository/BrAPIRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.Serializable;
44
import java.util.List;
55
import java.util.Optional;
6+
import java.util.UUID;
67

78
import org.brapi.test.BrAPITestServer.exceptions.InvalidPagingException;
89
import org.brapi.test.BrAPITestServer.model.entity.BrAPIPrimaryEntity;
@@ -30,7 +31,7 @@ public interface BrAPIRepository<T extends BrAPIPrimaryEntity, ID extends Serial
3031

3132
public <S extends T> void refresh(S entity);
3233

33-
public void fetchXrefs(Page<T> page, Class<T> searchClass) throws InvalidPagingException;
34+
public void fetchXrefs(List<UUID> page, Page<T> pagedEntities, Class<T> searchClass) throws InvalidPagingException;
3435

3536
List<T> findByIdIn(List<ID> ids);
3637
}

src/main/java/org/brapi/test/BrAPITestServer/repository/BrAPIRepositoryImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.brapi.test.BrAPITestServer.exceptions.InvalidPagingException;
1515
import org.brapi.test.BrAPITestServer.model.entity.BrAPIPrimaryEntity;
1616
import org.brapi.test.BrAPITestServer.model.entity.ExternalReferenceEntity;
17+
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmEntity;
1718
import org.brapi.test.BrAPITestServer.service.SearchQueryBuilder;
1819
import org.brapi.test.BrAPITestServer.service.SecurityUtils;
1920

@@ -141,17 +142,17 @@ public <S extends T> void refresh(S entity) {
141142
this.entityManager.refresh(entity);
142143
}
143144

144-
public void fetchXrefs(Page<T> page, Class<T> searchClass) throws InvalidPagingException {
145-
SearchQueryBuilder<T> searchQuery = new SearchQueryBuilder<T>(searchClass);
145+
public void fetchXrefs(List<UUID> ids, Page<T> pagedEntities, Class<T> searchClass) {
146+
SearchQueryBuilder<T> searchQuery = new SearchQueryBuilder<>(searchClass);
146147
searchQuery.leftJoinFetch("externalReferences", "externalReferences")
147-
.appendList(page.stream().map(p -> p.getId().toString()).collect(Collectors.toList()), "id");
148+
.appendIds(ids);
148149

149-
Page<T> xrefs = findAllBySearchAndPaginate(searchQuery, PageRequest.of(0, page.getSize()));
150+
List<T> xrefs = findAllBySearch(searchQuery);
150151

151152
Map<UUID, List<ExternalReferenceEntity>> xrefByEntity = new HashMap<>();
152153
xrefs.forEach(entity -> xrefByEntity.put(entity.getId(), entity.getExternalReferences()));
153154

154-
page.forEach(entity -> entity.setExternalReferences(xrefByEntity.get(entity.getId())));
155+
pagedEntities.forEach(entity -> entity.setExternalReferences(xrefByEntity.get(entity.getId())));
155156
}
156157

157158
private void applyUserId(SearchQueryBuilder<T> searchQuery) {

src/main/java/org/brapi/test/BrAPITestServer/repository/pheno/ObservationUnitRepository.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,24 @@
22

33
import org.brapi.test.BrAPITestServer.model.entity.pheno.ObservationUnitEntity;
44
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
5+
import org.springframework.data.jpa.repository.NativeQuery;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
58

9+
import java.util.List;
610
import java.util.UUID;
711

812
public interface ObservationUnitRepository extends BrAPIRepository<ObservationUnitEntity, UUID> {
13+
@Query("SELECT ou from ObservationUnitEntity ou " +
14+
"LEFT JOIN FETCH ou.position " +
15+
"WHERE ou.id IN :ids")
16+
List<ObservationUnitEntity> findByIds(@Param("ids") List<String> ids);
917

18+
@NativeQuery(
19+
"SELECT ou.id, g.id, g.germplasm_name " +
20+
"FROM observation_unit ou " +
21+
"JOIN germplasm g ON g.id = ou.germplasm_id " +
22+
"WHERE ou.id IN :ouIds"
23+
)
24+
List<Object[]> fetchGermplasmDataForOUs(@Param("ouIds") List<UUID> ouIds);
1025
}

0 commit comments

Comments
 (0)