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

Add multiple filters export endpoint #666

Merged
merged 4 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ private StudyConstants() {
public static final String GROUP_UUID = "groupUuid";
public static final String REPORT_UUID = "reportUuid";
public static final String UUIDS = "uuids";
public static final String IDS = "ids";
public static final String QUERY_PARAM_ERROR_ON_GROUP_NOT_FOUND = "errorOnGroupNotFound";
public static final String QUERY_PARAM_REPORT_DEFAULT_NAME = "defaultName";
public static final String QUERY_PARAM_REPORT_SEVERITY_LEVEL = "severityLevels";
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/org/gridsuite/study/server/StudyController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2068,6 +2068,16 @@ public ResponseEntity<String> exportFilter(
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.exportFilter(rootNetworkUuid, filterUuid));
}

@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/filters/elements")
@Operation(summary = "Evaluate a list of filters on root node to get matched elements")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The list of matched elements")})
public ResponseEntity<String> exportFilters(
@Parameter(description = "Study uuid") @PathVariable("studyUuid") UUID studyUuid,
@Parameter(description = "Root network uuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
@Parameter(description = "Filters uuid to be resolved") @RequestParam("filtersUuid") List<UUID> filtersUuid) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.exportFilters(rootNetworkUuid, filtersUuid));
}

@PostMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/state-estimation/run")
@Operation(summary = "run state estimation on study")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The state estimation has started")})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.List;
import java.util.Objects;
import java.util.UUID;

import static org.gridsuite.study.server.StudyConstants.DELIMITER;
import static org.gridsuite.study.server.StudyConstants.FILTER_API_VERSION;
import static org.gridsuite.study.server.StudyException.Type.*;
import static org.gridsuite.study.server.StudyException.Type.EVALUATE_FILTER_FAILED;
import static org.gridsuite.study.server.StudyException.Type.NETWORK_NOT_FOUND;
import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError;

/**
Expand All @@ -35,6 +37,7 @@ public class FilterService {

public static final String FILTER_END_POINT_EVALUATE = "/filters/evaluate";
public static final String FILTER_END_POINT_EXPORT = "/filters/{id}/export";
public static final String FILTERS_END_POINT_EXPORT = "/filters/export";

private final RestTemplate restTemplate;

Expand Down Expand Up @@ -90,4 +93,17 @@ public String exportFilter(UUID networkUuid, UUID filterUuid) {

return restTemplate.getForObject(uriComponent.toUriString(), String.class);
}

public String exportFilters(UUID networkUuid, List<UUID> filtersUuid) {
Objects.requireNonNull(networkUuid);
Objects.requireNonNull(filtersUuid);
String endPointUrl = getBaseUri() + DELIMITER + FILTER_API_VERSION + FILTERS_END_POINT_EXPORT;

UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(endPointUrl);
uriComponentsBuilder.queryParam("networkUuid", networkUuid);
uriComponentsBuilder.queryParam("ids", filtersUuid);
var uriComponent = uriComponentsBuilder.buildAndExpand();

return restTemplate.getForObject(uriComponent.toUriString(), String.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2440,6 +2440,10 @@ public String exportFilter(UUID rootNetworkUuid, UUID filterUuid) {
return filterService.exportFilter(rootNetworkService.getNetworkUuid(rootNetworkUuid), filterUuid);
}

public String exportFilters(UUID rootNetworkUuid, List<UUID> filtersUuid) {
return filterService.exportFilters(rootNetworkService.getNetworkUuid(rootNetworkUuid), filtersUuid);
}

@Transactional
public UUID runStateEstimation(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, String userId) {
Objects.requireNonNull(studyUuid);
Expand Down
51 changes: 51 additions & 0 deletions src/test/java/org/gridsuite/study/server/FilterServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;

import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static org.junit.jupiter.api.Assertions.assertEquals;
Expand All @@ -53,6 +55,7 @@ class FilterServiceTest {
private static final String NETWORK_UUID_STRING = "38400000-8cf0-11bd-b23e-10b96e4ef00d";
private static final String CASE_UUID_STRING = "00000000-8cf0-11bd-b23e-10b96e4ef00d";
private static final String FILTER_UUID_STRING = "c6c15d08-81e9-47a1-9cdb-7be22f017ad5";
private static final List<String> FILTERS_UUID_STRING = List.of("fc3aa057-5fa4-4173-b1a8-16028f5eefd1", "f8773f32-f77c-4126-8c6f-a4af8bf6f788");
private static final UUID CASE_UUID = UUID.fromString(CASE_UUID_STRING);

@Autowired
Expand Down Expand Up @@ -262,4 +265,52 @@ void testExportFilter() throws Exception {

wireMockUtils.verifyFilterExport(stubUuid, FILTER_UUID_STRING, NETWORK_UUID_STRING);
}

@Test
void testExportFilters() throws Exception {
StudyEntity studyEntity = insertDummyStudy(UUID.fromString(NETWORK_UUID_STRING), CASE_UUID);
UUID firstRootNetworkUuid = studyTestUtils.getStudyFirstRootNetworkUuid(studyEntity.getId());
UUID studyUuid = studyEntity.getId();
String responseBody = """
[
{
"filterId":"fc3aa057-5fa4-4173-b1a8-16028f5eefd1",
"identifiableAttributes":[
{
"id":".TMP",
"type":"SUBSTATION",
"distributionKey":null
}
],
"notFoundEquipments":null
},
{
"filterId":"f8773f32-f77c-4126-8c6f-a4af8bf6f788",
"identifiableAttributes":[
{
"id":".TMP2",
"type":"SUBSTATION",
"distributionKey":null
},
{
"id":".TMP3",
"type":"SUBSTATION",
"distributionKey":null
},
],
"notFoundEquipments":null
}
]
""";
UUID stubUuid = wireMockUtils.stubFiltersExport(NETWORK_UUID_STRING, FILTERS_UUID_STRING, responseBody);

MvcResult mvcResult = mockMvc.perform(get("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/filters/elements?filtersUuid=" + FILTERS_UUID_STRING.stream().collect(Collectors.joining(",")),
studyUuid, firstRootNetworkUuid))
.andExpect(status().isOk())
.andReturn();
String resultAsString = mvcResult.getResponse().getContentAsString();
assertEquals(responseBody, resultAsString);

wireMockUtils.verifyFiltersExport(stubUuid, FILTERS_UUID_STRING, NETWORK_UUID_STRING);
}
}
18 changes: 18 additions & 0 deletions src/test/java/org/gridsuite/study/server/utils/WireMockUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -458,8 +458,26 @@ public UUID stubFilterExport(String networkUuid, String filterUuid, String respo
).getId();
}

public UUID stubFiltersExport(String networkUuid, List<String> filtersUuid, String responseBody) {
MappingBuilder requestPatternBuilder = WireMock.get(WireMock.urlPathEqualTo("/v1/filters/export"))
.withQueryParam(NETWORK_UUID, WireMock.equalTo(networkUuid));
for (String filterUuid : filtersUuid) {
requestPatternBuilder.withQueryParam(IDS, WireMock.equalTo(filterUuid));
}
return wireMock.stubFor(requestPatternBuilder.willReturn(WireMock.ok().withBody(responseBody))).getId();
}

public void verifyFilterExport(UUID stubUuid, String filterUuid, String networkUuid) {
verifyGetRequest(stubUuid, "/v1/filters/" + filterUuid + "/export",
Map.of(NETWORK_UUID, WireMock.equalTo(networkUuid)));
}

public void verifyFiltersExport(UUID stubUuid, List<String> filtersUuid, String networkUuid) {
Map<String, StringValuePattern> queryParams = new HashMap<>();
queryParams.put(NETWORK_UUID, WireMock.equalTo(networkUuid));
for (String filterUuid : filtersUuid) {
queryParams.put(IDS, WireMock.equalTo(filterUuid));
}
verifyGetRequest(stubUuid, "/v1/filters/export", queryParams);
}
}