diff --git a/src/main/java/com/example/demo/repository/PhaseLevelRepository.java b/src/main/java/com/example/demo/repository/PhaseLevelRepository.java index 99ac0f35ee33a7263eacf14322d508ca2a433b4b..f71587d1ca678c15d6c9d89a240505f1e8d070a1 100644 --- a/src/main/java/com/example/demo/repository/PhaseLevelRepository.java +++ b/src/main/java/com/example/demo/repository/PhaseLevelRepository.java @@ -5,8 +5,12 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; + public interface PhaseLevelRepository extends JpaRepository<PhaseLevel, Long> { @Query("SELECT COUNT(p.id) FROM PhaseLevel p WHERE p.trainingDefinitionId = :trainingDefinitionId") int getNumberOfExistingPhases(@Param("trainingDefinitionId") Long trainingDefinitionId); + + List<PhaseLevel> findAllByTrainingDefinitionIdOrderByOrder(Long trainingDefinitionId); } diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java index 135b035b5bbd89c1bb4de317e75f720386c15ccc..77e81f7bfc5fc0edca6c5ef2bb9d1fef79fc0b5e 100644 --- a/src/main/java/com/example/demo/service/LevelOperationsService.java +++ b/src/main/java/com/example/demo/service/LevelOperationsService.java @@ -74,11 +74,10 @@ public class LevelOperationsService { return; } - // TODO change decision matrix - levelFrom.get().setOrder(newPosition); - baseLevelRepository.save(levelFrom.get()); + + phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.get().getTrainingDefinitionId()); } @Transactional diff --git a/src/main/java/com/example/demo/service/PhaseLevelService.java b/src/main/java/com/example/demo/service/PhaseLevelService.java index 5b869dc11b90c302e6393354ae7342007a9aebde..c8f8c020f4a68a89d390b8e2dcf3b38d7f91795e 100644 --- a/src/main/java/com/example/demo/service/PhaseLevelService.java +++ b/src/main/java/com/example/demo/service/PhaseLevelService.java @@ -13,8 +13,11 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; @Service public class PhaseLevelService { @@ -63,6 +66,14 @@ public class PhaseLevelService { return BeanMapper.INSTANCE.toDto(savedEntity); } + public void alignDecisionMatrixForPhasesInTrainingDefinition(Long trainingDefinitionId) { + List<PhaseLevel> phaseLevels = phaseLevelRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId); + + for (PhaseLevel phaseLevel : phaseLevels) { + alignDecisionMatrixForPhase(phaseLevel); + } + } + private List<DecisionMatrixRow> prepareDefaultDecisionMatrix(Long trainingDefinitionId, PhaseLevel phaseLevel) { List<DecisionMatrixRow> result = new ArrayList<>(); @@ -79,4 +90,54 @@ public class PhaseLevelService { return result; } + + private void alignDecisionMatrixForPhase(PhaseLevel phaseLevel) { + if (Objects.isNull(phaseLevel)) { + return; + } + + int numberOfRows = 0; + if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) { + numberOfRows = phaseLevel.getDecisionMatrix().size(); + } + + final int expextedNumberOfRows = phaseLevel.getOrder() + 1; + + if (numberOfRows == expextedNumberOfRows) { + return; + } else if (numberOfRows < expextedNumberOfRows) { + List<DecisionMatrixRow> newDecisionMatrixRows = getNewDecisionMatrixRows(numberOfRows, expextedNumberOfRows, phaseLevel); + phaseLevel.getDecisionMatrix().addAll(newDecisionMatrixRows); + } else { + List<DecisionMatrixRow> neededDecisionMatrixRows = getOnlyNeededDecisionMatrixRows(expextedNumberOfRows, phaseLevel); + + phaseLevel.getDecisionMatrix().clear(); + phaseLevel.getDecisionMatrix().addAll(neededDecisionMatrixRows); + } + + phaseLevelRepository.save(phaseLevel); + } + + private List<DecisionMatrixRow> getNewDecisionMatrixRows(int currentNumberOfNewRows, int expectedNumberOfRows, PhaseLevel phaseLevel) { + List<DecisionMatrixRow> result = new ArrayList<>(); + for (int i = currentNumberOfNewRows; i < expectedNumberOfRows; i++) { + DecisionMatrixRow decisionMatrixRow = new DecisionMatrixRow(); + decisionMatrixRow.setPhaseLevel(phaseLevel); + decisionMatrixRow.setOrder(i); + + result.add(decisionMatrixRow); + } + + return result; + } + + private List<DecisionMatrixRow> getOnlyNeededDecisionMatrixRows(int expectedNumberOfRows, PhaseLevel phaseLevel) { + List<DecisionMatrixRow> decisionMatrix = phaseLevel.getDecisionMatrix(); + + return decisionMatrix.stream() + .sorted(Comparator.comparingInt(DecisionMatrixRow::getOrder)) + .limit(expectedNumberOfRows) + .collect(Collectors.toList()); + + } }