From dc8885010ded91f67256046f5a430f4c3e4c91c7 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Wed, 28 Jan 2026 11:29:08 +0100 Subject: [PATCH 01/22] persist computation result filters --- .../ComputationResultFiltersController.java | 82 +++++++++++++ .../ComputationResultColumnFilterInfos.java | 21 ++++ .../dto/ComputationResultFiltersInfos.java | 21 ++++ .../dto/ComputationSubTypeFilterInfos.java | 24 ++++ .../dto/ComputationTypeFiltersInfos.java | 30 +++++ .../ComputationResultColumnFilterEntity.java | 45 +++++++ .../ComputationResultFiltersEntity.java | 34 +++++ .../ComputationSubTypeFiltersEntity.java | 37 ++++++ .../ComputationTypeFiltersEntity.java | 44 +++++++ .../ComputationResultFiltersMapper.java | 61 +++++++++ .../ComputationResultFiltersRepository.java | 20 +++ .../ComputationSubTypeFiltersRepository.java | 20 +++ .../ComputationTypeFiltersRepository.java | 20 +++ .../ComputationResultFiltersService.java | 116 ++++++++++++++++++ .../changesets/changelog_20260128T102437Z.xml | 70 +++++++++++ .../db/changelog/db.changelog-master.yaml | 3 + 16 files changed, 648 insertions(+) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java create mode 100644 src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java new file mode 100644 index 00000000..060a00a9 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.gridsuite.studyconfig.server.StudyConfigApi; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.dto.ComputationResultFiltersInfos; +import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; +import org.gridsuite.studyconfig.server.service.ComputationResultFiltersService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@RestController +@RequestMapping(value = "/" + StudyConfigApi.API_VERSION + "/computation-result-filters") +@RequiredArgsConstructor +public class ComputationResultFiltersController { + private final ComputationResultFiltersService computationGlobalFiltersService; + + @PostMapping(value = "/default") + @Operation(summary = "Create a default computation result filters", + description = "Creates a default computation result filters") + @ApiResponse(responseCode = "201", description = "Default computation result filters created", + content = @Content(schema = @Schema(implementation = UUID.class))) + public ResponseEntity createDefaultComputationResultFilters() { + UUID id = computationGlobalFiltersService.createDefaultComputingResultFilters(); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + + @GetMapping("/{id}") + @Operation(summary = "Get a computation result filters", + description = "Retrieves a computation result filters by its ID") + @ApiResponse(responseCode = "200", description = "Computation result filters found", + content = @Content(schema = @Schema(implementation = ComputationResultFiltersInfos.class))) + @ApiResponse(responseCode = "404", description = "Computation result filters not found") + public ResponseEntity getComputingResultFilters( + @Parameter(description = "ID of the computation result filters to retrieve") @PathVariable UUID id) { + return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultFilters(id)); + } + + @PostMapping("/{id}/{computationType}/global-filters") + @Operation(summary = "Set global filters", + description = "Replaces all existing global filters with the provided list for a computation result") + @ApiResponse(responseCode = "204", description = "Global filters set successfully") + @ApiResponse(responseCode = "404", description = "Computation result filters not found") + public ResponseEntity setGlobalFiltersForComputingResult( + @PathVariable UUID id, + @PathVariable String computationType, + @Valid @RequestBody List filters) { + computationGlobalFiltersService.setGlobalFiltersForComputationResult(id, computationType, filters); + return ResponseEntity.noContent().build(); + } + + @PutMapping("/{id}/{computationType}/{computationSubType}/columns") + @Operation(summary = "Update a column", description = "Updates an existing column") + @ApiResponse(responseCode = "204", description = "Column updated") + public ResponseEntity updateColumn( + @PathVariable UUID id, + @PathVariable String computationType, + @PathVariable String computationSubType, + @Valid @RequestBody ComputationResultColumnFilterInfos dto) { + computationGlobalFiltersService.updateColumn(id, computationType, computationSubType, dto); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java new file mode 100644 index 00000000..da638407 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author Rehili Ghazwa + */ +@Schema(name = "ComputationResultColumnFilterInfos", description = "Column filter infos") +public record ComputationResultColumnFilterInfos( + String id, + String filterDataType, + String filterType, + String filterValue, + Double filterTolerance +) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java new file mode 100644 index 00000000..30c2af19 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author Rehili Ghazwa + */ + +@Schema(name = "ComputationResultFiltersInfos", description = "Computation Result Filters") +public record ComputationResultFiltersInfos( + @Schema(description = "List of the computation types with their sub types associated column filters and global filter") + List computationTypeFiltersInfos +) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java new file mode 100644 index 00000000..b7e08174 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author Rehili Ghazwa + */ +@Schema(name = "ComputationSubTypeFilter") +public record ComputationSubTypeFilterInfos( + + @Schema(description = "computation sub type") + String computationSubType, + + @Schema(description = "List of columns for this computation subtype") + List columns +) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java new file mode 100644 index 00000000..1deecd9f --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.util.List; + +/** + * @author Rehili Ghazwa + */ + +@Schema(name = "ComputationTypeFiltersInfos", description = "Computation type Filters") +public record ComputationTypeFiltersInfos( + + @Schema(description = "Computation type") + String computationType, + + @NotNull + @Schema(description = "Global filters") + List globalFilters, + + @Schema(description = "Subtypes of the computation type with their columns filters") + List computationSubTypeFilterInfos +) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java new file mode 100644 index 00000000..b2aeedaa --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@Entity +@Table(name = "computation_column") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ComputationResultColumnFilterEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "uuid") + private UUID uuid; + + @Column(name = "columnId", nullable = false, columnDefinition = "varchar(255)") + private String id; + + @Column(name = "filter_data_type", columnDefinition = "varchar(255)") + private String filterDataType; + + @Column(name = "filter_type", columnDefinition = "varchar(255)") + private String filterType; + + @Column(name = "filter_value", columnDefinition = "CLOB") + private String filterValue; + + @Column(name = "filter_tolerance") + private Double filterTolerance; +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java new file mode 100644 index 00000000..d4f09803 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.*; + +/** + * @author Rehili Ghazwa + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "computation_result_filters") +public class ComputationResultFiltersEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private UUID id; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "computation_result_filters_id", foreignKey = @ForeignKey(name = "fk_computation_result_filters_type")) + @Builder.Default + private List computationResultFilter = new ArrayList<>(); +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java new file mode 100644 index 00000000..cf9dc252 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.*; + +/** + * @author Rehili Ghazwa + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "computation_sub_type_filters") +public class ComputationSubTypeFiltersEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "uuid") + private UUID uuid; + + @Column(name = "computation_sub_type", nullable = false, unique = true) + private String computationSubType; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "computation_result_id", foreignKey = @ForeignKey(name = "fk_computation_result_column")) + @Builder.Default + private List columns = new ArrayList<>(); +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java new file mode 100644 index 00000000..1a64147b --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.entities; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "computation_type_filters") +public class ComputationTypeFiltersEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "uuid") + private UUID uuid; + + @Column(name = "computation_type", nullable = false, unique = true) + private String computationType; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "computation_type_filters_id", foreignKey = @ForeignKey(name = "fk_computation_type_global_filters")) + @Builder.Default + private List globalFilters = new ArrayList<>(); + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "computation_sub_type_filters_id", foreignKey = @ForeignKey(name = "fk_computation_sub_type_column_filters")) + @Builder.Default + private List computationSubTypes = new ArrayList<>(); +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java new file mode 100644 index 00000000..5c5e8d04 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java @@ -0,0 +1,61 @@ +/** +* Copyright (c) 2025, RTE (http://www.rte-france.com) +* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ +package org.gridsuite.studyconfig.server.mapper; + +import org.gridsuite.studyconfig.server.dto.*; +import org.gridsuite.studyconfig.server.entities.*; + +/** + * @author Rehili Ghazwa + */ +public final class ComputationResultFiltersMapper { + + private ComputationResultFiltersMapper() { } + + public static ComputationResultFiltersInfos toDto(ComputationResultFiltersEntity entity) { + return new ComputationResultFiltersInfos(entity.getComputationResultFilter().stream() + .map(ComputationResultFiltersMapper::toTypeDto) + .toList()); + } + + private static ComputationTypeFiltersInfos toTypeDto(ComputationTypeFiltersEntity typeEntity) { + return new ComputationTypeFiltersInfos( + typeEntity.getComputationType(), + typeEntity.getGlobalFilters().stream().map(SpreadsheetConfigMapper::toGlobalFilterDto).toList(), + typeEntity.getComputationSubTypes().stream().map(ComputationResultFiltersMapper::toSubTypeDto).toList() + ); + } + + private static ComputationSubTypeFilterInfos toSubTypeDto(ComputationSubTypeFiltersEntity entity) { + return new ComputationSubTypeFilterInfos( + entity.getComputationSubType(), + entity.getColumns().stream().map(ComputationResultFiltersMapper::toComputationColumnFilterInfos).toList() + ); + } + + public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos(ComputationResultColumnFilterEntity entity) { + return new ComputationResultColumnFilterInfos( + entity.getId(), + entity.getFilterDataType(), + entity.getFilterType(), + entity.getFilterValue(), + entity.getFilterTolerance() + ); + } + + public static ComputationResultColumnFilterEntity toComputationColumnFilterEntity(ComputationResultColumnFilterInfos columnFilterInfos) { + return ComputationResultColumnFilterEntity.builder() + .id(columnFilterInfos.id()) + .filterDataType(columnFilterInfos.filterDataType()) + .filterType(columnFilterInfos.filterType()) + .filterValue(columnFilterInfos.filterValue()) + .filterTolerance(columnFilterInfos.filterTolerance()) + .build(); + } +} + + diff --git a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java b/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java new file mode 100644 index 00000000..1d8952ec --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.repositories; + +import org.gridsuite.studyconfig.server.entities.ComputationResultFiltersEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@Repository +public interface ComputationResultFiltersRepository extends JpaRepository { +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java b/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java new file mode 100644 index 00000000..241c7d35 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.repositories; + +import org.gridsuite.studyconfig.server.entities.ComputationSubTypeFiltersEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@Repository +public interface ComputationSubTypeFiltersRepository extends JpaRepository { +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java b/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java new file mode 100644 index 00000000..5865d38e --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.repositories; + +import org.gridsuite.studyconfig.server.entities.ComputationTypeFiltersEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@Repository +public interface ComputationTypeFiltersRepository extends JpaRepository { +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java new file mode 100644 index 00000000..88bd4b7e --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.service; + +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.dto.ComputationResultFiltersInfos; +import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; +import org.gridsuite.studyconfig.server.entities.*; +import org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper; +import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; +import org.gridsuite.studyconfig.server.repositories.ComputationResultFiltersRepository; +import org.gridsuite.studyconfig.server.repositories.ComputationSubTypeFiltersRepository; +import org.gridsuite.studyconfig.server.repositories.ComputationTypeFiltersRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.UUID; + +import static org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper.toComputationColumnFilterEntity; + + +/** + * @author Rehili Ghazwa + */ +@Service +@RequiredArgsConstructor +public class ComputationResultFiltersService { + private static final String COMPUTATION_FILTERS_NOT_FOUND = "not found"; + private final ComputationResultFiltersRepository computationResultFiltersRepository; + private final ComputationTypeFiltersRepository computationTypeFiltersRepository; + private final ComputationSubTypeFiltersRepository computationSubTypeFiltersRepository; + + @Transactional + public UUID createDefaultComputingResultFilters() { + ComputationResultFiltersEntity root = new ComputationResultFiltersEntity(); + return computationResultFiltersRepository.saveAndFlush(root).getId(); + } + + @Transactional(readOnly = true) + public ComputationResultFiltersInfos getComputingResultFilters(UUID rootId) { + ComputationResultFiltersEntity entity = computationResultFiltersRepository.findById(rootId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + return ComputationResultFiltersMapper.toDto(entity); + } + + @Transactional + public void setGlobalFiltersForComputationResult(UUID rootId, String computationType, List globalFilters) { + ComputationResultFiltersEntity root = computationResultFiltersRepository.findById(rootId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + ComputationTypeFiltersEntity typeEntity = root.getComputationResultFilter().stream() + .filter(type -> computationType.equals(type.getComputationType())) + .findFirst() + .orElseGet(() -> { + ComputationTypeFiltersEntity entity = new ComputationTypeFiltersEntity(); + entity.setComputationType(computationType); + root.getComputationResultFilter().add(entity); + return entity; + }); + + List newFilters = globalFilters.stream().map(SpreadsheetConfigMapper::toGlobalFilterEntity).toList(); + if (!typeEntity.getGlobalFilters().equals(newFilters)) { + typeEntity.getGlobalFilters().clear(); + typeEntity.getGlobalFilters().addAll(newFilters); + } + computationResultFiltersRepository.save(root); + } + + @Transactional + public void updateColumn( + UUID rootId, + String computationType, + String computationSubType, + ComputationResultColumnFilterInfos columns + ) { + ComputationResultFiltersEntity root = computationResultFiltersRepository.findById(rootId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + ComputationTypeFiltersEntity typeEntity = findOrCreateComputationType(root, computationType); + if (typeEntity.getUuid() == null) { + computationTypeFiltersRepository.save(typeEntity); + } + ComputationSubTypeFiltersEntity subTypeEntity = typeEntity.getComputationSubTypes().stream() + .filter(sub -> sub.getComputationSubType().equals(computationSubType)) + .findFirst() + .orElseGet(() -> createAndAttachSubType(typeEntity, computationSubType)); + ComputationResultColumnFilterEntity updatedColumn = toComputationColumnFilterEntity(columns); + subTypeEntity.getColumns().removeIf(col -> col.getId() != null && col.getId().equals(updatedColumn.getId())); + subTypeEntity.getColumns().add(updatedColumn); + computationResultFiltersRepository.save(root); + } + + private ComputationTypeFiltersEntity findOrCreateComputationType(ComputationResultFiltersEntity root, String computationType) { + return root.getComputationResultFilter().stream() + .filter(type -> type.getComputationType().equals(computationType)) + .findFirst() + .orElseGet(() -> { + ComputationTypeFiltersEntity newType = new ComputationTypeFiltersEntity(); + newType.setComputationType(computationType); + root.getComputationResultFilter().add(newType); + return newType; + }); + } + + private ComputationSubTypeFiltersEntity createAndAttachSubType(ComputationTypeFiltersEntity typeEntity, String computationSubType) { + ComputationSubTypeFiltersEntity newSubType = new ComputationSubTypeFiltersEntity(); + newSubType.setComputationSubType(computationSubType); + typeEntity.getComputationSubTypes().add(newSubType); + return computationSubTypeFiltersRepository.save(newSubType); + } +} diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml new file mode 100644 index 00000000..f3d081eb --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 72620d57..141b376e 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -91,4 +91,7 @@ databaseChangeLog: relativeToChangelogFile: true - include: file: changesets/changelog_20260106T155059Z.xml + relativeToChangelogFile: true + - include: + file: changesets/changelog_20260128T102437Z.xml relativeToChangelogFile: true \ No newline at end of file From ce26203b7ab4949ab7e75cfcfb97183e64ed9121 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Thu, 29 Jan 2026 10:13:27 +0100 Subject: [PATCH 02/22] refacto column entity --- .../server/entities/AbstractColumnFilter.java | 52 +++++++++++++++++++ .../server/entities/ColumnEntity.java | 48 ++--------------- .../ComputationResultColumnFilterEntity.java | 28 ++-------- .../server/entities/GlobalFilterEntity.java | 5 +- .../ComputationResultFiltersMapper.java | 4 +- .../ComputationResultFiltersService.java | 2 +- .../changesets/changelog_20260128T102437Z.xml | 29 ++++++----- .../server/ComputationResultFiltersTest.java | 18 +++++++ 8 files changed, 104 insertions(+), 82 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java create mode 100644 src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java b/src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java new file mode 100644 index 00000000..a810c7d9 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2024, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import java.util.UUID; + +/** + * @author Rehili Ghazwa + */ +@MappedSuperclass +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder(toBuilder = true) +public abstract class AbstractColumnFilter { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "uuid") + private UUID uuid; + + @Column(name = "filter_data_type", columnDefinition = "varchar(255)") + private String filterDataType; + + @Column(name = "filter_type", columnDefinition = "varchar(255)") + private String filterType; + + @Column(name = "filter_value", columnDefinition = "CLOB") + private String filterValue; + + @Column(name = "filter_tolerance") + private Double filterTolerance; + + public void resetFilter() { + this.filterDataType = null; + this.filterType = null; + this.filterTolerance = null; + this.filterValue = null; + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java index a9d91cb8..251106e8 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java @@ -6,12 +6,10 @@ */ package org.gridsuite.studyconfig.server.entities; -import java.util.UUID; - -import org.gridsuite.studyconfig.server.constants.ColumnType; - import jakarta.persistence.*; import lombok.*; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.constants.ColumnType; /** * @author Achour BERRAHMA @@ -22,13 +20,8 @@ @Setter @NoArgsConstructor @AllArgsConstructor -@Builder(toBuilder = true) -public class ColumnEntity { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "uuid") - private UUID uuid; +@SuperBuilder(toBuilder = true) +public class ColumnEntity extends AbstractColumnFilter { @Column(name = "name", nullable = false, columnDefinition = "varchar(255)") private String name; @@ -49,42 +42,11 @@ public class ColumnEntity { @Column(name = "columnId", nullable = false, columnDefinition = "varchar(255)") private String id; - @Column(name = "filter_data_type", columnDefinition = "varchar(255)") - private String filterDataType; - - @Column(name = "filter_type", columnDefinition = "varchar(255)") - private String filterType; - - @Column(name = "filter_value", columnDefinition = "CLOB") - private String filterValue; - - @Column(name = "filter_tolerance") - private Double filterTolerance; - @Column(name = "visible", nullable = false) @Builder.Default private boolean visible = true; - public void resetFilter() { - this.filterDataType = null; - this.filterType = null; - this.filterTolerance = null; - this.filterValue = null; - } - public ColumnEntity copy() { - return ColumnEntity.builder() - .name(getName()) - .type(getType()) - .precision(getPrecision()) - .formula(getFormula()) - .dependencies(getDependencies()) - .id(getId()) - .filterDataType(getFilterDataType()) - .filterType(getFilterType()) - .filterValue(getFilterValue()) - .filterTolerance(getFilterTolerance()) - .visible(isVisible()) - .build(); + return this.toBuilder().uuid(null).build(); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java index b2aeedaa..70f4b2e4 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java @@ -8,8 +8,7 @@ import jakarta.persistence.*; import lombok.*; - -import java.util.UUID; +import lombok.experimental.SuperBuilder; /** * @author Rehili Ghazwa @@ -20,26 +19,9 @@ @Setter @NoArgsConstructor @AllArgsConstructor -@Builder -public class ComputationResultColumnFilterEntity { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "uuid") - private UUID uuid; - - @Column(name = "columnId", nullable = false, columnDefinition = "varchar(255)") - private String id; - - @Column(name = "filter_data_type", columnDefinition = "varchar(255)") - private String filterDataType; - - @Column(name = "filter_type", columnDefinition = "varchar(255)") - private String filterType; - - @Column(name = "filter_value", columnDefinition = "CLOB") - private String filterValue; +@SuperBuilder(toBuilder = true) +public class ComputationResultColumnFilterEntity extends AbstractColumnFilter { - @Column(name = "filter_tolerance") - private Double filterTolerance; + @Column(name = "computation_column_id", nullable = false, columnDefinition = "varchar(255)") + private String computationColumnId; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java index 976a80a7..8f84f888 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java @@ -15,7 +15,10 @@ * @author Achour BERRAHMA */ @Entity -@Table(name = "spreadsheet_global_filter") +@Table(name = "spreadsheet_global_filter", indexes = { + @Index(name = "idx_global_filter_spreadsheet_config_id", columnList = "spreadsheet_config_id"), + @Index(name = "idx_global_filter_computation_type_filters_id", columnList = "computation_type_filters_id")} +) @Getter @Setter @NoArgsConstructor diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java index 5c5e8d04..c7d5dadd 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java @@ -39,7 +39,7 @@ private static ComputationSubTypeFilterInfos toSubTypeDto(ComputationSubTypeFilt public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos(ComputationResultColumnFilterEntity entity) { return new ComputationResultColumnFilterInfos( - entity.getId(), + entity.getComputationColumnId(), entity.getFilterDataType(), entity.getFilterType(), entity.getFilterValue(), @@ -49,7 +49,7 @@ public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos( public static ComputationResultColumnFilterEntity toComputationColumnFilterEntity(ComputationResultColumnFilterInfos columnFilterInfos) { return ComputationResultColumnFilterEntity.builder() - .id(columnFilterInfos.id()) + .computationColumnId(columnFilterInfos.id()) .filterDataType(columnFilterInfos.filterDataType()) .filterType(columnFilterInfos.filterType()) .filterValue(columnFilterInfos.filterValue()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index 88bd4b7e..905bd87e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -90,7 +90,7 @@ public void updateColumn( .findFirst() .orElseGet(() -> createAndAttachSubType(typeEntity, computationSubType)); ComputationResultColumnFilterEntity updatedColumn = toComputationColumnFilterEntity(columns); - subTypeEntity.getColumns().removeIf(col -> col.getId() != null && col.getId().equals(updatedColumn.getId())); + subTypeEntity.getColumns().removeIf(col -> col.getComputationColumnId() != null && col.getComputationColumnId().equals(updatedColumn.getComputationColumnId())); subTypeEntity.getColumns().add(updatedColumn); computationResultFiltersRepository.save(root); } diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml index f3d081eb..b549d05a 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -1,6 +1,6 @@ - + @@ -9,20 +9,20 @@ - + - + - + @@ -33,7 +33,7 @@ - + @@ -44,27 +44,32 @@ - + - + - + - + + + + + + - + - + - + diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java new file mode 100644 index 00000000..131f2630 --- /dev/null +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server; + +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @author Rehili Ghazwa + */ +@SpringBootTest +@AutoConfigureMockMvc +public class ComputationResultFiltersTest { +} From e3b2318632a3a1d9f31d58bbf42d1a788fb75b75 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Thu, 29 Jan 2026 15:33:22 +0100 Subject: [PATCH 03/22] refacto to column filter entity --- .../ComputationResultFiltersController.java | 16 ++--- .../server/dto/ColumnFilterInfos.java | 27 +++++++ .../studyconfig/server/dto/ColumnInfos.java | 34 +++++---- .../ComputationResultColumnFilterInfos.java | 11 +-- .../server/entities/ColumnEntity.java | 28 ++++++-- ...actColumnFilter.java => ColumnFilter.java} | 24 ++++--- .../ComputationResultColumnFilterEntity.java | 17 ++++- .../entities/SpreadsheetConfigEntity.java | 6 +- .../ComputationResultFiltersMapper.java | 31 ++++---- .../mapper/SpreadsheetConfigMapper.java | 22 +++--- .../ComputationResultFiltersService.java | 15 ++-- .../service/SpreadsheetConfigService.java | 9 +-- .../changesets/changelog_20260128T102437Z.xml | 65 +++++++++++++---- .../studyconfig/server/DtoConverterTest.java | 72 ++++++++++--------- ...dsheetConfigCollectionIntegrationTest.java | 70 +++++++++--------- .../SpreadsheetConfigIntegrationTest.java | 62 ++++++++-------- 16 files changed, 317 insertions(+), 192 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ColumnFilterInfos.java rename src/main/java/org/gridsuite/studyconfig/server/entities/{AbstractColumnFilter.java => ColumnFilter.java} (69%) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java index 060a00a9..32f67943 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java @@ -14,9 +14,7 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.gridsuite.studyconfig.server.StudyConfigApi; -import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; -import org.gridsuite.studyconfig.server.dto.ComputationResultFiltersInfos; -import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; +import org.gridsuite.studyconfig.server.dto.*; import org.gridsuite.studyconfig.server.service.ComputationResultFiltersService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -44,15 +42,17 @@ public ResponseEntity createDefaultComputationResultFilters() { return ResponseEntity.status(HttpStatus.CREATED).body(id); } - @GetMapping("/{id}") + @GetMapping("/{id}/{computationType}/{computationSubType}") @Operation(summary = "Get a computation result filters", - description = "Retrieves a computation result filters by its ID") + description = "Fetches the computation result filters for a given computation type and subtype") @ApiResponse(responseCode = "200", description = "Computation result filters found", content = @Content(schema = @Schema(implementation = ComputationResultFiltersInfos.class))) @ApiResponse(responseCode = "404", description = "Computation result filters not found") - public ResponseEntity getComputingResultFilters( - @Parameter(description = "ID of the computation result filters to retrieve") @PathVariable UUID id) { - return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultFilters(id)); + public ResponseEntity getComputingResultFilters( + @Parameter(description = "Computation root ID") @PathVariable UUID id, + @Parameter(description = "Computation type") @PathVariable String computationType, + @Parameter(description = "Computation subtype") @PathVariable String computationSubType) { + return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultFilters(id, computationType, computationSubType)); } @PostMapping("/{id}/{computationType}/global-filters") diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnFilterInfos.java new file mode 100644 index 00000000..2ecb4884 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnFilterInfos.java @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author Rehili Ghazwa + */ +@Schema(name = "ColumnFilterInfos", description = "Column filter infos") +public record ColumnFilterInfos( + @Schema(description = "Filter data type") + String filterDataType, + + @Schema(description = "Filter type") + String filterType, + + @Schema(description = "Filter value") + String filterValue, + + @Schema(description = "Filter tolerance for numeric comparisons") + Double filterTolerance +) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java index 02681948..2992cc2e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java @@ -41,24 +41,32 @@ public record ColumnInfos( @Schema(description = "Column id") String id, - @Schema(description = "Filter data type") - String filterDataType, - - @Schema(description = "Filter type") - String filterType, - - @Schema(description = "Filter value") - String filterValue, - - @Schema(description = "Filter tolerance for numeric comparisons") - Double filterTolerance, - @Schema(description = "Column visibility", defaultValue = "true") - Boolean visible + Boolean visible, + + @Schema(description = "column filter infos") + ColumnFilterInfos columnFilterInfos ) { public ColumnInfos { if (visible == null) { visible = true; } } + + public ColumnInfos( + UUID uuid, + String name, + ColumnType type, + Integer precision, + String formula, + String dependencies, + String id, + boolean visible, + String filterDataType, + String filterType, + String filterValue, + Double filterTolerance) { + this(uuid, name, type, precision, formula, dependencies, id, visible, + new ColumnFilterInfos(filterDataType, filterType, filterValue, filterTolerance)); + } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java index da638407..5bdf0752 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java @@ -11,11 +11,12 @@ /** * @author Rehili Ghazwa */ -@Schema(name = "ComputationResultColumnFilterInfos", description = "Column filter infos") +@Schema(name = "ComputationResultColumnFilterInfos", description = "Computation Result Column filter infos") public record ComputationResultColumnFilterInfos( + + @Schema(description = "Column id") String id, - String filterDataType, - String filterType, - String filterValue, - Double filterTolerance + + @Schema(description = "column filter infos") + ColumnFilterInfos columnFilterInfos ) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java index 251106e8..0d99bbf3 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java @@ -8,9 +8,10 @@ import jakarta.persistence.*; import lombok.*; -import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.constants.ColumnType; +import java.util.UUID; + /** * @author Achour BERRAHMA */ @@ -20,8 +21,13 @@ @Setter @NoArgsConstructor @AllArgsConstructor -@SuperBuilder(toBuilder = true) -public class ColumnEntity extends AbstractColumnFilter { +@Builder(toBuilder = true) +public class ColumnEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "uuid") + private UUID uuid; @Column(name = "name", nullable = false, columnDefinition = "varchar(255)") private String name; @@ -46,7 +52,21 @@ public class ColumnEntity extends AbstractColumnFilter { @Builder.Default private boolean visible = true; + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + @JoinColumn(name = "columnEntity_columnFilter_id", referencedColumnName = "uuid", + foreignKey = @ForeignKey(name = "columnEntity_columnFilter_fk")) + private ColumnFilter columnFilter; + public ColumnEntity copy() { - return this.toBuilder().uuid(null).build(); + return ColumnEntity.builder() + .name(getName()) + .type(getType()) + .precision(getPrecision()) + .formula(getFormula()) + .dependencies(getDependencies()) + .id(getId()) + .columnFilter(this.columnFilter != null ? this.columnFilter.copy() : null) + .visible(isVisible()) + .build(); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilter.java similarity index 69% rename from src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilter.java index a810c7d9..0e678980 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/AbstractColumnFilter.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilter.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024, RTE (http://www.rte-france.com) + * Copyright (c) 2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -7,24 +7,21 @@ package org.gridsuite.studyconfig.server.entities; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; +import lombok.*; import java.util.UUID; /** * @author Rehili Ghazwa */ -@MappedSuperclass +@Entity +@Table(name = "column_filter") @Getter @Setter @NoArgsConstructor @AllArgsConstructor -@SuperBuilder(toBuilder = true) -public abstract class AbstractColumnFilter { +@Builder(toBuilder = true) +public class ColumnFilter { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -49,4 +46,13 @@ public void resetFilter() { this.filterTolerance = null; this.filterValue = null; } + + public ColumnFilter copy() { + return ColumnFilter.builder() + .filterDataType(this.getFilterDataType()) + .filterType(this.getFilterType()) + .filterValue(this.getFilterValue()) + .filterTolerance(this.getFilterTolerance()) + .build(); + } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java index 70f4b2e4..024637d0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java @@ -8,7 +8,8 @@ import jakarta.persistence.*; import lombok.*; -import lombok.experimental.SuperBuilder; + +import java.util.UUID; /** * @author Rehili Ghazwa @@ -19,9 +20,19 @@ @Setter @NoArgsConstructor @AllArgsConstructor -@SuperBuilder(toBuilder = true) -public class ComputationResultColumnFilterEntity extends AbstractColumnFilter { +@Builder(toBuilder = true) +public class ComputationResultColumnFilterEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "uuid") + private UUID uuid; @Column(name = "computation_column_id", nullable = false, columnDefinition = "varchar(255)") private String computationColumnId; + + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + @JoinColumn(name = "computationResult_columnFilter_id", referencedColumnName = "uuid", + foreignKey = @ForeignKey(name = "computationResult_columnFilter_fk")) + private ColumnFilter columnFilter; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java index 7f75798e..b27614d1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java @@ -63,6 +63,10 @@ public class SpreadsheetConfigEntity { public void resetFilters() { this.globalFilters.clear(); - getColumns().forEach(ColumnEntity::resetFilter); + this.columns.forEach(column -> { + if (column.getColumnFilter() != null) { + column.getColumnFilter().resetFilter(); + } + }); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java index c7d5dadd..f252fa61 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java @@ -22,11 +22,11 @@ public static ComputationResultFiltersInfos toDto(ComputationResultFiltersEntity .toList()); } - private static ComputationTypeFiltersInfos toTypeDto(ComputationTypeFiltersEntity typeEntity) { - return new ComputationTypeFiltersInfos( - typeEntity.getComputationType(), - typeEntity.getGlobalFilters().stream().map(SpreadsheetConfigMapper::toGlobalFilterDto).toList(), - typeEntity.getComputationSubTypes().stream().map(ComputationResultFiltersMapper::toSubTypeDto).toList() + public static ComputationTypeFiltersInfos toTypeDto(ComputationTypeFiltersEntity entity) { + return new ComputationTypeFiltersInfos(entity.getComputationType(), + entity.getGlobalFilters().stream() + .map(SpreadsheetConfigMapper::toGlobalFilterDto).toList(), + entity.getComputationSubTypes().stream().map(ComputationResultFiltersMapper::toSubTypeDto).toList() ); } @@ -38,22 +38,21 @@ private static ComputationSubTypeFilterInfos toSubTypeDto(ComputationSubTypeFilt } public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos(ComputationResultColumnFilterEntity entity) { - return new ComputationResultColumnFilterInfos( - entity.getComputationColumnId(), - entity.getFilterDataType(), - entity.getFilterType(), - entity.getFilterValue(), - entity.getFilterTolerance() - ); + ColumnFilter filter = entity.getColumnFilter(); + return new ComputationResultColumnFilterInfos(entity.getComputationColumnId(), filter != null ? + new ColumnFilterInfos(filter.getFilterDataType(), filter.getFilterType(), filter.getFilterValue(), filter.getFilterTolerance()) + : null); } public static ComputationResultColumnFilterEntity toComputationColumnFilterEntity(ComputationResultColumnFilterInfos columnFilterInfos) { return ComputationResultColumnFilterEntity.builder() .computationColumnId(columnFilterInfos.id()) - .filterDataType(columnFilterInfos.filterDataType()) - .filterType(columnFilterInfos.filterType()) - .filterValue(columnFilterInfos.filterValue()) - .filterTolerance(columnFilterInfos.filterTolerance()) + .columnFilter(columnFilterInfos.columnFilterInfos() != null ? ColumnFilter.builder() + .filterDataType(columnFilterInfos.columnFilterInfos().filterDataType()) + .filterType(columnFilterInfos.columnFilterInfos().filterType()) + .filterValue(columnFilterInfos.columnFilterInfos().filterValue()) + .filterTolerance(columnFilterInfos.columnFilterInfos().filterTolerance()) + .build() : null) .build(); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java index 2c83da18..e5449fad 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java @@ -9,6 +9,7 @@ import org.gridsuite.studyconfig.server.constants.SortDirection; import org.gridsuite.studyconfig.server.dto.*; import org.gridsuite.studyconfig.server.entities.ColumnEntity; +import org.gridsuite.studyconfig.server.entities.ColumnFilter; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; @@ -70,6 +71,7 @@ public static SpreadsheetConfigEntity toEntity(SpreadsheetConfigInfos dto) { } public static ColumnInfos toColumnDto(ColumnEntity entity) { + ColumnFilter filter = entity.getColumnFilter(); return new ColumnInfos( entity.getUuid(), entity.getName(), @@ -78,11 +80,11 @@ public static ColumnInfos toColumnDto(ColumnEntity entity) { entity.getFormula(), entity.getDependencies(), entity.getId(), - entity.getFilterDataType(), - entity.getFilterType(), - entity.getFilterValue(), - entity.getFilterTolerance(), - entity.isVisible() + entity.isVisible(), + filter != null ? filter.getFilterDataType() : null, + filter != null ? filter.getFilterType() : null, + filter != null ? filter.getFilterValue() : null, + filter != null ? filter.getFilterTolerance() : null ); } @@ -94,11 +96,13 @@ public static ColumnEntity toColumnEntity(ColumnInfos dto) { .formula(dto.formula()) .dependencies(dto.dependencies()) .id(dto.id()) - .filterDataType(dto.filterDataType()) - .filterType(dto.filterType()) - .filterValue(dto.filterValue()) - .filterTolerance(dto.filterTolerance()) .visible(dto.visible()) + .columnFilter(dto.columnFilterInfos() != null ? ColumnFilter.builder() + .filterDataType(dto.columnFilterInfos().filterDataType()) + .filterType(dto.columnFilterInfos().filterType()) + .filterValue(dto.columnFilterInfos().filterValue()) + .filterTolerance(dto.columnFilterInfos().filterTolerance()) + .build() : null) .build(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index 905bd87e..fe10204b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -8,9 +8,7 @@ import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; -import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; -import org.gridsuite.studyconfig.server.dto.ComputationResultFiltersInfos; -import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; +import org.gridsuite.studyconfig.server.dto.*; import org.gridsuite.studyconfig.server.entities.*; import org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; @@ -44,10 +42,15 @@ public UUID createDefaultComputingResultFilters() { } @Transactional(readOnly = true) - public ComputationResultFiltersInfos getComputingResultFilters(UUID rootId) { - ComputationResultFiltersEntity entity = computationResultFiltersRepository.findById(rootId) + public ComputationTypeFiltersInfos getComputingResultFilters(UUID rootId, String computationType, String computationSubType) { + ComputationResultFiltersEntity rootEntity = computationResultFiltersRepository.findById(rootId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); - return ComputationResultFiltersMapper.toDto(entity); + return ComputationResultFiltersMapper.toTypeDto(rootEntity.getComputationResultFilter().stream() + .filter(type -> type.getComputationType().equals(computationType)) + .filter(type -> type.getComputationSubTypes().stream().anyMatch( + sub -> sub.getComputationSubType().equals(computationSubType))) + .findFirst() + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationType))); } @Transactional diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java index 8c5e3cfe..f3ad23ae 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java @@ -323,10 +323,10 @@ public void updateColumn(UUID id, UUID columnId, ColumnInfos dto) { columnEntity.setFormula(dto.formula()); columnEntity.setDependencies(dto.dependencies()); columnEntity.setId(dto.id()); - columnEntity.setFilterDataType(dto.filterDataType()); - columnEntity.setFilterType(dto.filterType()); - columnEntity.setFilterValue(dto.filterValue()); - columnEntity.setFilterTolerance(dto.filterTolerance()); + columnEntity.getColumnFilter().setFilterDataType(dto.columnFilterInfos().filterDataType()); + columnEntity.getColumnFilter().setFilterType(dto.columnFilterInfos().filterType()); + columnEntity.getColumnFilter().setFilterValue(dto.columnFilterInfos().filterValue()); + columnEntity.getColumnFilter().setFilterTolerance(dto.columnFilterInfos().filterTolerance()); columnEntity.setVisible(dto.visible()); spreadsheetConfigRepository.save(entity); @@ -393,6 +393,7 @@ public void duplicateColumn(UUID id, UUID columnId) { .findFirst().orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, COLUMN_NOT_FOUND + columnId)); ColumnEntity columnCopy = columnEntity.toBuilder().build(); columnCopy.setUuid(null); + columnCopy.setColumnFilter(null); Pair idAndName = getDuplicateIdAndNameCandidate(entity, columnCopy.getId(), columnCopy.getName()); columnCopy.setId(idAndName.getLeft()); columnCopy.setName(idAndName.getRight()); diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml index b549d05a..ef457136 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -1,28 +1,36 @@ - - + + - + + + + + + + + + - + - + @@ -33,7 +41,7 @@ - + @@ -44,32 +52,61 @@ - + + + + + + - + + + + - + - + + + + - + + + + + + + - + - + - + + + + + + + + + + + + + diff --git a/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java b/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java index fd1a64bb..76debbd6 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java @@ -13,6 +13,7 @@ import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; import org.gridsuite.studyconfig.server.dto.SpreadsheetConfigInfos; import org.gridsuite.studyconfig.server.entities.ColumnEntity; +import org.gridsuite.studyconfig.server.entities.ColumnFilter; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; @@ -42,10 +43,12 @@ void testConversionToDtoOfSpreadsheetConfig() { .name("Column1") .formula("A+B") .id("id1") - .filterDataType("text") - .filterType("contains") - .filterValue("test") .visible(false) + .columnFilter(ColumnFilter.builder() + .filterDataType("text") + .filterType("contains") + .filterValue("test") + .build()) .build(), ColumnEntity.builder().name("Column2").formula("C*D").id("id2").build() )) @@ -73,17 +76,17 @@ void testConversionToDtoOfSpreadsheetConfig() { assertThat(d.columns().get(0).name()).isEqualTo("Column1"); assertThat(d.columns().get(0).formula()).isEqualTo("A+B"); assertThat(d.columns().get(0).id()).isEqualTo("id1"); - assertThat(d.columns().get(0).filterDataType()).isEqualTo("text"); - assertThat(d.columns().get(0).filterType()).isEqualTo("contains"); - assertThat(d.columns().get(0).filterValue()).isEqualTo("test"); + assertThat(d.columns().get(0).columnFilterInfos().filterDataType()).isEqualTo("text"); + assertThat(d.columns().get(0).columnFilterInfos().filterType()).isEqualTo("contains"); + assertThat(d.columns().get(0).columnFilterInfos().filterValue()).isEqualTo("test"); assertThat(d.columns().get(0).visible()).isFalse(); assertThat(d.columns().get(1).name()).isEqualTo("Column2"); assertThat(d.columns().get(1).formula()).isEqualTo("C*D"); assertThat(d.columns().get(1).id()).isEqualTo("id2"); - assertThat(d.columns().get(1).filterDataType()).isNull(); - assertThat(d.columns().get(1).filterType()).isNull(); - assertThat(d.columns().get(1).filterValue()).isNull(); + assertThat(d.columns().get(1).columnFilterInfos().filterDataType()).isNull(); + assertThat(d.columns().get(1).columnFilterInfos().filterType()).isNull(); + assertThat(d.columns().get(1).columnFilterInfos().filterValue()).isNull(); assertThat(d.columns().get(1).visible()).isTrue(); // Global filters assertions @@ -102,10 +105,10 @@ void testConversionToEntityOfSpreadsheetConfig() { "TestSheet", SheetType.BUS, Arrays.asList( - new ColumnInfos(null, "Column1", ColumnType.NUMBER, 1, "X+Y", "[\"col1\", \"col2\"]", "id1", - "number", "greaterThan", "100", 0.5, true), - new ColumnInfos(null, "Column2", ColumnType.NUMBER, 2, "Z*W", "[\"col1\"]", "id2", - null, null, null, null, true) + new ColumnInfos(null, "Column1", ColumnType.NUMBER, 1, "X+Y", "[\"col1\", \"col2\"]", "id1", true, + "number", "greaterThan", "100", 0.5), + new ColumnInfos(null, "Column2", ColumnType.NUMBER, 2, "Z*W", "[\"col1\"]", "id2", true, + null, null, null, null) ), List.of( GlobalFilterInfos.builder().uuid(filterId).filterType("country").label("GlobalFilter1").recent(false).build() @@ -128,20 +131,20 @@ void testConversionToEntityOfSpreadsheetConfig() { assertThat(e.getColumns().get(0).getFormula()).isEqualTo("X+Y"); assertThat(e.getColumns().get(0).getId()).isEqualTo("id1"); assertThat(e.getColumns().get(0).getDependencies()).isEqualTo("[\"col1\", \"col2\"]"); - assertThat(e.getColumns().get(0).getFilterDataType()).isEqualTo("number"); - assertThat(e.getColumns().get(0).getFilterType()).isEqualTo("greaterThan"); - assertThat(e.getColumns().get(0).getFilterValue()).isEqualTo("100"); - assertThat(e.getColumns().get(0).getFilterTolerance()).isEqualTo(0.5); + assertThat(e.getColumns().get(0).getColumnFilter().getFilterDataType()).isEqualTo("number"); + assertThat(e.getColumns().get(0).getColumnFilter().getFilterType()).isEqualTo("greaterThan"); + assertThat(e.getColumns().get(0).getColumnFilter().getFilterValue()).isEqualTo("100"); + assertThat(e.getColumns().get(0).getColumnFilter().getFilterTolerance()).isEqualTo(0.5); assertThat(e.getColumns().get(0).isVisible()).isTrue(); assertThat(e.getColumns().get(1).getName()).isEqualTo("Column2"); assertThat(e.getColumns().get(1).getFormula()).isEqualTo("Z*W"); assertThat(e.getColumns().get(1).getId()).isEqualTo("id2"); assertThat(e.getColumns().get(1).getDependencies()).isEqualTo("[\"col1\"]"); - assertThat(e.getColumns().get(1).getFilterDataType()).isNull(); - assertThat(e.getColumns().get(1).getFilterType()).isNull(); - assertThat(e.getColumns().get(1).getFilterValue()).isNull(); - assertThat(e.getColumns().get(1).getFilterTolerance()).isNull(); + assertThat(e.getColumns().get(1).getColumnFilter().getFilterDataType()).isNull(); + assertThat(e.getColumns().get(1).getColumnFilter().getFilterType()).isNull(); + assertThat(e.getColumns().get(1).getColumnFilter().getFilterValue()).isNull(); + assertThat(e.getColumns().get(1).getColumnFilter().getFilterTolerance()).isNull(); assertThat(e.getColumns().get(1).isVisible()).isTrue(); // Global filter assertions @@ -160,10 +163,11 @@ void testConversionToDtoOfColumnWithFilter() { .name("TestColumn") .formula("A+B+C") .id("idTest") + .columnFilter(ColumnFilter.builder() .filterDataType("text") .filterType("startsWith") .filterValue("prefix") - .filterTolerance(null) + .filterTolerance(null).build()) .build(); ColumnInfos dto = SpreadsheetConfigMapper.toColumnDto(entity); @@ -174,10 +178,10 @@ void testConversionToDtoOfColumnWithFilter() { assertThat(d.name()).isEqualTo("TestColumn"); assertThat(d.formula()).isEqualTo("A+B+C"); assertThat(d.id()).isEqualTo("idTest"); - assertThat(d.filterDataType()).isEqualTo("text"); - assertThat(d.filterType()).isEqualTo("startsWith"); - assertThat(d.filterValue()).isEqualTo("prefix"); - assertThat(d.filterTolerance()).isNull(); + assertThat(d.columnFilterInfos().filterDataType()).isEqualTo("text"); + assertThat(d.columnFilterInfos().filterType()).isEqualTo("startsWith"); + assertThat(d.columnFilterInfos().filterValue()).isEqualTo("prefix"); + assertThat(d.columnFilterInfos().filterTolerance()).isNull(); assertThat(d.visible()).isTrue(); }); } @@ -192,11 +196,11 @@ void testConversionToEntityOfColumnWithFilter() { "X*Y*Z", "[\"col1\", \"col2\"]", "idTest", + true, "number", "lessThan", "50.5", - 0.1, - true); + 0.1); ColumnEntity column = SpreadsheetConfigMapper.toColumnEntity(dto); @@ -207,10 +211,10 @@ void testConversionToEntityOfColumnWithFilter() { assertThat(e.getFormula()).isEqualTo("X*Y*Z"); assertThat(e.getDependencies()).isEqualTo("[\"col1\", \"col2\"]"); assertThat(e.getId()).isEqualTo("idTest"); - assertThat(e.getFilterDataType()).isEqualTo("number"); - assertThat(e.getFilterType()).isEqualTo("lessThan"); - assertThat(e.getFilterValue()).isEqualTo("50.5"); - assertThat(e.getFilterTolerance()).isEqualTo(0.1); + assertThat(e.getColumnFilter().getFilterDataType()).isEqualTo("number"); + assertThat(e.getColumnFilter().getFilterType()).isEqualTo("lessThan"); + assertThat(e.getColumnFilter().getFilterValue()).isEqualTo("50.5"); + assertThat(e.getColumnFilter().getFilterTolerance()).isEqualTo(0.1); assertThat(e.isVisible()).isTrue(); }); } @@ -225,11 +229,11 @@ void testConversionOfColumnWithoutFilter() { "X*Y*Z", "[\"col1\", \"col2\"]", "idTest", + true, null, null, null, - null, - true); + null); ColumnEntity entity = SpreadsheetConfigMapper.toColumnEntity(dto); ColumnInfos convertedDto = SpreadsheetConfigMapper.toColumnDto(entity); diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java index bd55762b..cb7ee520 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java @@ -277,7 +277,7 @@ void testAddSpreadsheetConfigToCollection() throws Exception { UUID collectionUuid = postSpreadsheetConfigCollection(initialCollection); List columnInfos = List.of( - new ColumnInfos(null, "new_col", ColumnType.NUMBER, 1, "formula", "[\"dep\"]", "idNew", null, null, null, null, true) + new ColumnInfos(null, "new_col", ColumnType.NUMBER, 1, "formula", "[\"dep\"]", "idNew", true, null, null, null, null) ); SpreadsheetConfigInfos newConfig = new SpreadsheetConfigInfos(null, "NewSheet", SheetType.BATTERY, columnInfos, null, List.of(), new SortConfig("idNew", SortDirection.ASC.name().toLowerCase())); @@ -414,8 +414,8 @@ void testReplaceAllSpreadsheetConfigs() throws Exception { private List createSpreadsheetConfigsWithAliases() { List columnInfos = Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", null, null, null, null, true), - new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", null, null, null, null, true) + new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", true, null, null, null, null) ); return List.of( @@ -429,8 +429,8 @@ private List createSpreadsheetConfigsWithAliases() { private List createSpreadsheetConfigs() { List columnInfos = Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", null, null, null, null, true), - new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", null, null, null, null, true) + new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", true, null, null, null, null) ); return List.of( @@ -441,14 +441,14 @@ private List createSpreadsheetConfigs() { private List createSpreadsheetConfigsWithFilters() { List columnsConfig1 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", - "text", "equals", "test-value", null, true), - new ColumnInfos(null, "name", ColumnType.TEXT, null, "name", "[\"name\"]", "name", - "text", "contains", "name-value", null, true), - new ColumnInfos(null, "country1", ColumnType.ENUM, null, "country1", "[\"country1\"]", "country1", - null, null, null, null, true), - new ColumnInfos(null, "voltage", ColumnType.NUMBER, 1, "voltage", "[\"voltage\"]", "voltage", - "number", "greaterThan", "100", 0.5, true) + new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + "text", "equals", "test-value", null), + new ColumnInfos(null, "name", ColumnType.TEXT, null, "name", "[\"name\"]", "name", true, + "text", "contains", "name-value", null), + new ColumnInfos(null, "country1", ColumnType.ENUM, null, "country1", "[\"country1\"]", "country1", true, + null, null, null, null), + new ColumnInfos(null, "voltage", ColumnType.NUMBER, 1, "voltage", "[\"voltage\"]", "voltage", true, + "number", "greaterThan", "100", 0.5) ); List globalFiltersConfig1 = Arrays.asList( @@ -457,12 +457,12 @@ private List createSpreadsheetConfigsWithFilters() { ); List columnsConfig2 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", - "text", "contains", "other-value", null, true), - new ColumnInfos(null, "type", ColumnType.ENUM, null, "type", "[\"type\"]", "type", - null, null, null, null, true), - new ColumnInfos(null, "power", ColumnType.NUMBER, 1, "power", "[\"power\"]", "power", - "number", "lessThan", "50", 0.1, true) + new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + "text", "contains", "other-value", null), + new ColumnInfos(null, "type", ColumnType.ENUM, null, "type", "[\"type\"]", "type", true, + null, null, null, null), + new ColumnInfos(null, "power", ColumnType.NUMBER, 1, "power", "[\"power\"]", "power", true, + "number", "lessThan", "50", 0.1) ); List globalFiltersConfig2 = List.of( @@ -477,10 +477,10 @@ private List createSpreadsheetConfigsWithFilters() { private List createUpdatedSpreadsheetConfigs() { List columnInfos = Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", null, null, null, null, true), - new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 2", null, "idB", null, null, null, null, true), - new ColumnInfos(null, "cust_c", ColumnType.ENUM, null, "cust_b + 2", "[\"cust_b\"]", "idC", null, null, null, null, true), - new ColumnInfos(null, "cust_d", ColumnType.NUMBER, 0, "5 + 1", null, "idD", null, null, null, null, true) + new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 2", null, "idB", true, null, null, null, null), + new ColumnInfos(null, "cust_c", ColumnType.ENUM, null, "cust_b + 2", "[\"cust_b\"]", "idC", true, null, null, null, null), + new ColumnInfos(null, "cust_d", ColumnType.NUMBER, 0, "5 + 1", null, "idD", true, null, null, null, null) ); return List.of( @@ -492,10 +492,10 @@ private List createUpdatedSpreadsheetConfigs() { private List createUpdatedSpreadsheetConfigsWithFilters() { List columnsConfig1 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", - "text", "startsWith", "new-prefix", null, true), - new ColumnInfos(null, "updated", ColumnType.TEXT, null, "updated", "[\"updated\"]", "updated", - null, null, null, null, true) + new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + "text", "startsWith", "new-prefix", null), + new ColumnInfos(null, "updated", ColumnType.TEXT, null, "updated", "[\"updated\"]", "updated", true, + null, null, null, null) ); List globalFiltersConfig1 = Arrays.asList( @@ -505,10 +505,10 @@ private List createUpdatedSpreadsheetConfigsWithFilters( ); List columnsConfig2 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", - "text", "endsWith", "suffix", null, true), - new ColumnInfos(null, "other", ColumnType.NUMBER, 2, "other", "[\"other\"]", "other", - "number", "between", "10,20", null, true) + new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + "text", "endsWith", "suffix", null), + new ColumnInfos(null, "other", ColumnType.NUMBER, 2, "other", "[\"other\"]", "other", true, + "number", "between", "10,20", null) ); List globalFiltersConfig2 = List.of( @@ -516,10 +516,10 @@ private List createUpdatedSpreadsheetConfigsWithFilters( ); List columnsConfig3 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", - "text", "contains", "middle", null, true), - new ColumnInfos(null, "third", ColumnType.BOOLEAN, null, "third", "[\"third\"]", "third", - "boolean", "equals", "true", null, true) + new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + "text", "contains", "middle", null), + new ColumnInfos(null, "third", ColumnType.BOOLEAN, null, "third", "[\"third\"]", "third", true, + "boolean", "equals", "true", null) ); List globalFiltersConfig3 = List.of( diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java index a84f1132..d9004fbc 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java @@ -238,7 +238,7 @@ void testCreateColumn() throws Exception { SpreadsheetConfigInfos config = new SpreadsheetConfigInfos(null, "Battery", SheetType.BATTERY, List.of(), null, List.of(), null); UUID configId = saveAndReturnId(config); - ColumnInfos columnToCreate = new ColumnInfos(null, "new_column", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", null, null, null, null, true); + ColumnInfos columnToCreate = new ColumnInfos(null, "new_column", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", true, null, null, null, null); MvcResult result = mockMvc.perform(post(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE) .content(mapper.writeValueAsString(columnToCreate)) @@ -255,8 +255,8 @@ void testCreateColumn() throws Exception { .isEqualTo(columnToCreate); // Create a column with a filter - ColumnInfos columnWithFilter = new ColumnInfos(null, "new_column_with_filter", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", - "text", "equals", "test-value", null, true); + ColumnInfos columnWithFilter = new ColumnInfos(null, "new_column_with_filter", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", true, + "text", "equals", "test-value", null); MvcResult resultWithFilter = mockMvc.perform(post(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE) .content(mapper.writeValueAsString(columnWithFilter)) @@ -280,8 +280,8 @@ void testUpdateColumn() throws Exception { SpreadsheetConfigInfos savedConfig = getSpreadsheetConfig(configId); UUID columnId = savedConfig.columns().get(0).uuid(); - ColumnInfos columnUpdate = new ColumnInfos(columnId, "updated_column", ColumnType.TEXT, null, "new_formula", "[]", "updatedId", - "text", "equals", "updated-value", null, true); + ColumnInfos columnUpdate = new ColumnInfos(columnId, "updated_column", ColumnType.TEXT, null, "new_formula", "[]", "updatedId", true, + "text", "equals", "updated-value", null); mockMvc.perform(put(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE + "/" + columnId) .content(mapper.writeValueAsString(columnUpdate)) @@ -398,9 +398,9 @@ void testReorderColumns() throws Exception { void testUpdateColumnStates() throws Exception { // Create config with multiple columns List columns = Arrays.asList( - new ColumnInfos(null, "col1", ColumnType.TEXT, null, "formula1", null, "id1", null, null, null, null, true), - new ColumnInfos(null, "col2", ColumnType.NUMBER, 2, "formula2", null, "id2", null, null, null, null, true), - new ColumnInfos(null, "col3", ColumnType.BOOLEAN, null, "formula3", null, "id3", null, null, null, null, false) + new ColumnInfos(null, "col1", ColumnType.TEXT, null, "formula1", null, "id1", true, null, null, null, null), + new ColumnInfos(null, "col2", ColumnType.NUMBER, 2, "formula2", null, "id2", true, null, null, null, null), + new ColumnInfos(null, "col3", ColumnType.BOOLEAN, null, "formula3", null, "id3", false, null, null, null, null) ); SpreadsheetConfigInfos config = new SpreadsheetConfigInfos(null, "TestConfig", SheetType.BATTERY, columns, null, List.of(), null); @@ -597,7 +597,7 @@ void testResetFiltersForSpreadsheetConfig() throws Exception { // Initial config should have filters set SpreadsheetConfigInfos initialConfig = getSpreadsheetConfig(configId); assertThat(initialConfig.globalFilters()).hasSize(2); - assertThat(initialConfig.columns().getFirst()).hasFieldOrPropertyWithValue("filterValue", "test-value"); + assertThat(initialConfig.columns().getFirst().columnFilterInfos()).hasFieldOrPropertyWithValue("filterValue", "test-value"); // Call the endpoint to reset the filters mockMvc.perform(put(URI_SPREADSHEET_CONFIG_GET_PUT + configId + "/reset-filters") @@ -607,7 +607,7 @@ void testResetFiltersForSpreadsheetConfig() throws Exception { // Verify the filters (global or column based) were reset SpreadsheetConfigInfos updatedConfig = getSpreadsheetConfig(configId); assertThat(updatedConfig.globalFilters()).isEmpty(); - assertThat(updatedConfig.columns().getFirst()).hasFieldOrPropertyWithValue("filterValue", null); + assertThat(updatedConfig.columns().getFirst().columnFilterInfos()).hasFieldOrPropertyWithValue("filterValue", null); } @Test @@ -625,42 +625,42 @@ void testSetGlobalFiltersToNonExistentConfig() throws Exception { private List createColumns() { return Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", null, null, null, null, true), - new ColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", null, null, null, null, true), - new ColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", null, null, null, null, true), - new ColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", null, null, null, null, true) + new ColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new ColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", true, null, null, null, null), + new ColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", true, null, null, null, null), + new ColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", true, null, null, null, null) ); } private List createColumnsWithFilters() { return Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", - "text", "equals", "test-value", null, true), - new ColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", - "number", "greaterThan", "100", 0.5, true), - new ColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", - "text", "startsWith", "prefix", null, true), - new ColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", - null, null, null, null, true) + new ColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, + "text", "equals", "test-value", null), + new ColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", true, + "number", "greaterThan", "100", 0.5), + new ColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", true, + "text", "startsWith", "prefix", null), + new ColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", true, + null, null, null, null) ); } private List createUpdatedColumns() { return Arrays.asList( - new ColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", null, null, null, null, true), - new ColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", null, null, null, null, true), - new ColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", null, null, null, null, true) + new ColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", true, null, null, null, null), + new ColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", true, null, null, null, null), + new ColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", true, null, null, null, null) ); } private List createUpdatedColumnsWithFilters() { return Arrays.asList( - new ColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", - "text", "contains", "updated-value", null, true), - new ColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", - "number", "lessThan", "50", 0.1, true), - new ColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", - null, null, null, null, true) // No filter on this column + new ColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", true, + "text", "contains", "updated-value", null), + new ColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", true, + "number", "lessThan", "50", 0.1), + new ColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", true, + null, null, null, null) // No filter on this column ); } From 1fb33f78c454a30ce1db85f265638ed52a8d1bab Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 30 Jan 2026 12:21:38 +0100 Subject: [PATCH 04/22] add TU --- .../service/SpreadsheetConfigService.java | 16 ++-- .../server/ComputationResultFiltersTest.java | 77 ++++++++++++++++++- 2 files changed, 84 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java index f3ad23ae..b8f9e7dd 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java @@ -10,10 +10,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.studyconfig.server.constants.SortDirection; import org.gridsuite.studyconfig.server.dto.*; -import org.gridsuite.studyconfig.server.entities.ColumnEntity; -import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; -import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigCollectionEntity; -import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; +import org.gridsuite.studyconfig.server.entities.*; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; import org.gridsuite.studyconfig.server.repositories.SpreadsheetConfigCollectionRepository; import org.gridsuite.studyconfig.server.repositories.SpreadsheetConfigRepository; @@ -323,10 +320,13 @@ public void updateColumn(UUID id, UUID columnId, ColumnInfos dto) { columnEntity.setFormula(dto.formula()); columnEntity.setDependencies(dto.dependencies()); columnEntity.setId(dto.id()); - columnEntity.getColumnFilter().setFilterDataType(dto.columnFilterInfos().filterDataType()); - columnEntity.getColumnFilter().setFilterType(dto.columnFilterInfos().filterType()); - columnEntity.getColumnFilter().setFilterValue(dto.columnFilterInfos().filterValue()); - columnEntity.getColumnFilter().setFilterTolerance(dto.columnFilterInfos().filterTolerance()); + Optional.ofNullable(columnEntity.getColumnFilter()).ifPresent(filter -> { + var infos = dto.columnFilterInfos(); + filter.setFilterDataType(infos != null ? infos.filterDataType() : null); + filter.setFilterType(infos != null ? infos.filterType() : null); + filter.setFilterValue(infos != null ? infos.filterValue() : null); + filter.setFilterTolerance(infos != null ? infos.filterTolerance() : null); + }); columnEntity.setVisible(dto.visible()); spreadsheetConfigRepository.save(entity); diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 131f2630..8f2a09b2 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -6,13 +6,88 @@ */ package org.gridsuite.studyconfig.server; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gridsuite.studyconfig.server.dto.ColumnFilterInfos; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.dto.ComputationTypeFiltersInfos; +import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; +import org.gridsuite.studyconfig.server.repositories.ComputationResultFiltersRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import java.util.List; +import java.util.UUID; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * @author Rehili Ghazwa */ @SpringBootTest @AutoConfigureMockMvc -public class ComputationResultFiltersTest { +class ComputationResultFiltersTest { + + private static final String BASE_URI = "/v1/computation-result-filters"; + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper mapper; + + @Autowired + private ComputationResultFiltersRepository computationResultFiltersRepository; + + @AfterEach + void tearDown() { + computationResultFiltersRepository.deleteAll(); + } + + private List createGlobalFilters() { + return List.of(GlobalFilterInfos.builder().id(UUID.randomUUID()).filterType("country").label("Filter 1").recent(false).build(), + GlobalFilterInfos.builder().id(UUID.randomUUID()).filterType("country").label("Filter 2").recent(false).build()); + } + + private ComputationResultColumnFilterInfos createColumnFilter() { + return new ComputationResultColumnFilterInfos("subjectId", new ColumnFilterInfos("number", "greaterThan", "10", 0.5)); + } + + @Test + void testCreateDefaultComputationResultFilters() throws Exception { + MvcResult result = mockMvc.perform(post(BASE_URI + "/default")) + .andExpect(status().isCreated()) + .andReturn(); + UUID rootId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); + assertThat(rootId).isNotNull(); + assertThat(computationResultFiltersRepository.findById(rootId)).isPresent(); + } + + @Test + void testGetComputationResultFilters() throws Exception { + MvcResult result = mockMvc.perform(post(BASE_URI + "/default")).andReturn(); + UUID rootId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); + mockMvc.perform(post(BASE_URI + "/" + rootId + "/" + "LoadFlow" + "/global-filters") + .content(mapper.writeValueAsString(createGlobalFilters())) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + mockMvc.perform(put(BASE_URI + "/" + rootId + "/" + "LoadFlow" + "/" + "limitViolation" + "/columns") + .content(mapper.writeValueAsString(createColumnFilter())) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow/limitViolation")).andExpect(status().isOk()).andReturn(); + ComputationTypeFiltersInfos infos = mapper.readValue(result.getResponse().getContentAsString(), ComputationTypeFiltersInfos.class); + assertThat(infos.computationType()).isEqualTo("LoadFlow"); + assertThat(infos.computationSubTypeFilterInfos()).hasSize(1); + assertThat(infos.computationSubTypeFilterInfos().getFirst().computationSubType()).isEqualTo("limitViolation"); + } } From a06a86f1696f3056ab5d766e7db2cee87bbc9eb3 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 30 Jan 2026 18:03:38 +0100 Subject: [PATCH 05/22] some fix --- .../ComputationResultFiltersController.java | 26 ++++++++++++++----- .../ComputationResultFiltersService.java | 25 +++++++++++++----- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java index 32f67943..3ac50459 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java @@ -42,17 +42,29 @@ public ResponseEntity createDefaultComputationResultFilters() { return ResponseEntity.status(HttpStatus.CREATED).body(id); } + @GetMapping("/{id}/{computationType}") + @Operation(summary = "Get a computation result global filters", + description = "Fetches the computation result global filters for a given computation type") + @ApiResponse(responseCode = "200", description = "Computation result global filters found", + content = @Content(schema = @Schema(implementation = GlobalFilterInfos.class))) + @ApiResponse(responseCode = "404", description = "Computation result global filters not found") + public ResponseEntity> getComputingResultGlobalFilters( + @Parameter(description = "Computation root ID") @PathVariable UUID id, + @Parameter(description = "Computation type") @PathVariable String computationType) { + return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultGlobalFilters(id, computationType)); + } + @GetMapping("/{id}/{computationType}/{computationSubType}") - @Operation(summary = "Get a computation result filters", - description = "Fetches the computation result filters for a given computation type and subtype") - @ApiResponse(responseCode = "200", description = "Computation result filters found", - content = @Content(schema = @Schema(implementation = ComputationResultFiltersInfos.class))) - @ApiResponse(responseCode = "404", description = "Computation result filters not found") - public ResponseEntity getComputingResultFilters( + @Operation(summary = "Get a computation result column filters", + description = "Fetches the computation result column filters for a given computation type and subtype") + @ApiResponse(responseCode = "200", description = "Computation result column filters found", + content = @Content(schema = @Schema(implementation = ComputationResultColumnFilterInfos.class))) + @ApiResponse(responseCode = "404", description = "Computation result column filters not found") + public ResponseEntity> getComputingResultColumnFilters( @Parameter(description = "Computation root ID") @PathVariable UUID id, @Parameter(description = "Computation type") @PathVariable String computationType, @Parameter(description = "Computation subtype") @PathVariable String computationSubType) { - return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultFilters(id, computationType, computationSubType)); + return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultColumnFilters(id, computationType, computationSubType)); } @PostMapping("/{id}/{computationType}/global-filters") diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index fe10204b..56dab3ad 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -8,7 +8,8 @@ import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; -import org.gridsuite.studyconfig.server.dto.*; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; import org.gridsuite.studyconfig.server.entities.*; import org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; @@ -42,15 +43,27 @@ public UUID createDefaultComputingResultFilters() { } @Transactional(readOnly = true) - public ComputationTypeFiltersInfos getComputingResultFilters(UUID rootId, String computationType, String computationSubType) { + public List getComputingResultColumnFilters(UUID rootId, String computationType, String computationSubType) { ComputationResultFiltersEntity rootEntity = computationResultFiltersRepository.findById(rootId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); - return ComputationResultFiltersMapper.toTypeDto(rootEntity.getComputationResultFilter().stream() + return rootEntity.getComputationResultFilter().stream() .filter(type -> type.getComputationType().equals(computationType)) - .filter(type -> type.getComputationSubTypes().stream().anyMatch( - sub -> sub.getComputationSubType().equals(computationSubType))) .findFirst() - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationType))); + .flatMap(type -> type.getComputationSubTypes().stream() + .filter(sub -> sub.getComputationSubType().equals(computationSubType)) + .findFirst()) + .map(subType -> subType.getColumns().stream() + .map(ComputationResultFiltersMapper::toComputationColumnFilterInfos).toList()).orElse(List.of()); + } + + @Transactional(readOnly = true) + public List getComputingResultGlobalFilters(UUID rootId, String computationType) { + ComputationResultFiltersEntity rootEntity = computationResultFiltersRepository.findById(rootId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + return rootEntity.getComputationResultFilter().stream().filter(type -> type.getComputationType().equals(computationType)) + .findFirst() + .map(type -> type.getGlobalFilters().stream().map(SpreadsheetConfigMapper::toGlobalFilterDto).toList()) + .orElse(List.of()); } @Transactional From f8b91f5a35d37b040fa66eb73d329dc80f20ec14 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 30 Jan 2026 18:08:04 +0100 Subject: [PATCH 06/22] some fix --- .../service/SpreadsheetConfigService.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java index b8f9e7dd..5bb7b560 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java @@ -320,13 +320,18 @@ public void updateColumn(UUID id, UUID columnId, ColumnInfos dto) { columnEntity.setFormula(dto.formula()); columnEntity.setDependencies(dto.dependencies()); columnEntity.setId(dto.id()); - Optional.ofNullable(columnEntity.getColumnFilter()).ifPresent(filter -> { - var infos = dto.columnFilterInfos(); - filter.setFilterDataType(infos != null ? infos.filterDataType() : null); - filter.setFilterType(infos != null ? infos.filterType() : null); - filter.setFilterValue(infos != null ? infos.filterValue() : null); - filter.setFilterTolerance(infos != null ? infos.filterTolerance() : null); - }); + var infos = dto.columnFilterInfos(); + if (infos != null) { + ColumnFilter filter = columnEntity.getColumnFilter(); + if (filter == null) { + filter = new ColumnFilter(); + columnEntity.setColumnFilter(filter); + } + filter.setFilterDataType(infos.filterDataType()); + filter.setFilterType(infos.filterType()); + filter.setFilterValue(infos.filterValue()); + filter.setFilterTolerance(infos.filterTolerance()); + } columnEntity.setVisible(dto.visible()); spreadsheetConfigRepository.save(entity); From b12a1e03fde0ceb2ff48740fa0a97e586bba970a Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 30 Jan 2026 18:19:28 +0100 Subject: [PATCH 07/22] update TU --- .../server/ComputationResultFiltersTest.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 8f2a09b2..75cbcf98 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -6,11 +6,9 @@ */ package org.gridsuite.studyconfig.server; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.studyconfig.server.dto.ColumnFilterInfos; -import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; -import org.gridsuite.studyconfig.server.dto.ComputationTypeFiltersInfos; -import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; +import org.gridsuite.studyconfig.server.dto.*; import org.gridsuite.studyconfig.server.repositories.ComputationResultFiltersRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -85,9 +83,13 @@ void testGetComputationResultFilters() throws Exception { .andExpect(status().isNoContent()); result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow/limitViolation")).andExpect(status().isOk()).andReturn(); - ComputationTypeFiltersInfos infos = mapper.readValue(result.getResponse().getContentAsString(), ComputationTypeFiltersInfos.class); - assertThat(infos.computationType()).isEqualTo("LoadFlow"); - assertThat(infos.computationSubTypeFilterInfos()).hasSize(1); - assertThat(infos.computationSubTypeFilterInfos().getFirst().computationSubType()).isEqualTo("limitViolation"); + List infos = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(infos).hasSize(1); + ComputationResultColumnFilterInfos info = infos.get(0); + assertThat(info.id()).isEqualTo("subjectId"); + assertThat(info.columnFilterInfos().filterValue()).isEqualTo("10"); + assertThat(info.columnFilterInfos().filterType()).isEqualTo("greaterThan"); + assertThat(info.columnFilterInfos().filterDataType()).isEqualTo("number"); + } } From c0da42d7442568f182a1e26e9977b6d4e51532b6 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Sun, 1 Feb 2026 19:10:45 +0100 Subject: [PATCH 08/22] unused functions --- .../ComputationResultFiltersMapper.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java index f252fa61..961b2a11 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java @@ -16,27 +16,6 @@ public final class ComputationResultFiltersMapper { private ComputationResultFiltersMapper() { } - public static ComputationResultFiltersInfos toDto(ComputationResultFiltersEntity entity) { - return new ComputationResultFiltersInfos(entity.getComputationResultFilter().stream() - .map(ComputationResultFiltersMapper::toTypeDto) - .toList()); - } - - public static ComputationTypeFiltersInfos toTypeDto(ComputationTypeFiltersEntity entity) { - return new ComputationTypeFiltersInfos(entity.getComputationType(), - entity.getGlobalFilters().stream() - .map(SpreadsheetConfigMapper::toGlobalFilterDto).toList(), - entity.getComputationSubTypes().stream().map(ComputationResultFiltersMapper::toSubTypeDto).toList() - ); - } - - private static ComputationSubTypeFilterInfos toSubTypeDto(ComputationSubTypeFiltersEntity entity) { - return new ComputationSubTypeFilterInfos( - entity.getComputationSubType(), - entity.getColumns().stream().map(ComputationResultFiltersMapper::toComputationColumnFilterInfos).toList() - ); - } - public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos(ComputationResultColumnFilterEntity entity) { ColumnFilter filter = entity.getColumnFilter(); return new ComputationResultColumnFilterInfos(entity.getComputationColumnId(), filter != null ? From cd193241c93825ccd3443c17eb10fa1af445fdbf Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Sun, 1 Feb 2026 20:45:26 +0100 Subject: [PATCH 09/22] fix TU --- .../server/ComputationResultFiltersTest.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 75cbcf98..6df7690a 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -77,19 +77,31 @@ void testGetComputationResultFilters() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - mockMvc.perform(put(BASE_URI + "/" + rootId + "/" + "LoadFlow" + "/" + "limitViolation" + "/columns") + mockMvc.perform(put(BASE_URI + "/" + rootId + "/" + "PccMin" + "/" + "pccMinResults" + "/columns") .content(mapper.writeValueAsString(createColumnFilter())) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow/limitViolation")).andExpect(status().isOk()).andReturn(); - List infos = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); - assertThat(infos).hasSize(1); - ComputationResultColumnFilterInfos info = infos.get(0); + result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow/loadflowCurrentLimitViolation")).andExpect(status().isOk()).andReturn(); + List infosLoadFlowColumn = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(infosLoadFlowColumn).isEmpty(); + + result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/PccMin/pccMinResults")).andExpect(status().isOk()).andReturn(); + List infosPccMinColumn = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(infosPccMinColumn).hasSize(1); + ComputationResultColumnFilterInfos info = infosPccMinColumn.getFirst(); assertThat(info.id()).isEqualTo("subjectId"); assertThat(info.columnFilterInfos().filterValue()).isEqualTo("10"); assertThat(info.columnFilterInfos().filterType()).isEqualTo("greaterThan"); assertThat(info.columnFilterInfos().filterDataType()).isEqualTo("number"); + result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow")).andExpect(status().isOk()).andReturn(); + List globalFilterInfos = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); + assertThat(globalFilterInfos).hasSize(2); + GlobalFilterInfos globalFilterInfo = globalFilterInfos.getFirst(); + assertThat(globalFilterInfo.label()).isEqualTo("Filter 1"); + assertThat(globalFilterInfo.filterType()).isEqualTo("country"); + assertThat(globalFilterInfo.recent()).isFalse(); + } } From 460d3fa99799da6fcc3166ba5597d1cb38b05094 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Sun, 1 Feb 2026 22:28:49 +0100 Subject: [PATCH 10/22] add sql file data migration --- .../server/entities/GlobalFilterEntity.java | 2 +- .../changesets/changelog_20260128T102437Z.xml | 53 ++++++++++++------- ...migrationColumnFilter_20260201T111008Z.sql | 22 ++++++++ 3 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java index 8f84f888..a5dd79c0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java @@ -15,7 +15,7 @@ * @author Achour BERRAHMA */ @Entity -@Table(name = "spreadsheet_global_filter", indexes = { +@Table(name = "global_filter", indexes = { @Index(name = "idx_global_filter_spreadsheet_config_id", columnList = "spreadsheet_config_id"), @Index(name = "idx_global_filter_computation_type_filters_id", columnList = "computation_type_filters_id")} ) diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml index ef457136..a39ba970 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -58,55 +58,72 @@ - + + + + - + - + - + - + - - + + - - - - + + + - + - + - + - + - + - + + + + - + + + + + + + diff --git a/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql b/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql new file mode 100644 index 00000000..f64206e3 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql @@ -0,0 +1,22 @@ +INSERT INTO column_filter (uuid, filter_data_type, filter_type, filter_value, filter_tolerance) +SELECT + gen_random_uuid(), + filter_data_type, + filter_type, + filter_value, + filter_tolerance +FROM spreadsheet_column +WHERE + filter_data_type IS NOT NULL + OR filter_type IS NOT NULL + OR filter_value IS NOT NULL + OR filter_tolerance IS NOT NULL; + +UPDATE spreadsheet_column sc +SET column_entity_column_filter_id = cf.uuid +FROM column_filter cf +WHERE + sc.filter_data_type IS NOT DISTINCT FROM cf.filter_data_type + AND sc.filter_type IS NOT DISTINCT FROM cf.filter_type + AND sc.filter_value IS NOT DISTINCT FROM cf.filter_value + AND sc.filter_tolerance IS NOT DISTINCT FROM cf.filter_tolerance; \ No newline at end of file From a1f913630a641669fa7ee9aa3342fbce455458d8 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Mon, 2 Feb 2026 13:02:40 +0100 Subject: [PATCH 11/22] fix sql script --- ...migrationColumnFilter_20260201T111008Z.sql | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql b/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql index f64206e3..3aad3e84 100644 --- a/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql +++ b/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql @@ -1,22 +1,36 @@ -INSERT INTO column_filter (uuid, filter_data_type, filter_type, filter_value, filter_tolerance) -SELECT - gen_random_uuid(), - filter_data_type, - filter_type, - filter_value, - filter_tolerance -FROM spreadsheet_column -WHERE - filter_data_type IS NOT NULL - OR filter_type IS NOT NULL - OR filter_value IS NOT NULL - OR filter_tolerance IS NOT NULL; - +WITH created_filters AS ( + SELECT + sc.uuid AS column_uuid, + gen_random_uuid() AS filter_uuid, + sc.filter_data_type, + sc.filter_type, + sc.filter_value, + sc.filter_tolerance + FROM spreadsheet_column sc + WHERE + sc.filter_data_type IS NOT NULL + OR sc.filter_type IS NOT NULL + OR sc.filter_value IS NOT NULL + OR sc.filter_tolerance IS NOT NULL +), + inserted AS ( + INSERT INTO column_filter ( + uuid, + filter_data_type, + filter_type, + filter_value, + filter_tolerance + ) + SELECT + filter_uuid, + filter_data_type, + filter_type, + filter_value, + filter_tolerance + FROM created_filters + RETURNING uuid + ) UPDATE spreadsheet_column sc -SET column_entity_column_filter_id = cf.uuid -FROM column_filter cf -WHERE - sc.filter_data_type IS NOT DISTINCT FROM cf.filter_data_type - AND sc.filter_type IS NOT DISTINCT FROM cf.filter_type - AND sc.filter_value IS NOT DISTINCT FROM cf.filter_value - AND sc.filter_tolerance IS NOT DISTINCT FROM cf.filter_tolerance; \ No newline at end of file +SET column_entity_column_filter_id = cf.filter_uuid +FROM created_filters cf +WHERE sc.uuid = cf.column_uuid; \ No newline at end of file From 5699270bd98a1753aba0fee4e4641423b9c78a78 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Mon, 2 Feb 2026 13:18:07 +0100 Subject: [PATCH 12/22] formatted file --- ...migrationColumnFilter_20260201T111008Z.sql | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql b/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql index 3aad3e84..c5e2e7b0 100644 --- a/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql +++ b/src/main/resources/db/changelog/changesets/migrationColumnFilter_20260201T111008Z.sql @@ -1,35 +1,19 @@ -WITH created_filters AS ( - SELECT - sc.uuid AS column_uuid, - gen_random_uuid() AS filter_uuid, - sc.filter_data_type, - sc.filter_type, - sc.filter_value, - sc.filter_tolerance - FROM spreadsheet_column sc - WHERE - sc.filter_data_type IS NOT NULL - OR sc.filter_type IS NOT NULL - OR sc.filter_value IS NOT NULL - OR sc.filter_tolerance IS NOT NULL -), +WITH created_filters AS (SELECT sc.uuid AS column_uuid, + gen_random_uuid() AS filter_uuid, + sc.filter_data_type, + sc.filter_type, + sc.filter_value, + sc.filter_tolerance + FROM spreadsheet_column sc + WHERE sc.filter_data_type IS NOT NULL + OR sc.filter_type IS NOT NULL + OR sc.filter_value IS NOT NULL + OR sc.filter_tolerance IS NOT NULL), inserted AS ( - INSERT INTO column_filter ( - uuid, - filter_data_type, - filter_type, - filter_value, - filter_tolerance - ) - SELECT - filter_uuid, - filter_data_type, - filter_type, - filter_value, - filter_tolerance + INSERT INTO column_filter (uuid, filter_data_type, filter_type, filter_value, filter_tolerance) + SELECT filter_uuid, filter_data_type, filter_type, filter_value, filter_tolerance FROM created_filters - RETURNING uuid - ) + RETURNING uuid) UPDATE spreadsheet_column sc SET column_entity_column_filter_id = cf.filter_uuid FROM created_filters cf From 7cf28fc512cacad4e631ab3c12c7d54c69e3abde Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Tue, 3 Feb 2026 21:19:43 +0100 Subject: [PATCH 13/22] code review remarks --- .../SpreadsheetConfigController.java | 6 +- .../WorkspacesConfigController.java | 2 +- .../ComputationResultColumnFilterInfos.java | 4 +- .../dto/ComputationResultFiltersInfos.java | 21 ----- .../dto/ComputationSubTypeFilterInfos.java | 24 ------ .../dto/ComputationTypeFiltersInfos.java | 30 ------- .../studyconfig/server/dto/SortConfig.java | 2 +- ...Infos.java => SpreadsheetColumnInfos.java} | 10 +-- .../server/dto/SpreadsheetConfigInfos.java | 2 +- .../ComputationSubTypeFiltersEntity.java | 2 +- .../ComputationTypeFiltersEntity.java | 2 +- .../server/entities/GlobalFilterEntity.java | 2 +- ...tity.java => SpreadsheetColumnEntity.java} | 8 +- .../entities/SpreadsheetConfigEntity.java | 2 +- .../ComputationResultFiltersMapper.java | 2 +- .../mapper/SpreadsheetConfigMapper.java | 10 +-- .../ComputationResultFiltersService.java | 48 +++++++---- .../service/DiagramGridLayoutService.java | 4 +- .../NetworkVisualizationsParamService.java | 2 +- .../service/SpreadsheetConfigService.java | 44 +++++----- .../service/WorkspacesConfigService.java | 4 +- .../changesets/changelog_20260128T102437Z.xml | 6 -- .../server/ComputationResultFiltersTest.java | 2 +- .../studyconfig/server/DtoConverterTest.java | 26 +++--- ...dsheetConfigCollectionIntegrationTest.java | 78 ++++++++--------- .../SpreadsheetConfigIntegrationTest.java | 84 +++++++++---------- .../WorkspacesConfigControllerTest.java | 2 +- 27 files changed, 183 insertions(+), 246 deletions(-) delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java rename src/main/java/org/gridsuite/studyconfig/server/dto/{ColumnInfos.java => SpreadsheetColumnInfos.java} (88%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{ColumnEntity.java => SpreadsheetColumnEntity.java} (90%) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/SpreadsheetConfigController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/SpreadsheetConfigController.java index 6f316706..faff2903 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/SpreadsheetConfigController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/SpreadsheetConfigController.java @@ -140,7 +140,7 @@ public ResponseEntity deleteSpreadsheetConfig( @Operation(summary = "Get a column", description = "Retrieves a column by its ID") @ApiResponse(responseCode = "200", description = "Column found") @ApiResponse(responseCode = "404", description = "Column not found") - public ResponseEntity getColumn( + public ResponseEntity getColumn( @Parameter(description = "ID of the spreadsheet config") @PathVariable UUID id, @Parameter(description = "ID of the column to retrieve") @PathVariable UUID columnId) { return ResponseEntity.ok(spreadsheetConfigService.getColumn(id, columnId)); @@ -151,7 +151,7 @@ public ResponseEntity getColumn( @ApiResponse(responseCode = "201", description = "Column created") public ResponseEntity createColumn( @Parameter(description = "ID of the spreadsheet config") @PathVariable UUID id, - @Valid @RequestBody ColumnInfos dto) { + @Valid @RequestBody SpreadsheetColumnInfos dto) { UUID columnId = spreadsheetConfigService.createColumn(id, dto); return ResponseEntity.status(HttpStatus.CREATED).body(columnId); } @@ -162,7 +162,7 @@ public ResponseEntity createColumn( public ResponseEntity updateColumn( @Parameter(description = "ID of the spreadsheet config") @PathVariable UUID id, @Parameter(description = "ID of the column to update") @PathVariable UUID columnId, - @Valid @RequestBody ColumnInfos dto) { + @Valid @RequestBody SpreadsheetColumnInfos dto) { spreadsheetConfigService.updateColumn(id, columnId, dto); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java index 1002523b..05db43ce 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java @@ -79,7 +79,7 @@ public ResponseEntity deleteWorkspacesConfig( @GetMapping("/{id}/workspaces") @Operation(summary = "Get workspaces metadata", - description = "Retrieves lightweight metadata for all workspaces (id, name, panel count)") + description = "Retrieves lightweight metadata for all workspaces (columnId, name, panel count)") @ApiResponse(responseCode = "200", description = "Workspaces metadata retrieved") @ApiResponse(responseCode = "404", description = "Workspaces config not found") public ResponseEntity> getWorkspaces( diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java index 5bdf0752..521abe74 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java @@ -14,8 +14,8 @@ @Schema(name = "ComputationResultColumnFilterInfos", description = "Computation Result Column filter infos") public record ComputationResultColumnFilterInfos( - @Schema(description = "Column id") - String id, + @Schema(description = "Column columnId") + String columnId, @Schema(description = "column filter infos") ColumnFilterInfos columnFilterInfos diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java deleted file mode 100644 index 30c2af19..00000000 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultFiltersInfos.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server.dto; - -import io.swagger.v3.oas.annotations.media.Schema; - -import java.util.List; - -/** - * @author Rehili Ghazwa - */ - -@Schema(name = "ComputationResultFiltersInfos", description = "Computation Result Filters") -public record ComputationResultFiltersInfos( - @Schema(description = "List of the computation types with their sub types associated column filters and global filter") - List computationTypeFiltersInfos -) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java deleted file mode 100644 index b7e08174..00000000 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationSubTypeFilterInfos.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server.dto; - -import io.swagger.v3.oas.annotations.media.Schema; - -import java.util.List; - -/** - * @author Rehili Ghazwa - */ -@Schema(name = "ComputationSubTypeFilter") -public record ComputationSubTypeFilterInfos( - - @Schema(description = "computation sub type") - String computationSubType, - - @Schema(description = "List of columns for this computation subtype") - List columns -) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java deleted file mode 100644 index 1deecd9f..00000000 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationTypeFiltersInfos.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; - -import java.util.List; - -/** - * @author Rehili Ghazwa - */ - -@Schema(name = "ComputationTypeFiltersInfos", description = "Computation type Filters") -public record ComputationTypeFiltersInfos( - - @Schema(description = "Computation type") - String computationType, - - @NotNull - @Schema(description = "Global filters") - List globalFilters, - - @Schema(description = "Subtypes of the computation type with their columns filters") - List computationSubTypeFilterInfos -) { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java b/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java index c4c01a49..5e18abb8 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java @@ -13,7 +13,7 @@ */ @Schema(description = "Sort configuration") public record SortConfig( - @Schema(description = "column id") + @Schema(description = "column columnId") String colId, @Schema(description = "Sort direction") diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java similarity index 88% rename from src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java index 2992cc2e..dcbc978c 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ColumnInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java @@ -16,8 +16,8 @@ /** * @author Achour BERRAHMA */ -@Schema(name = "ColumnDto", description = "Column configuration") -public record ColumnInfos( +@Schema(name = "SpreadsheetColumnInfos", description = "Column configuration") +public record SpreadsheetColumnInfos( @Schema(description = "Column UUID") UUID uuid, @@ -38,7 +38,7 @@ public record ColumnInfos( @Schema(description = "Column dependencies") String dependencies, - @Schema(description = "Column id") + @Schema(description = "Column columnId") String id, @Schema(description = "Column visibility", defaultValue = "true") @@ -47,13 +47,13 @@ public record ColumnInfos( @Schema(description = "column filter infos") ColumnFilterInfos columnFilterInfos ) { - public ColumnInfos { + public SpreadsheetColumnInfos { if (visible == null) { visible = true; } } - public ColumnInfos( + public SpreadsheetColumnInfos( UUID uuid, String name, ColumnType type, diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetConfigInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetConfigInfos.java index 3419e758..ada37ba1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetConfigInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetConfigInfos.java @@ -30,7 +30,7 @@ public record SpreadsheetConfigInfos( SheetType sheetType, @Schema(description = "Columns") - List columns, + List columns, @Schema(description = "Global filters") List globalFilters, diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java index cf9dc252..d69ebae6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java @@ -27,7 +27,7 @@ public class ComputationSubTypeFiltersEntity { @Column(name = "uuid") private UUID uuid; - @Column(name = "computation_sub_type", nullable = false, unique = true) + @Column(name = "computation_sub_type", nullable = false) private String computationSubType; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java index 1a64147b..8a12ea82 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java @@ -29,7 +29,7 @@ public class ComputationTypeFiltersEntity { @Column(name = "uuid") private UUID uuid; - @Column(name = "computation_type", nullable = false, unique = true) + @Column(name = "computation_type", nullable = false) private String computationType; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java index a5dd79c0..451d0464 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/GlobalFilterEntity.java @@ -40,7 +40,7 @@ public class GlobalFilterEntity { @Column(name = "label", nullable = false) private String label; - @Column(name = "recent") + @Column(name = "recent", nullable = false, columnDefinition = "boolean default false") private boolean recent; @Column(name = "uuid") diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java similarity index 90% rename from src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java index 0d99bbf3..a9370c84 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java @@ -22,7 +22,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) -public class ColumnEntity { +public class SpreadsheetColumnEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -48,7 +48,7 @@ public class ColumnEntity { @Column(name = "columnId", nullable = false, columnDefinition = "varchar(255)") private String id; - @Column(name = "visible", nullable = false) + @Column(name = "visible", nullable = false, columnDefinition = "boolean default true") @Builder.Default private boolean visible = true; @@ -57,8 +57,8 @@ public class ColumnEntity { foreignKey = @ForeignKey(name = "columnEntity_columnFilter_fk")) private ColumnFilter columnFilter; - public ColumnEntity copy() { - return ColumnEntity.builder() + public SpreadsheetColumnEntity copy() { + return SpreadsheetColumnEntity.builder() .name(getName()) .type(getType()) .precision(getPrecision()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java index b27614d1..b17f45ca 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetConfigEntity.java @@ -43,7 +43,7 @@ public class SpreadsheetConfigEntity { @JoinColumn(name = "spreadsheet_config_id", foreignKey = @ForeignKey(name = "fk_spreadsheet_config_column")) @OrderColumn(name = "column_order") @Builder.Default - private List columns = new ArrayList<>(); + private List columns = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "spreadsheet_config_id", foreignKey = @ForeignKey(name = "fk_global_filter_spreadsheet_config")) diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java index 961b2a11..a8d9d64e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java @@ -25,7 +25,7 @@ public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos( public static ComputationResultColumnFilterEntity toComputationColumnFilterEntity(ComputationResultColumnFilterInfos columnFilterInfos) { return ComputationResultColumnFilterEntity.builder() - .computationColumnId(columnFilterInfos.id()) + .computationColumnId(columnFilterInfos.columnId()) .columnFilter(columnFilterInfos.columnFilterInfos() != null ? ColumnFilter.builder() .filterDataType(columnFilterInfos.columnFilterInfos().filterDataType()) .filterType(columnFilterInfos.columnFilterInfos().filterType()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java index e5449fad..3922ff6e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java @@ -8,7 +8,7 @@ import org.gridsuite.studyconfig.server.constants.SortDirection; import org.gridsuite.studyconfig.server.dto.*; -import org.gridsuite.studyconfig.server.entities.ColumnEntity; +import org.gridsuite.studyconfig.server.entities.SpreadsheetColumnEntity; import org.gridsuite.studyconfig.server.entities.ColumnFilter; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; @@ -70,9 +70,9 @@ public static SpreadsheetConfigEntity toEntity(SpreadsheetConfigInfos dto) { return entity; } - public static ColumnInfos toColumnDto(ColumnEntity entity) { + public static SpreadsheetColumnInfos toColumnDto(SpreadsheetColumnEntity entity) { ColumnFilter filter = entity.getColumnFilter(); - return new ColumnInfos( + return new SpreadsheetColumnInfos( entity.getUuid(), entity.getName(), entity.getType(), @@ -88,8 +88,8 @@ public static ColumnInfos toColumnDto(ColumnEntity entity) { ); } - public static ColumnEntity toColumnEntity(ColumnInfos dto) { - return ColumnEntity.builder() + public static SpreadsheetColumnEntity toColumnEntity(SpreadsheetColumnInfos dto) { + return SpreadsheetColumnEntity.builder() .name(dto.name()) .type(dto.type()) .precision(dto.precision()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index 56dab3ad..22af0b8b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -20,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; import java.util.UUID; import static org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper.toComputationColumnFilterEntity; @@ -42,27 +43,44 @@ public UUID createDefaultComputingResultFilters() { return computationResultFiltersRepository.saveAndFlush(root).getId(); } - @Transactional(readOnly = true) - public List getComputingResultColumnFilters(UUID rootId, String computationType, String computationSubType) { - ComputationResultFiltersEntity rootEntity = computationResultFiltersRepository.findById(rootId) + private ComputationResultFiltersEntity getRootEntity(UUID rootId) { + return computationResultFiltersRepository.findById(rootId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); - return rootEntity.getComputationResultFilter().stream() - .filter(type -> type.getComputationType().equals(computationType)) + } + + private ComputationTypeFiltersEntity findComputationType(ComputationResultFiltersEntity root, String type) { + return root.getComputationResultFilter().stream() + .filter(t -> t.getComputationType().equals(type)) + .findFirst() + .orElse(null); + } + + private ComputationSubTypeFiltersEntity findComputationSubType(ComputationTypeFiltersEntity typeEntity, String subType) { + return typeEntity.getComputationSubTypes().stream() + .filter(s -> s.getComputationSubType().equals(subType)) .findFirst() - .flatMap(type -> type.getComputationSubTypes().stream() - .filter(sub -> sub.getComputationSubType().equals(computationSubType)) - .findFirst()) - .map(subType -> subType.getColumns().stream() - .map(ComputationResultFiltersMapper::toComputationColumnFilterInfos).toList()).orElse(List.of()); + .orElse(null); + } + + @Transactional(readOnly = true) + public List getComputingResultColumnFilters(UUID rootId, String computationType, String computationSubType) { + ComputationResultFiltersEntity rootEntity = getRootEntity(rootId); + return Optional.ofNullable(findComputationType(rootEntity, computationType)) + .map(type -> findComputationSubType(type, computationSubType)) + .map(sub -> sub.getColumns().stream() + .map(ComputationResultFiltersMapper::toComputationColumnFilterInfos) + .toList()) + .orElse(List.of()); + } @Transactional(readOnly = true) public List getComputingResultGlobalFilters(UUID rootId, String computationType) { - ComputationResultFiltersEntity rootEntity = computationResultFiltersRepository.findById(rootId) - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); - return rootEntity.getComputationResultFilter().stream().filter(type -> type.getComputationType().equals(computationType)) - .findFirst() - .map(type -> type.getGlobalFilters().stream().map(SpreadsheetConfigMapper::toGlobalFilterDto).toList()) + ComputationResultFiltersEntity rootEntity = getRootEntity(rootId); + return Optional.ofNullable(findComputationType(rootEntity, computationType)) + .map(type -> type.getGlobalFilters().stream() + .map(SpreadsheetConfigMapper::toGlobalFilterDto) + .toList()) .orElse(List.of()); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java index c2fc11d6..21fc763e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java @@ -29,7 +29,7 @@ public DiagramGridLayoutService(DiagramGridLayoutRepository diagramGridLayoutRep public DiagramGridLayout getByDiagramGridLayoutUuid(UUID diagramGridLayoutUuid) { DiagramGridLayoutEntity entity = diagramGridLayoutRepository .findById(diagramGridLayoutUuid) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with id: " + diagramGridLayoutUuid)); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with columnId: " + diagramGridLayoutUuid)); return DiagramGridLayoutMapper.toDto(entity); } @@ -48,7 +48,7 @@ public UUID saveDiagramGridLayout(DiagramGridLayout diagramGridLayout) { @Transactional public void updateDiagramGridLayout(UUID diagramGridLayoutUuid, DiagramGridLayout diagramGridLayout) { - DiagramGridLayoutEntity diagramGridLayoutEntity = diagramGridLayoutRepository.findById(diagramGridLayoutUuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with id: " + diagramGridLayoutUuid)); + DiagramGridLayoutEntity diagramGridLayoutEntity = diagramGridLayoutRepository.findById(diagramGridLayoutUuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with columnId: " + diagramGridLayoutUuid)); diagramGridLayoutEntity.replaceAllDiagramLayouts(diagramGridLayout.getDiagramLayouts().stream() .map(DiagramGridLayoutMapper::toDiagramLayoutEntity) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java b/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java index f20c53d7..cb7e0c6a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java @@ -95,6 +95,6 @@ private NetworkVisualizationParamEntity findEntityById(UUID id) { } private ResponseStatusException notFoundException(UUID id) { - return new ResponseStatusException(HttpStatus.NOT_FOUND, "NetworkVisualizationParam not found with id: " + id); + return new ResponseStatusException(HttpStatus.NOT_FOUND, "NetworkVisualizationParam not found with columnId: " + id); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java index 5bb7b560..a6fa0cd2 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java @@ -42,8 +42,8 @@ public class SpreadsheetConfigService { @Value("classpath:default-spreadsheet-config-collection.json") private Resource defaultSpreadsheetConfigCollectionResource; - private static final String SPREADSHEET_CONFIG_COLLECTION_NOT_FOUND = "SpreadsheetConfigCollection not found with id: "; - private static final String COLUMN_NOT_FOUND = "Column not found with id: "; + private static final String SPREADSHEET_CONFIG_COLLECTION_NOT_FOUND = "SpreadsheetConfigCollection not found with columnId: "; + private static final String COLUMN_NOT_FOUND = "Column not found with columnId: "; @Transactional public UUID createSpreadsheetConfig(SpreadsheetConfigInfos dto) { @@ -71,7 +71,7 @@ private SpreadsheetConfigEntity duplicateSpreadsheetConfigEntity(UUID id) { duplicate.setSortDirection(entity.getSortDirection()); } duplicate.setColumns(entity.getColumns().stream() - .map(ColumnEntity::copy) + .map(SpreadsheetColumnEntity::copy) .toList()); // Copy global filters if needed @@ -153,7 +153,7 @@ private SpreadsheetConfigEntity findEntityById(UUID id) { } private ResponseStatusException notFoundException(UUID id) { - return new ResponseStatusException(HttpStatus.NOT_FOUND, "SpreadsheetConfig not found with id: " + id); + return new ResponseStatusException(HttpStatus.NOT_FOUND, "SpreadsheetConfig not found with columnId: " + id); } public UUID createSpreadsheetConfigCollection(SpreadsheetConfigCollectionInfos dto) { @@ -275,7 +275,7 @@ public UUID duplicateSpreadsheetConfigCollection(UUID id) { configDuplicate.setNodeAliases(new ArrayList<>(config.getNodeAliases())); } configDuplicate.setColumns(config.getColumns().stream() - .map(ColumnEntity::copy) + .map(SpreadsheetColumnEntity::copy) .toList()); configDuplicate.setGlobalFilters(config.getGlobalFilters().stream() .map(GlobalFilterEntity::copy) @@ -288,7 +288,7 @@ public UUID duplicateSpreadsheetConfigCollection(UUID id) { } @Transactional(readOnly = true) - public ColumnInfos getColumn(UUID id, UUID columnId) { + public SpreadsheetColumnInfos getColumn(UUID id, UUID columnId) { SpreadsheetConfigEntity entity = findEntityById(id); return entity.getColumns().stream() .filter(column -> column.getUuid().equals(columnId)) @@ -298,18 +298,18 @@ public ColumnInfos getColumn(UUID id, UUID columnId) { } @Transactional - public UUID createColumn(UUID id, ColumnInfos dto) { + public UUID createColumn(UUID id, SpreadsheetColumnInfos dto) { SpreadsheetConfigEntity entity = findEntityById(id); - ColumnEntity columnEntity = SpreadsheetConfigMapper.toColumnEntity(dto); + SpreadsheetColumnEntity columnEntity = SpreadsheetConfigMapper.toColumnEntity(dto); entity.getColumns().add(columnEntity); spreadsheetConfigRepository.flush(); return columnEntity.getUuid(); } @Transactional - public void updateColumn(UUID id, UUID columnId, ColumnInfos dto) { + public void updateColumn(UUID id, UUID columnId, SpreadsheetColumnInfos dto) { SpreadsheetConfigEntity entity = findEntityById(id); - ColumnEntity columnEntity = entity.getColumns().stream() + SpreadsheetColumnEntity columnEntity = entity.getColumns().stream() .filter(column -> column.getUuid().equals(columnId)) .findFirst() .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, COLUMN_NOT_FOUND + columnId)); @@ -350,12 +350,12 @@ public void deleteColumn(UUID id, UUID columnId) { @Transactional public void reorderColumns(UUID id, List columnOrder) { SpreadsheetConfigEntity entity = findEntityById(id); - List columns = entity.getColumns(); + List columns = entity.getColumns(); reorderColumns(columnOrder, columns); } - private static void reorderColumns(List columnOrder, List columns) { + private static void reorderColumns(List columnOrder, List columns) { columns.sort(Comparator.comparingInt(column -> columnOrder.indexOf(column.getUuid()))); } @@ -383,8 +383,8 @@ private String getUniqueValue(String originalValue, Set existingValues) } private Pair getDuplicateIdAndNameCandidate(SpreadsheetConfigEntity entity, String columnId, String columnName) { - var existingColumnIds = entity.getColumns().stream().map(ColumnEntity::getId).collect(Collectors.toSet()); - var existingColumnNames = entity.getColumns().stream().map(ColumnEntity::getName).collect(Collectors.toSet()); + var existingColumnIds = entity.getColumns().stream().map(SpreadsheetColumnEntity::getId).collect(Collectors.toSet()); + var existingColumnNames = entity.getColumns().stream().map(SpreadsheetColumnEntity::getName).collect(Collectors.toSet()); String newColumnId = getUniqueValue(columnId, existingColumnIds); String newColumnName = getUniqueValue(columnName, existingColumnNames); @@ -394,15 +394,15 @@ private Pair getDuplicateIdAndNameCandidate(SpreadsheetConfigEnt @Transactional public void duplicateColumn(UUID id, UUID columnId) { SpreadsheetConfigEntity entity = findEntityById(id); - ColumnEntity columnEntity = entity.getColumns().stream().filter(col -> col.getUuid().equals(columnId)) + SpreadsheetColumnEntity columnEntity = entity.getColumns().stream().filter(col -> col.getUuid().equals(columnId)) .findFirst().orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, COLUMN_NOT_FOUND + columnId)); - ColumnEntity columnCopy = columnEntity.toBuilder().build(); + SpreadsheetColumnEntity columnCopy = columnEntity.toBuilder().build(); columnCopy.setUuid(null); - columnCopy.setColumnFilter(null); + columnCopy.setColumnFilter(columnEntity.getColumnFilter().copy()); Pair idAndName = getDuplicateIdAndNameCandidate(entity, columnCopy.getId(), columnCopy.getName()); columnCopy.setId(idAndName.getLeft()); columnCopy.setName(idAndName.getRight()); - List columns = entity.getColumns(); + List columns = entity.getColumns(); columns.add(columns.indexOf(columnEntity) + 1, columnCopy); entity.setColumns(columns); spreadsheetConfigRepository.save(entity); @@ -411,13 +411,13 @@ public void duplicateColumn(UUID id, UUID columnId) { @Transactional public void updateColumnStates(UUID id, List columnStates) { SpreadsheetConfigEntity entity = findEntityById(id); - List columns = entity.getColumns(); + List columns = entity.getColumns(); - Map columnMap = columns.stream() - .collect(Collectors.toMap(ColumnEntity::getUuid, column -> column)); + Map columnMap = columns.stream() + .collect(Collectors.toMap(SpreadsheetColumnEntity::getUuid, column -> column)); for (ColumnStateUpdateInfos state : columnStates) { - ColumnEntity column = columnMap.get(state.columnId()); + SpreadsheetColumnEntity column = columnMap.get(state.columnId()); if (column == null) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, COLUMN_NOT_FOUND + state.columnId()); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java index 90f3b0a6..b6110f4b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java @@ -36,8 +36,8 @@ public class WorkspacesConfigService { @Value("classpath:default-workspaces-config.json") private Resource defaultWorkspacesConfigResource; - private static final String WORKSPACES_CONFIG_NOT_FOUND = "WorkspacesConfig not found with id: "; - private static final String WORKSPACE_NOT_FOUND = "Workspace not found with id: "; + private static final String WORKSPACES_CONFIG_NOT_FOUND = "WorkspacesConfig not found with columnId: "; + private static final String WORKSPACE_NOT_FOUND = "Workspace not found with columnId: "; private static final String WORKSPACE_NAME_PREFIX = "Workspace "; @Transactional diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml index a39ba970..ef966620 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -68,12 +68,6 @@ - - - - - - diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 6df7690a..42257a9e 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -90,7 +90,7 @@ void testGetComputationResultFilters() throws Exception { List infosPccMinColumn = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); assertThat(infosPccMinColumn).hasSize(1); ComputationResultColumnFilterInfos info = infosPccMinColumn.getFirst(); - assertThat(info.id()).isEqualTo("subjectId"); + assertThat(info.columnId()).isEqualTo("subjectId"); assertThat(info.columnFilterInfos().filterValue()).isEqualTo("10"); assertThat(info.columnFilterInfos().filterType()).isEqualTo("greaterThan"); assertThat(info.columnFilterInfos().filterDataType()).isEqualTo("number"); diff --git a/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java b/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java index 76debbd6..3577ce78 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java @@ -9,10 +9,10 @@ import org.assertj.core.api.WithAssertions; import org.gridsuite.studyconfig.server.constants.ColumnType; import org.gridsuite.studyconfig.server.constants.SheetType; -import org.gridsuite.studyconfig.server.dto.ColumnInfos; +import org.gridsuite.studyconfig.server.dto.SpreadsheetColumnInfos; import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; import org.gridsuite.studyconfig.server.dto.SpreadsheetConfigInfos; -import org.gridsuite.studyconfig.server.entities.ColumnEntity; +import org.gridsuite.studyconfig.server.entities.SpreadsheetColumnEntity; import org.gridsuite.studyconfig.server.entities.ColumnFilter; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; @@ -39,7 +39,7 @@ void testConversionToDtoOfSpreadsheetConfig() { .id(id) .sheetType(SheetType.BATTERY) .columns(Arrays.asList( - ColumnEntity.builder() + SpreadsheetColumnEntity.builder() .name("Column1") .formula("A+B") .id("id1") @@ -50,7 +50,7 @@ void testConversionToDtoOfSpreadsheetConfig() { .filterValue("test") .build()) .build(), - ColumnEntity.builder().name("Column2").formula("C*D").id("id2").build() + SpreadsheetColumnEntity.builder().name("Column2").formula("C*D").id("id2").build() )) .globalFilters(Arrays.asList( GlobalFilterEntity.builder() @@ -105,9 +105,9 @@ void testConversionToEntityOfSpreadsheetConfig() { "TestSheet", SheetType.BUS, Arrays.asList( - new ColumnInfos(null, "Column1", ColumnType.NUMBER, 1, "X+Y", "[\"col1\", \"col2\"]", "id1", true, + new SpreadsheetColumnInfos(null, "Column1", ColumnType.NUMBER, 1, "X+Y", "[\"col1\", \"col2\"]", "id1", true, "number", "greaterThan", "100", 0.5), - new ColumnInfos(null, "Column2", ColumnType.NUMBER, 2, "Z*W", "[\"col1\"]", "id2", true, + new SpreadsheetColumnInfos(null, "Column2", ColumnType.NUMBER, 2, "Z*W", "[\"col1\"]", "id2", true, null, null, null, null) ), List.of( @@ -159,7 +159,7 @@ void testConversionToEntityOfSpreadsheetConfig() { class ColumnConverterTest { @Test void testConversionToDtoOfColumnWithFilter() { - ColumnEntity entity = ColumnEntity.builder() + SpreadsheetColumnEntity entity = SpreadsheetColumnEntity.builder() .name("TestColumn") .formula("A+B+C") .id("idTest") @@ -170,7 +170,7 @@ void testConversionToDtoOfColumnWithFilter() { .filterTolerance(null).build()) .build(); - ColumnInfos dto = SpreadsheetConfigMapper.toColumnDto(entity); + SpreadsheetColumnInfos dto = SpreadsheetConfigMapper.toColumnDto(entity); assertThat(dto) .as("DTO conversion result") @@ -188,7 +188,7 @@ void testConversionToDtoOfColumnWithFilter() { @Test void testConversionToEntityOfColumnWithFilter() { - ColumnInfos dto = new ColumnInfos( + SpreadsheetColumnInfos dto = new SpreadsheetColumnInfos( null, "TestColumn", ColumnType.NUMBER, @@ -202,7 +202,7 @@ void testConversionToEntityOfColumnWithFilter() { "50.5", 0.1); - ColumnEntity column = SpreadsheetConfigMapper.toColumnEntity(dto); + SpreadsheetColumnEntity column = SpreadsheetConfigMapper.toColumnEntity(dto); assertThat(column) .as("Entity conversion result") @@ -221,7 +221,7 @@ void testConversionToEntityOfColumnWithFilter() { @Test void testConversionOfColumnWithoutFilter() { - ColumnInfos dto = new ColumnInfos( + SpreadsheetColumnInfos dto = new SpreadsheetColumnInfos( null, "TestColumn", ColumnType.TEXT, @@ -235,8 +235,8 @@ void testConversionOfColumnWithoutFilter() { null, null); - ColumnEntity entity = SpreadsheetConfigMapper.toColumnEntity(dto); - ColumnInfos convertedDto = SpreadsheetConfigMapper.toColumnDto(entity); + SpreadsheetColumnEntity entity = SpreadsheetConfigMapper.toColumnEntity(dto); + SpreadsheetColumnInfos convertedDto = SpreadsheetConfigMapper.toColumnDto(entity); assertThat(convertedDto) .as("Round-trip conversion result") diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java index cb7ee520..9a8c0cee 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java @@ -62,7 +62,7 @@ void testCreateCollection() throws Exception { assertThat(createdCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); assertThat(createdCollection.id()).isNotNull(); @@ -82,7 +82,7 @@ void testCreateCollectionWithFilteredConfigs() throws Exception { assertThat(createdCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id", "spreadsheetConfigs.globalFilters.uuid") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId", "spreadsheetConfigs.globalFilters.uuid") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); @@ -98,7 +98,7 @@ void testCreateCollectionWithAliases() throws Exception { assertThat(createdCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); assertThat(createdCollection.id()).isNotNull(); @@ -114,7 +114,7 @@ void testReadCollection() throws Exception { assertThat(receivedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId") .ignoringExpectedNullFields() .isEqualTo(collectionToRead); assertThat(receivedCollection.id()).isEqualTo(collectionUuid); @@ -139,7 +139,7 @@ void testUpdateCollection() throws Exception { assertThat(retrievedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.id") + .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.columnId") .ignoringExpectedNullFields() .isEqualTo(updatedCollection); } @@ -173,7 +173,7 @@ void testUpdateCollectionWithFilteredConfigs() throws Exception { assertThat(retrievedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.id", "spreadsheetConfigs.globalFilters.uuid") + .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.columnId", "spreadsheetConfigs.globalFilters.uuid") .ignoringExpectedNullFields() .isEqualTo(updatedCollection); } @@ -224,7 +224,7 @@ void testDuplicateCollection() throws Exception { SpreadsheetConfigCollectionInfos duplicatedCollection = getSpreadsheetConfigCollection(duplicatedCollectionUuid); assertThat(duplicatedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id", "spreadsheetConfigs.globalFilters.uuid") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId", "spreadsheetConfigs.globalFilters.uuid") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); assertThat(duplicatedCollection.id()).isNotEqualTo(collectionUuid); @@ -250,7 +250,7 @@ void testMergeModelsIntoNewCollection() throws Exception { // dont compare aliases, merged collection aliases are computed assertThat(mergedCollection) .usingRecursiveComparison() - .ignoringFields("id", "nodeAliases", "spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.id") + .ignoringFields("id", "nodeAliases", "spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.columnId") .ignoringExpectedNullFields() .isEqualTo(sourceCollection); @@ -276,8 +276,8 @@ void testAddSpreadsheetConfigToCollection() throws Exception { SpreadsheetConfigCollectionInfos initialCollection = new SpreadsheetConfigCollectionInfos(null, createSpreadsheetConfigs(), null); UUID collectionUuid = postSpreadsheetConfigCollection(initialCollection); - List columnInfos = List.of( - new ColumnInfos(null, "new_col", ColumnType.NUMBER, 1, "formula", "[\"dep\"]", "idNew", true, null, null, null, null) + List columnInfos = List.of( + new SpreadsheetColumnInfos(null, "new_col", ColumnType.NUMBER, 1, "formula", "[\"dep\"]", "idNew", true, null, null, null, null) ); SpreadsheetConfigInfos newConfig = new SpreadsheetConfigInfos(null, "NewSheet", SheetType.BATTERY, columnInfos, null, List.of(), new SortConfig("idNew", SortDirection.ASC.name().toLowerCase())); @@ -413,9 +413,9 @@ void testReplaceAllSpreadsheetConfigs() throws Exception { } private List createSpreadsheetConfigsWithAliases() { - List columnInfos = Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), - new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", true, null, null, null, null) + List columnInfos = Arrays.asList( + new SpreadsheetColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", true, null, null, null, null) ); return List.of( @@ -428,9 +428,9 @@ private List createSpreadsheetConfigsWithAliases() { } private List createSpreadsheetConfigs() { - List columnInfos = Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), - new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", true, null, null, null, null) + List columnInfos = Arrays.asList( + new SpreadsheetColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 1", null, "idB", true, null, null, null, null) ); return List.of( @@ -440,14 +440,14 @@ private List createSpreadsheetConfigs() { } private List createSpreadsheetConfigsWithFilters() { - List columnsConfig1 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + List columnsConfig1 = Arrays.asList( + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, "text", "equals", "test-value", null), - new ColumnInfos(null, "name", ColumnType.TEXT, null, "name", "[\"name\"]", "name", true, + new SpreadsheetColumnInfos(null, "name", ColumnType.TEXT, null, "name", "[\"name\"]", "name", true, "text", "contains", "name-value", null), - new ColumnInfos(null, "country1", ColumnType.ENUM, null, "country1", "[\"country1\"]", "country1", true, + new SpreadsheetColumnInfos(null, "country1", ColumnType.ENUM, null, "country1", "[\"country1\"]", "country1", true, null, null, null, null), - new ColumnInfos(null, "voltage", ColumnType.NUMBER, 1, "voltage", "[\"voltage\"]", "voltage", true, + new SpreadsheetColumnInfos(null, "voltage", ColumnType.NUMBER, 1, "voltage", "[\"voltage\"]", "voltage", true, "number", "greaterThan", "100", 0.5) ); @@ -456,12 +456,12 @@ private List createSpreadsheetConfigsWithFilters() { GlobalFilterInfos.builder().uuid(UUID.randomUUID()).filterType("country").label("Global Filter 2").recent(false).build() ); - List columnsConfig2 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + List columnsConfig2 = Arrays.asList( + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, "text", "contains", "other-value", null), - new ColumnInfos(null, "type", ColumnType.ENUM, null, "type", "[\"type\"]", "type", true, + new SpreadsheetColumnInfos(null, "type", ColumnType.ENUM, null, "type", "[\"type\"]", "type", true, null, null, null, null), - new ColumnInfos(null, "power", ColumnType.NUMBER, 1, "power", "[\"power\"]", "power", true, + new SpreadsheetColumnInfos(null, "power", ColumnType.NUMBER, 1, "power", "[\"power\"]", "power", true, "number", "lessThan", "50", 0.1) ); @@ -476,11 +476,11 @@ private List createSpreadsheetConfigsWithFilters() { } private List createUpdatedSpreadsheetConfigs() { - List columnInfos = Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), - new ColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 2", null, "idB", true, null, null, null, null), - new ColumnInfos(null, "cust_c", ColumnType.ENUM, null, "cust_b + 2", "[\"cust_b\"]", "idC", true, null, null, null, null), - new ColumnInfos(null, "cust_d", ColumnType.NUMBER, 0, "5 + 1", null, "idD", true, null, null, null, null) + List columnInfos = Arrays.asList( + new SpreadsheetColumnInfos(null, "cust_a", ColumnType.NUMBER, 1, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_b", ColumnType.TEXT, null, "var_minP + 2", null, "idB", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_c", ColumnType.ENUM, null, "cust_b + 2", "[\"cust_b\"]", "idC", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_d", ColumnType.NUMBER, 0, "5 + 1", null, "idD", true, null, null, null, null) ); return List.of( @@ -491,10 +491,10 @@ private List createUpdatedSpreadsheetConfigs() { } private List createUpdatedSpreadsheetConfigsWithFilters() { - List columnsConfig1 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + List columnsConfig1 = Arrays.asList( + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, "text", "startsWith", "new-prefix", null), - new ColumnInfos(null, "updated", ColumnType.TEXT, null, "updated", "[\"updated\"]", "updated", true, + new SpreadsheetColumnInfos(null, "updated", ColumnType.TEXT, null, "updated", "[\"updated\"]", "updated", true, null, null, null, null) ); @@ -504,10 +504,10 @@ private List createUpdatedSpreadsheetConfigsWithFilters( GlobalFilterInfos.builder().uuid(UUID.randomUUID()).filterType("country").label("Updated Filter 3").recent(false).build() ); - List columnsConfig2 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + List columnsConfig2 = Arrays.asList( + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, "text", "endsWith", "suffix", null), - new ColumnInfos(null, "other", ColumnType.NUMBER, 2, "other", "[\"other\"]", "other", true, + new SpreadsheetColumnInfos(null, "other", ColumnType.NUMBER, 2, "other", "[\"other\"]", "other", true, "number", "between", "10,20", null) ); @@ -515,10 +515,10 @@ private List createUpdatedSpreadsheetConfigsWithFilters( GlobalFilterInfos.builder().uuid(UUID.randomUUID()).filterType("country").label("Updated Other Filter").recent(false).build() ); - List columnsConfig3 = Arrays.asList( - new ColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, + List columnsConfig3 = Arrays.asList( + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, "text", "contains", "middle", null), - new ColumnInfos(null, "third", ColumnType.BOOLEAN, null, "third", "[\"third\"]", "third", true, + new SpreadsheetColumnInfos(null, "third", ColumnType.BOOLEAN, null, "third", "[\"third\"]", "third", true, "boolean", "equals", "true", null) ); diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java index d9004fbc..0c2841a2 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java @@ -238,7 +238,7 @@ void testCreateColumn() throws Exception { SpreadsheetConfigInfos config = new SpreadsheetConfigInfos(null, "Battery", SheetType.BATTERY, List.of(), null, List.of(), null); UUID configId = saveAndReturnId(config); - ColumnInfos columnToCreate = new ColumnInfos(null, "new_column", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", true, null, null, null, null); + SpreadsheetColumnInfos columnToCreate = new SpreadsheetColumnInfos(null, "new_column", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", true, null, null, null, null); MvcResult result = mockMvc.perform(post(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE) .content(mapper.writeValueAsString(columnToCreate)) @@ -248,14 +248,14 @@ void testCreateColumn() throws Exception { UUID columnId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); - ColumnInfos createdColumn = getColumn(configId, columnId); + SpreadsheetColumnInfos createdColumn = getColumn(configId, columnId); assertThat(createdColumn) .usingRecursiveComparison() .ignoringFields("uuid") .isEqualTo(columnToCreate); // Create a column with a filter - ColumnInfos columnWithFilter = new ColumnInfos(null, "new_column_with_filter", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", true, + SpreadsheetColumnInfos columnWithFilter = new SpreadsheetColumnInfos(null, "new_column_with_filter", ColumnType.NUMBER, 2, "x + 1", "[\"x\"]", "newId", true, "text", "equals", "test-value", null); MvcResult resultWithFilter = mockMvc.perform(post(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE) @@ -265,7 +265,7 @@ void testCreateColumn() throws Exception { .andReturn(); UUID columnWithFilterId = mapper.readValue(resultWithFilter.getResponse().getContentAsString(), UUID.class); - ColumnInfos createdColumnWithFilter = getColumn(configId, columnWithFilterId); + SpreadsheetColumnInfos createdColumnWithFilter = getColumn(configId, columnWithFilterId); assertThat(createdColumnWithFilter) .usingRecursiveComparison() .ignoringFields("uuid") @@ -280,7 +280,7 @@ void testUpdateColumn() throws Exception { SpreadsheetConfigInfos savedConfig = getSpreadsheetConfig(configId); UUID columnId = savedConfig.columns().get(0).uuid(); - ColumnInfos columnUpdate = new ColumnInfos(columnId, "updated_column", ColumnType.TEXT, null, "new_formula", "[]", "updatedId", true, + SpreadsheetColumnInfos columnUpdate = new SpreadsheetColumnInfos(columnId, "updated_column", ColumnType.TEXT, null, "new_formula", "[]", "updatedId", true, "text", "equals", "updated-value", null); mockMvc.perform(put(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE + "/" + columnId) @@ -288,7 +288,7 @@ void testUpdateColumn() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - ColumnInfos updatedColumn = getColumn(configId, columnId); + SpreadsheetColumnInfos updatedColumn = getColumn(configId, columnId); assertThat(updatedColumn).isEqualTo(columnUpdate); } @@ -305,7 +305,7 @@ void testDeleteColumn() throws Exception { SpreadsheetConfigInfos configAfterDelete = getSpreadsheetConfig(configId); assertThat(configAfterDelete.columns()) - .extracting(ColumnInfos::uuid) + .extracting(SpreadsheetColumnInfos::uuid) .isNotEmpty() .doesNotContain(columnId); } @@ -324,8 +324,8 @@ void testDuplicateColumn() throws Exception { SpreadsheetConfigInfos configAfterDuplicate = getSpreadsheetConfig(configId); assertThat(configAfterDuplicate.columns()).hasSize(5); - ColumnInfos columnInfos = configAfterDuplicate.columns().get(0); - ColumnInfos duplicatedColumnInfos = configAfterDuplicate.columns().get(1); + SpreadsheetColumnInfos columnInfos = configAfterDuplicate.columns().get(0); + SpreadsheetColumnInfos duplicatedColumnInfos = configAfterDuplicate.columns().get(1); assertThat(columnInfos.uuid()).isNotEqualTo(duplicatedColumnInfos.uuid()); assertEquals(columnInfos.id() + "_1", duplicatedColumnInfos.id()); @@ -356,7 +356,7 @@ void testGetColumn() throws Exception { SpreadsheetConfigInfos savedConfig = getSpreadsheetConfig(configId); UUID columnId = savedConfig.columns().get(0).uuid(); - ColumnInfos column = getColumn(configId, columnId); + SpreadsheetColumnInfos column = getColumn(configId, columnId); assertThat(column).isNotNull(); assertThat(column.uuid()).isEqualTo(columnId); } @@ -368,12 +368,12 @@ void testReorderColumns() throws Exception { // get the saved config to retrieve column UUIDs SpreadsheetConfigInfos savedConfig = getSpreadsheetConfig(configId); - List originalColumns = savedConfig.columns(); + List originalColumns = savedConfig.columns(); assertThat(originalColumns).hasSize(4); // reverse the original order List reorderedColumnIds = originalColumns.stream() - .map(ColumnInfos::uuid) + .map(SpreadsheetColumnInfos::uuid) .collect(Collectors.toList()); Collections.reverse(reorderedColumnIds); @@ -384,7 +384,7 @@ void testReorderColumns() throws Exception { // verify the new order SpreadsheetConfigInfos updatedConfig = getSpreadsheetConfig(configId); - List reorderedColumns = updatedConfig.columns(); + List reorderedColumns = updatedConfig.columns(); assertThat(reorderedColumns).hasSize(originalColumns.size()); @@ -397,10 +397,10 @@ void testReorderColumns() throws Exception { @Test void testUpdateColumnStates() throws Exception { // Create config with multiple columns - List columns = Arrays.asList( - new ColumnInfos(null, "col1", ColumnType.TEXT, null, "formula1", null, "id1", true, null, null, null, null), - new ColumnInfos(null, "col2", ColumnType.NUMBER, 2, "formula2", null, "id2", true, null, null, null, null), - new ColumnInfos(null, "col3", ColumnType.BOOLEAN, null, "formula3", null, "id3", false, null, null, null, null) + List columns = Arrays.asList( + new SpreadsheetColumnInfos(null, "col1", ColumnType.TEXT, null, "formula1", null, "id1", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "col2", ColumnType.NUMBER, 2, "formula2", null, "id2", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "col3", ColumnType.BOOLEAN, null, "formula3", null, "id3", false, null, null, null, null) ); SpreadsheetConfigInfos config = new SpreadsheetConfigInfos(null, "TestConfig", SheetType.BATTERY, columns, null, List.of(), null); @@ -408,7 +408,7 @@ void testUpdateColumnStates() throws Exception { // Get the saved config to retrieve column UUIDs SpreadsheetConfigInfos savedConfig = getSpreadsheetConfig(configId); - List savedColumns = savedConfig.columns(); + List savedColumns = savedConfig.columns(); assertThat(savedColumns).hasSize(3); // Prepare column state updates: reorder and change visibility @@ -426,15 +426,15 @@ void testUpdateColumnStates() throws Exception { // Verify the updates SpreadsheetConfigInfos updatedConfig = getSpreadsheetConfig(configId); - List updatedColumns = updatedConfig.columns(); + List updatedColumns = updatedConfig.columns(); // Check visibility updates - ColumnInfos firstColumn = updatedColumns.stream() + SpreadsheetColumnInfos firstColumn = updatedColumns.stream() .filter(col -> col.uuid().equals(savedColumns.get(0).uuid())) .findFirst().orElseThrow(); assertThat(firstColumn.visible()).isFalse(); - ColumnInfos thirdColumn = updatedColumns.stream() + SpreadsheetColumnInfos thirdColumn = updatedColumns.stream() .filter(col -> col.uuid().equals(savedColumns.get(2).uuid())) .findFirst().orElseThrow(); assertThat(thirdColumn.visible()).isTrue(); @@ -504,7 +504,7 @@ void testRenameSpreadsheetConfig() throws Exception { assertThat(renamedConfig) .usingRecursiveComparison() - .ignoringFields("name", "columns.uuid", "id", "columns.id") + .ignoringFields("name", "columns.uuid", "id", "columns.columnId") .isEqualTo(configToRename); } @@ -623,43 +623,43 @@ void testSetGlobalFiltersToNonExistentConfig() throws Exception { .andExpect(status().isNotFound()); } - private List createColumns() { + private List createColumns() { return Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), - new ColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", true, null, null, null, null), - new ColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", true, null, null, null, null), - new ColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", true, null, null, null, null) + new SpreadsheetColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", true, null, null, null, null) ); } - private List createColumnsWithFilters() { + private List createColumnsWithFilters() { return Arrays.asList( - new ColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, + new SpreadsheetColumnInfos(null, "cust_a", ColumnType.BOOLEAN, null, "cust_b + cust_c", "[\"cust_b\", \"cust_c\"]", "idA", true, "text", "equals", "test-value", null), - new ColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", true, + new SpreadsheetColumnInfos(null, "cust_b", ColumnType.NUMBER, 0, "var_minP + 1", null, "idB", true, "number", "greaterThan", "100", 0.5), - new ColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", true, + new SpreadsheetColumnInfos(null, "cust_c", ColumnType.NUMBER, 2, "cust_b + 1", "[\"cust_b\"]", "idC", true, "text", "startsWith", "prefix", null), - new ColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", true, + new SpreadsheetColumnInfos(null, "cust_d", ColumnType.TEXT, null, "5 + 2", null, "idD", true, null, null, null, null) ); } - private List createUpdatedColumns() { + private List createUpdatedColumns() { return Arrays.asList( - new ColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", true, null, null, null, null), - new ColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", true, null, null, null, null), - new ColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", true, null, null, null, null) + new SpreadsheetColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", true, null, null, null, null), + new SpreadsheetColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", true, null, null, null, null) ); } - private List createUpdatedColumnsWithFilters() { + private List createUpdatedColumnsWithFilters() { return Arrays.asList( - new ColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", true, + new SpreadsheetColumnInfos(null, "cust_x", ColumnType.BOOLEAN, null, "cust_y * 2", "[\"cust_y\"]", "idX", true, "text", "contains", "updated-value", null), - new ColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", true, + new SpreadsheetColumnInfos(null, "cust_y", ColumnType.NUMBER, 1, "var_maxP - 1", null, "idY", true, "number", "lessThan", "50", 0.1), - new ColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", true, + new SpreadsheetColumnInfos(null, "cust_z", ColumnType.NUMBER, 0, "cust_x / 2", "[\"cust_x\"]", "idZ", true, null, null, null, null) // No filter on this column ); } @@ -722,11 +722,11 @@ private UUID saveAndReturnId(SpreadsheetConfigInfos config) { return spreadsheetConfigService.createSpreadsheetConfig(config); } - private ColumnInfos getColumn(UUID configId, UUID columnId) throws Exception { + private SpreadsheetColumnInfos getColumn(UUID configId, UUID columnId) throws Exception { MvcResult result = mockMvc.perform(get(URI_SPREADSHEET_CONFIG_GET_PUT + configId + URI_COLUMN_BASE + "/" + columnId)) .andExpect(status().isOk()) .andReturn(); - return mapper.readValue(result.getResponse().getContentAsString(), ColumnInfos.class); + return mapper.readValue(result.getResponse().getContentAsString(), SpreadsheetColumnInfos.class); } } diff --git a/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java index 2de96643..c5132436 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java @@ -57,7 +57,7 @@ private String getWorkspacesConfigBasePath() { } private String getPanelsPath() { - return getWorkspacesConfigBasePath() + "/{id}/workspaces/{workspaceId}/panels"; + return getWorkspacesConfigBasePath() + "/{columnId}/workspaces/{workspaceId}/panels"; } private String getNadConfigPath() { From 4531f5227d7d710fd2347a66c99f9ab340180cde Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Wed, 4 Feb 2026 10:16:09 +0100 Subject: [PATCH 14/22] revert --- .../WorkspacesConfigController.java | 2 +- .../ComputationResultColumnFilterInfos.java | 2 +- .../studyconfig/server/dto/SortConfig.java | 2 +- .../server/dto/SpreadsheetColumnInfos.java | 2 +- .../service/DiagramGridLayoutService.java | 4 ++-- .../NetworkVisualizationsParamService.java | 2 +- .../service/SpreadsheetConfigService.java | 6 ++--- .../service/WorkspacesConfigService.java | 4 ++-- ...dsheetConfigCollectionIntegrationTest.java | 24 +++++++++---------- .../SpreadsheetConfigIntegrationTest.java | 2 +- .../WorkspacesConfigControllerTest.java | 2 +- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java index 05db43ce..1002523b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/WorkspacesConfigController.java @@ -79,7 +79,7 @@ public ResponseEntity deleteWorkspacesConfig( @GetMapping("/{id}/workspaces") @Operation(summary = "Get workspaces metadata", - description = "Retrieves lightweight metadata for all workspaces (columnId, name, panel count)") + description = "Retrieves lightweight metadata for all workspaces (id, name, panel count)") @ApiResponse(responseCode = "200", description = "Workspaces metadata retrieved") @ApiResponse(responseCode = "404", description = "Workspaces config not found") public ResponseEntity> getWorkspaces( diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java index 521abe74..d88af04b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/ComputationResultColumnFilterInfos.java @@ -14,7 +14,7 @@ @Schema(name = "ComputationResultColumnFilterInfos", description = "Computation Result Column filter infos") public record ComputationResultColumnFilterInfos( - @Schema(description = "Column columnId") + @Schema(description = "Column id") String columnId, @Schema(description = "column filter infos") diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java b/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java index 5e18abb8..c4c01a49 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/SortConfig.java @@ -13,7 +13,7 @@ */ @Schema(description = "Sort configuration") public record SortConfig( - @Schema(description = "column columnId") + @Schema(description = "column id") String colId, @Schema(description = "Sort direction") diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java b/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java index dcbc978c..0d7cba6f 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/SpreadsheetColumnInfos.java @@ -38,7 +38,7 @@ public record SpreadsheetColumnInfos( @Schema(description = "Column dependencies") String dependencies, - @Schema(description = "Column columnId") + @Schema(description = "Column id") String id, @Schema(description = "Column visibility", defaultValue = "true") diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java index 21fc763e..c2fc11d6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java @@ -29,7 +29,7 @@ public DiagramGridLayoutService(DiagramGridLayoutRepository diagramGridLayoutRep public DiagramGridLayout getByDiagramGridLayoutUuid(UUID diagramGridLayoutUuid) { DiagramGridLayoutEntity entity = diagramGridLayoutRepository .findById(diagramGridLayoutUuid) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with columnId: " + diagramGridLayoutUuid)); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with id: " + diagramGridLayoutUuid)); return DiagramGridLayoutMapper.toDto(entity); } @@ -48,7 +48,7 @@ public UUID saveDiagramGridLayout(DiagramGridLayout diagramGridLayout) { @Transactional public void updateDiagramGridLayout(UUID diagramGridLayoutUuid, DiagramGridLayout diagramGridLayout) { - DiagramGridLayoutEntity diagramGridLayoutEntity = diagramGridLayoutRepository.findById(diagramGridLayoutUuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with columnId: " + diagramGridLayoutUuid)); + DiagramGridLayoutEntity diagramGridLayoutEntity = diagramGridLayoutRepository.findById(diagramGridLayoutUuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Diagram grid layout not found with id: " + diagramGridLayoutUuid)); diagramGridLayoutEntity.replaceAllDiagramLayouts(diagramGridLayout.getDiagramLayouts().stream() .map(DiagramGridLayoutMapper::toDiagramLayoutEntity) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java b/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java index cb7e0c6a..f20c53d7 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/NetworkVisualizationsParamService.java @@ -95,6 +95,6 @@ private NetworkVisualizationParamEntity findEntityById(UUID id) { } private ResponseStatusException notFoundException(UUID id) { - return new ResponseStatusException(HttpStatus.NOT_FOUND, "NetworkVisualizationParam not found with columnId: " + id); + return new ResponseStatusException(HttpStatus.NOT_FOUND, "NetworkVisualizationParam not found with id: " + id); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java index a6fa0cd2..89a4244d 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java @@ -42,8 +42,8 @@ public class SpreadsheetConfigService { @Value("classpath:default-spreadsheet-config-collection.json") private Resource defaultSpreadsheetConfigCollectionResource; - private static final String SPREADSHEET_CONFIG_COLLECTION_NOT_FOUND = "SpreadsheetConfigCollection not found with columnId: "; - private static final String COLUMN_NOT_FOUND = "Column not found with columnId: "; + private static final String SPREADSHEET_CONFIG_COLLECTION_NOT_FOUND = "SpreadsheetConfigCollection not found with id: "; + private static final String COLUMN_NOT_FOUND = "Column not found with id: "; @Transactional public UUID createSpreadsheetConfig(SpreadsheetConfigInfos dto) { @@ -153,7 +153,7 @@ private SpreadsheetConfigEntity findEntityById(UUID id) { } private ResponseStatusException notFoundException(UUID id) { - return new ResponseStatusException(HttpStatus.NOT_FOUND, "SpreadsheetConfig not found with columnId: " + id); + return new ResponseStatusException(HttpStatus.NOT_FOUND, "SpreadsheetConfig not found with id: " + id); } public UUID createSpreadsheetConfigCollection(SpreadsheetConfigCollectionInfos dto) { diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java index b6110f4b..90f3b0a6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/WorkspacesConfigService.java @@ -36,8 +36,8 @@ public class WorkspacesConfigService { @Value("classpath:default-workspaces-config.json") private Resource defaultWorkspacesConfigResource; - private static final String WORKSPACES_CONFIG_NOT_FOUND = "WorkspacesConfig not found with columnId: "; - private static final String WORKSPACE_NOT_FOUND = "Workspace not found with columnId: "; + private static final String WORKSPACES_CONFIG_NOT_FOUND = "WorkspacesConfig not found with id: "; + private static final String WORKSPACE_NOT_FOUND = "Workspace not found with id: "; private static final String WORKSPACE_NAME_PREFIX = "Workspace "; @Transactional diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java index 9a8c0cee..b244a932 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java @@ -62,7 +62,7 @@ void testCreateCollection() throws Exception { assertThat(createdCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); assertThat(createdCollection.id()).isNotNull(); @@ -82,7 +82,7 @@ void testCreateCollectionWithFilteredConfigs() throws Exception { assertThat(createdCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId", "spreadsheetConfigs.globalFilters.uuid") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id", "spreadsheetConfigs.globalFilters.uuid") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); @@ -98,7 +98,7 @@ void testCreateCollectionWithAliases() throws Exception { assertThat(createdCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); assertThat(createdCollection.id()).isNotNull(); @@ -114,7 +114,7 @@ void testReadCollection() throws Exception { assertThat(receivedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id") .ignoringExpectedNullFields() .isEqualTo(collectionToRead); assertThat(receivedCollection.id()).isEqualTo(collectionUuid); @@ -139,7 +139,7 @@ void testUpdateCollection() throws Exception { assertThat(retrievedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.columnId") + .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.id") .ignoringExpectedNullFields() .isEqualTo(updatedCollection); } @@ -224,7 +224,7 @@ void testDuplicateCollection() throws Exception { SpreadsheetConfigCollectionInfos duplicatedCollection = getSpreadsheetConfigCollection(duplicatedCollectionUuid); assertThat(duplicatedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.columnId", "spreadsheetConfigs.globalFilters.uuid") + .ignoringFields("spreadsheetConfigs.columns.uuid", "id", "spreadsheetConfigs.id", "spreadsheetConfigs.globalFilters.uuid") .ignoringExpectedNullFields() .isEqualTo(collectionToCreate); assertThat(duplicatedCollection.id()).isNotEqualTo(collectionUuid); @@ -250,7 +250,7 @@ void testMergeModelsIntoNewCollection() throws Exception { // dont compare aliases, merged collection aliases are computed assertThat(mergedCollection) .usingRecursiveComparison() - .ignoringFields("id", "nodeAliases", "spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.columnId") + .ignoringFields("id", "nodeAliases", "spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.id") .ignoringExpectedNullFields() .isEqualTo(sourceCollection); @@ -441,7 +441,7 @@ private List createSpreadsheetConfigs() { private List createSpreadsheetConfigsWithFilters() { List columnsConfig1 = Arrays.asList( - new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, "text", "equals", "test-value", null), new SpreadsheetColumnInfos(null, "name", ColumnType.TEXT, null, "name", "[\"name\"]", "name", true, "text", "contains", "name-value", null), @@ -457,7 +457,7 @@ private List createSpreadsheetConfigsWithFilters() { ); List columnsConfig2 = Arrays.asList( - new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, "text", "contains", "other-value", null), new SpreadsheetColumnInfos(null, "type", ColumnType.ENUM, null, "type", "[\"type\"]", "type", true, null, null, null, null), @@ -492,7 +492,7 @@ private List createUpdatedSpreadsheetConfigs() { private List createUpdatedSpreadsheetConfigsWithFilters() { List columnsConfig1 = Arrays.asList( - new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, "text", "startsWith", "new-prefix", null), new SpreadsheetColumnInfos(null, "updated", ColumnType.TEXT, null, "updated", "[\"updated\"]", "updated", true, null, null, null, null) @@ -505,7 +505,7 @@ private List createUpdatedSpreadsheetConfigsWithFilters( ); List columnsConfig2 = Arrays.asList( - new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, "text", "endsWith", "suffix", null), new SpreadsheetColumnInfos(null, "other", ColumnType.NUMBER, 2, "other", "[\"other\"]", "other", true, "number", "between", "10,20", null) @@ -516,7 +516,7 @@ private List createUpdatedSpreadsheetConfigsWithFilters( ); List columnsConfig3 = Arrays.asList( - new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"columnId\"]", "id", true, + new SpreadsheetColumnInfos(null, "id", ColumnType.TEXT, null, "id", "[\"id\"]", "id", true, "text", "contains", "middle", null), new SpreadsheetColumnInfos(null, "third", ColumnType.BOOLEAN, null, "third", "[\"third\"]", "third", true, "boolean", "equals", "true", null) diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java index 0c2841a2..4e372167 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigIntegrationTest.java @@ -504,7 +504,7 @@ void testRenameSpreadsheetConfig() throws Exception { assertThat(renamedConfig) .usingRecursiveComparison() - .ignoringFields("name", "columns.uuid", "id", "columns.columnId") + .ignoringFields("name", "columns.uuid", "id", "columns.id") .isEqualTo(configToRename); } diff --git a/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java index c5132436..2de96643 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/WorkspacesConfigControllerTest.java @@ -57,7 +57,7 @@ private String getWorkspacesConfigBasePath() { } private String getPanelsPath() { - return getWorkspacesConfigBasePath() + "/{columnId}/workspaces/{workspaceId}/panels"; + return getWorkspacesConfigBasePath() + "/{id}/workspaces/{workspaceId}/panels"; } private String getNadConfigPath() { From 434073185fcd8c47c125f9ed530674c54b8c4aea Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Wed, 4 Feb 2026 13:45:39 +0100 Subject: [PATCH 15/22] code review remarks --- .../ComputationResultFiltersController.java | 1 + ...umnFilter.java => ColumnFilterEntity.java} | 6 +- .../entities/SpreadsheetColumnEntity.java | 2 +- .../ColumnEntity.java} | 10 +- .../FilterSubTypeEntity.java} | 6 +- .../FilterTypeEntity.java} | 7 +- .../FiltersEntity.java} | 6 +- .../ComputationResultFiltersMapper.java | 12 ++- .../mapper/SpreadsheetConfigMapper.java | 6 +- .../FilterSubTypeRepository.java} | 6 +- .../FilterTypeRepository.java} | 6 +- .../FiltersRepository.java} | 6 +- .../ComputationResultFiltersService.java | 100 +++++++++--------- .../service/SpreadsheetConfigService.java | 4 +- .../server/ComputationResultFiltersTest.java | 5 +- .../studyconfig/server/DtoConverterTest.java | 6 +- ...dsheetConfigCollectionIntegrationTest.java | 2 +- 17 files changed, 98 insertions(+), 93 deletions(-) rename src/main/java/org/gridsuite/studyconfig/server/entities/{ColumnFilter.java => ColumnFilterEntity.java} (92%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{ComputationResultColumnFilterEntity.java => computationresult/ColumnEntity.java} (75%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{ComputationSubTypeFiltersEntity.java => computationresult/FilterSubTypeEntity.java} (83%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{ComputationTypeFiltersEntity.java => computationresult/FilterTypeEntity.java} (83%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{ComputationResultFiltersEntity.java => computationresult/FiltersEntity.java} (81%) rename src/main/java/org/gridsuite/studyconfig/server/repositories/{ComputationSubTypeFiltersRepository.java => computationresult/FilterSubTypeRepository.java} (65%) rename src/main/java/org/gridsuite/studyconfig/server/repositories/{ComputationTypeFiltersRepository.java => computationresult/FilterTypeRepository.java} (66%) rename src/main/java/org/gridsuite/studyconfig/server/repositories/{ComputationResultFiltersRepository.java => computationresult/FiltersRepository.java} (65%) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java index 3ac50459..525d3b99 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import org.gridsuite.studyconfig.server.StudyConfigApi; import org.gridsuite.studyconfig.server.dto.*; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; import org.gridsuite.studyconfig.server.service.ComputationResultFiltersService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilter.java b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilterEntity.java similarity index 92% rename from src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilter.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilterEntity.java index 0e678980..43b6dc4d 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilter.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/ColumnFilterEntity.java @@ -21,7 +21,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) -public class ColumnFilter { +public class ColumnFilterEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -47,8 +47,8 @@ public void resetFilter() { this.filterValue = null; } - public ColumnFilter copy() { - return ColumnFilter.builder() + public ColumnFilterEntity copy() { + return ColumnFilterEntity.builder() .filterDataType(this.getFilterDataType()) .filterType(this.getFilterType()) .filterValue(this.getFilterValue()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java index a9370c84..545f3bd7 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/SpreadsheetColumnEntity.java @@ -55,7 +55,7 @@ public class SpreadsheetColumnEntity { @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "columnEntity_columnFilter_id", referencedColumnName = "uuid", foreignKey = @ForeignKey(name = "columnEntity_columnFilter_fk")) - private ColumnFilter columnFilter; + private ColumnFilterEntity columnFilter; public SpreadsheetColumnEntity copy() { return SpreadsheetColumnEntity.builder() diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java similarity index 75% rename from src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java index 024637d0..2c7440b3 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultColumnFilterEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java @@ -4,10 +4,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities; +package org.gridsuite.studyconfig.server.entities.computationresult; import jakarta.persistence.*; import lombok.*; +import org.gridsuite.studyconfig.server.entities.ColumnFilterEntity; import java.util.UUID; @@ -21,7 +22,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) -public class ComputationResultColumnFilterEntity { +public class ColumnEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -32,7 +33,6 @@ public class ComputationResultColumnFilterEntity { private String computationColumnId; @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) - @JoinColumn(name = "computationResult_columnFilter_id", referencedColumnName = "uuid", - foreignKey = @ForeignKey(name = "computationResult_columnFilter_fk")) - private ColumnFilter columnFilter; + @JoinColumn(name = "computationResult_columnFilter_id", referencedColumnName = "uuid", foreignKey = @ForeignKey(name = "computationResult_columnFilter_fk")) + private ColumnFilterEntity columnFilter; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java similarity index 83% rename from src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java index d69ebae6..400f12ff 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationSubTypeFiltersEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities; +package org.gridsuite.studyconfig.server.entities.computationresult; import jakarta.persistence.*; import lombok.*; @@ -21,7 +21,7 @@ @Setter @Entity @Table(name = "computation_sub_type_filters") -public class ComputationSubTypeFiltersEntity { +public class FilterSubTypeEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "uuid") @@ -33,5 +33,5 @@ public class ComputationSubTypeFiltersEntity { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "computation_result_id", foreignKey = @ForeignKey(name = "fk_computation_result_column")) @Builder.Default - private List columns = new ArrayList<>(); + private List columns = new ArrayList<>(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java similarity index 83% rename from src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java index 8a12ea82..a4dd59a0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationTypeFiltersEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java @@ -4,10 +4,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities; +package org.gridsuite.studyconfig.server.entities.computationresult; import jakarta.persistence.*; import lombok.*; +import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import java.util.ArrayList; import java.util.List; @@ -23,7 +24,7 @@ @Setter @Entity @Table(name = "computation_type_filters") -public class ComputationTypeFiltersEntity { +public class FilterTypeEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "uuid") @@ -40,5 +41,5 @@ public class ComputationTypeFiltersEntity { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "computation_sub_type_filters_id", foreignKey = @ForeignKey(name = "fk_computation_sub_type_column_filters")) @Builder.Default - private List computationSubTypes = new ArrayList<>(); + private List computationSubTypes = new ArrayList<>(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FiltersEntity.java similarity index 81% rename from src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FiltersEntity.java index d4f09803..a9cb9981 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/ComputationResultFiltersEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FiltersEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities; +package org.gridsuite.studyconfig.server.entities.computationresult; import jakarta.persistence.*; import lombok.*; @@ -21,7 +21,7 @@ @Setter @Entity @Table(name = "computation_result_filters") -public class ComputationResultFiltersEntity { +public class FiltersEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") @@ -30,5 +30,5 @@ public class ComputationResultFiltersEntity { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "computation_result_filters_id", foreignKey = @ForeignKey(name = "fk_computation_result_filters_type")) @Builder.Default - private List computationResultFilter = new ArrayList<>(); + private List computationResultFilter = new ArrayList<>(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java index a8d9d64e..962e65eb 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/ComputationResultFiltersMapper.java @@ -7,7 +7,9 @@ package org.gridsuite.studyconfig.server.mapper; import org.gridsuite.studyconfig.server.dto.*; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; import org.gridsuite.studyconfig.server.entities.*; +import org.gridsuite.studyconfig.server.entities.computationresult.ColumnEntity; /** * @author Rehili Ghazwa @@ -16,17 +18,17 @@ public final class ComputationResultFiltersMapper { private ComputationResultFiltersMapper() { } - public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos(ComputationResultColumnFilterEntity entity) { - ColumnFilter filter = entity.getColumnFilter(); + public static ComputationResultColumnFilterInfos toComputationColumnFilterInfos(ColumnEntity entity) { + ColumnFilterEntity filter = entity.getColumnFilter(); return new ComputationResultColumnFilterInfos(entity.getComputationColumnId(), filter != null ? new ColumnFilterInfos(filter.getFilterDataType(), filter.getFilterType(), filter.getFilterValue(), filter.getFilterTolerance()) : null); } - public static ComputationResultColumnFilterEntity toComputationColumnFilterEntity(ComputationResultColumnFilterInfos columnFilterInfos) { - return ComputationResultColumnFilterEntity.builder() + public static ColumnEntity toComputationColumnFilterEntity(ComputationResultColumnFilterInfos columnFilterInfos) { + return ColumnEntity.builder() .computationColumnId(columnFilterInfos.columnId()) - .columnFilter(columnFilterInfos.columnFilterInfos() != null ? ColumnFilter.builder() + .columnFilter(columnFilterInfos.columnFilterInfos() != null ? ColumnFilterEntity.builder() .filterDataType(columnFilterInfos.columnFilterInfos().filterDataType()) .filterType(columnFilterInfos.columnFilterInfos().filterType()) .filterValue(columnFilterInfos.columnFilterInfos().filterValue()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java index 3922ff6e..a8fbcd7e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/SpreadsheetConfigMapper.java @@ -9,7 +9,7 @@ import org.gridsuite.studyconfig.server.constants.SortDirection; import org.gridsuite.studyconfig.server.dto.*; import org.gridsuite.studyconfig.server.entities.SpreadsheetColumnEntity; -import org.gridsuite.studyconfig.server.entities.ColumnFilter; +import org.gridsuite.studyconfig.server.entities.ColumnFilterEntity; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; @@ -71,7 +71,7 @@ public static SpreadsheetConfigEntity toEntity(SpreadsheetConfigInfos dto) { } public static SpreadsheetColumnInfos toColumnDto(SpreadsheetColumnEntity entity) { - ColumnFilter filter = entity.getColumnFilter(); + ColumnFilterEntity filter = entity.getColumnFilter(); return new SpreadsheetColumnInfos( entity.getUuid(), entity.getName(), @@ -97,7 +97,7 @@ public static SpreadsheetColumnEntity toColumnEntity(SpreadsheetColumnInfos dto) .dependencies(dto.dependencies()) .id(dto.id()) .visible(dto.visible()) - .columnFilter(dto.columnFilterInfos() != null ? ColumnFilter.builder() + .columnFilter(dto.columnFilterInfos() != null ? ColumnFilterEntity.builder() .filterDataType(dto.columnFilterInfos().filterDataType()) .filterType(dto.columnFilterInfos().filterType()) .filterValue(dto.columnFilterInfos().filterValue()) diff --git a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java b/src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FilterSubTypeRepository.java similarity index 65% rename from src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java rename to src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FilterSubTypeRepository.java index 241c7d35..31f0caa6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationSubTypeFiltersRepository.java +++ b/src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FilterSubTypeRepository.java @@ -4,9 +4,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.repositories; +package org.gridsuite.studyconfig.server.repositories.computationresult; -import org.gridsuite.studyconfig.server.entities.ComputationSubTypeFiltersEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FilterSubTypeEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -16,5 +16,5 @@ * @author Rehili Ghazwa */ @Repository -public interface ComputationSubTypeFiltersRepository extends JpaRepository { +public interface FilterSubTypeRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java b/src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FilterTypeRepository.java similarity index 66% rename from src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java rename to src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FilterTypeRepository.java index 5865d38e..f3045cdb 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationTypeFiltersRepository.java +++ b/src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FilterTypeRepository.java @@ -4,9 +4,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.repositories; +package org.gridsuite.studyconfig.server.repositories.computationresult; -import org.gridsuite.studyconfig.server.entities.ComputationTypeFiltersEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FilterTypeEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -16,5 +16,5 @@ * @author Rehili Ghazwa */ @Repository -public interface ComputationTypeFiltersRepository extends JpaRepository { +public interface FilterTypeRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java b/src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FiltersRepository.java similarity index 65% rename from src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java rename to src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FiltersRepository.java index 1d8952ec..226957f2 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/repositories/ComputationResultFiltersRepository.java +++ b/src/main/java/org/gridsuite/studyconfig/server/repositories/computationresult/FiltersRepository.java @@ -4,9 +4,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.repositories; +package org.gridsuite.studyconfig.server.repositories.computationresult; -import org.gridsuite.studyconfig.server.entities.ComputationResultFiltersEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FiltersEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -16,5 +16,5 @@ * @author Rehili Ghazwa */ @Repository -public interface ComputationResultFiltersRepository extends JpaRepository { +public interface FiltersRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index 22af0b8b..1b7829cd 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -8,19 +8,22 @@ import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; -import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; -import org.gridsuite.studyconfig.server.entities.*; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.ColumnEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FilterTypeEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FiltersEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FilterSubTypeEntity; import org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; -import org.gridsuite.studyconfig.server.repositories.ComputationResultFiltersRepository; -import org.gridsuite.studyconfig.server.repositories.ComputationSubTypeFiltersRepository; -import org.gridsuite.studyconfig.server.repositories.ComputationTypeFiltersRepository; +import org.gridsuite.studyconfig.server.repositories.computationresult.FiltersRepository; +import org.gridsuite.studyconfig.server.repositories.computationresult.FilterSubTypeRepository; +import org.gridsuite.studyconfig.server.repositories.computationresult.FilterTypeRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Optional; import java.util.UUID; import static org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper.toComputationColumnFilterEntity; @@ -33,29 +36,29 @@ @RequiredArgsConstructor public class ComputationResultFiltersService { private static final String COMPUTATION_FILTERS_NOT_FOUND = "not found"; - private final ComputationResultFiltersRepository computationResultFiltersRepository; - private final ComputationTypeFiltersRepository computationTypeFiltersRepository; - private final ComputationSubTypeFiltersRepository computationSubTypeFiltersRepository; + private final FiltersRepository filtersRepository; + private final FilterTypeRepository filterTypeRepository; + private final FilterSubTypeRepository filterSubTypeRepository; @Transactional public UUID createDefaultComputingResultFilters() { - ComputationResultFiltersEntity root = new ComputationResultFiltersEntity(); - return computationResultFiltersRepository.saveAndFlush(root).getId(); + FiltersEntity root = new FiltersEntity(); + return filtersRepository.saveAndFlush(root).getId(); } - private ComputationResultFiltersEntity getRootEntity(UUID rootId) { - return computationResultFiltersRepository.findById(rootId) + private FiltersEntity getRootEntity(UUID rootId) { + return filtersRepository.findById(rootId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); } - private ComputationTypeFiltersEntity findComputationType(ComputationResultFiltersEntity root, String type) { + private FilterTypeEntity findComputationType(FiltersEntity root, String type) { return root.getComputationResultFilter().stream() .filter(t -> t.getComputationType().equals(type)) .findFirst() .orElse(null); } - private ComputationSubTypeFiltersEntity findComputationSubType(ComputationTypeFiltersEntity typeEntity, String subType) { + private FilterSubTypeEntity findComputationSubType(FilterTypeEntity typeEntity, String subType) { return typeEntity.getComputationSubTypes().stream() .filter(s -> s.getComputationSubType().equals(subType)) .findFirst() @@ -64,35 +67,37 @@ private ComputationSubTypeFiltersEntity findComputationSubType(ComputationTypeFi @Transactional(readOnly = true) public List getComputingResultColumnFilters(UUID rootId, String computationType, String computationSubType) { - ComputationResultFiltersEntity rootEntity = getRootEntity(rootId); - return Optional.ofNullable(findComputationType(rootEntity, computationType)) - .map(type -> findComputationSubType(type, computationSubType)) - .map(sub -> sub.getColumns().stream() - .map(ComputationResultFiltersMapper::toComputationColumnFilterInfos) - .toList()) - .orElse(List.of()); - + FiltersEntity rootEntity = getRootEntity(rootId); + FilterTypeEntity typeEntity = findComputationType(rootEntity, computationType); + if (typeEntity == null) { + return List.of(); + } + FilterSubTypeEntity subTypeEntity = findComputationSubType(typeEntity, computationSubType); + if (subTypeEntity == null) { + return List.of(); + } + return subTypeEntity.getColumns().stream().map(ComputationResultFiltersMapper::toComputationColumnFilterInfos).toList(); } @Transactional(readOnly = true) public List getComputingResultGlobalFilters(UUID rootId, String computationType) { - ComputationResultFiltersEntity rootEntity = getRootEntity(rootId); - return Optional.ofNullable(findComputationType(rootEntity, computationType)) - .map(type -> type.getGlobalFilters().stream() - .map(SpreadsheetConfigMapper::toGlobalFilterDto) - .toList()) - .orElse(List.of()); + FiltersEntity rootEntity = getRootEntity(rootId); + FilterTypeEntity typeEntity = findComputationType(rootEntity, computationType); + if (typeEntity == null) { + return List.of(); + } + return typeEntity.getGlobalFilters().stream().map(SpreadsheetConfigMapper::toGlobalFilterDto).toList(); } @Transactional public void setGlobalFiltersForComputationResult(UUID rootId, String computationType, List globalFilters) { - ComputationResultFiltersEntity root = computationResultFiltersRepository.findById(rootId) + FiltersEntity root = filtersRepository.findById(rootId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); - ComputationTypeFiltersEntity typeEntity = root.getComputationResultFilter().stream() + FilterTypeEntity typeEntity = root.getComputationResultFilter().stream() .filter(type -> computationType.equals(type.getComputationType())) .findFirst() .orElseGet(() -> { - ComputationTypeFiltersEntity entity = new ComputationTypeFiltersEntity(); + FilterTypeEntity entity = new FilterTypeEntity(); entity.setComputationType(computationType); root.getComputationResultFilter().add(entity); return entity; @@ -103,48 +108,43 @@ public void setGlobalFiltersForComputationResult(UUID rootId, String computation typeEntity.getGlobalFilters().clear(); typeEntity.getGlobalFilters().addAll(newFilters); } - computationResultFiltersRepository.save(root); + filtersRepository.save(root); } @Transactional - public void updateColumn( - UUID rootId, - String computationType, - String computationSubType, - ComputationResultColumnFilterInfos columns - ) { - ComputationResultFiltersEntity root = computationResultFiltersRepository.findById(rootId) + public void updateColumn(UUID rootId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columns) { + FiltersEntity root = filtersRepository.findById(rootId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); - ComputationTypeFiltersEntity typeEntity = findOrCreateComputationType(root, computationType); + FilterTypeEntity typeEntity = findOrCreateComputationType(root, computationType); if (typeEntity.getUuid() == null) { - computationTypeFiltersRepository.save(typeEntity); + filterTypeRepository.save(typeEntity); } - ComputationSubTypeFiltersEntity subTypeEntity = typeEntity.getComputationSubTypes().stream() + FilterSubTypeEntity subTypeEntity = typeEntity.getComputationSubTypes().stream() .filter(sub -> sub.getComputationSubType().equals(computationSubType)) .findFirst() .orElseGet(() -> createAndAttachSubType(typeEntity, computationSubType)); - ComputationResultColumnFilterEntity updatedColumn = toComputationColumnFilterEntity(columns); + ColumnEntity updatedColumn = toComputationColumnFilterEntity(columns); subTypeEntity.getColumns().removeIf(col -> col.getComputationColumnId() != null && col.getComputationColumnId().equals(updatedColumn.getComputationColumnId())); subTypeEntity.getColumns().add(updatedColumn); - computationResultFiltersRepository.save(root); + filtersRepository.save(root); } - private ComputationTypeFiltersEntity findOrCreateComputationType(ComputationResultFiltersEntity root, String computationType) { + private FilterTypeEntity findOrCreateComputationType(FiltersEntity root, String computationType) { return root.getComputationResultFilter().stream() .filter(type -> type.getComputationType().equals(computationType)) .findFirst() .orElseGet(() -> { - ComputationTypeFiltersEntity newType = new ComputationTypeFiltersEntity(); + FilterTypeEntity newType = new FilterTypeEntity(); newType.setComputationType(computationType); root.getComputationResultFilter().add(newType); return newType; }); } - private ComputationSubTypeFiltersEntity createAndAttachSubType(ComputationTypeFiltersEntity typeEntity, String computationSubType) { - ComputationSubTypeFiltersEntity newSubType = new ComputationSubTypeFiltersEntity(); + private FilterSubTypeEntity createAndAttachSubType(FilterTypeEntity typeEntity, String computationSubType) { + FilterSubTypeEntity newSubType = new FilterSubTypeEntity(); newSubType.setComputationSubType(computationSubType); typeEntity.getComputationSubTypes().add(newSubType); - return computationSubTypeFiltersRepository.save(newSubType); + return filterSubTypeRepository.save(newSubType); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java index 89a4244d..05019023 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/SpreadsheetConfigService.java @@ -322,9 +322,9 @@ public void updateColumn(UUID id, UUID columnId, SpreadsheetColumnInfos dto) { columnEntity.setId(dto.id()); var infos = dto.columnFilterInfos(); if (infos != null) { - ColumnFilter filter = columnEntity.getColumnFilter(); + ColumnFilterEntity filter = columnEntity.getColumnFilter(); if (filter == null) { - filter = new ColumnFilter(); + filter = new ColumnFilterEntity(); columnEntity.setColumnFilter(filter); } filter.setFilterDataType(infos.filterDataType()); diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 42257a9e..47c877cc 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -9,7 +9,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.studyconfig.server.dto.*; -import org.gridsuite.studyconfig.server.repositories.ComputationResultFiltersRepository; +import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.repositories.computationresult.FiltersRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +43,7 @@ class ComputationResultFiltersTest { private ObjectMapper mapper; @Autowired - private ComputationResultFiltersRepository computationResultFiltersRepository; + private FiltersRepository computationResultFiltersRepository; @AfterEach void tearDown() { diff --git a/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java b/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java index 3577ce78..ebd9ce13 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/DtoConverterTest.java @@ -13,7 +13,7 @@ import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; import org.gridsuite.studyconfig.server.dto.SpreadsheetConfigInfos; import org.gridsuite.studyconfig.server.entities.SpreadsheetColumnEntity; -import org.gridsuite.studyconfig.server.entities.ColumnFilter; +import org.gridsuite.studyconfig.server.entities.ColumnFilterEntity; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.SpreadsheetConfigEntity; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; @@ -44,7 +44,7 @@ void testConversionToDtoOfSpreadsheetConfig() { .formula("A+B") .id("id1") .visible(false) - .columnFilter(ColumnFilter.builder() + .columnFilter(ColumnFilterEntity.builder() .filterDataType("text") .filterType("contains") .filterValue("test") @@ -163,7 +163,7 @@ void testConversionToDtoOfColumnWithFilter() { .name("TestColumn") .formula("A+B+C") .id("idTest") - .columnFilter(ColumnFilter.builder() + .columnFilter(ColumnFilterEntity.builder() .filterDataType("text") .filterType("startsWith") .filterValue("prefix") diff --git a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java index b244a932..257fba4c 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/SpreadsheetConfigCollectionIntegrationTest.java @@ -173,7 +173,7 @@ void testUpdateCollectionWithFilteredConfigs() throws Exception { assertThat(retrievedCollection) .usingRecursiveComparison() - .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.columnId", "spreadsheetConfigs.globalFilters.uuid") + .ignoringFields("spreadsheetConfigs.columns.uuid", "spreadsheetConfigs.id", "spreadsheetConfigs.globalFilters.uuid") .ignoringExpectedNullFields() .isEqualTo(updatedCollection); } From bc2aa72e97fb1c701023af1440d8e9331753cebf Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Wed, 4 Feb 2026 13:50:01 +0100 Subject: [PATCH 16/22] rename to computationResultFiltersId --- .../ComputationResultFiltersController.java | 24 +++++++-------- .../ComputationResultFiltersService.java | 30 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java index 525d3b99..45cbf155 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/ComputationResultFiltersController.java @@ -43,53 +43,53 @@ public ResponseEntity createDefaultComputationResultFilters() { return ResponseEntity.status(HttpStatus.CREATED).body(id); } - @GetMapping("/{id}/{computationType}") + @GetMapping("/{computationResultFiltersId}/{computationType}") @Operation(summary = "Get a computation result global filters", description = "Fetches the computation result global filters for a given computation type") @ApiResponse(responseCode = "200", description = "Computation result global filters found", content = @Content(schema = @Schema(implementation = GlobalFilterInfos.class))) @ApiResponse(responseCode = "404", description = "Computation result global filters not found") public ResponseEntity> getComputingResultGlobalFilters( - @Parameter(description = "Computation root ID") @PathVariable UUID id, + @Parameter(description = "Computation result filters Id") @PathVariable UUID computationResultFiltersId, @Parameter(description = "Computation type") @PathVariable String computationType) { - return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultGlobalFilters(id, computationType)); + return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultGlobalFilters(computationResultFiltersId, computationType)); } - @GetMapping("/{id}/{computationType}/{computationSubType}") + @GetMapping("/{computationResultFiltersId}/{computationType}/{computationSubType}") @Operation(summary = "Get a computation result column filters", description = "Fetches the computation result column filters for a given computation type and subtype") @ApiResponse(responseCode = "200", description = "Computation result column filters found", content = @Content(schema = @Schema(implementation = ComputationResultColumnFilterInfos.class))) @ApiResponse(responseCode = "404", description = "Computation result column filters not found") public ResponseEntity> getComputingResultColumnFilters( - @Parameter(description = "Computation root ID") @PathVariable UUID id, + @Parameter(description = "Computation result filters Id") @PathVariable UUID computationResultFiltersId, @Parameter(description = "Computation type") @PathVariable String computationType, @Parameter(description = "Computation subtype") @PathVariable String computationSubType) { - return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultColumnFilters(id, computationType, computationSubType)); + return ResponseEntity.ok(computationGlobalFiltersService.getComputingResultColumnFilters(computationResultFiltersId, computationType, computationSubType)); } - @PostMapping("/{id}/{computationType}/global-filters") + @PostMapping("/{computationResultFiltersId}/{computationType}/global-filters") @Operation(summary = "Set global filters", description = "Replaces all existing global filters with the provided list for a computation result") @ApiResponse(responseCode = "204", description = "Global filters set successfully") @ApiResponse(responseCode = "404", description = "Computation result filters not found") public ResponseEntity setGlobalFiltersForComputingResult( - @PathVariable UUID id, + @PathVariable UUID computationResultFiltersId, @PathVariable String computationType, @Valid @RequestBody List filters) { - computationGlobalFiltersService.setGlobalFiltersForComputationResult(id, computationType, filters); + computationGlobalFiltersService.setGlobalFiltersForComputationResult(computationResultFiltersId, computationType, filters); return ResponseEntity.noContent().build(); } - @PutMapping("/{id}/{computationType}/{computationSubType}/columns") + @PutMapping("/{computationResultFiltersId}/{computationType}/{computationSubType}/columns") @Operation(summary = "Update a column", description = "Updates an existing column") @ApiResponse(responseCode = "204", description = "Column updated") public ResponseEntity updateColumn( - @PathVariable UUID id, + @PathVariable UUID computationResultFiltersId, @PathVariable String computationType, @PathVariable String computationSubType, @Valid @RequestBody ComputationResultColumnFilterInfos dto) { - computationGlobalFiltersService.updateColumn(id, computationType, computationSubType, dto); + computationGlobalFiltersService.updateColumn(computationResultFiltersId, computationType, computationSubType, dto); return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index 1b7829cd..8cfaa36d 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -51,8 +51,8 @@ private FiltersEntity getRootEntity(UUID rootId) { .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); } - private FilterTypeEntity findComputationType(FiltersEntity root, String type) { - return root.getComputationResultFilter().stream() + private FilterTypeEntity findComputationType(FiltersEntity filtersEntity, String type) { + return filtersEntity.getComputationResultFilter().stream() .filter(t -> t.getComputationType().equals(type)) .findFirst() .orElse(null); @@ -66,8 +66,8 @@ private FilterSubTypeEntity findComputationSubType(FilterTypeEntity typeEntity, } @Transactional(readOnly = true) - public List getComputingResultColumnFilters(UUID rootId, String computationType, String computationSubType) { - FiltersEntity rootEntity = getRootEntity(rootId); + public List getComputingResultColumnFilters(UUID computationResultFiltersId, String computationType, String computationSubType) { + FiltersEntity rootEntity = getRootEntity(computationResultFiltersId); FilterTypeEntity typeEntity = findComputationType(rootEntity, computationType); if (typeEntity == null) { return List.of(); @@ -80,8 +80,8 @@ public List getComputingResultColumnFilters( } @Transactional(readOnly = true) - public List getComputingResultGlobalFilters(UUID rootId, String computationType) { - FiltersEntity rootEntity = getRootEntity(rootId); + public List getComputingResultGlobalFilters(UUID computationResultFiltersId, String computationType) { + FiltersEntity rootEntity = getRootEntity(computationResultFiltersId); FilterTypeEntity typeEntity = findComputationType(rootEntity, computationType); if (typeEntity == null) { return List.of(); @@ -90,9 +90,9 @@ public List getComputingResultGlobalFilters(UUID rootId, Stri } @Transactional - public void setGlobalFiltersForComputationResult(UUID rootId, String computationType, List globalFilters) { - FiltersEntity root = filtersRepository.findById(rootId) - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + public void setGlobalFiltersForComputationResult(UUID computationResultFiltersId, String computationType, List globalFilters) { + FiltersEntity root = filtersRepository.findById(computationResultFiltersId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); FilterTypeEntity typeEntity = root.getComputationResultFilter().stream() .filter(type -> computationType.equals(type.getComputationType())) .findFirst() @@ -112,9 +112,9 @@ public void setGlobalFiltersForComputationResult(UUID rootId, String computation } @Transactional - public void updateColumn(UUID rootId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columns) { - FiltersEntity root = filtersRepository.findById(rootId) - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + public void updateColumn(UUID computationResultFiltersId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columns) { + FiltersEntity root = filtersRepository.findById(computationResultFiltersId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); FilterTypeEntity typeEntity = findOrCreateComputationType(root, computationType); if (typeEntity.getUuid() == null) { filterTypeRepository.save(typeEntity); @@ -129,14 +129,14 @@ public void updateColumn(UUID rootId, String computationType, String computation filtersRepository.save(root); } - private FilterTypeEntity findOrCreateComputationType(FiltersEntity root, String computationType) { - return root.getComputationResultFilter().stream() + private FilterTypeEntity findOrCreateComputationType(FiltersEntity filtersEntity, String computationType) { + return filtersEntity.getComputationResultFilter().stream() .filter(type -> type.getComputationType().equals(computationType)) .findFirst() .orElseGet(() -> { FilterTypeEntity newType = new FilterTypeEntity(); newType.setComputationType(computationType); - root.getComputationResultFilter().add(newType); + filtersEntity.getComputationResultFilter().add(newType); return newType; }); } From 64a8651904fe85be1df36a4156b22b40d1c4ab03 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Thu, 5 Feb 2026 11:37:30 +0100 Subject: [PATCH 17/22] rename to computationResultsFiltersId --- .../ComputationResultFiltersService.java | 32 +++++++++---------- .../server/ComputationResultFiltersTest.java | 18 +++++------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index 8cfaa36d..d45e8a45 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -42,13 +42,13 @@ public class ComputationResultFiltersService { @Transactional public UUID createDefaultComputingResultFilters() { - FiltersEntity root = new FiltersEntity(); - return filtersRepository.saveAndFlush(root).getId(); + FiltersEntity filtersEntity = new FiltersEntity(); + return filtersRepository.saveAndFlush(filtersEntity).getId(); } - private FiltersEntity getRootEntity(UUID rootId) { - return filtersRepository.findById(rootId) - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + rootId)); + private FiltersEntity getFiltersEntity(UUID computationResultFiltersId) { + return filtersRepository.findById(computationResultFiltersId) + .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); } private FilterTypeEntity findComputationType(FiltersEntity filtersEntity, String type) { @@ -67,8 +67,8 @@ private FilterSubTypeEntity findComputationSubType(FilterTypeEntity typeEntity, @Transactional(readOnly = true) public List getComputingResultColumnFilters(UUID computationResultFiltersId, String computationType, String computationSubType) { - FiltersEntity rootEntity = getRootEntity(computationResultFiltersId); - FilterTypeEntity typeEntity = findComputationType(rootEntity, computationType); + FiltersEntity filtersEntity = getFiltersEntity(computationResultFiltersId); + FilterTypeEntity typeEntity = findComputationType(filtersEntity, computationType); if (typeEntity == null) { return List.of(); } @@ -81,8 +81,8 @@ public List getComputingResultColumnFilters( @Transactional(readOnly = true) public List getComputingResultGlobalFilters(UUID computationResultFiltersId, String computationType) { - FiltersEntity rootEntity = getRootEntity(computationResultFiltersId); - FilterTypeEntity typeEntity = findComputationType(rootEntity, computationType); + FiltersEntity filtersEntity = getFiltersEntity(computationResultFiltersId); + FilterTypeEntity typeEntity = findComputationType(filtersEntity, computationType); if (typeEntity == null) { return List.of(); } @@ -91,15 +91,15 @@ public List getComputingResultGlobalFilters(UUID computationR @Transactional public void setGlobalFiltersForComputationResult(UUID computationResultFiltersId, String computationType, List globalFilters) { - FiltersEntity root = filtersRepository.findById(computationResultFiltersId) + FiltersEntity filtersEntity = filtersRepository.findById(computationResultFiltersId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); - FilterTypeEntity typeEntity = root.getComputationResultFilter().stream() + FilterTypeEntity typeEntity = filtersEntity.getComputationResultFilter().stream() .filter(type -> computationType.equals(type.getComputationType())) .findFirst() .orElseGet(() -> { FilterTypeEntity entity = new FilterTypeEntity(); entity.setComputationType(computationType); - root.getComputationResultFilter().add(entity); + filtersEntity.getComputationResultFilter().add(entity); return entity; }); @@ -108,14 +108,14 @@ public void setGlobalFiltersForComputationResult(UUID computationResultFiltersId typeEntity.getGlobalFilters().clear(); typeEntity.getGlobalFilters().addAll(newFilters); } - filtersRepository.save(root); + filtersRepository.save(filtersEntity); } @Transactional public void updateColumn(UUID computationResultFiltersId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columns) { - FiltersEntity root = filtersRepository.findById(computationResultFiltersId) + FiltersEntity filtersEntity = filtersRepository.findById(computationResultFiltersId) .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); - FilterTypeEntity typeEntity = findOrCreateComputationType(root, computationType); + FilterTypeEntity typeEntity = findOrCreateComputationType(filtersEntity, computationType); if (typeEntity.getUuid() == null) { filterTypeRepository.save(typeEntity); } @@ -126,7 +126,7 @@ public void updateColumn(UUID computationResultFiltersId, String computationType ColumnEntity updatedColumn = toComputationColumnFilterEntity(columns); subTypeEntity.getColumns().removeIf(col -> col.getComputationColumnId() != null && col.getComputationColumnId().equals(updatedColumn.getComputationColumnId())); subTypeEntity.getColumns().add(updatedColumn); - filtersRepository.save(root); + filtersRepository.save(filtersEntity); } private FilterTypeEntity findOrCreateComputationType(FiltersEntity filtersEntity, String computationType) { diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 47c877cc..2dfaceeb 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -64,30 +64,30 @@ void testCreateDefaultComputationResultFilters() throws Exception { MvcResult result = mockMvc.perform(post(BASE_URI + "/default")) .andExpect(status().isCreated()) .andReturn(); - UUID rootId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); - assertThat(rootId).isNotNull(); - assertThat(computationResultFiltersRepository.findById(rootId)).isPresent(); + UUID computationResultFiltersId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); + assertThat(computationResultFiltersId).isNotNull(); + assertThat(computationResultFiltersRepository.findById(computationResultFiltersId)).isPresent(); } @Test void testGetComputationResultFilters() throws Exception { MvcResult result = mockMvc.perform(post(BASE_URI + "/default")).andReturn(); - UUID rootId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); - mockMvc.perform(post(BASE_URI + "/" + rootId + "/" + "LoadFlow" + "/global-filters") + UUID computationResultFiltersId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); + mockMvc.perform(post(BASE_URI + "/" + computationResultFiltersId + "/" + "LoadFlow" + "/global-filters") .content(mapper.writeValueAsString(createGlobalFilters())) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - mockMvc.perform(put(BASE_URI + "/" + rootId + "/" + "PccMin" + "/" + "pccMinResults" + "/columns") + mockMvc.perform(put(BASE_URI + "/" + computationResultFiltersId + "/" + "PccMin" + "/" + "pccMinResults" + "/columns") .content(mapper.writeValueAsString(createColumnFilter())) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow/loadflowCurrentLimitViolation")).andExpect(status().isOk()).andReturn(); + result = mockMvc.perform(get(BASE_URI + "/" + computationResultFiltersId + "/LoadFlow/loadflowCurrentLimitViolation")).andExpect(status().isOk()).andReturn(); List infosLoadFlowColumn = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); assertThat(infosLoadFlowColumn).isEmpty(); - result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/PccMin/pccMinResults")).andExpect(status().isOk()).andReturn(); + result = mockMvc.perform(get(BASE_URI + "/" + computationResultFiltersId + "/PccMin/pccMinResults")).andExpect(status().isOk()).andReturn(); List infosPccMinColumn = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); assertThat(infosPccMinColumn).hasSize(1); ComputationResultColumnFilterInfos info = infosPccMinColumn.getFirst(); @@ -96,7 +96,7 @@ void testGetComputationResultFilters() throws Exception { assertThat(info.columnFilterInfos().filterType()).isEqualTo("greaterThan"); assertThat(info.columnFilterInfos().filterDataType()).isEqualTo("number"); - result = mockMvc.perform(get(BASE_URI + "/" + rootId + "/LoadFlow")).andExpect(status().isOk()).andReturn(); + result = mockMvc.perform(get(BASE_URI + "/" + computationResultFiltersId + "/LoadFlow")).andExpect(status().isOk()).andReturn(); List globalFilterInfos = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<>() { }); assertThat(globalFilterInfos).hasSize(2); GlobalFilterInfos globalFilterInfo = globalFilterInfos.getFirst(); From 805a0afb3b2d4c9ccef394a846ba95bdaf2343b0 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Thu, 5 Feb 2026 14:46:05 +0100 Subject: [PATCH 18/22] code review remarks --- .../computationresult/ColumnEntity.java | 2 +- .../FilterSubTypeEntity.java | 4 +- .../computationresult/FilterTypeEntity.java | 2 +- .../changesets/changelog_20260128T102437Z.xml | 77 +++++++++++-------- .../server/ComputationResultFiltersTest.java | 2 +- 5 files changed, 51 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java index 2c7440b3..bd6ac108 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/ColumnEntity.java @@ -16,7 +16,7 @@ * @author Rehili Ghazwa */ @Entity -@Table(name = "computation_column") +@Table(name = "computation_column", indexes = @Index(name = "idx_computation_sub_type_filters_id", columnList = "computation_sub_type_filters_id")) @Getter @Setter @NoArgsConstructor diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java index 400f12ff..73b57a2a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterSubTypeEntity.java @@ -20,7 +20,7 @@ @Getter @Setter @Entity -@Table(name = "computation_sub_type_filters") +@Table(name = "computation_sub_type_filters", indexes = @Index(name = "idx_computation_type_computation_sub_type_id", columnList = "computation_type_computation_sub_type_id")) public class FilterSubTypeEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -31,7 +31,7 @@ public class FilterSubTypeEntity { private String computationSubType; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "computation_result_id", foreignKey = @ForeignKey(name = "fk_computation_result_column")) + @JoinColumn(name = "computation_sub_type_filters_id", foreignKey = @ForeignKey(name = "fk_computation_sub_type_filters_id")) @Builder.Default private List columns = new ArrayList<>(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java index a4dd59a0..4dbf2eaa 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java @@ -39,7 +39,7 @@ public class FilterTypeEntity { private List globalFilters = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "computation_sub_type_filters_id", foreignKey = @ForeignKey(name = "fk_computation_sub_type_column_filters")) + @JoinColumn(name = "computation_type_computation_sub_type_id", foreignKey = @ForeignKey(name = "fk_computation_type_computation_sub_type_id")) @Builder.Default private List computationSubTypes = new ArrayList<>(); } diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml index ef966620..f2e4eee5 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -1,6 +1,6 @@ - + @@ -11,7 +11,7 @@ - + @@ -20,17 +20,17 @@ - + - + - + @@ -38,10 +38,10 @@ - + - + @@ -52,51 +52,63 @@ - - - - - - + + - + - + + + + + + + - + - + + + + + + + + + + + - + - + - + - - - - + - - + + + + + - + @@ -108,16 +120,19 @@ splitStatements="true" stripComments="true"/> - + + diff --git a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java index 2dfaceeb..352422ed 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/ComputationResultFiltersTest.java @@ -70,7 +70,7 @@ void testCreateDefaultComputationResultFilters() throws Exception { } @Test - void testGetComputationResultFilters() throws Exception { + void testComputationResultFilters() throws Exception { MvcResult result = mockMvc.perform(post(BASE_URI + "/default")).andReturn(); UUID computationResultFiltersId = mapper.readValue(result.getResponse().getContentAsString(), UUID.class); mockMvc.perform(post(BASE_URI + "/" + computationResultFiltersId + "/" + "LoadFlow" + "/global-filters") From 300546b257b9c3aa63470cfbfbf1117f596e74f1 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 6 Feb 2026 13:33:02 +0100 Subject: [PATCH 19/22] add idx_computation_result_filters_id --- .../computationresult/FilterTypeEntity.java | 2 +- .../changesets/changelog_20260128T102437Z.xml | 42 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java index 4dbf2eaa..9b38eea4 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/computationresult/FilterTypeEntity.java @@ -23,7 +23,7 @@ @Getter @Setter @Entity -@Table(name = "computation_type_filters") +@Table(name = "computation_type_filters", indexes = @Index(name = "idx_computation_result_filters_id", columnList = "computation_result_filters_id")) public class FilterTypeEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) diff --git a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml index f2e4eee5..b662d0be 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260128T102437Z.xml @@ -52,63 +52,67 @@ - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -122,16 +126,16 @@ From 8def8ad7986c1c0758486dbccfdbd89074e5ead7 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 6 Feb 2026 15:06:11 +0100 Subject: [PATCH 20/22] add delete column case --- .../ComputationResultFiltersService.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index d45e8a45..aba35d41 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -8,18 +8,18 @@ import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; -import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; import org.gridsuite.studyconfig.server.dto.ComputationResultColumnFilterInfos; +import org.gridsuite.studyconfig.server.dto.GlobalFilterInfos; import org.gridsuite.studyconfig.server.entities.GlobalFilterEntity; import org.gridsuite.studyconfig.server.entities.computationresult.ColumnEntity; +import org.gridsuite.studyconfig.server.entities.computationresult.FilterSubTypeEntity; import org.gridsuite.studyconfig.server.entities.computationresult.FilterTypeEntity; import org.gridsuite.studyconfig.server.entities.computationresult.FiltersEntity; -import org.gridsuite.studyconfig.server.entities.computationresult.FilterSubTypeEntity; import org.gridsuite.studyconfig.server.mapper.ComputationResultFiltersMapper; import org.gridsuite.studyconfig.server.mapper.SpreadsheetConfigMapper; -import org.gridsuite.studyconfig.server.repositories.computationresult.FiltersRepository; import org.gridsuite.studyconfig.server.repositories.computationresult.FilterSubTypeRepository; import org.gridsuite.studyconfig.server.repositories.computationresult.FilterTypeRepository; +import org.gridsuite.studyconfig.server.repositories.computationresult.FiltersRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -91,8 +91,7 @@ public List getComputingResultGlobalFilters(UUID computationR @Transactional public void setGlobalFiltersForComputationResult(UUID computationResultFiltersId, String computationType, List globalFilters) { - FiltersEntity filtersEntity = filtersRepository.findById(computationResultFiltersId) - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); + FiltersEntity filtersEntity = getFiltersEntity(computationResultFiltersId); FilterTypeEntity typeEntity = filtersEntity.getComputationResultFilter().stream() .filter(type -> computationType.equals(type.getComputationType())) .findFirst() @@ -113,8 +112,7 @@ public void setGlobalFiltersForComputationResult(UUID computationResultFiltersId @Transactional public void updateColumn(UUID computationResultFiltersId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columns) { - FiltersEntity filtersEntity = filtersRepository.findById(computationResultFiltersId) - .orElseThrow(() -> new EntityNotFoundException(COMPUTATION_FILTERS_NOT_FOUND + computationResultFiltersId)); + FiltersEntity filtersEntity = getFiltersEntity(computationResultFiltersId); FilterTypeEntity typeEntity = findOrCreateComputationType(filtersEntity, computationType); if (typeEntity.getUuid() == null) { filterTypeRepository.save(typeEntity); @@ -123,8 +121,20 @@ public void updateColumn(UUID computationResultFiltersId, String computationType .filter(sub -> sub.getComputationSubType().equals(computationSubType)) .findFirst() .orElseGet(() -> createAndAttachSubType(typeEntity, computationSubType)); + + // DELETE case (columnFilter is null) + var filterInfos = columns.columnFilterInfos(); + if (filterInfos.filterValue() == null && filterInfos.filterTolerance() == null && + filterInfos.filterType() == null && filterInfos.filterDataType() == null) { + String columnId = columns.columnId(); + subTypeEntity.getColumns().removeIf(col -> columnId != null && columnId.equals(col.getComputationColumnId())); + filtersRepository.save(filtersEntity); + return; + } + // UPDATE/INSERT case ColumnEntity updatedColumn = toComputationColumnFilterEntity(columns); - subTypeEntity.getColumns().removeIf(col -> col.getComputationColumnId() != null && col.getComputationColumnId().equals(updatedColumn.getComputationColumnId())); + String updatedColumnId = updatedColumn.getComputationColumnId(); + subTypeEntity.getColumns().removeIf(col -> updatedColumnId != null && updatedColumnId.equals(col.getComputationColumnId())); subTypeEntity.getColumns().add(updatedColumn); filtersRepository.save(filtersEntity); } From fa3eced783b91e08a361b6da72042d65466144c2 Mon Sep 17 00:00:00 2001 From: Rehili Ghazwa Date: Fri, 6 Feb 2026 17:31:38 +0100 Subject: [PATCH 21/22] code review remarks --- .../server/service/ComputationResultFiltersService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index aba35d41..a1e725a7 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -124,8 +124,7 @@ public void updateColumn(UUID computationResultFiltersId, String computationType // DELETE case (columnFilter is null) var filterInfos = columns.columnFilterInfos(); - if (filterInfos.filterValue() == null && filterInfos.filterTolerance() == null && - filterInfos.filterType() == null && filterInfos.filterDataType() == null) { + if (filterInfos == null) { String columnId = columns.columnId(); subTypeEntity.getColumns().removeIf(col -> columnId != null && columnId.equals(col.getComputationColumnId())); filtersRepository.save(filtersEntity); From 972b4a50a7feb4f98f33a426e38a49da2c8989b9 Mon Sep 17 00:00:00 2001 From: Etienne Homer Date: Fri, 6 Feb 2026 17:57:42 +0100 Subject: [PATCH 22/22] rename parameter Signed-off-by: Etienne Homer --- .../service/ComputationResultFiltersService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java index a1e725a7..eaf5c84c 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/ComputationResultFiltersService.java @@ -111,7 +111,7 @@ public void setGlobalFiltersForComputationResult(UUID computationResultFiltersId } @Transactional - public void updateColumn(UUID computationResultFiltersId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columns) { + public void updateColumn(UUID computationResultFiltersId, String computationType, String computationSubType, ComputationResultColumnFilterInfos columnFilter) { FiltersEntity filtersEntity = getFiltersEntity(computationResultFiltersId); FilterTypeEntity typeEntity = findOrCreateComputationType(filtersEntity, computationType); if (typeEntity.getUuid() == null) { @@ -123,15 +123,15 @@ public void updateColumn(UUID computationResultFiltersId, String computationType .orElseGet(() -> createAndAttachSubType(typeEntity, computationSubType)); // DELETE case (columnFilter is null) - var filterInfos = columns.columnFilterInfos(); + var filterInfos = columnFilter.columnFilterInfos(); if (filterInfos == null) { - String columnId = columns.columnId(); - subTypeEntity.getColumns().removeIf(col -> columnId != null && columnId.equals(col.getComputationColumnId())); + String columnId = columnFilter.columnId(); + subTypeEntity.getColumns().removeIf(col -> columnId.equals(col.getComputationColumnId())); filtersRepository.save(filtersEntity); return; } // UPDATE/INSERT case - ColumnEntity updatedColumn = toComputationColumnFilterEntity(columns); + ColumnEntity updatedColumn = toComputationColumnFilterEntity(columnFilter); String updatedColumnId = updatedColumn.getComputationColumnId(); subTypeEntity.getColumns().removeIf(col -> updatedColumnId != null && updatedColumnId.equals(col.getComputationColumnId())); subTypeEntity.getColumns().add(updatedColumn);