Skip to content

Commit 2655ddc

Browse files
Refactor commit b32f39d
1 parent b32f39d commit 2655ddc

File tree

4 files changed

+50
-77
lines changed

4 files changed

+50
-77
lines changed

src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88

99
import com.fasterxml.jackson.annotation.JsonInclude;
1010
import lombok.Builder;
11-
import lombok.EqualsAndHashCode;
12-
import lombok.Getter;
11+
import lombok.Data;
12+
import lombok.With;
13+
import lombok.experimental.Accessors;
1314
import org.springframework.util.CollectionUtils;
1415

1516
import java.util.List;
@@ -19,9 +20,10 @@
1920
* @author David Braquart <david.braquart at rte-france.com>
2021
* == a powsybl OperationalLimitsGroup == a LimitSet
2122
*/
23+
@With
2224
@Builder
23-
@Getter
24-
@EqualsAndHashCode
25+
@Data
26+
@Accessors(chain = true)
2527
public class CurrentLimitsData {
2628
// may be null in case we just need the selected limit set and don't really need its name/id
2729
@JsonInclude(JsonInclude.Include.NON_NULL)

src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,10 @@ private static LineFormInfos toFormInfos(Identifiable<?> identifiable) {
6565
.b1(line.getB1())
6666
.g2(line.getG2())
6767
.b2(line.getB2())
68-
.properties(getProperties(line))
6968
.selectedOperationalLimitsGroup1(line.getSelectedOperationalLimitsGroupId1().orElse(null))
70-
.selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null));
71-
72-
mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2(), builder::currentLimits);
69+
.selectedOperationalLimitsGroup2(line.getSelectedOperationalLimitsGroupId2().orElse(null))
70+
.currentLimits(mergeCurrentLimits(line.getOperationalLimitsGroups1(), line.getOperationalLimitsGroups2()))
71+
.properties(getProperties(line));
7372

7473
buildCurrentLimits(line.getOperationalLimitsGroups1(), builder::currentLimits1);
7574
buildCurrentLimits(line.getOperationalLimitsGroups2(), builder::currentLimits2);

src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable<?> ident
6666
.g(twoWT.getG())
6767
.ratedU1(twoWT.getRatedU1())
6868
.ratedU2(twoWT.getRatedU2())
69+
.selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null))
70+
.selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null))
71+
.currentLimits(mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2()))
6972
.properties(getProperties(twoWT));
7073

7174
builder.busOrBusbarSectionId1(getBusOrBusbarSection(terminal1))
@@ -77,10 +80,7 @@ private static TwoWindingsTransformerFormInfos toFormInfos(Identifiable<?> ident
7780
builder.q2(nullIfNan(terminal2.getQ()));
7881
builder.i1(nullIfNan(terminal1.getI()));
7982
builder.i2(nullIfNan(terminal2.getI()));
80-
builder.selectedOperationalLimitsGroup1(twoWT.getSelectedOperationalLimitsGroupId1().orElse(null));
81-
builder.selectedOperationalLimitsGroup2(twoWT.getSelectedOperationalLimitsGroupId2().orElse(null));
8283

83-
mergeCurrentLimits(twoWT.getOperationalLimitsGroups1(), twoWT.getOperationalLimitsGroups2(), builder::currentLimits);
8484

8585
buildCurrentLimits(twoWT.getOperationalLimitsGroups1(), builder::currentLimits1);
8686
buildCurrentLimits(twoWT.getOperationalLimitsGroups2(), builder::currentLimits2);

src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java

Lines changed: 38 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
import com.powsybl.iidm.network.*;
1111
import com.powsybl.iidm.network.extensions.*;
1212
import com.powsybl.math.graph.TraversalType;
13+
import lombok.NonNull;
1314
import org.gridsuite.network.map.dto.common.*;
1415
import org.gridsuite.network.map.dto.definition.extension.*;
1516
import org.gridsuite.network.map.dto.definition.threewindingstransformer.ThreeWindingsTransformerTabInfos;
17+
import org.springframework.lang.Nullable;
1618
import org.springframework.util.CollectionUtils;
1719

18-
import java.util.ArrayList;
1920
import java.util.Collection;
2021
import java.util.HashMap;
2122
import java.util.List;
@@ -24,6 +25,7 @@
2425
import java.util.function.Consumer;
2526
import java.util.function.Function;
2627
import java.util.stream.Collectors;
28+
import java.util.stream.Stream;
2729

2830
import static org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability.*;
2931

@@ -93,85 +95,55 @@ public static void buildCurrentLimits(Collection<OperationalLimitsGroup> current
9395
}
9496
}
9597

96-
private static CurrentLimitsData copyCurrentLimitsData(CurrentLimitsData currentLimitsData, CurrentLimitsData.Applicability applicability) {
97-
return CurrentLimitsData.builder()
98-
.id(currentLimitsData.getId())
99-
.applicability(applicability)
100-
.temporaryLimits(currentLimitsData.getTemporaryLimits())
101-
.permanentLimit(currentLimitsData.getPermanentLimit()).build();
102-
}
103-
10498
/**
99+
* Combine 2 sides in one list.
105100
* @return id of the selected operation limits group 1 and 2 if they have been renamed
106101
*/
107-
public static void mergeCurrentLimits(Collection<OperationalLimitsGroup> operationalLimitsGroups1,
108-
Collection<OperationalLimitsGroup> operationalLimitsGroups2,
109-
Consumer<List<CurrentLimitsData>> build) {
110-
List<CurrentLimitsData> mergedLimitsData = new ArrayList<>();
111-
102+
@Nullable
103+
public static List<CurrentLimitsData> mergeCurrentLimits(@NonNull final Collection<OperationalLimitsGroup> operationalLimitsGroups1,
104+
@NonNull final Collection<OperationalLimitsGroup> operationalLimitsGroups2) {
112105
// Build temporary limit from side 1 and 2
113-
List<CurrentLimitsData> currentLimitsData1 = operationalLimitsGroups1.stream()
114-
.map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList();
115-
ArrayList<CurrentLimitsData> currentLimitsData2 = new ArrayList<>(operationalLimitsGroups2.stream()
116-
.map(ElementUtils::operationalLimitsGroupToMapDataCurrentLimits).toList());
117-
118-
// combine 2 sides in one list
106+
final List<CurrentLimitsData> currentLimitsData1 = operationalLimitsGroups1.stream()
107+
.map(operationalLimitsGroup -> operationalLimitsGroupToMapDataCurrentLimits(operationalLimitsGroup).setApplicability(SIDE1))
108+
.toList();
109+
final List<CurrentLimitsData> currentLimitsData2 = operationalLimitsGroups2.stream()
110+
.map(operationalLimitsGroup -> operationalLimitsGroupToMapDataCurrentLimits(operationalLimitsGroup).setApplicability(SIDE2))
111+
.toList();
119112

120113
// simple case : one of the arrays are empty
121114
if (currentLimitsData2.isEmpty() && !currentLimitsData1.isEmpty()) {
122-
for (CurrentLimitsData currentLimitsData : currentLimitsData1) {
123-
mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE1));
124-
}
125-
build.accept(mergedLimitsData);
126-
return;
115+
return currentLimitsData1;
127116
}
128117
if (currentLimitsData1.isEmpty() && !currentLimitsData2.isEmpty()) {
129-
for (CurrentLimitsData currentLimitsData : currentLimitsData2) {
130-
mergedLimitsData.add(copyCurrentLimitsData(currentLimitsData, SIDE2));
131-
}
132-
build.accept(mergedLimitsData);
133-
return;
118+
return currentLimitsData2;
134119
}
135120

136121
// more complex case
137-
for (CurrentLimitsData limitsData : currentLimitsData1) {
138-
Optional<CurrentLimitsData> l2 = currentLimitsData2.stream().filter(l -> l.getId().equals(limitsData.getId())).findFirst();
139-
140-
if (l2.isPresent()) {
141-
CurrentLimitsData limitsData2 = l2.get();
142-
// Only side one has limits
143-
if (limitsData.hasLimits() && !limitsData2.hasLimits()) {
144-
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1));
145-
// only side two has limits
146-
} else if (limitsData2.hasLimits() && !limitsData.hasLimits()) {
147-
mergedLimitsData.add(copyCurrentLimitsData(limitsData2, SIDE2));
148-
} else {
149-
// both sides have limits and limits are equals
150-
if (limitsData.limitsEquals(limitsData2)) {
151-
mergedLimitsData.add(copyCurrentLimitsData(limitsData, EQUIPMENT));
152-
// both side have limits and they are different : create 2 different limit sets
153-
} else {
154-
// Side 1
155-
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1));
156-
// Side 2
157-
mergedLimitsData.add(copyCurrentLimitsData(limitsData2, SIDE2));
122+
return Stream.concat(currentLimitsData1.stream(), currentLimitsData2.stream())
123+
.collect(Collectors.groupingByConcurrent(CurrentLimitsData::getId))
124+
.values()
125+
.parallelStream()
126+
.<CurrentLimitsData>mapMulti((currentLimitsData, acc) -> {
127+
if (currentLimitsData.isEmpty() || currentLimitsData.size() > 2) {
128+
throw new UnsupportedOperationException("IDs are assumed unique in each lists");
129+
} else if (currentLimitsData.size() == 2) {
130+
final CurrentLimitsData limitsData = currentLimitsData.get(0);
131+
final CurrentLimitsData limitsData2 = currentLimitsData.get(1);
132+
if (limitsData.hasLimits() && !limitsData2.hasLimits()) { // Only side one has limits
133+
acc.accept(limitsData);
134+
return;
135+
} else if (limitsData2.hasLimits() && !limitsData.hasLimits()) { // only side two has limits
136+
acc.accept(limitsData2);
137+
return;
138+
} else if (limitsData.limitsEquals(limitsData2)) { // both sides have limits and limits are equals
139+
acc.accept(limitsData.setApplicability(EQUIPMENT));
140+
return;
158141
}
142+
// both side have limits and are different: create 2 different limit sets
159143
}
160-
// remove processed limits from side 2
161-
currentLimitsData2.remove(l2.get());
162-
} else {
163-
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE1));
164-
}
165-
}
166-
167-
// add remaining limits from side 2
168-
for (CurrentLimitsData limitsData : currentLimitsData2) {
169-
mergedLimitsData.add(copyCurrentLimitsData(limitsData, SIDE2));
170-
}
171-
172-
if (!mergedLimitsData.isEmpty()) {
173-
build.accept(mergedLimitsData);
174-
}
144+
currentLimitsData.forEach(acc);
145+
})
146+
.toList();
175147
}
176148

177149
public static Optional<StandbyAutomatonInfos> toStandbyAutomaton(StaticVarCompensator staticVarCompensator) {

0 commit comments

Comments
 (0)