diff --git a/oracle-api/src/main/java/ca/bc/gov/oracleapi/entity/projection/ParentTreePropsProj.java b/oracle-api/src/main/java/ca/bc/gov/oracleapi/entity/projection/ParentTreePropsProj.java new file mode 100644 index 000000000..f65887a26 --- /dev/null +++ b/oracle-api/src/main/java/ca/bc/gov/oracleapi/entity/projection/ParentTreePropsProj.java @@ -0,0 +1,11 @@ +package ca.bc.gov.oracleapi.entity.projection; + +/** This projection consists of a mix of joined column from various tables. */ +public interface ParentTreePropsProj { + + Long getParentTreeId(); + + String getParentTreeNumber(); + + Character getTested(); +} diff --git a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeGeneticQualityRepository.java b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeGeneticQualityRepository.java index f335dc54f..60ddaabc5 100644 --- a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeGeneticQualityRepository.java +++ b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeGeneticQualityRepository.java @@ -37,4 +37,7 @@ List findAllByListOfSpuAndId( String geneticTypeCode, List spuList, List parentTreeIdList); + + @Query("from ParentTreeGeneticQuality where parentTreeId in ?1 and seedPlanningUnitId in ?2 and toBeUsedInCalculations = true") + List findAllGenQualityProps(List parentIds, List spuIds); } diff --git a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeOrchardRepository.java b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeOrchardRepository.java index 21f345413..feb42caff 100644 --- a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeOrchardRepository.java +++ b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeOrchardRepository.java @@ -10,4 +10,6 @@ public interface ParentTreeOrchardRepository extends JpaRepository { List findByIdOrchardId(String orchardId); + + List findAllById_parentTreeIdIn(List parentTreeIds); } diff --git a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeRepository.java b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeRepository.java index 82ce715af..ff358a2c7 100644 --- a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeRepository.java +++ b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeRepository.java @@ -2,6 +2,8 @@ import ca.bc.gov.oracleapi.entity.ParentTreeEntity; import ca.bc.gov.oracleapi.entity.projection.ParentTreeProj; +import ca.bc.gov.oracleapi.entity.projection.ParentTreePropsProj; + import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -13,26 +15,60 @@ public interface ParentTreeRepository extends JpaRepository findAllParentTreeWithVegCode(String vegCode); + + @Query("select pt.id, pt.parentTreeNumber, pt.tested from ParentTreeEntity pt where pt.vegetationCode = ?1") + List findAllParentTreePropsForVegCode(String vegCode); } diff --git a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeSpuRepository.java b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeSpuRepository.java index c29670bcb..bfd34eea1 100644 --- a/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeSpuRepository.java +++ b/oracle-api/src/main/java/ca/bc/gov/oracleapi/repository/ParentTreeSpuRepository.java @@ -10,4 +10,6 @@ public interface ParentTreeSpuRepository extends JpaRepository { List findByIdSpuIdIn(List spuId); + + List findAllById_parentTreeIdIn(List parentTreeIds); } diff --git a/oracle-api/src/main/java/ca/bc/gov/oracleapi/service/ParentTreeService.java b/oracle-api/src/main/java/ca/bc/gov/oracleapi/service/ParentTreeService.java index 70b9cea36..385473c6a 100644 --- a/oracle-api/src/main/java/ca/bc/gov/oracleapi/service/ParentTreeService.java +++ b/oracle-api/src/main/java/ca/bc/gov/oracleapi/service/ParentTreeService.java @@ -8,12 +8,24 @@ import ca.bc.gov.oracleapi.dto.ParentTreeGeoNodeDto; import ca.bc.gov.oracleapi.dto.ParentTreeNodeDto; import ca.bc.gov.oracleapi.entity.ParentTreeEntity; +import ca.bc.gov.oracleapi.entity.ParentTreeGeneticQuality; +import ca.bc.gov.oracleapi.entity.ParentTreeOrchard; +import ca.bc.gov.oracleapi.entity.ParentTreeSpuEntity; import ca.bc.gov.oracleapi.entity.projection.ParentTreeProj; +import ca.bc.gov.oracleapi.entity.projection.ParentTreePropsProj; +import ca.bc.gov.oracleapi.repository.ParentTreeGeneticQualityRepository; +import ca.bc.gov.oracleapi.repository.ParentTreeOrchardRepository; import ca.bc.gov.oracleapi.repository.ParentTreeRepository; +import ca.bc.gov.oracleapi.repository.ParentTreeSpuRepository; + +import java.time.Instant; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Optional; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; @@ -27,6 +39,12 @@ public class ParentTreeService { private final ParentTreeRepository parentTreeRepository; + private final ParentTreeSpuRepository parentTreeSpuRepository; + + private final ParentTreeOrchardRepository parentTreeOrchardRepository; + + private final ParentTreeGeneticQualityRepository parentTreeGeneticQualityRepository; + private static final Integer MAX_LEVELS = 5; /** @@ -187,6 +205,15 @@ private boolean parentTreeListHasAnyElevationMissing(List list return list.stream().filter(tree -> tree.getElevation() == null).count() > 0; } + private String milliToFmt(long milli) { + Duration duration = Duration.ofMillis(milli); + long HH = duration.toHours(); + long MM = duration.toMinutesPart(); + long SS = duration.toSecondsPart(); + long MS = duration.toMillisPart(); + return String.format("%02d:%02d:%02d:%04d", HH, MM, SS, MS); + } + /** * Find all parent trees under a vegCode. * @@ -199,9 +226,41 @@ public Map findParentTreesWithVegCode(String veg Map ptMap = new HashMap<>(); // Step 1: Get all the parent trees under a species + /* Ric 1: Parent tree props - id, number, tested */ + long start = Instant.now().toEpochMilli(); + List ptProps = parentTreeRepository.findAllParentTreePropsForVegCode(vegCode); + List ptIdList = ptProps.stream().map(ParentTreePropsProj::getParentTreeId).toList(); + long ending = Instant.now().toEpochMilli(); + SparLog.info("Time elapsed for step 1: {}", milliToFmt(ending - start)); + + /* Ric 2: Parent Tree SPU props - spu id, parent tree id */ + start = Instant.now().toEpochMilli(); + List spuProps = parentTreeSpuRepository.findAllById_parentTreeIdIn(ptIdList); + spuProps.sort((o1, o2) -> o1.getId().getSpuId().compareTo(o2.getId().getSpuId())); + Set spuIds = new HashSet<>(spuProps.stream().map((p) -> p.getId().getSpuId()).toList()); + ending = Instant.now().toEpochMilli(); + SparLog.info("Time elapsed for step 2: {}", milliToFmt(ending - start)); + + /* Ric 3: Orchards */ + start = Instant.now().toEpochMilli(); + List orchardProps = parentTreeOrchardRepository.findAllById_parentTreeIdIn(ptIdList); + orchardProps.sort((o1, o2) -> o1.getId().getOrchardId().compareTo(o2.getId().getOrchardId())); + ending = Instant.now().toEpochMilli(); + SparLog.info("Time elapsed for step 3: {}", milliToFmt(ending - start)); + + /* Ric 4: Parent Tree */ + start = Instant.now().toEpochMilli(); + List genQualityProps = parentTreeGeneticQualityRepository.findAllGenQualityProps(ptIdList, spuIds.stream().toList()); + ending = Instant.now().toEpochMilli(); + SparLog.info("Time elapsed for step 3: {}", milliToFmt(ending - start)); + + start = Instant.now().toEpochMilli(); List parentTreesProjList = parentTreeRepository.findAllParentTreeWithVegCode(vegCode); + ending = Instant.now().toEpochMilli(); + SparLog.info("Time elapsed for old query: {}", milliToFmt(ending - start)); + YesNoConverter yesNoConverter = new YesNoConverter(); // Step 2: Aggregate by parent tree number