Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

refactor tabular modification #412

Merged
merged 9 commits into from
Jan 10, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
*/
package org.gridsuite.modification.server.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.powsybl.commons.reporter.Reporter;
import com.powsybl.commons.reporter.ReporterModel;
import com.powsybl.iidm.network.IdentifiableType;
import lombok.*;
import org.gridsuite.modification.server.ModificationType;
import org.gridsuite.modification.server.dto.annotation.ModificationErrorTypeName;
Expand All @@ -35,11 +37,15 @@
@JsonTypeName("TABULAR_MODIFICATION")
@ModificationErrorTypeName("TABULAR_MODIFICATION_ERROR")
public class TabularModificationInfos extends ModificationInfos {
@Schema(description = "Modification type")

public static final String TABULAR_EQUIPMENT_TYPE = "tabularEquipmentType";

@Schema(description = "equipment type")
@NonNull
private String modificationType;
private IdentifiableType equipmentType;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's not enough. We can have here types like GENERATOR_MODIFICATION, GENERATOR_CREATION or EQUIPMENT_DELETION

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using ModificationType enum would be more appropriate

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No ModificationType represente all modification types of network
We need only injection modificatio/creation/deletion

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

operationType { MODIFICATION, CREATION, DELETION } ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You want to use 2 fields : IdentifiableType equipmentType + OperationType operationType ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Last decision: we use ModificationType enum. No data migration. Same Front-end.


@Schema(description = "modifications")
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<ModificationInfos> modifications;

@Override
Expand All @@ -60,7 +66,7 @@ public Reporter createSubReporter(ReporterModel reporter) {
@Override
public Map<String, String> getMapMessageValues() {
Map<String, String> mapMessageValues = new HashMap<>();
mapMessageValues.put("tabularModificationType", getModificationType());
mapMessageValues.put(TABULAR_EQUIPMENT_TYPE, getEquipmentType().name());
return mapMessageValues;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.gridsuite.modification.server.entities;

import com.powsybl.iidm.network.IdentifiableType;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -16,7 +17,6 @@
import java.util.stream.Collectors;

import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.entities.equipment.modification.*;

/**
* @author Etienne Homer <etienne.homer at rte-france.com>
Expand All @@ -28,41 +28,17 @@
@Table(name = "tabular_modification")
public class TabularModificationEntity extends ModificationEntity {

@Column(name = "modificationType")
private String modificationType;
@Column(name = "equipmentType")
@Enumerated(EnumType.STRING)
private IdentifiableType equipmentType;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@OrderColumn
private List<ModificationEntity> modifications;

public TabularModificationEntity(TabularModificationInfos tabularModificationInfos) {
public TabularModificationEntity(@NonNull TabularModificationInfos tabularModificationInfos) {
super(tabularModificationInfos);
modificationType = tabularModificationInfos.getModificationType();
switch (modificationType) {
case "GENERATOR_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(generatorModificationInfos -> new GeneratorModificationEntity((GeneratorModificationInfos) generatorModificationInfos)).collect(Collectors.toList());
break;
case "LOAD_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList());
break;
case "TWO_WINDINGS_TRANSFORMER_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(twtModificationInfos -> new TwoWindingsTransformerModificationEntity((TwoWindingsTransformerModificationInfos) twtModificationInfos)).collect(Collectors.toList());
break;
case "BATTERY_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(batteryModificationInfos -> new BatteryModificationEntity((BatteryModificationInfos) batteryModificationInfos)).collect(Collectors.toList());
break;
case "VOLTAGE_LEVEL_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(voltageLevelModificationInfos -> new VoltageLevelModificationEntity((VoltageLevelModificationInfos) voltageLevelModificationInfos)).collect(Collectors.toList());
break;
case "LINE_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(lineModificationInfos -> new LineModificationEntity((LineModificationInfos) lineModificationInfos)).collect(Collectors.toList());
break;
case "SUBSTATION_MODIFICATION":
modifications = tabularModificationInfos.getModifications().stream().map(subStationModificationInfos -> new SubstationModificationEntity((SubstationModificationInfos) subStationModificationInfos)).collect(Collectors.toList());
break;
default:
break;
}
assignAttributes(tabularModificationInfos);
}

@Override
Expand All @@ -72,42 +48,24 @@ public TabularModificationInfos toModificationInfos() {
.date(getDate())
.uuid(getId())
.stashed(getStashed())
.modificationType(modificationType)
.equipmentType(equipmentType)
.modifications(modificationsInfos)
.build();
}

@Override
public void update(@NonNull ModificationInfos modificationInfos) {
super.update(modificationInfos);
TabularModificationInfos tabularModificationInfos = (TabularModificationInfos) modificationInfos;
modificationType = tabularModificationInfos.getModificationType();
modifications.clear();
switch (modificationType) {
case "GENERATOR_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(generatorModificationInfos -> new GeneratorModificationEntity((GeneratorModificationInfos) generatorModificationInfos)).collect(Collectors.toList()));
break;
case "BATTERY_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(batteryModificationInfos -> new BatteryModificationEntity((BatteryModificationInfos) batteryModificationInfos)).collect(Collectors.toList()));
break;
case "LOAD_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList()));
break;
case "TWO_WINDINGS_TRANSFORMER_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(twtModificationInfos -> new TwoWindingsTransformerModificationEntity((TwoWindingsTransformerModificationInfos) twtModificationInfos)).collect(Collectors.toList()));
break;
case "VOLTAGE_LEVEL_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(voltageLevelModificationInfos -> new VoltageLevelModificationEntity((VoltageLevelModificationInfos) voltageLevelModificationInfos)).collect(Collectors.toList()));
break;
case "LINE_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(lineModificationInfos -> new LineModificationEntity((LineModificationInfos) lineModificationInfos)).collect(Collectors.toList()));
break;
case "SUBSTATION_MODIFICATION":
modifications.addAll(tabularModificationInfos.getModifications().stream().map(subStationModificationInfos -> new SubstationModificationEntity((SubstationModificationInfos) subStationModificationInfos)).toList());
break;
default:
break;
}
assignAttributes((TabularModificationInfos) modificationInfos);
}

private void assignAttributes(TabularModificationInfos tabularModificationInfos) {
equipmentType = tabularModificationInfos.getEquipmentType();
if (modifications == null) {
modifications = tabularModificationInfos.getModifications().stream().map(ModificationInfos::toEntity).toList();
} else {
modifications.clear();
modifications.addAll(tabularModificationInfos.getModifications().stream().map(ModificationInfos::toEntity).toList());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,26 +61,26 @@ public void apply(Network network, Reporter subReporter) {
}
});
String defaultMessage = " have been modified";
switch (modificationInfos.getModificationType()) {
case "GENERATOR_MODIFICATION":
switch (modificationInfos.getEquipmentType()) {
case GENERATOR:
defaultMessage = "generators" + defaultMessage;
break;
case "LOAD_MODIFICATION":
case LOAD:
defaultMessage = "loads" + defaultMessage;
break;
case "TWO_WINDINGS_TRANSFORMER_MODIFICATION":
case TWO_WINDINGS_TRANSFORMER:
defaultMessage = "two windings transformers" + defaultMessage;
break;
case "BATTERY_MODIFICATION":
case BATTERY:
defaultMessage = "batteries" + defaultMessage;
break;
case "VOLTAGE_LEVEL_MODIFICATION":
case VOLTAGE_LEVEL:
defaultMessage = "voltage levels" + defaultMessage;
break;
case "LINE_MODIFICATION":
case LINE:
defaultMessage = "lines" + defaultMessage;
break;
case "SUBSTATION_MODIFICATION":
case SUBSTATION:
defaultMessage = "substations" + defaultMessage;
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,8 @@ public List<ModificationInfos> getModificationsMetadata(UUID groupUuid, boolean

public TabularModificationEntity loadTabularModificationSubEntities(ModificationEntity modificationEntity) {
TabularModificationEntity tabularModificationEntity = (TabularModificationEntity) modificationEntity;
switch (tabularModificationEntity.getModificationType()) {
case "GENERATOR_MODIFICATION":
switch (tabularModificationEntity.getEquipmentType()) {
case GENERATOR:
tabularModificationEntity = modificationRepository.findAllWithReactiveCapabilityCurvePointsById(modificationEntity.getId()).orElseThrow(() ->
new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationEntity.getId()))
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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">
<changeSet author="braquartdav (generated)" id="1704304253203-29">
<addColumn tableName="tabular_modification">
<column name="equipment_type" type="varchar(255)"/>
</addColumn>
</changeSet>
<changeSet author="braquartdav" id="migrationTabularModificationType-20240103T175012Z-1">
<sqlFile
encoding="UTF-8"
path="migrationTabularModificationType_20240103T175012Z.sql"
relativeToChangelogFile="true"
splitStatements="true"
stripComments="true"/>
</changeSet>
<changeSet author="braquartdav (generated)" id="1704304253203-47">
<dropColumn columnName="modification_type" tableName="tabular_modification"/>
</changeSet>
</databaseChangeLog>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
update tabular_modification set equipment_type =
(case
when modification_type = 'BATTERY_MODIFICATION' then 'BATTERY'
when modification_type = 'GENERATOR_MODIFICATION' then 'GENERATOR'
when modification_type = 'LINE_MODIFICATION' then 'LINE'
when modification_type = 'LOAD_MODIFICATION' then 'LOAD'
when modification_type = 'SUBSTATION_MODIFICATION' then 'SUBSTATION'
when modification_type = 'TWO_WINDINGS_TRANSFORMER_MODIFICATION' then 'TWO_WINDINGS_TRANSFORMER'
when modification_type = 'VOLTAGE_LEVEL_MODIFICATION' then 'VOLTAGE_LEVEL'
end)
where id = id;
update modification set message_values =
(case
when message_values = '{"tabularModificationType":"BATTERY_MODIFICATION"}' then '{"tabularEquipmentType":"BATTERY"}'
when message_values = '{"tabularModificationType":"GENERATOR_MODIFICATION"}' then '{"tabularEquipmentType":"GENERATOR"}'
when message_values = '{"tabularModificationType":"LINE_MODIFICATION"}' then '{"tabularEquipmentType":"LINE"}'
when message_values = '{"tabularModificationType":"LOAD_MODIFICATION"}' then '{"tabularEquipmentType":"LOAD"}'
when message_values = '{"tabularModificationType":"SUBSTATION_MODIFICATION"}' then '{"tabularEquipmentType":"SUBSTATION"}'
when message_values = '{"tabularModificationType":"TWO_WINDINGS_TRANSFORMER_MODIFICATION"}' then '{"tabularEquipmentType":"TWO_WINDINGS_TRANSFORMER"}'
when message_values = '{"tabularModificationType":"VOLTAGE_LEVEL_MODIFICATION"}' then '{"tabularEquipmentType":"VOLTAGE_LEVEL"}'
end)
where type = 'TABULAR_MODIFICATION' and id = id;
3 changes: 3 additions & 0 deletions src/main/resources/db/changelog/db.changelog-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -230,4 +230,7 @@ databaseChangeLog:
relativeToChangelogFile: true
- include:
file: changesets/changelog_20231214T162501Z.xml
relativeToChangelogFile: true
- include:
file: changesets/changelog_20240103T175012Z.xml
relativeToChangelogFile: true
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package org.gridsuite.modification.server.modifications.tabularmodifications;

import com.fasterxml.jackson.core.type.TypeReference;
import com.powsybl.iidm.network.IdentifiableType;
import com.powsybl.iidm.network.Network;
import lombok.SneakyThrows;
import org.gridsuite.modification.server.ModificationType;
Expand All @@ -25,6 +26,7 @@
import java.util.Map;
import java.util.UUID;

import static org.gridsuite.modification.server.dto.TabularModificationInfos.TABULAR_EQUIPMENT_TYPE;
import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage;
import static org.junit.Assert.assertEquals;

Expand All @@ -47,7 +49,7 @@ protected ModificationInfos buildModification() {
BatteryModificationInfos.builder().equipmentId("unknownBattery").reactivePowerSetpoint(new AttributeModification<>(500., OperationType.SET)).build()
);
return TabularModificationInfos.builder()
.modificationType("BATTERY_MODIFICATION")
.equipmentType(IdentifiableType.BATTERY)
.modifications(modifications)
.stashed(false)
.build();
Expand All @@ -61,7 +63,7 @@ protected ModificationInfos buildModificationUpdate() {
BatteryModificationInfos.builder().equipmentId("v3Battery").activePowerSetpoint(new AttributeModification<>(6., OperationType.SET)).build()
);
return TabularModificationInfos.builder()
.modificationType("BATTERY_MODIFICATION")
.equipmentType(IdentifiableType.BATTERY)
.modifications(modifications)
.stashed(false)
.build();
Expand All @@ -87,14 +89,14 @@ protected void assertAfterNetworkModificationDeletion() {
protected void testCreationModificationMessage(ModificationInfos modificationInfos) {
assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType());
Map<String, String> createdValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { });
Assertions.assertEquals("BATTERY_MODIFICATION", createdValues.get("tabularModificationType"));
Assertions.assertEquals(IdentifiableType.BATTERY.name(), createdValues.get(TABULAR_EQUIPMENT_TYPE));
}

@Override
@SneakyThrows
protected void testUpdateModificationMessage(ModificationInfos modificationInfos) {
assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType());
Map<String, String> updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { });
Assertions.assertEquals("BATTERY_MODIFICATION", updatedValues.get("tabularModificationType"));
Assertions.assertEquals(IdentifiableType.BATTERY.name(), updatedValues.get(TABULAR_EQUIPMENT_TYPE));
}
}
Loading
Loading