Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sort trajectories by creation date for /search endpoint #49

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.rte_france.antares.datamanager_back.dto.StudyDTO;
import com.rte_france.antares.datamanager_back.exception.BadRequestException;
import com.rte_france.antares.datamanager_back.service.StudyGeneratorService;
import com.rte_france.antares.datamanager_back.service.StudyService;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -38,7 +39,7 @@ public ResponseEntity<Page<StudyDTO>> searchStudies(
@RequestParam(value = "sortColumn", required = false) String sortColumn,
@RequestParam(value = "sortDirection", required = false) String sortDirection) {

Sort sorting = Sort.by(Sort.Direction.DESC,SORTING_CRITERION);
Sort sorting = Sort.by(Sort.Direction.DESC, SORTING_CRITERION);

if (sortColumn != null && !sortColumn.isEmpty() && !sortDirection.isEmpty()) {
Sort.Direction direction = Sort.Direction.fromString(sortDirection);
Expand Down Expand Up @@ -76,5 +77,4 @@ public ResponseEntity<Void> generateStudy(@RequestParam Integer id) throws JsonP
studyGeneratorService.callGenerateStudyService(id);
return new ResponseEntity<>(HttpStatus.CREATED);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
import org.springframework.data.domain.Page;

import java.util.Collections;
import java.util.Objects;

@Value
@Builder(toBuilder = true)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StudyMapper {

public static StudyDTO toStudyDTO(StudyEntity entity) {
Objects.requireNonNull(entity);
return StudyDTO.builder()
.id(entity.getId())
.name(entity.getName())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,17 @@ public interface TrajectoryRepository extends JpaRepository<TrajectoryEntity, In
@ExecutionTime
Optional<TrajectoryEntity> findFirstByFileNameOrderByVersionDesc(String fileName);


@Query("SELECT t FROM Trajectory t WHERE t.type = :type AND t.horizon= :horizon AND (t.fileName LIKE CONCAT('%', CONCAT(:fileNameStartsWith, '%')) OR :fileNameStartsWith IS NULL)")
@Query("SELECT t " +
"FROM Trajectory t " +
"WHERE t.creationDate IN (" +
"SELECT MAX(t1.creationDate) " +
"FROM Trajectory t1 " +
"WHERE t1.type = :type AND t1.horizon = :horizon AND (t1.fileName LIKE CONCAT('%', CONCAT(:fileNameStartsWith, '%')) OR :fileNameStartsWith IS NULL) " +
"GROUP BY t1.fileName" +
") " +
"ORDER BY t.creationDate DESC")
List<TrajectoryEntity> findTrajectoriesFileNameByTypeAAndHorizonAndFileNameStartsWith(@Param("type") String type, @Param("horizon") String horizon, @Param("fileNameStartsWith") String fileNameStartsWith);


@Query("SELECT t FROM Trajectory t JOIN t.scenarioEntities s WHERE t.type = :type AND s.id = :studyId")
List<TrajectoryEntity> findByTypeAndStudyId(@Param("type") String type, @Param("studyId") Integer studyId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.ZoneId;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;


@Slf4j
Expand Down Expand Up @@ -98,7 +98,7 @@ public List<FsTrajectoryDTO> findTrajectoriesByTypeAndFileNameStartWithFromFS(Tr


try (var stream = Files.list(directory)) {
return stream.filter(Files::isRegularFile)
var trajectories = stream.filter(Files::isRegularFile)
.map(path -> {
try {return FsTrajectoryDTO.builder()
.fileName(path.getFileName().toString())
Expand All @@ -111,11 +111,36 @@ public List<FsTrajectoryDTO> findTrajectoriesByTypeAndFileNameStartWithFromFS(Tr
}
})
.toList();
var latestTrajectories = extractKeyFromColumnByComparator(
trajectories,
FsTrajectoryDTO::getFileName,
Comparator.comparing(FsTrajectoryDTO::getLastModifiedDate).reversed()
);

return sortedByComparator(latestTrajectories.values(), Comparator.comparing(FsTrajectoryDTO::getLastModifiedDate).reversed());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private static <T> List<T> sortedByComparator(Collection<T> collection, Comparator<T> comparator) {
return collection.stream()
.sorted(comparator)
.collect(Collectors.toList());
}

private static <T, U> Map<T, U> extractKeyFromColumnByComparator(Collection<U> entities, Function<U, T> keyExtractor, Comparator<U> comparator) {
if (entities == null) {
return Map.of();
}
return entities.stream()
.collect(Collectors.toMap(
keyExtractor,
Function.identity(),
BinaryOperator.maxBy(comparator)
));
}

@Override
public List<TrajectoryDTO> findTrajectoriesByTypeAndStudyId(String trajectoryType, Integer studyId) {
return trajectoryRepository.findByTypeAndStudyId(trajectoryType, studyId).stream()
Expand Down