Skip to content

Commit

Permalink
Merge branch 'main' into bug-new-modification-point
Browse files Browse the repository at this point in the history
  • Loading branch information
ne0ds authored Jan 29, 2024
2 parents 100e349 + dd8abc1 commit d5b18ed
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import static org.gridsuite.modification.server.modifications.ModificationUtils.distinctByKey;

public class ByFormulaModification extends AbstractModification {
public static final String EQUIPMENT_MODIFIED_REPORT_ERROR = "EquipmentModifiedReportError_";
private final ByFormulaModificationInfos modificationInfos;
protected FilterService filterService;
private int equipmentNotModifiedCount;
Expand Down Expand Up @@ -140,7 +141,7 @@ private void applyFormulaOnFilterEquipments(Network network,
.stream()
.map(attributes -> network.getIdentifiable(attributes.getId()))
.filter(identifiable -> {
boolean isEditableEquipment = isEquipmentEditable(identifiable, formulaInfos);
boolean isEditableEquipment = isEquipmentEditable(identifiable, formulaInfos, equipmentsReport);
if (!isEditableEquipment) {
notEditableEquipments.add(identifiable.getId());
equipmentNotModifiedCount += 1;
Expand Down Expand Up @@ -181,7 +182,7 @@ private void createFormulaReports(List<Report> formulaReports, FormulaInfos form
if (!CollectionUtils.isEmpty(notEditableEquipments)) {
formulaReports.add(Report.builder()
.withKey("NotEditedEquipmentsFilter_" + formulaReports.size())
.withDefaultMessage(String.format(" The following equipment were not modified : %s", String.join(", ", notEditableEquipments)))
.withDefaultMessage(String.format(" %s equipment(s) were not modified", notEditableEquipments.size()))
.withSeverity(TypedValue.WARN_SEVERITY)
.build());
}
Expand All @@ -205,7 +206,8 @@ private void createFormulaReports(List<Report> formulaReports, FormulaInfos form
}

private boolean isEquipmentEditable(Identifiable<?> identifiable,
FormulaInfos formulaInfos) {
FormulaInfos formulaInfos,
List<Report> equipmentsReport) {
if (formulaInfos.getEditedField() == null) {
return false;
}
Expand All @@ -214,8 +216,32 @@ private boolean isEquipmentEditable(Identifiable<?> identifiable,
TwoWindingsTransformerField editedField = TwoWindingsTransformerField.valueOf(formulaInfos.getEditedField());
TwoWindingsTransformer twoWindingsTransformer = (TwoWindingsTransformer) identifiable;
return switch (editedField) {
case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> twoWindingsTransformer.getRatioTapChanger() != null;
case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> twoWindingsTransformer.getPhaseTapChanger() != null;
case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> {
boolean isEditable = twoWindingsTransformer.getRatioTapChanger() != null;
if (!isEditable) {
equipmentsReport.add(Report.builder()
.withKey(EQUIPMENT_MODIFIED_REPORT_ERROR + equipmentsReport.size())
.withDefaultMessage(String.format(" Cannot modify field %s of equipment %s : Ratio tab changer is null",
editedField,
identifiable.getId()))
.withSeverity(TypedValue.TRACE_SEVERITY)
.build());
}
yield isEditable;
}
case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> {
boolean isEditable = twoWindingsTransformer.getPhaseTapChanger() != null;
if (!isEditable) {
equipmentsReport.add(Report.builder()
.withKey(EQUIPMENT_MODIFIED_REPORT_ERROR + equipmentsReport.size())
.withDefaultMessage(String.format(" Cannot modify field %s of equipment %s : Phase tab changer is null",
editedField,
identifiable.getId()))
.withSeverity(TypedValue.TRACE_SEVERITY)
.build());
}
yield isEditable;
}
default -> true;
};
}
Expand All @@ -232,7 +258,7 @@ private void applyFormula(Identifiable<?> identifiable,
equipmentNotModifiedCount += 1;
notEditableEquipments.add(identifiable.getId());
reports.add(Report.builder()
.withKey("EquipmentModifiedReportError_" + reports.size())
.withKey(EQUIPMENT_MODIFIED_REPORT_ERROR + reports.size())
.withDefaultMessage(String.format(" Cannot modify equipment %s : At least one of the value or referenced field is null",
identifiable.getId()))
.withSeverity(TypedValue.TRACE_SEVERITY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,27 @@ public void specificSetUp() {

@Test
public void testByModificationError() throws Exception {
//Test with modification = null
mockMvc.perform(post(getNetworkModificationUri()).content(mapper.writeValueAsString(null)).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isBadRequest());

// Test with empty list of formulas
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of()).build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

// Test with empty list of filters in formula
FormulaInfos formulaInfos = FormulaInfos.builder()
List<FormulaInfos> formulaInfosWithNoFilters = getFormulaInfos().stream().peek(formula -> formula.setFilters(List.of())).toList();
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(formulaInfosWithNoFilters).build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

// Test with editedField = null
FormulaInfos formulaInfosWithNoEditedField = FormulaInfos.builder()
.fieldOrValue1(ReferenceFieldOrValue.builder().value(50.).build())
.fieldOrValue2(ReferenceFieldOrValue.builder().value(50.).build())
.operator(Operator.ADDITION)
.filters(List.of())
.build();
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos)).build(),
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfosWithNoEditedField)).build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);
}

Expand All @@ -105,9 +114,38 @@ protected void checkCreateWithWarning(List<FormulaInfos> formulaInfos, List<Iden
wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(getNetworkUuid(), List.of(FILTER_WITH_ONE_WRONG_ID)), false);
}

protected void checkCreateWithError(List<FormulaInfos> formulaInfos) throws Exception {
protected void checkCreateWithError(List<FormulaInfos> formulaInfos, List<FilterEquipments> filterEquipments) throws Exception {
String filterIds = filterEquipments.stream()
.map(FilterEquipments::getFilterId)
.map(UUID::toString)
.collect(Collectors.joining(","));

UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + filterIds))
.willReturn(WireMock.ok()
.withBody(mapper.writeValueAsString(filterEquipments))
.withHeader("Content-Type", "application/json"))).getId();

ByFormulaModificationInfos byFormulaModificationInfos = ByFormulaModificationInfos.builder()
.formulaInfosList(formulaInfos)
.identifiableType(getIdentifiableType())
.build();

checkCreationApplicationStatus(byFormulaModificationInfos, NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

wireMockUtils.verifyGetRequest(stubId,
PATH,
handleQueryParams(getNetworkUuid(), filterEquipments.stream().map(FilterEquipments::getFilterId).collect(Collectors.toList())),
false);
}

@Test
public void testModificationWithAllWrongEquipmentIds() throws Exception {
FilterEquipments filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId", List.of(), List.of("wrongId1", "wrongId2"));

List<FormulaInfos> formulaInfos = getFormulaInfos().stream()
.peek(formula -> formula.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId"))))
.toList();

UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + FILTER_WITH_ALL_WRONG_IDS))
.willReturn(WireMock.ok()
.withBody(mapper.writeValueAsString(List.of(filter)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,6 @@ public void testCreateWithWarning() throws Exception {
assertEquals(75, getNetwork().getBattery(BATTERY_ID_1).getTargetP(), 0);
}

@Test
public void testCreateWithError() throws Exception {
FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filterWithAllWrongId))
.editedField(BatteryField.ACTIVE_POWER_SET_POINT.name())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build())
.operator(Operator.ADDITION)
.fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build())
.build();

checkCreateWithError(List.of(formulaInfos));
}

@Override
protected void createEquipments() {
getNetwork().getBattery(BATTERY_ID_1).setTargetP(100).setMaxP(500).setMinP(0).setTargetQ(80);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.powsybl.iidm.network.extensions.GeneratorStartup;
import com.powsybl.iidm.network.extensions.GeneratorStartupAdder;
import org.gridsuite.modification.server.dto.FilterEquipments;
import org.gridsuite.modification.server.dto.FilterInfos;
import org.gridsuite.modification.server.dto.IdentifiableAttributes;
import org.gridsuite.modification.server.dto.formula.FormulaInfos;
import org.gridsuite.modification.server.dto.formula.Operator;
Expand Down Expand Up @@ -67,16 +68,19 @@ public void testCreateWithWarning() throws Exception {
}

@Test
public void testCreateWithError() throws Exception {
public void testWithNullReferenceFieldOrValue() throws Exception {
IdentifiableAttributes identifiableAttributes = getIdentifiableAttributes(GENERATOR_ID_1, 1.0);
FilterEquipments filterEquipments = getFilterEquipments(FILTER_ID_1, "filter1", List.of(identifiableAttributes), List.of());

FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filterWithAllWrongId))
.filters(List.of(new FilterInfos(FILTER_ID_1, "filter1")))
.editedField(GeneratorField.ACTIVE_POWER_SET_POINT.name())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build())
.operator(Operator.ADDITION)
.fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build())
.fieldOrValue2(ReferenceFieldOrValue.builder().build())
.build();

checkCreateWithError(List.of(formulaInfos));
checkCreateWithError(List.of(formulaInfos), List.of(filterEquipments));
}

protected void createEquipments() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,6 @@ public void testCreateWithWarning() throws Exception {
assertEquals(5, getNetwork().getShuntCompensator(SHUNT_COMPENSATOR_ID_1).getMaximumSectionCount(), 0);
}

@Test
public void testCreateWithError() throws Exception {
FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filterWithAllWrongId))
.editedField(ShuntCompensatorField.MAXIMUM_SECTION_COUNT.name())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(2.).build())
.operator(Operator.ADDITION)
.fieldOrValue2(ReferenceFieldOrValue.builder().value(3.).build())
.build();

checkCreateWithError(List.of(formulaInfos));
}

@Override
protected void createEquipments() {
createShuntCompensator(getNetwork().getVoltageLevel("v1"), SHUNT_COMPENSATOR_ID_1, "v1shunt", 8, 225., 10, true, 4, 2, 3, 2, "cn11", 22, ConnectablePosition.Direction.BOTTOM);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,39 @@ public class TwoWindingsTransformerByFormulaModificationTest extends AbstractByF

@Test
public void testModifyTwtWithError() throws Exception {
// Test modifying ratio tab changer field when ratio tab changer is null
IdentifiableAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_4, 1.);
IdentifiableAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_6, 1.);
FilterEquipments filter = getFilterEquipments(FILTER_ID_4, "filter4", List.of(identifiableAttributes1, identifiableAttributes2), List.of());

UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + FILTER_ID_4))
.willReturn(WireMock.ok()
.withBody(mapper.writeValueAsString(List.of(filter)))
.withHeader("Content-Type", "application/json"))).getId();
FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filter4))
.fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build())
.editedField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name())
.operator(Operator.ADDITION)
.build();
checkCreationApplicationStatus(ByFormulaModificationInfos.builder()
.identifiableType(getIdentifiableType())
.formulaInfosList(List.of(formulaInfos))
.build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

checkCreateWithError(List.of(formulaInfos), List.of(filter));

assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger());
assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger());

wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(getNetworkUuid(), List.of(FILTER_ID_4)), false);
// Test modifying phase tab changer field when phase tab changer is null
IdentifiableAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_1, 1.);
IdentifiableAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_2, 1.);
FilterEquipments filter2 = getFilterEquipments(FILTER_ID_1, "filter1", List.of(identifiableAttributes3, identifiableAttributes4), List.of());
FormulaInfos formulaInfos2 = FormulaInfos.builder()
.filters(List.of(filter1))
.fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build())
.editedField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name())
.operator(Operator.ADDITION)
.build();

checkCreateWithError(List.of(formulaInfos2), List.of(filter2));

assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getPhaseTapChanger());
assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getPhaseTapChanger());
}

@Test
Expand All @@ -81,6 +89,7 @@ public void testDivisionByZero() throws Exception {
.fieldOrValue2(ReferenceFieldOrValue.builder().value(0.).build())
.operator(Operator.DIVISION)
.filters(List.of(filter4))
.editedField(TwoWindingsTransformerField.SERIES_RESISTANCE.name())
.build();

checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos2)).build(),
Expand Down

0 comments on commit d5b18ed

Please sign in to comment.