Skip to content

Commit 94ec2cd

Browse files
Add spreadsheet type: branch (#270)
1 parent 2065adc commit 94ec2cd

26 files changed

+690
-638
lines changed

src/main/java/org/gridsuite/network/map/NetworkMapController.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1414
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1515
import io.swagger.v3.oas.annotations.tags.Tag;
16+
import lombok.AllArgsConstructor;
1617
import org.gridsuite.network.map.dto.*;
1718
import org.gridsuite.network.map.dto.definition.hvdc.HvdcShuntCompensatorsInfos;
1819
import org.springframework.context.annotation.ComponentScan;
@@ -33,16 +34,13 @@
3334
@RequestMapping(value = "/" + NetworkMapController.API_VERSION + "/")
3435
@Tag(name = "network-map-server")
3536
@ComponentScan(basePackageClasses = NetworkMapService.class)
37+
@AllArgsConstructor
3638
public class NetworkMapController {
3739

3840
public static final String API_VERSION = "v1";
3941

4042
private final NetworkMapService networkMapService;
4143

42-
public NetworkMapController(NetworkMapService networkMapService) {
43-
this.networkMapService = networkMapService;
44-
}
45-
4644
@PostMapping(value = "/networks/{networkUuid}/elements-ids", produces = APPLICATION_JSON_VALUE)
4745
@Operation(summary = "Get elements ids")
4846
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Equipments ids")})

src/main/java/org/gridsuite/network/map/NetworkMapService.java

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
import com.powsybl.iidm.network.HvdcConverterStation.HvdcType;
1212
import com.powsybl.network.store.client.NetworkStoreService;
1313
import com.powsybl.network.store.client.PreloadingStrategy;
14+
import lombok.AllArgsConstructor;
1415
import org.gridsuite.network.map.dto.*;
1516
import org.gridsuite.network.map.dto.definition.hvdc.HvdcShuntCompensatorsInfos;
1617
import org.gridsuite.network.map.dto.mapper.ElementInfosMapper;
1718
import org.gridsuite.network.map.dto.mapper.HvdcInfosMapper;
18-
import org.springframework.beans.factory.annotation.Autowired;
1919
import org.springframework.context.annotation.ComponentScan;
2020
import org.springframework.http.HttpStatus;
2121
import org.springframework.lang.NonNull;
@@ -33,10 +33,9 @@
3333
*/
3434
@ComponentScan(basePackageClasses = {NetworkStoreService.class})
3535
@Service
36+
@AllArgsConstructor
3637
public class NetworkMapService {
37-
38-
@Autowired
39-
private NetworkStoreService networkStoreService;
38+
private final NetworkStoreService networkStoreService;
4039

4140
private Network getNetwork(UUID networkUuid, PreloadingStrategy strategy, String variantId) {
4241
try {
@@ -250,8 +249,8 @@ private List<ElementInfos> getTieLinesInfos(Network network, @NonNull List<Strin
250249
private List<ElementInfos> getBusesInfos(Network network, @NonNull List<String> substationsId, InfoTypeParameters infoTypeParameters) {
251250
Stream<Bus> buses = substationsId.isEmpty() ? network.getBusView().getBusStream() :
252251
network.getBusView().getBusStream()
253-
.filter(bus -> bus.getVoltageLevel().getSubstation().stream().anyMatch(substation -> substationsId.contains(substation.getId())))
254252
.filter(Objects::nonNull)
253+
.filter(bus -> bus.getVoltageLevel().getSubstation().stream().anyMatch(substation -> substationsId.contains(substation.getId())))
255254
.distinct();
256255
return buses
257256
.map(c -> ElementType.BUS.getInfosGetter().apply(c, infoTypeParameters))
@@ -260,14 +259,16 @@ private List<ElementInfos> getBusesInfos(Network network, @NonNull List<String>
260259
}
261260

262261
private static List<ElementInfos> getElementsInfos(Network network, @NonNull List<String> substationsIds, ElementType elementType, InfoTypeParameters infoTypeParameters, List<Double> nominalVoltages) {
263-
Class<? extends Connectable<?>> elementClass = (Class<? extends Connectable<?>>) elementType.getElementClass();
264-
Stream<? extends Connectable<?>> connectables = substationsIds.isEmpty() ?
265-
getConnectableStream(network, elementType) :
262+
if (!elementType.isConnectable()) { // early break if not supported
263+
throw new IllegalStateException("Unexpected non-connectable element type: " + elementType);
264+
}
265+
final Stream<? extends Connectable<?>> connectables = substationsIds.isEmpty() ?
266+
elementType.getConnectableStream(network) :
266267
substationsIds.stream()
267268
.flatMap(substationId -> network.getSubstation(substationId).getVoltageLevelStream())
268269
.filter(voltageLevel -> (elementType != ElementType.BUSBAR_SECTION || voltageLevel.getTopologyKind() != TopologyKind.BUS_BREAKER)
269270
&& (nominalVoltages == null || nominalVoltages.contains(voltageLevel.getNominalV())))
270-
.flatMap(voltageLevel -> voltageLevel.getConnectableStream(elementClass))
271+
.flatMap(elementType::getVoltageLevelConnectableStream)
271272
.distinct();
272273
return connectables
273274
.map(c -> elementType.getInfosGetter().apply(c, infoTypeParameters))
@@ -277,13 +278,15 @@ private static List<ElementInfos> getElementsInfos(Network network, @NonNull Lis
277278
public List<ElementInfos> getElementsInfos(UUID networkUuid, String variantId, @NonNull List<String> substationsIds, ElementType equipmentType, InfoTypeParameters infoTypeParameters, List<Double> nominalVoltages) {
278279
Network network = getNetwork(networkUuid, getPreloadingStrategy(substationsIds), variantId);
279280
return switch (equipmentType) {
281+
// types that don't implement `Connectable<>` interface
280282
case SUBSTATION -> getSubstationsInfos(network, substationsIds, infoTypeParameters, nominalVoltages);
281283
case VOLTAGE_LEVEL -> getVoltageLevelsInfos(network, substationsIds, infoTypeParameters, nominalVoltages);
282284
case HVDC_LINE -> getHvdcLinesInfos(network, substationsIds, infoTypeParameters, nominalVoltages);
283285
case HVDC_LINE_LCC -> getHvdcLinesLccInfos(network, substationsIds, infoTypeParameters, nominalVoltages);
284286
case HVDC_LINE_VSC -> getHvdcLinesVscInfos(network, substationsIds, infoTypeParameters, nominalVoltages);
285287
case TIE_LINE -> getTieLinesInfos(network, substationsIds, infoTypeParameters, nominalVoltages);
286288
case BUS -> getBusesInfos(network, substationsIds, infoTypeParameters);
289+
// for others, it's okay
287290
default -> getElementsInfos(network, substationsIds, equipmentType, infoTypeParameters, nominalVoltages);
288291
};
289292
}
@@ -314,33 +317,36 @@ public HvdcShuntCompensatorsInfos getHvdcLineShuntCompensators(UUID networkUuid,
314317
Network network = getNetwork(networkUuid, PreloadingStrategy.NONE, variantId);
315318
HvdcLine hvdcLine = network.getHvdcLine(hvdcId);
316319
if (hvdcLine == null) {
317-
// called from a modification, then we must support un-existing equipment
320+
// called from a modification, then we must support unexisting equipment
318321
return HvdcShuntCompensatorsInfos.builder().id(hvdcId).build();
319322
}
320323
return HvdcInfosMapper.toHvdcShuntCompensatorsInfos(hvdcLine);
321324
}
322325

323326
public List<String> getElementsIds(UUID networkUuid, String variantId, @NonNull List<String> substationsIds, ElementType elementType, List<Double> nominalVoltages) {
324327
return switch (elementType) {
328+
// types that don't implement `Connectable<>` interface
325329
case SUBSTATION -> getSubstationsIds(networkUuid, variantId, nominalVoltages);
326330
case TIE_LINE -> getTieLinesIds(networkUuid, variantId, substationsIds, nominalVoltages);
327331
case HVDC_LINE -> getHvdcLinesIds(networkUuid, variantId, substationsIds, nominalVoltages);
328332
case HVDC_LINE_LCC -> getHvdcLinesLccIds(networkUuid, variantId, substationsIds, nominalVoltages);
329333
case HVDC_LINE_VSC -> getHvdcLinesVscIds(networkUuid, variantId, substationsIds, nominalVoltages);
330334
case VOLTAGE_LEVEL -> getVoltageLevelsIds(networkUuid, variantId, substationsIds, nominalVoltages);
335+
// for others, it's okay
331336
default -> getConnectablesIds(networkUuid, variantId, substationsIds, elementType, nominalVoltages);
332337
};
333338
}
334339

335340
private List<String> getConnectablesIds(UUID networkUuid, String variantId, @NonNull List<String> substationsIds, ElementType elementType, List<Double> nominalVoltages) {
336341
Network network = getNetwork(networkUuid, getPreloadingStrategy(substationsIds), variantId);
337342
if (substationsIds.isEmpty() && nominalVoltages == null) {
338-
return getConnectableStream(network, elementType)
339-
.map(Connectable::getId)
340-
.toList();
343+
return elementType.getConnectableStream(network).map(Connectable::getId).toList();
341344
} else {
345+
if (!elementType.isConnectable()) { // early break if not supported
346+
throw new IllegalStateException("Unexpected non-connectable element type: " + elementType);
347+
}
342348
return getVoltageLevelStream(network, substationsIds, nominalVoltages)
343-
.flatMap(voltageLevel -> voltageLevel.getConnectableStream((Class<? extends Connectable>) elementType.getElementClass()))
349+
.flatMap(elementType::getVoltageLevelConnectableStream)
344350
.map(Connectable::getId)
345351
.distinct()
346352
.collect(Collectors.toList());
@@ -355,24 +361,6 @@ private static Stream<VoltageLevel> getVoltageLevelStream(Network network, @NonN
355361
return voltageLevelStream.filter(voltageLevel -> nominalVoltages == null || nominalVoltages.contains(voltageLevel.getNominalV()));
356362
}
357363

358-
private static Stream<? extends Connectable<?>> getConnectableStream(Network network, ElementType elementType) {
359-
return switch (elementType) {
360-
case BUSBAR_SECTION, BUS -> network.getBusbarSectionStream();
361-
case GENERATOR -> network.getGeneratorStream();
362-
case LINE -> network.getLineStream();
363-
case TWO_WINDINGS_TRANSFORMER -> network.getTwoWindingsTransformerStream();
364-
case THREE_WINDINGS_TRANSFORMER -> network.getThreeWindingsTransformerStream();
365-
case BATTERY -> network.getBatteryStream();
366-
case DANGLING_LINE -> network.getDanglingLineStream();
367-
case LCC_CONVERTER_STATION -> network.getLccConverterStationStream();
368-
case VSC_CONVERTER_STATION -> network.getVscConverterStationStream();
369-
case LOAD -> network.getLoadStream();
370-
case SHUNT_COMPENSATOR -> network.getShuntCompensatorStream();
371-
case STATIC_VAR_COMPENSATOR -> network.getStaticVarCompensatorStream();
372-
default -> throw new IllegalStateException("Unexpected connectable type:" + elementType);
373-
};
374-
}
375-
376364
public Set<Country> getCountries(UUID networkUuid, String variantId) {
377365
Network network = getNetwork(networkUuid, PreloadingStrategy.COLLECTION, variantId);
378366
return network.getSubstationStream()

src/main/java/org/gridsuite/network/map/dto/ElementType.java

Lines changed: 96 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,110 @@
77
package org.gridsuite.network.map.dto;
88

99
import com.powsybl.iidm.network.*;
10+
import lombok.Getter;
11+
import lombok.NonNull;
1012
import org.gridsuite.network.map.dto.mapper.*;
13+
import org.springframework.lang.Nullable;
1114

15+
import java.util.Set;
1216
import java.util.function.BiFunction;
13-
17+
import java.util.function.Function;
18+
import java.util.stream.Stream;
1419

1520
public enum ElementType {
16-
SUBSTATION(Substation.class, SubstationInfosMapper::toData),
17-
VOLTAGE_LEVEL(VoltageLevel.class, VoltageLevelInfosMapper::toData),
18-
LINE(Line.class, LineInfosMapper::toData),
19-
TIE_LINE(TieLine.class, TieLineInfosMapper::toData),
20-
HVDC_LINE(HvdcLine.class, HvdcInfosMapper::toData),
21-
HVDC_LINE_LCC(HvdcLine.class, HvdcLccInfosMapper::toData),
22-
HVDC_LINE_VSC(HvdcLine.class, HvdcVscInfosMapper::toData),
23-
LOAD(Load.class, LoadInfosMapper::toData),
24-
TWO_WINDINGS_TRANSFORMER(TwoWindingsTransformer.class, TwoWindingsTransformerInfosMapper::toData),
25-
THREE_WINDINGS_TRANSFORMER(ThreeWindingsTransformer.class, ThreeWindingsTransformerInfosMapper::toData),
26-
BUSBAR_SECTION(BusbarSection.class, BusBarSectionInfosMapper::toData),
27-
BUS(Bus.class, BusInfosMapper::toData),
28-
GENERATOR(Generator.class, GeneratorInfosMapper::toData),
29-
BATTERY(Battery.class, BatteryInfosMapper::toData),
30-
SHUNT_COMPENSATOR(ShuntCompensator.class, ShuntCompensatorMapper::toData),
31-
DANGLING_LINE(DanglingLine.class, DanglingLineInfosMapper::toData),
32-
STATIC_VAR_COMPENSATOR(StaticVarCompensator.class, StaticVarCompensatorInfosMapper::toData),
33-
LCC_CONVERTER_STATION(LccConverterStation.class, LccConverterStationInfosMapper::toData),
34-
VSC_CONVERTER_STATION(VscConverterStation.class, VscConverterStationInfosMapper::toData);
35-
36-
private final Class<? extends Identifiable> elementClass;
37-
38-
private final BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos> infosGetter;
39-
40-
public Class<? extends Identifiable> getElementClass() {
41-
return elementClass;
21+
SUBSTATION(Substation.class, SubstationInfosMapper::toData, null),
22+
VOLTAGE_LEVEL(VoltageLevel.class, VoltageLevelInfosMapper::toData, null),
23+
BRANCH(Branch.class, BranchInfosMapper::toData,
24+
network -> Stream.concat(network.getLineStream(), network.getTwoWindingsTransformerStream()),
25+
Line.class, TwoWindingsTransformer.class),
26+
LINE(Line.class, LineInfosMapper::toData, Network::getLineStream),
27+
TIE_LINE(TieLine.class, TieLineInfosMapper::toData, null),
28+
HVDC_LINE(HvdcLine.class, HvdcInfosMapper::toData, null),
29+
HVDC_LINE_LCC(HvdcLine.class, HvdcLccInfosMapper::toData, null),
30+
HVDC_LINE_VSC(HvdcLine.class, HvdcVscInfosMapper::toData, null),
31+
LOAD(Load.class, LoadInfosMapper::toData, Network::getLoadStream),
32+
TWO_WINDINGS_TRANSFORMER(TwoWindingsTransformer.class, TwoWindingsTransformerInfosMapper::toData, Network::getTwoWindingsTransformerStream),
33+
THREE_WINDINGS_TRANSFORMER(ThreeWindingsTransformer.class, ThreeWindingsTransformerInfosMapper::toData, Network::getThreeWindingsTransformerStream),
34+
BUSBAR_SECTION(BusbarSection.class, BusBarSectionInfosMapper::toData, Network::getBusbarSectionStream),
35+
BUS(Bus.class, BusInfosMapper::toData, Network::getBusbarSectionStream),
36+
GENERATOR(Generator.class, GeneratorInfosMapper::toData, Network::getGeneratorStream),
37+
BATTERY(Battery.class, BatteryInfosMapper::toData, Network::getBatteryStream),
38+
SHUNT_COMPENSATOR(ShuntCompensator.class, ShuntCompensatorMapper::toData, Network::getShuntCompensatorStream),
39+
DANGLING_LINE(DanglingLine.class, DanglingLineInfosMapper::toData, Network::getDanglingLineStream),
40+
STATIC_VAR_COMPENSATOR(StaticVarCompensator.class, StaticVarCompensatorInfosMapper::toData, Network::getStaticVarCompensatorStream),
41+
LCC_CONVERTER_STATION(LccConverterStation.class, LccConverterStationInfosMapper::toData, Network::getLccConverterStationStream),
42+
VSC_CONVERTER_STATION(VscConverterStation.class, VscConverterStationInfosMapper::toData, Network::getVscConverterStationStream);
43+
44+
/**
45+
* @since 2.22.0
46+
* @apiNote Is {@code null} if it's not a concrete class.
47+
*/
48+
@NonNull private final Class<? extends Identifiable<?>> elementClass;
49+
50+
/**
51+
* For composed element classes
52+
* @since 2.22.0
53+
*/
54+
@Nullable private final Set<Class<? extends Identifiable<?>>> subClasses;
55+
56+
/**
57+
* Is {@link #elementClass}, or all {@link #subClasses} if present, is an instance of {@link Connectable}?
58+
* @apiNote Is only to not have to do the test each time the information is needed.
59+
* @since 2.22.0
60+
*/
61+
@Getter final boolean isConnectable;
62+
63+
/**
64+
* {@code toData()} function from the mapper
65+
*/
66+
@Getter @NonNull
67+
private final BiFunction</*? extends*/ Identifiable<?>, InfoTypeParameters, ElementInfos> infosGetter;
68+
69+
/**
70+
* @since 2.22.0
71+
*/
72+
@NonNull
73+
private final Function<Network, Stream</*? extends*/ Connectable<?>>> connectableStream;
74+
75+
@SafeVarargs
76+
<T extends Identifiable<T>> ElementType(
77+
@NonNull final Class<T> typeClass,
78+
@NonNull final BiFunction<T, InfoTypeParameters, ElementInfos> dataGetter,
79+
@Nullable final Function<Network, Stream</*T*/ ? extends Connectable<?>>> connectableStream,
80+
@Nullable final Class</*? extends T*/? extends Identifiable<?>>... subTypes) {
81+
this.connectableStream = connectableStream != null ? ((Function<Network, Stream<Connectable<?>>>) (Object) connectableStream) : (n -> {
82+
throw new IllegalStateException("Unexpected connectable type:" + this);
83+
});
84+
this.elementClass = typeClass;
85+
//noinspection unchecked
86+
this.infosGetter = (BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos>) dataGetter;
87+
if (subTypes != null && subTypes.length > 0) {
88+
this.subClasses = Set.of(subTypes);
89+
if (subClasses.stream().anyMatch(subType -> !typeClass.isAssignableFrom(subType))) {
90+
// typing the list as Class<? extends T> to check during compile-time don't work, so let's at least check during class loading
91+
throw new VerifyError("Not all sub-classes extends base class");
92+
}
93+
this.isConnectable = subClasses.stream().allMatch(Connectable.class::isAssignableFrom);
94+
} else {
95+
this.subClasses = null;
96+
this.isConnectable = Connectable.class.isAssignableFrom(this.elementClass);
97+
}
4298
}
4399

44-
public BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos> getInfosGetter() {
45-
return infosGetter;
100+
public Stream<Connectable<?>> getVoltageLevelConnectableStream(@NonNull final VoltageLevel voltageLevel) {
101+
if (!this.isConnectable) {
102+
throw new UnsupportedOperationException("This element type is not a connectable type");
103+
}
104+
if (this.subClasses == null) {
105+
return voltageLevel.getConnectableStream((Class<Connectable<?>>) this.elementClass);
106+
} else {
107+
return this.subClasses.stream()
108+
.map(c -> (Class<? extends Connectable<?>>) c)
109+
.flatMap(voltageLevel::getConnectableStream);
110+
}
46111
}
47112

48-
ElementType(Class<? extends Identifiable> typeClass, BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos> dataGetter) {
49-
this.elementClass = typeClass;
50-
this.infosGetter = dataGetter;
113+
public Stream<Connectable<?>> getConnectableStream(final Network network) {
114+
return this.connectableStream.apply(network);
51115
}
52116
}
53-

0 commit comments

Comments
 (0)