diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index f4870290d..12f264057 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -207,10 +207,20 @@ public ResponseEntity> getLineTypes() { } @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Get a line types catalog") + @Operation(summary = "Get a line type from the catalog with area and temperature but no limits") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) + public ResponseEntity getOneLineTypeWithAreaAndTemperature(@PathVariable("uuid") UUID uuid) { + return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithAreaTemperatureShapeFactors(uuid)); + } + + @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}/with-limits", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get a line type from the catalog with the limits associated with requested area, temperature and shape factor") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) - public ResponseEntity getOneLineTypeWithLimits(@PathVariable("uuid") UUID uuid) { - return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithLimits(uuid)); + public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID uuid, @RequestParam String area, + @RequestParam(required = false) String temperature, + @RequestParam(required = false) String shapeFactor) { + LineTypeInfos test = lineTypesCatalogService.getLineTypesWithLimits(uuid, area, temperature, shapeFactor); + return ResponseEntity.ok().body(test); } @PostMapping(value = "/network-modifications/catalog/line_types", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) diff --git a/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java b/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java index 4b40ec6ee..202a8994f 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java @@ -14,6 +14,7 @@ import lombok.Setter; import lombok.experimental.SuperBuilder; +import java.util.List; import java.util.UUID; /** @@ -36,14 +37,8 @@ public class LimitsForLineTypeInfos { @Schema(description = "Permanent limit") private Double permanentLimit; - @Schema(description = "Temporary limit value") - private Double temporaryLimitValue; - - @Schema(description = "Temporary limit acceptable duration") - private Integer temporaryLimitAcceptableDuration; - - @Schema(description = "Temporary limit name") - private String temporaryLimitName; + @Schema(description = "temporary limits list") + List temporaryLimits; @Schema(description = "Area") private String area; diff --git a/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java b/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java new file mode 100644 index 000000000..9aed4b4f7 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2026, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package org.gridsuite.modification.server.dto.catalog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.gridsuite.modification.server.entities.catalog.TemporaryLimitEntity; + +import java.util.UUID; + +/** + * @author Etienne Lesot + */ +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Schema(description = "Temporary limit infos") +public class TemporaryLimitInfos { + @Schema(description = "id") + private UUID id; + + @Schema(description = "Temporary limit value") + private Double limitValue; + + @Schema(description = "Temporary limit acceptable duration") + private Integer acceptableDuration; + + @Schema(description = "Temporary limit name") + private String name; + + public TemporaryLimitEntity toTemporaryLimitEntity() { + return TemporaryLimitEntity.builder() + .limitValue(limitValue) + .acceptableDuration(acceptableDuration) + .name(name).build(); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java index 290aef162..b000e35a1 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java @@ -9,6 +9,7 @@ import jakarta.persistence.*; import lombok.NoArgsConstructor; import org.gridsuite.modification.server.dto.catalog.AerialLineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; /** * @author Sylvain Bouzols @@ -60,10 +61,20 @@ public AerialLineTypeInfos toDto() { } @Override - public AerialLineTypeInfos toDtoWithLimits() { + public AerialLineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { return toDtoBuilder() - .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) - .build(); + .limitsForLineType(this.getLimitsForLineType().stream() + .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area) && + limitsForLineTypeEntity.getTemperature().equals(temperature)) + .map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) + .build(); + } + + @Override + public LineTypeInfos toDtoWithAreaTemperatureShapeFactors() { + return toDtoBuilder() + .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) + .build(); } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java index 28d2ee887..e8cf63dba 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java @@ -11,15 +11,19 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.TemporaryLimitInfos; +import java.util.List; import java.util.UUID; /** * @author Etienne Lesot */ @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @SuperBuilder @@ -38,14 +42,9 @@ public class LimitsForLineTypeEntity { @Column private Double permanentLimit; - @Column - private Double temporaryLimitValue; - - @Column - private Integer temporaryLimitAcceptableDuration; - - @Column - private String temporaryLimitName; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "temporary_limit_id", nullable = false) + private List temporaryLimits; @Column private String area; @@ -53,14 +52,20 @@ public class LimitsForLineTypeEntity { @Column private String temperature; + public LimitsForLineTypeInfos toLineTypeInfosWithoutLimits() { + return LimitsForLineTypeInfos.builder() + .id(id) + .area(area) + .temperature(temperature) + .build(); + } + public LimitsForLineTypeInfos toLineTypeInfos() { return LimitsForLineTypeInfos.builder() .id(id) .limitSetName(limitSetName) .permanentLimit(permanentLimit) - .temporaryLimitValue(temporaryLimitValue) - .temporaryLimitAcceptableDuration(temporaryLimitAcceptableDuration) - .temporaryLimitName(temporaryLimitName) + .temporaryLimits(temporaryLimits.stream().map(TemporaryLimitEntity::toTemporaryLimitInfos).toList()) .area(area) .temperature(temperature) .build(); @@ -70,9 +75,7 @@ public LimitsForLineTypeEntity(LimitsForLineTypeInfos limitsForLineTypeInfos) { this(limitsForLineTypeInfos.getId(), limitsForLineTypeInfos.getLimitSetName(), limitsForLineTypeInfos.getPermanentLimit(), - limitsForLineTypeInfos.getTemporaryLimitValue(), - limitsForLineTypeInfos.getTemporaryLimitAcceptableDuration(), - limitsForLineTypeInfos.getTemporaryLimitName(), + limitsForLineTypeInfos.getTemporaryLimits() != null ? limitsForLineTypeInfos.getTemporaryLimits().stream().map(TemporaryLimitInfos::toTemporaryLimitEntity).toList() : null, limitsForLineTypeInfos.getArea(), limitsForLineTypeInfos.getTemperature()); } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java index 5790017ca..edfec59c3 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java @@ -88,10 +88,14 @@ public LineTypeInfos toDto() { return toBuilder().build(); } - public LineTypeInfos toDtoWithLimits() { + public LineTypeInfos toDtoWithAreaTemperatureShapeFactors() { return toBuilder() - .limitsForLineType(this.limitsForLineType.stream().map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) - .build(); + .limitsForLineType(this.limitsForLineType.parallelStream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) + .build(); + } + + public LineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { + throw new UnsupportedOperationException("Not implemented, only implemented for subClasses AerialLineTypeEntity and UndergroundLineTypeEntity"); } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java new file mode 100644 index 000000000..bc4940b96 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2026, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package org.gridsuite.modification.server.entities.catalog; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.gridsuite.modification.server.dto.catalog.TemporaryLimitInfos; + +import java.util.UUID; + +/** + * @author Etienne Lesot + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@Entity +@Table(name = "temporary_limit_for_line_catalog") +public class TemporaryLimitEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private UUID id; + + @Column + private Double limitValue; + + @Column + private Integer acceptableDuration; + + @Column + private String name; + + public TemporaryLimitInfos toTemporaryLimitInfos() { + return TemporaryLimitInfos.builder() + .id(id) + .limitValue(limitValue) + .acceptableDuration(acceptableDuration) + .name(name) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java index 7745beafa..fec5b7640 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java @@ -8,8 +8,11 @@ import jakarta.persistence.*; import lombok.NoArgsConstructor; +import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.dto.catalog.UndergroundLineTypeInfos; +import java.util.ArrayList; import java.util.List; /** @@ -59,12 +62,29 @@ public UndergroundLineTypeInfos toDto() { } @Override - public UndergroundLineTypeInfos toDtoWithLimits() { + public UndergroundLineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { + double shapeFactorValue = shapeFactor == null ? 1 : Double.parseDouble(shapeFactor); + List filterAndAdaptedLimits = new ArrayList<>(); + for (LimitsForLineTypeEntity limitsForLineTypeEntity : this.getLimitsForLineType()) { + if (limitsForLineTypeEntity.getArea().equals(area)) { + limitsForLineTypeEntity.setPermanentLimit(shapeFactorValue * limitsForLineTypeEntity.getPermanentLimit()); + limitsForLineTypeEntity.getTemporaryLimits().forEach(temporaryLimit -> + temporaryLimit.setLimitValue(shapeFactorValue * temporaryLimit.getLimitValue())); + filterAndAdaptedLimits.add(limitsForLineTypeEntity.toLineTypeInfos()); + } + } return toDtoBuilder() - .shapeFactors(SHAPE_FACTORS) - .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) + .limitsForLineType(filterAndAdaptedLimits) .build(); } + + @Override + public LineTypeInfos toDtoWithAreaTemperatureShapeFactors() { + return toDtoBuilder() + .shapeFactors(SHAPE_FACTORS) + .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) + .build(); + } } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java index cef4c43cf..b90e51073 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java @@ -8,7 +8,10 @@ import org.gridsuite.modification.server.entities.catalog.LineTypeEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.util.UUID; @@ -17,4 +20,14 @@ */ @Repository public interface LineTypesCatalogRepository extends JpaRepository { + + @Transactional + @Modifying + @Query(value = """ + TRUNCATE TABLE line_types_catalog, + aerial_line_types_catalog, + underground_line_types_catalog + RESTART IDENTITY CASCADE + """, nativeQuery = true) + void truncateCatalogFast(); } diff --git a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java index d68b8b885..875fc2936 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java @@ -11,6 +11,8 @@ import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.entities.catalog.LineTypeEntity; import org.gridsuite.modification.server.repositories.LineTypesCatalogRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -32,6 +34,8 @@ public class LineTypesCatalogService { private final LineTypesCatalogRepository lineTypesCatalogRepository; private final ObjectMapper mapper; + private static final Logger LOGGER = LoggerFactory.getLogger(LineTypesCatalogService.class); + public LineTypesCatalogService(LineTypesCatalogRepository lineTypesCatalogRepository, ObjectMapper objectMapper) { this.lineTypesCatalogRepository = lineTypesCatalogRepository; this.mapper = objectMapper; @@ -45,18 +49,26 @@ public List getAllLineTypes() { } @Transactional(readOnly = true) - public LineTypeInfos getLineTypesWithLimits(UUID id) { + public LineTypeInfos getLineTypesWithLimits(UUID id, String area, String temperature, String shapeFactor) { + Optional lineTypeEntity = lineTypesCatalogRepository.findById(id); + return lineTypeEntity.map((LineTypeEntity lineType) -> lineType.toDtoWithLimits(area, temperature, shapeFactor)).orElse(null); + } + + @Transactional(readOnly = true) + public LineTypeInfos getLineTypesWithAreaTemperatureShapeFactors(UUID id) { Optional lineTypeEntity = lineTypesCatalogRepository.findById(id); - return lineTypeEntity.map(LineTypeEntity::toDtoWithLimits).orElse(null); + return lineTypeEntity.map(LineTypeEntity::toDtoWithAreaTemperatureShapeFactors).orElse(null); } public void deleteLineTypesCatalog() { - lineTypesCatalogRepository.deleteAll(); + LOGGER.info("Starting to delete all line types from the catalog"); + lineTypesCatalogRepository.truncateCatalogFast(); + LOGGER.info("All line types from the catalog deleted"); } public void resetLineTypes(MultipartFile file) { try (GZIPInputStream gzipInputStream = new GZIPInputStream(file.getInputStream())) { - List lineTypes = mapper.readValue(gzipInputStream, new TypeReference<>() { + List lineTypes = mapper.readValue(gzipInputStream, new TypeReference>() { }); deleteLineTypesCatalog(); // remove duplicates in file @@ -65,7 +77,9 @@ public void resetLineTypes(MultipartFile file) { List lineTypesEntities = lineTypesSet.stream() .map(LineTypeInfos::toEntity) .collect(Collectors.toList()); + LOGGER.info("Starting to save {} line types in the catalog", lineTypesEntities.size()); lineTypesCatalogRepository.saveAll(lineTypesEntities); + LOGGER.info("all line types saved in the catalog"); } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/src/main/resources/config/application.yaml b/src/main/resources/config/application.yaml index 2edfd845d..5bd6027e6 100644 --- a/src/main/resources/config/application.yaml +++ b/src/main/resources/config/application.yaml @@ -14,7 +14,7 @@ spring: order_inserts: true order_updates: true jdbc: - batch_size: 128 + batch_size: 512 cloud: function: diff --git a/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml new file mode 100644 index 000000000..ce7a2dcb4 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index e6ba17e34..88e788d19 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -456,3 +456,7 @@ databaseChangeLog: - include: file: changesets/changelog_20260206T132143Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20260211T143540Z.xml + relativeToChangelogFile: true + diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 5a4935dce..23abf8162 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -28,7 +28,9 @@ import org.gridsuite.modification.server.dto.ModificationsSearchResult; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; +import org.gridsuite.modification.server.dto.catalog.AerialLineTypeInfos; import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.UndergroundLineTypeInfos; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosRepository; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; import org.gridsuite.modification.server.elasticsearch.TombstonedEquipmentInfosRepository; @@ -1572,7 +1574,7 @@ void testGetLineTypesCatalog() throws Exception { } @Test - void testGetLineTypeWithLimitsCatalog() throws Exception { + void testGetLineTypeWithoutLimitsCatalog() throws Exception { MvcResult mvcResult; String resultAsString; @@ -1600,6 +1602,8 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { // getting the whole catalog does not load the limits assertNull(lineTypes.get(0).getLimitsForLineType()); assertNull(lineTypes.get(1).getLimitsForLineType()); + + // get one line of the catalog does not load limits too mvcResult = mockMvc .perform(get(URI_LINE_CATALOG + "/" + lineTypes.get(0).getId()).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -1607,13 +1611,67 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { resultAsString = mvcResult.getResponse().getContentAsString(); LineTypeInfos selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); assertEquals(2, selectedLineType.getLimitsForLineType().size()); + assertNull(selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); + assertNull(selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); + assertNull(selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits()); + assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); + assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); + mockMvc.perform(delete(URI_LINE_CATALOG)) + .andExpect(status().isOk()); + } + + @Test + void testGetLineTypeWithLimitsCatalog() throws Exception { + // Create the catalog with some line types + mockMvc.perform(multipart(URI_LINE_CATALOG) + .file(createMockMultipartFile(LINE_TYPES_CATALOG_JSON_FILE_3))) + .andExpect(status().isOk()); + + MvcResult mvcResult = mockMvc + .perform(get(URI_LINE_CATALOG).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + String resultAsString = mvcResult.getResponse().getContentAsString(); + List lineTypes = mapper.readValue(resultAsString, new TypeReference<>() { }); + assertEquals(2, lineTypes.size()); + UUID aerialLineId = lineTypes.get(0) instanceof AerialLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); + UUID underGroundLineId = lineTypes.get(0) instanceof UndergroundLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); + + // get one aerial line with limits + mvcResult = mockMvc + .perform(get(URI_LINE_CATALOG + "/" + aerialLineId + "/with-limits?area=1&temperature=37").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + resultAsString = mvcResult.getResponse().getContentAsString(); + LineTypeInfos selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); + + assertEquals(1, selectedLineType.getLimitsForLineType().size()); assertEquals("LimitSet1", selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); assertEquals(10.0, selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); - assertEquals(20.0, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimitValue()); - assertEquals("TemporaryLimit1", selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimitName()); - assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimitAcceptableDuration()); + assertEquals(20.0, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getLimitValue()); + assertEquals("TemporaryLimit1", selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getName()); + assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getAcceptableDuration()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); + + // get one underground line with limits + mvcResult = mockMvc + .perform(get(URI_LINE_CATALOG + "/" + underGroundLineId + "/with-limits?area=1&shapeFactor=0.9").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + resultAsString = mvcResult.getResponse().getContentAsString(); + selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); + assertEquals(1, selectedLineType.getLimitsForLineType().size()); + assertEquals("LimitSet1", selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); + assertEquals(9.0, selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); + assertEquals(18.0, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getLimitValue()); + assertEquals("TemporaryLimit1", selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getName()); + assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getAcceptableDuration()); + assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); + assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); + + mockMvc.perform(delete(URI_LINE_CATALOG)) + .andExpect(status().isOk()); } private MockMultipartFile createMockMultipartFile(String fileName) throws IOException { diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java index 3c4a94f49..4726c32a6 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java @@ -184,7 +184,7 @@ void testSqlRequestsCountOnPostGroups2() throws Exception { reset(); ApiUtils.postGroups(mockMvc, getGroupId(), targetGroupUuid); - TestUtils.assertRequestsCount(20, 10, 2, 0); // (95, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points + TestUtils.assertRequestsCount(20, 9, 2, 0); // (95, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points assertTabularModificationsEquals(modifications, targetGroupUuid); } @@ -237,7 +237,7 @@ void testSqlRequestsCountOnPutGroupsDuplications2() throws Exception { reset(); ApiUtils.putGroupsDuplications(mockMvc, getGroupId(), targetGroupUuid, getNetworkId()); - TestUtils.assertRequestsCount(20, 10, 2, 0); // (107, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points + TestUtils.assertRequestsCount(20, 9, 2, 0); // (107, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points assertTabularModificationsEquals(modifications, targetGroupUuid); } @@ -289,7 +289,7 @@ void testSqlRequestsCountOnPutGroupsWithCopy2() throws Exception { reset(); ApiUtils.putGroupsWithCopy(mockMvc, targetGroupUuid, modifications.stream().map(Pair::getLeft).toList(), getNetworkId()); - TestUtils.assertRequestsCount(19, 10, 2, 0); // (26, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points + TestUtils.assertRequestsCount(19, 9, 2, 0); // (26, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points assertTabularModificationsEquals(modifications, targetGroupUuid); } @@ -337,7 +337,7 @@ void testSqlRequestsCountOnPostNetworkModificationsDuplicate2() throws Exception reset(); Map idsMapping = ApiUtils.postNetworkModificationsDuplicate(mockMvc, modifications.stream().map(Pair::getLeft).toList()); - TestUtils.assertRequestsCount(17, 9, 2, 0); // (93, 9, 1, 0) before improvements, why one additional insert ? Maybe insertion batch size limit but not sure + TestUtils.assertRequestsCount(17, 8, 2, 0); // (93, 9, 1, 0) before improvements, why one additional insert ? Maybe insertion batch size limit but not sure assertTabularModificationsEquals(modifications, idsMapping); } diff --git a/src/test/resources/line_types_catalog_3.json.gz b/src/test/resources/line_types_catalog_3.json.gz index add23bba9..ea2bb3262 100644 Binary files a/src/test/resources/line_types_catalog_3.json.gz and b/src/test/resources/line_types_catalog_3.json.gz differ