Skip to content

Commit 2ba515d

Browse files
authored
Add filter and sort params in sensi results csv export (#829)
Signed-off-by: David BRAQUART <[email protected]>
1 parent d6617b9 commit 2ba515d

File tree

4 files changed

+52
-27
lines changed

4 files changed

+52
-27
lines changed

src/main/java/org/gridsuite/study/server/controller/StudyController.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1759,8 +1759,11 @@ public ResponseEntity<byte[]> exportSensitivityResultsAsCsv(
17591759
@Parameter(description = "study UUID") @PathVariable("studyUuid") UUID studyUuid,
17601760
@Parameter(description = "rootNetworkUuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid,
17611761
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
1762+
@Parameter(description = "results selector") @RequestParam("selector") String selector,
1763+
@Parameter(description = "JSON array of filters") @RequestParam(name = "filters", required = false) String filters,
1764+
@Parameter(description = "JSON array of global filters") @RequestParam(name = "globalFilters", required = false) String globalFilters,
17621765
@RequestBody SensitivityAnalysisCsvFileInfos sensitivityAnalysisCsvFileInfos) {
1763-
byte[] result = rootNetworkNodeInfoService.exportSensitivityResultsAsCsv(nodeUuid, rootNetworkUuid, sensitivityAnalysisCsvFileInfos);
1766+
byte[] result = rootNetworkNodeInfoService.exportSensitivityResultsAsCsv(nodeUuid, rootNetworkUuid, sensitivityAnalysisCsvFileInfos, selector, filters, globalFilters);
17641767
HttpHeaders responseHeaders = new HttpHeaders();
17651768
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
17661769
responseHeaders.setContentDispositionFormData("attachment", "sensitivity_results.csv");

src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,9 +586,12 @@ public String getSensitivityAnalysisResult(UUID nodeUuid, UUID rootNetworkUuid,
586586
}
587587

588588
@Transactional(readOnly = true)
589-
public byte[] exportSensitivityResultsAsCsv(UUID nodeUuid, UUID rootNetworkUuid, SensitivityAnalysisCsvFileInfos sensitivityAnalysisCsvFileInfos) {
589+
public byte[] exportSensitivityResultsAsCsv(UUID nodeUuid, UUID rootNetworkUuid, SensitivityAnalysisCsvFileInfos sensitivityAnalysisCsvFileInfos, String selector, String filters, String globalFilters) {
590+
RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findByNodeInfoIdAndRootNetworkId(nodeUuid, rootNetworkUuid).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND));
591+
String variantId = rootNetworkNodeInfoEntity.getVariantId();
592+
UUID networkUuid = rootNetworkNodeInfoEntity.getRootNetwork().getNetworkUuid();
590593
UUID resultUuid = getComputationResultUuid(nodeUuid, rootNetworkUuid, SENSITIVITY_ANALYSIS);
591-
return sensitivityAnalysisService.exportSensitivityResultsAsCsv(resultUuid, sensitivityAnalysisCsvFileInfos);
594+
return sensitivityAnalysisService.exportSensitivityResultsAsCsv(resultUuid, sensitivityAnalysisCsvFileInfos, networkUuid, variantId, selector, filters, globalFilters);
592595
}
593596

594597
@Transactional(readOnly = true)

src/main/java/org/gridsuite/study/server/service/SensitivityAnalysisService.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class SensitivityAnalysisService extends AbstractComputationService {
4545

4646
static final String RESULT_UUID = "resultUuid";
4747
private static final String RESULTS = "results";
48+
private static final String QUERY_PARAM_RESULTS_SELECTOR = "selector";
4849
private static final String PARAMETERS_URI = "/parameters/{parametersUuid}";
4950

5051
private String sensitivityAnalysisServerBaseUri;
@@ -115,7 +116,7 @@ public String getSensitivityAnalysisResult(UUID resultUuid, UUID networkUuid, St
115116
// initializing from uri string (not from path string) allows build() to escape selector content
116117
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(sensitivityAnalysisServerBaseUri)
117118
.pathSegment(SENSITIVITY_ANALYSIS_API_VERSION, RESULTS, resultUuid.toString())
118-
.queryParam("selector", selector);
119+
.queryParam(QUERY_PARAM_RESULTS_SELECTOR, selector);
119120

120121
if (StringUtils.isNotBlank(filters)) {
121122
uriBuilder.queryParam("filters", URLEncoder.encode(filters, StandardCharsets.UTF_8));
@@ -141,18 +142,26 @@ public String getSensitivityAnalysisResult(UUID resultUuid, UUID networkUuid, St
141142
return result;
142143
}
143144

144-
public byte[] exportSensitivityResultsAsCsv(UUID resultUuid, SensitivityAnalysisCsvFileInfos sensitivityAnalysisCsvFileInfos) {
145+
public byte[] exportSensitivityResultsAsCsv(UUID resultUuid, SensitivityAnalysisCsvFileInfos sensitivityAnalysisCsvFileInfos, UUID networkUuid, String variantId, String selector, String filters, String globalFilters) {
145146
if (resultUuid == null) {
146147
throw new StudyException(SENSITIVITY_ANALYSIS_NOT_FOUND);
147148
}
148149

149-
// initializing from uri string (not from path string) allows build() to escape selector content
150-
URI uri = UriComponentsBuilder.fromUriString(sensitivityAnalysisServerBaseUri)
150+
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(sensitivityAnalysisServerBaseUri)
151151
.pathSegment(SENSITIVITY_ANALYSIS_API_VERSION, RESULTS, resultUuid.toString(), "csv")
152-
.build()
153-
.encode()
154-
.toUri();
152+
.queryParam(QUERY_PARAM_RESULTS_SELECTOR, selector);
153+
if (StringUtils.isNotBlank(filters)) {
154+
uriBuilder.queryParam("filters", URLEncoder.encode(filters, StandardCharsets.UTF_8));
155+
}
156+
if (!StringUtils.isEmpty(globalFilters)) {
157+
uriBuilder.queryParam("globalFilters", URLEncoder.encode(globalFilters, StandardCharsets.UTF_8));
158+
uriBuilder.queryParam("networkUuid", networkUuid);
159+
if (!StringUtils.isBlank(variantId)) {
160+
uriBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId);
161+
}
162+
}
155163

164+
URI uri = uriBuilder.build().encode().toUri();
156165
HttpHeaders headers = new HttpHeaders();
157166
headers.setContentType(MediaType.APPLICATION_JSON);
158167

@@ -178,7 +187,7 @@ public String getSensitivityResultsFilterOptions(UUID resultUuid, String selecto
178187
// initializing from uri string (not from path string) allows build() to escape selector content
179188
URI uri = UriComponentsBuilder.fromUriString(sensitivityAnalysisServerBaseUri)
180189
.pathSegment(SENSITIVITY_ANALYSIS_API_VERSION, RESULTS, resultUuid.toString(), "filter-options")
181-
.queryParam("selector", selector).build().encode().toUri();
190+
.queryParam(QUERY_PARAM_RESULTS_SELECTOR, selector).build().encode().toUri();
182191
try {
183192
options = restTemplate.getForObject(uri, String.class);
184193
} catch (HttpStatusCodeException e) {

src/test/java/org/gridsuite/study/server/SensitivityAnalysisTest.java

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,11 @@ class SensitivityAnalysisTest {
181181
private static final String SENSITIVITY_ANALYSIS_STOPPED_DESTINATION = "sensitivityanalysis.stopped";
182182
private static final String SENSITIVITY_ANALYSIS_FAILED_DESTINATION = "sensitivityanalysis.run.dlx";
183183

184-
private static final byte[] SENSITIVITY_RESULTS_AS_CSV = {0x00, 0x01};
184+
private static final byte[] SENSITIVITY_RESULTS_AS_ZIPPED_CSV = {0x00, 0x01};
185185

186186
@Autowired
187187
private RootNetworkNodeInfoService rootNetworkNodeInfoService;
188188
@Autowired
189-
private StudyService studyService;
190-
@Autowired
191189
private TestUtils studyTestUtils;
192190

193191
@BeforeEach
@@ -254,9 +252,11 @@ public MockResponse dispatch(RecordedRequest request) {
254252
} else if (path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_RESULT_UUID + "/filter-options" + "\\?.*")
255253
|| path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/filter-options" + "\\?.*")) {
256254
return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), FAKE_RESULT_JSON);
257-
} else if (path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_RESULT_UUID + "/csv")
258-
|| path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/csv") && request.getMethod().equals("POST")) {
259-
return new MockResponse.Builder().code(200).body(getBinaryAsBuffer(SENSITIVITY_RESULTS_AS_CSV))
255+
} else if (path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_RESULT_UUID + "/csv\\?selector=fakeJsonSelector")
256+
|| path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_RESULT_UUID + "/csv\\?selector=fakeJsonSelector&filters=lineId2&globalFilters=ss&networkUuid=.*&variantId=.*")
257+
|| path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/csv\\?selector=fakeJsonSelector")
258+
|| path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/csv\\?selector=fakeJsonSelector&filters=lineId2&globalFilters=ss&networkUuid=.*&variantId=.*")) {
259+
return new MockResponse.Builder().code(200).body(getBinaryAsBuffer(SENSITIVITY_RESULTS_AS_ZIPPED_CSV))
260260
.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();
261261
} else if (path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_RESULT_UUID) && request.getMethod().equals("DELETE")) {
262262
return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), SENSITIVITY_ANALYSIS_STATUS_JSON);
@@ -306,7 +306,7 @@ public MockResponse dispatch(RecordedRequest request) {
306306
} else if (path.matches("/v1/results/" + SENSITIVITY_ANALYSIS_RESULT_UUID + "\\?filters=.*globalFilters=.*networkUuid=.*variantId.*sort=.*")) {
307307
return new MockResponse(200, Headers.of(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE), SENSITIVITY_ANALYSIS_RESULT_UUID);
308308
} else {
309-
LOGGER.error("Unhandled method+path: " + request.getMethod() + " " + request.getPath());
309+
LOGGER.error("Unhandled method+path: {} {}", request.getMethod(), request.getPath());
310310
return new MockResponse.Builder().code(418).body("Unhandled method+path: " + request.getMethod() + " " + request.getPath()).build();
311311
}
312312
}
@@ -374,19 +374,29 @@ private void testSensitivityAnalysisWithRootNetworkUuidAndNodeUuid(final MockWeb
374374
.language("en")
375375
.build());
376376

377-
mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv", studyUuid, rootNetworkUuid, UUID.randomUUID())
377+
// error case
378+
mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv?selector=fakeJsonSelector", studyUuid, rootNetworkUuid, UUID.randomUUID())
379+
.contentType(MediaType.APPLICATION_JSON)
380+
.header("userId", "userId")
381+
.content(content))
382+
.andExpectAll(status().isNotFound(), content().string("\"ROOT_NETWORK_NOT_FOUND\""));
383+
384+
// csv export with no filter
385+
mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv?selector=fakeJsonSelector", studyUuid, rootNetworkUuid, nodeUuid)
378386
.contentType(MediaType.APPLICATION_JSON)
379387
.header("userId", "userId")
380388
.content(content))
381-
.andExpectAll(status().isNotFound(), content().string("\"SENSITIVITY_ANALYSIS_NOT_FOUND\""));
389+
.andExpectAll(status().isOk(), content().bytes(SENSITIVITY_RESULTS_AS_ZIPPED_CSV));
390+
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.contains("/v1/results/" + resultUuid + "/csv?selector=fakeJsonSelector")));
382391

383-
mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv", studyUuid, rootNetworkUuid, nodeUuid)
392+
// csv export with filters
393+
mockMvc.perform(post("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/result/csv?selector=fakeJsonSelector&filters=lineId2&globalFilters=ss", studyUuid, rootNetworkUuid, nodeUuid)
384394
.contentType(MediaType.APPLICATION_JSON)
385395
.header("userId", "userId")
386396
.content(content))
387-
.andExpectAll(status().isOk(), content().bytes(SENSITIVITY_RESULTS_AS_CSV));
397+
.andExpectAll(status().isOk(), content().bytes(SENSITIVITY_RESULTS_AS_ZIPPED_CSV));
398+
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.contains("/v1/results/" + resultUuid + "/csv") && r.contains("filters=lineId2") && r.contains("globalFilters=ss")));
388399

389-
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.contains("/v1/results/" + resultUuid + "/csv")));
390400
// stop sensitivity analysis
391401
mockMvc.perform(put("/v1/studies/{studyUuid}/root-networks/{rootNetworkUuid}/nodes/{nodeUuid}/sensitivity-analysis/stop", studyUuid, rootNetworkUuid, nodeUuid)
392402
.header(HEADER_USER_ID, "userId"))
@@ -395,7 +405,7 @@ private void testSensitivityAnalysisWithRootNetworkUuidAndNodeUuid(final MockWeb
395405
sensitivityAnalysisStatusMessage = output.receive(TIMEOUT, STUDY_UPDATE_DESTINATION);
396406
assertEquals(studyUuid, sensitivityAnalysisStatusMessage.getHeaders().get(NotificationService.HEADER_STUDY_UUID));
397407
updateType = (String) sensitivityAnalysisStatusMessage.getHeaders().get(HEADER_UPDATE_TYPE);
398-
assertTrue(updateType.equals(NotificationService.UPDATE_TYPE_SENSITIVITY_ANALYSIS_STATUS) || updateType.equals(NotificationService.UPDATE_TYPE_SENSITIVITY_ANALYSIS_RESULT));
408+
assertTrue(NotificationService.UPDATE_TYPE_SENSITIVITY_ANALYSIS_STATUS.equals(updateType) || NotificationService.UPDATE_TYPE_SENSITIVITY_ANALYSIS_RESULT.equals(updateType));
399409

400410
assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + resultUuid + "/stop\\?receiver=.*nodeUuid.*")));
401411
}
@@ -542,12 +552,12 @@ void testResetUuidResultWhenSAFailed() throws Exception {
542552
assertNotNull(rootNetworkNodeInfoService.getComputationResultUuid(modificationNode.getId(), firstRootNetworkUuid, SENSITIVITY_ANALYSIS));
543553
assertEquals(resultUuid, rootNetworkNodeInfoService.getComputationResultUuid(modificationNode.getId(), firstRootNetworkUuid, SENSITIVITY_ANALYSIS));
544554

545-
StudyService studyService = Mockito.mock(StudyService.class);
555+
StudyService studyServiceMock = Mockito.mock(StudyService.class);
546556
doAnswer(invocation -> {
547557
input.send(MessageBuilder.withPayload("").setHeader(HEADER_RECEIVER, resultUuidJson).build(), SENSITIVITY_ANALYSIS_FAILED_DESTINATION);
548558
return resultUuid;
549-
}).when(studyService).runSensitivityAnalysis(any(), any(), any(), any());
550-
studyService.runSensitivityAnalysis(studyEntity.getId(), modificationNode.getId(), firstRootNetworkUuid, "testUserId");
559+
}).when(studyServiceMock).runSensitivityAnalysis(any(), any(), any(), any());
560+
studyServiceMock.runSensitivityAnalysis(studyEntity.getId(), modificationNode.getId(), firstRootNetworkUuid, "testUserId");
551561

552562
// Test reset uuid result in the database
553563
assertNull(rootNetworkNodeInfoService.getComputationResultUuid(modificationNode.getId(), firstRootNetworkUuid, SENSITIVITY_ANALYSIS));

0 commit comments

Comments
 (0)