Skip to content
Open
Show file tree
Hide file tree
Changes from 9 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
2 changes: 2 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@
<dependency>
<groupId>org.gridsuite</groupId>
<artifactId>gridsuite-filter</artifactId>
<!-- TODO : remove version when lib is released -->
<version>1.9.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/org/gridsuite/filter/server/FilterController.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.gridsuite.filter.AbstractFilter;
import org.gridsuite.filter.IFilterAttributes;
import org.gridsuite.filter.identifierlistfilter.FilterEquipments;
import org.gridsuite.filter.identifierlistfilter.FilteredIdentifiables;
import org.gridsuite.filter.identifierlistfilter.IdentifiableAttributes;
import org.gridsuite.filter.server.dto.IdsByGroup;
import org.springframework.context.annotation.ComponentScan;
Expand Down Expand Up @@ -192,6 +193,18 @@ public ResponseEntity<List<FilterEquipments>> exportFilters(@RequestParam("ids")
.body(ret);
}

@GetMapping(value = "/filters/evaluate/identifiables", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Export matched identifiables elements to JSON format")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "The list of matched elements")
})
public ResponseEntity<FilteredIdentifiables> evaluateFilters(@RequestParam("ids") List<UUID> ids,
@RequestParam(value = "networkUuid") UUID networkUuid,
@RequestParam(value = "variantUuid", required = false) String variantUuid) {
FilteredIdentifiables identifiableAttributes = service.evaluateFilters(ids, networkUuid, variantUuid);
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(identifiableAttributes);
}

@PostMapping(value = "/filters/evaluate", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Export matched elements to JSON format")
@ApiResponses(value = {
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/org/gridsuite/filter/server/FilterService.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.gridsuite.filter.IFilterAttributes;
import org.gridsuite.filter.identifierlistfilter.FilterEquipments;
import org.gridsuite.filter.identifierlistfilter.IdentifiableAttributes;
import org.gridsuite.filter.identifierlistfilter.FilteredIdentifiables;
import org.gridsuite.filter.server.dto.IdsByGroup;
import org.gridsuite.filter.server.entities.AbstractFilterEntity;
import org.gridsuite.filter.server.repositories.FilterRepository;
Expand Down Expand Up @@ -249,6 +250,34 @@ public List<IdentifiableAttributes> evaluateFilter(AbstractFilter filter, UUID n
return getIdentifiableAttributes(filter, networkUuid, variantId, filterLoader);
}

@Transactional(readOnly = true)
public FilteredIdentifiables evaluateFilters(List<UUID> filters, UUID networkUuid, String variantId) {
FilteredIdentifiables filteredIdentifiables = new FilteredIdentifiables();
Map<String, IdentifiableAttributes> result = new TreeMap<>();
Map<String, IdentifiableAttributes> notFound = new TreeMap<>();
Network network = getNetwork(networkUuid, variantId);
filters.forEach((UUID filterUuid) -> {
Optional<AbstractFilter> optFilter = getFilterFromRepository(filterUuid);
if (optFilter.isEmpty()) {
return;
}
AbstractFilter filter = optFilter.get();
Objects.requireNonNull(filter);
FilterLoader filterLoader = new FilterLoaderImpl(filterRepositories);
FilteredIdentifiables filterIdentiables = filter.toFilteredIdentifiables(FilterServiceUtils.getIdentifiableAttributes(filter, network, filterLoader));

// unduplicate equipments and merge in common lists
if (filterIdentiables.getNotFoundIds() != null) {
filterIdentiables.getNotFoundIds().forEach(element -> notFound.put(element.getId(), element));
}
filterIdentiables.getEquipmentIds().forEach(element -> result.put(element.getId(), element));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would implement the same safety than upper

}
);
filteredIdentifiables.setEquipmentIds(result.values().stream().toList());
filteredIdentifiables.setNotFoundIds(notFound.values().stream().toList());
return filteredIdentifiables;
}

@Transactional(readOnly = true)
public Optional<List<IdentifiableAttributes>> exportFilter(UUID id, UUID networkUuid, String variantId) {
Objects.requireNonNull(id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.gridsuite.filter.expertfilter.ExpertFilter;
import org.gridsuite.filter.expertfilter.expertrule.*;
import org.gridsuite.filter.identifierlistfilter.FilterEquipments;
import org.gridsuite.filter.identifierlistfilter.FilteredIdentifiables;
import org.gridsuite.filter.identifierlistfilter.IdentifiableAttributes;
import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter;
import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes;
Expand Down Expand Up @@ -421,6 +422,34 @@ private void checkIdentifiableAttributes(List<IdentifiableAttributes> identifiab
}
}

@Test
public void testEvaluateFilters() throws Exception {
UUID filterId = UUID.randomUUID();
ArrayList<AbstractExpertRule> rules = new ArrayList<>();
EnumExpertRule country1Filter = EnumExpertRule.builder().field(FieldType.COUNTRY_1).operator(OperatorType.IN)
.values(new TreeSet<>(Set.of("FR"))).build();
rules.add(country1Filter);
CombinatorExpertRule parentRule = CombinatorExpertRule.builder().combinator(CombinatorType.AND).rules(rules).build();
ExpertFilter lineFilter = new ExpertFilter(filterId, new Date(), EquipmentType.LINE, parentRule);
insertFilter(filterId, lineFilter);

// Apply filter by calling endPoint
List<String> filterIds = List.of(filterId.toString());
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.addAll("ids", filterIds);
params.add("networkUuid", NETWORK_UUID.toString());
FilteredIdentifiables result = objectMapper.readValue(mvc.perform(get(URL_TEMPLATE + "/evaluate/identifiables")
.params(params).contentType(APPLICATION_JSON)).andExpect(status().isOk())
.andReturn().getResponse().getContentAsString(), new TypeReference<>() { });

List<IdentifiableAttributes> expected = new ArrayList<>();
expected.add(new IdentifiableAttributes("NHV1_NHV2_1", IdentifiableType.LINE, null));
expected.add(new IdentifiableAttributes("NHV1_NHV2_2", IdentifiableType.LINE, null));
assertTrue(expected.size() == result.getEquipmentIds().size()
&& result.getEquipmentIds().containsAll(expected)
&& expected.containsAll(result.getEquipmentIds()));
}

@Test
public void testExportFilters() throws Exception {
UUID filterId = UUID.randomUUID();
Expand Down
Loading