Skip to content

Commit 5f879cc

Browse files
authored
Allow additional properties columns in tabular modifications (#663)
Signed-off-by: David BRAQUART <[email protected]>
1 parent 353cf5b commit 5f879cc

20 files changed

+604
-29
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
Copyright (c) 2021, RTE (http://www.rte-france.com)
3+
This Source Code Form is subject to the terms of the Mozilla Public
4+
License, v. 2.0. If a copy of the MPL was not distributed with this
5+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.modification.server.entities;
8+
9+
import jakarta.persistence.CascadeType;
10+
import jakarta.persistence.FetchType;
11+
import jakarta.persistence.JoinColumn;
12+
import jakarta.persistence.MappedSuperclass;
13+
import jakarta.persistence.OneToMany;
14+
import jakarta.persistence.OrderColumn;
15+
import lombok.Getter;
16+
import lombok.NoArgsConstructor;
17+
import org.gridsuite.modification.dto.ModificationInfos;
18+
import org.gridsuite.modification.dto.TabularBaseInfos;
19+
20+
import java.util.List;
21+
22+
/**
23+
* @author Franck Lecuyer <franck.lecuyer at rte-france.com>
24+
*/
25+
@NoArgsConstructor
26+
@Getter
27+
@MappedSuperclass
28+
public class TabularBaseEntity extends ModificationEntity {
29+
30+
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
31+
@JoinColumn(name = "tabular_modification_id")
32+
@OrderColumn(name = "insert_position")
33+
private List<TabularPropertyEntity> properties;
34+
35+
protected TabularBaseEntity(TabularBaseInfos tabularBaseInfos) {
36+
super(tabularBaseInfos);
37+
assignAttributes(tabularBaseInfos);
38+
}
39+
40+
@Override
41+
public void update(ModificationInfos modificationInfos) {
42+
super.update(modificationInfos);
43+
assignAttributes((TabularBaseInfos) modificationInfos);
44+
}
45+
46+
private void assignAttributes(TabularBaseInfos tabularBaseInfos) {
47+
List<TabularPropertyEntity> newProperties = tabularBaseInfos.getProperties() == null ? null :
48+
tabularBaseInfos.getProperties().stream()
49+
.map(TabularPropertyEntity::new)
50+
.toList();
51+
if (this.properties != null) {
52+
this.properties.clear();
53+
if (newProperties != null) {
54+
this.properties.addAll(newProperties);
55+
}
56+
} else {
57+
this.properties = newProperties;
58+
}
59+
}
60+
}

src/main/java/org/gridsuite/modification/server/entities/TabularCreationEntity.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.gridsuite.modification.ModificationType;
2222
import org.gridsuite.modification.dto.ModificationInfos;
2323
import org.gridsuite.modification.dto.TabularCreationInfos;
24+
import org.springframework.util.CollectionUtils;
2425

2526
import java.util.List;
2627
import java.util.stream.Collectors;
@@ -33,7 +34,7 @@
3334
@Setter
3435
@Entity
3536
@Table(name = "tabular_creation")
36-
public class TabularCreationEntity extends ModificationEntity {
37+
public class TabularCreationEntity extends TabularBaseEntity {
3738

3839
@Column(name = "creationType")
3940
@Enumerated(EnumType.STRING)
@@ -58,6 +59,9 @@ public TabularCreationInfos toModificationInfos() {
5859
.activated(getActivated())
5960
.creationType(creationType)
6061
.creations(creationsInfos)
62+
.properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream()
63+
.map(TabularPropertyEntity::toInfos)
64+
.toList())
6165
.build();
6266
}
6367

src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.gridsuite.modification.ModificationType;
1919
import org.gridsuite.modification.dto.*;
20+
import org.springframework.util.CollectionUtils;
2021

2122
/**
2223
* @author Etienne Homer <etienne.homer at rte-france.com>
@@ -26,7 +27,7 @@
2627
@Setter
2728
@Entity
2829
@Table(name = "tabular_modification")
29-
public class TabularModificationEntity extends ModificationEntity {
30+
public class TabularModificationEntity extends TabularBaseEntity {
3031

3132
@Column(name = "modificationType")
3233
@Enumerated(EnumType.STRING)
@@ -56,6 +57,9 @@ public TabularModificationInfos toModificationInfos() {
5657
.activated(getActivated())
5758
.modificationType(modificationType)
5859
.modifications(modificationsInfos)
60+
.properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream()
61+
.map(TabularPropertyEntity::toInfos)
62+
.toList())
5963
.build();
6064
}
6165

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
package org.gridsuite.modification.server.entities;
9+
10+
import jakarta.persistence.Column;
11+
import jakarta.persistence.Entity;
12+
import jakarta.persistence.GeneratedValue;
13+
import jakarta.persistence.GenerationType;
14+
import jakarta.persistence.Id;
15+
import jakarta.persistence.Index;
16+
import jakarta.persistence.Table;
17+
import lombok.AllArgsConstructor;
18+
import lombok.Getter;
19+
import lombok.NoArgsConstructor;
20+
import lombok.experimental.SuperBuilder;
21+
import org.gridsuite.modification.dto.TabularPropertyInfos;
22+
23+
import java.util.UUID;
24+
25+
/**
26+
* @author David Braquart <david.braquart_externe at rte-france.com>
27+
*/
28+
@Getter
29+
@NoArgsConstructor
30+
@AllArgsConstructor
31+
@SuperBuilder
32+
@Entity
33+
@Table(name = "tabular_property", indexes = @Index(name = "tabular_modification_idx", columnList = "tabular_modification_id"))
34+
public class TabularPropertyEntity {
35+
@Id
36+
@GeneratedValue(strategy = GenerationType.AUTO)
37+
@Column(name = "id")
38+
private UUID id;
39+
40+
@Column(name = "name", nullable = false)
41+
private String name;
42+
43+
@Column(name = "predefined")
44+
private boolean predefined;
45+
46+
@Column(name = "selected")
47+
private boolean selected = false;
48+
49+
public TabularPropertyInfos toInfos() {
50+
return TabularPropertyInfos.builder()
51+
.name(name)
52+
.predefined(predefined)
53+
.selected(selected)
54+
.build();
55+
}
56+
57+
public TabularPropertyEntity(TabularPropertyInfos propertyInfos) {
58+
this(null, propertyInfos.getName(), propertyInfos.isPredefined(), propertyInfos.isSelected());
59+
}
60+
}

src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.gridsuite.modification.server.entities.equipment.modification.GeneratorModificationEntity;
1818
import org.springframework.stereotype.Repository;
1919
import org.springframework.transaction.annotation.Transactional;
20+
import org.springframework.util.CollectionUtils;
2021

2122
import java.util.*;
2223
import java.util.function.Function;
@@ -41,6 +42,8 @@ public class NetworkModificationRepository {
4142

4243
private final GeneratorCreationRepository generatorCreationRepository;
4344

45+
private final TabularPropertyRepository tabularPropertyRepository;
46+
4447
private final ModificationApplicationInfosService modificationApplicationInfosService;
4548

4649
private static final String MODIFICATION_NOT_FOUND_MESSAGE = "Modification (%s) not found";
@@ -49,11 +52,13 @@ public NetworkModificationRepository(ModificationGroupRepository modificationGro
4952
ModificationRepository modificationRepository,
5053
GeneratorModificationRepository generatorModificationRepository,
5154
GeneratorCreationRepository generatorCreationRepository,
55+
TabularPropertyRepository tabularPropertyRepository,
5256
ModificationApplicationInfosService modificationApplicationInfosService) {
5357
this.modificationGroupRepository = modificationGroupRepository;
5458
this.modificationRepository = modificationRepository;
5559
this.generatorModificationRepository = generatorModificationRepository;
5660
this.generatorCreationRepository = generatorCreationRepository;
61+
this.tabularPropertyRepository = tabularPropertyRepository;
5762
this.modificationApplicationInfosService = modificationApplicationInfosService;
5863
}
5964

@@ -284,6 +289,9 @@ public TabularModificationInfos loadTabularModificationSubEntities(ModificationE
284289
.stashed(tabularModificationEntity.getStashed())
285290
.activated(tabularModificationEntity.getActivated())
286291
.modificationType(tabularModificationEntity.getModificationType())
292+
.properties(CollectionUtils.isEmpty(tabularModificationEntity.getProperties()) ? null : tabularModificationEntity.getProperties().stream()
293+
.map(TabularPropertyEntity::toInfos)
294+
.toList())
287295
.modifications(orderedGeneratorModifications.stream().map(GeneratorModificationEntity::toModificationInfos).map(m -> (ModificationInfos) m).toList())
288296
.build();
289297
default:
@@ -315,6 +323,9 @@ public TabularCreationInfos loadTabularCreationSubEntities(ModificationEntity mo
315323
.activated(tabularCreationEntity.getActivated())
316324
.creationType(tabularCreationEntity.getCreationType())
317325
.creations(orderedGeneratorCreation.stream().map(GeneratorCreationEntity::toModificationInfos).map(m -> (ModificationInfos) m).toList())
326+
.properties(CollectionUtils.isEmpty(tabularCreationEntity.getProperties()) ? null : tabularCreationEntity.getProperties().stream()
327+
.map(TabularPropertyEntity::toInfos)
328+
.toList())
318329
.build();
319330
default:
320331
break;
@@ -577,6 +588,7 @@ private void deleteTabularModification(TabularModificationEntity tabularModifica
577588
List<UUID> subModificationsIds = modificationRepository.findSubModificationIdsByTabularModificationId(tabularModificationEntity.getId());
578589
modificationToCleanUuids.addAll(subModificationsIds);
579590
modificationApplicationInfosService.deleteAllByModificationIds(modificationToCleanUuids);
591+
tabularPropertyRepository.deleteTabularProperties(tabularModificationEntity.getId());
580592
generatorModificationRepository.deleteTabularModification(subModificationsIds, tabularModificationEntity.getId());
581593
break;
582594
default:
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
package org.gridsuite.modification.server.repositories;
9+
10+
import org.gridsuite.modification.server.entities.TabularPropertyEntity;
11+
import org.springframework.data.jpa.repository.JpaRepository;
12+
import org.springframework.data.jpa.repository.Modifying;
13+
import org.springframework.data.jpa.repository.Query;
14+
15+
import java.util.UUID;
16+
17+
/**
18+
* @author David Braquart <david.braquart_externe at rte-france.com>
19+
*/
20+
21+
public interface TabularPropertyRepository extends JpaRepository<TabularPropertyEntity, UUID> {
22+
@Modifying
23+
@Query(value = "BEGIN;" +
24+
"DELETE FROM tabular_property tp WHERE tp.tabular_modification_id = ?1 ;" +
25+
"COMMIT;", nativeQuery = true)
26+
void deleteTabularProperties(UUID tabularModificationId);
27+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
2+
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
3+
<changeSet author="braquartdav (generated)" id="1753191875093-31">
4+
<createTable tableName="tabular_property">
5+
<column name="id" type="UUID">
6+
<constraints nullable="false" primaryKey="true" primaryKeyName="tabular_propertyPK"/>
7+
</column>
8+
<column name="name" type="VARCHAR(255)">
9+
<constraints nullable="false"/>
10+
</column>
11+
<column name="predefined" type="BOOLEAN"/>
12+
<column name="selected" type="BOOLEAN"/>
13+
<column name="tabular_modification_id" type="UUID"/>
14+
<column name="insert_position" type="INT"/>
15+
</createTable>
16+
</changeSet>
17+
<changeSet author="braquartdav (generated)" id="1753191875093-43">
18+
<createIndex indexName="tabular_modification_idx" tableName="tabular_property">
19+
<column name="tabular_modification_id"/>
20+
</createIndex>
21+
</changeSet>
22+
<changeSet author="braquartdav (generated)" id="1753191875093-44">
23+
<addForeignKeyConstraint baseColumnNames="tabular_modification_id" baseTableName="tabular_property" constraintName="FK1t4r9etm29snityophivgnkce" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="modification" validate="true"/>
24+
</changeSet>
25+
</databaseChangeLog>

src/main/resources/db/changelog/db.changelog-master.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,6 @@ databaseChangeLog:
381381
- include:
382382
file: changesets/changelog_20250723T155748Z.xml
383383
relativeToChangelogFile: true
384+
- include:
385+
file: changesets/changelog_20250722T134355Z.xml
386+
relativeToChangelogFile: true

0 commit comments

Comments
 (0)