Skip to content
Open
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 @@ -10,36 +10,37 @@
import org.gridsuite.filter.FilterLoader;
import org.gridsuite.filter.server.repositories.proxies.AbstractFilterRepositoryProxy;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;

/**
* @author Franck Lecuyer <franck.lecuyer at rte-france.com>
*/
public class FilterLoaderImpl implements FilterLoader {
public class DefaultFilterLoader implements FilterLoader {
private final Map<String, AbstractFilterRepositoryProxy<?, ?>> filterRepositories;

public FilterLoaderImpl(Map<String, AbstractFilterRepositoryProxy<?, ?>> filterRepositories) {
public DefaultFilterLoader(Map<String, AbstractFilterRepositoryProxy<?, ?>> filterRepositories) {
this.filterRepositories = filterRepositories;
}

private Optional<AbstractFilter> getFilter(UUID id) {
Objects.requireNonNull(id);
@Override
public List<AbstractFilter> getFilters(List<UUID> uuids) {
List<UUID> uuidsLoading = new ArrayList<>(uuids);
List<AbstractFilter> result = new ArrayList<>();
for (AbstractFilterRepositoryProxy<?, ?> repository : filterRepositories.values()) {
Optional<AbstractFilter> res = repository.getFilter(id);
if (res.isPresent()) {
return res;
List<AbstractFilter> partialResult = repository.getFilters(uuidsLoading);
result.addAll(partialResult);

// prepare next iteration
List<UUID> foundUuids = partialResult.stream().map(AbstractFilter::getId).toList();
uuidsLoading.removeAll(foundUuids);
if (uuidsLoading.isEmpty()) {
break;
}
}
return Optional.empty();
}

@Override
public List<AbstractFilter> getFilters(List<UUID> uuids) {
return uuids.stream()
.map(id -> getFilter(id).orElse(null)).toList();
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import org.gridsuite.filter.identifierlistfilter.FilterEquipments;
import org.gridsuite.filter.identifierlistfilter.FilteredIdentifiables;
import org.gridsuite.filter.identifierlistfilter.IdentifiableAttributes;
import org.gridsuite.filter.server.dto.FilterAttributes;
import org.gridsuite.filter.server.dto.FiltersWithEquipmentTypes;
import org.gridsuite.filter.api.dto.FilterAttributes;
import org.gridsuite.filter.server.dto.IdsByGroup;
import org.gridsuite.filter.api.dto.FiltersWithEquipmentTypes;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
Expand Down
61 changes: 5 additions & 56 deletions src/main/java/org/gridsuite/filter/server/FilterService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package org.gridsuite.filter.server;

import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.IdentifiableType;
import com.powsybl.iidm.network.Network;
import com.powsybl.network.store.client.NetworkStoreService;
import com.powsybl.network.store.client.PreloadingStrategy;
Expand All @@ -16,21 +15,18 @@
import org.gridsuite.filter.AbstractFilter;
import org.gridsuite.filter.FilterLoader;
import org.gridsuite.filter.IFilterAttributes;
import org.gridsuite.filter.api.FilterEvaluator;
import org.gridsuite.filter.api.dto.FilterAttributes;
import org.gridsuite.filter.api.dto.FiltersWithEquipmentTypes;
import org.gridsuite.filter.exception.FilterCycleException;
import org.gridsuite.filter.expertfilter.ExpertFilter;
import org.gridsuite.filter.identifierlistfilter.FilterEquipments;
import org.gridsuite.filter.identifierlistfilter.FilteredIdentifiables;
import org.gridsuite.filter.identifierlistfilter.IdentifiableAttributes;
import org.gridsuite.filter.server.dto.EquipmentTypesByFilterId;
import org.gridsuite.filter.server.dto.FilterAttributes;
import org.gridsuite.filter.server.dto.FiltersWithEquipmentTypes;
import org.gridsuite.filter.server.dto.IdsByGroup;
import org.gridsuite.filter.server.error.FilterBusinessErrorCode;
import org.gridsuite.filter.server.error.FilterException;
import org.gridsuite.filter.server.repositories.proxies.AbstractFilterRepositoryProxy;
import org.gridsuite.filter.server.service.DirectoryService;
import org.gridsuite.filter.server.utils.FilterWithEquipmentTypesUtils;
import org.gridsuite.filter.utils.EquipmentType;
import org.gridsuite.filter.utils.FilterServiceUtils;
import org.gridsuite.filter.utils.FilterType;
import org.gridsuite.filter.utils.expertfilter.FilterCycleDetector;
Expand All @@ -41,7 +37,6 @@
import org.springframework.web.server.ResponseStatusException;

import java.util.*;
import java.util.Comparator;
import java.util.stream.Collectors;

/**
Expand All @@ -61,6 +56,7 @@ public class FilterService {
private final NetworkStoreService networkStoreService;
private final NotificationService notificationService;
private final DirectoryService directoryService;
private final FilterEvaluator filterEvaluator;

public List<IFilterAttributes> getFilters() {
return this.repositoriesService.getFiltersAttributes()
Expand Down Expand Up @@ -251,55 +247,8 @@ public List<IdentifiableAttributes> evaluateFilter(AbstractFilter filter, UUID n

@Transactional(readOnly = true)
public FilteredIdentifiables evaluateFiltersWithEquipmentTypes(FiltersWithEquipmentTypes filtersWithEquipmentTypes, UUID networkUuid, String variantId) {
Map<String, IdentifiableAttributes> result = new TreeMap<>();
Map<String, IdentifiableAttributes> notFound = new TreeMap<>();
Network network = getNetwork(networkUuid, variantId);
FilterLoader filterLoader = this.repositoriesService.getFilterLoader();

filtersWithEquipmentTypes.filters().forEach((FilterAttributes filterAttributes) -> {
UUID filterUuid = filterAttributes.getId();
Optional<AbstractFilter> optFilter = this.repositoriesService.getFilter(filterUuid);
if (optFilter.isEmpty()) {
return;
}
AbstractFilter filter = optFilter.get();
Objects.requireNonNull(filter);
EquipmentType filterEquipmentType = filter.getEquipmentType();
FilteredIdentifiables filteredIdentifiables = filter.toFilteredIdentifiables(FilterServiceUtils.getIdentifiableAttributes(filter, network, filterLoader));

// unduplicate equipments and merge in common lists
if (filteredIdentifiables.notFoundIds() != null) {
filteredIdentifiables.notFoundIds().forEach(element -> notFound.put(element.getId(), element));
}

if (filteredIdentifiables.equipmentIds() != null) {
if (filterEquipmentType != EquipmentType.SUBSTATION && filterEquipmentType != EquipmentType.VOLTAGE_LEVEL) {
filteredIdentifiables.equipmentIds().forEach(element -> result.put(element.getId(), element));
} else {
Set<IdentifiableType> selectedEquipmentTypes = filtersWithEquipmentTypes.selectedEquipmentTypesByFilter()
.stream()
.filter(equipmentTypesByFilterId -> equipmentTypesByFilterId.filterId().equals(filterUuid))
.findFirst()
.map(EquipmentTypesByFilterId::equipmentTypes)
.orElseThrow(
() -> new IllegalStateException("No selected equipment types for filter " + filterUuid
+ " : substation and voltage level filters should contain an equipment types list")
);

// This list is the result of the original filter and so necessarily contains a list of IDs of substations or voltage levels
Set<String> filteredEquipmentIds = filteredIdentifiables.equipmentIds().stream().map(IdentifiableAttributes::getId).collect(Collectors.toSet());
List<ExpertFilter> filters = FilterWithEquipmentTypesUtils.createFiltersForSubEquipments(filterEquipmentType,
filteredEquipmentIds,
selectedEquipmentTypes);
filters.stream().flatMap(expertFilter -> getIdentifiableAttributes(expertFilter, networkUuid, variantId, filterLoader).stream())
.forEach(element -> result.put(element.getId(), element));
}
}
}
);
return new FilteredIdentifiables(
result.values().stream().sorted(Comparator.comparing(e -> e.getType().ordinal())).toList(),
notFound.values().stream().sorted(Comparator.comparing(e -> e.getType().ordinal())).toList());
return filterEvaluator.evaluateFilters(filtersWithEquipmentTypes, network);
}

@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import org.apache.commons.collections4.ListUtils;
import org.gridsuite.filter.AbstractFilter;
import org.gridsuite.filter.FilterLoader;
import org.gridsuite.filter.server.dto.FilterAttributes;
import org.gridsuite.filter.api.dto.FilterAttributes;
import org.gridsuite.filter.server.repositories.expertfilter.ExpertFilterRepository;
import org.gridsuite.filter.server.repositories.identifierlistfilter.IdentifierListFilterRepository;
import org.gridsuite.filter.server.repositories.proxies.AbstractFilterRepositoryProxy;
Expand Down Expand Up @@ -35,7 +35,7 @@ public RepositoryService(final IdentifierListFilterRepository identifierListFilt
final ExpertFilterRepository expertFilterRepository) {
this.identifierListFilterProxy = new IdentifierListFilterRepositoryProxy(identifierListFilterRepository);
this.expertFilterProxy = new ExpertFilterRepositoryProxy(expertFilterRepository);
this.filterLoader = new FilterLoaderImpl(Map.of(
this.filterLoader = new DefaultFilterLoader(Map.of(
FilterType.IDENTIFIER_LIST.name(), this.identifierListFilterProxy,
FilterType.EXPERT.name(), this.expertFilterProxy
));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.gridsuite.filter.server.configs;

import org.gridsuite.filter.api.FilterEvaluator;
import org.gridsuite.filter.api.FilterEvaluatorFactory;
import org.gridsuite.filter.server.RepositoryService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
@Bean
public FilterEvaluator filterEvaluator(RepositoryService repositoriesService) {
return FilterEvaluatorFactory.create(repositoriesService.getFilterLoader());
}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

package org.gridsuite.filter.server.repositories;

import org.gridsuite.filter.api.dto.FilterMetadata;
import org.gridsuite.filter.server.entities.AbstractFilterEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
package org.gridsuite.filter.server.repositories.proxies;

import org.gridsuite.filter.AbstractFilter;
import org.gridsuite.filter.server.dto.FilterAttributes;
import org.gridsuite.filter.api.dto.FilterAttributes;
import org.gridsuite.filter.server.entities.AbstractFilterEntity;
import org.gridsuite.filter.server.repositories.FilterMetadata;
import org.gridsuite.filter.api.dto.FilterMetadata;
import org.gridsuite.filter.server.repositories.FilterRepository;
import org.gridsuite.filter.utils.EquipmentType;
import org.gridsuite.filter.utils.FilterType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@
import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl;
import org.gridsuite.filter.AbstractFilter;
import org.gridsuite.filter.IFilterAttributes;
import org.gridsuite.filter.api.dto.EquipmentTypesByFilterId;
import org.gridsuite.filter.api.dto.FilterAttributes;
import org.gridsuite.filter.api.dto.FiltersWithEquipmentTypes;
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;
import org.gridsuite.filter.server.dto.*;
import org.gridsuite.filter.identifierlistfilter.*;
import org.gridsuite.filter.server.dto.ElementAttributes;
import org.gridsuite.filter.server.dto.IdsByGroup;
import org.gridsuite.filter.server.service.DirectoryService;
import org.gridsuite.filter.server.utils.MatcherJson;
import org.gridsuite.filter.server.utils.assertions.Assertions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.gridsuite.filter.server;

import com.powsybl.network.store.client.NetworkStoreService;
import org.gridsuite.filter.api.FilterEvaluator;
import org.gridsuite.filter.exception.FilterCycleException;
import org.gridsuite.filter.server.error.FilterException;
import org.gridsuite.filter.server.service.DirectoryService;
Expand All @@ -26,9 +27,7 @@
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.*;

/**
* @author Mohamed Ben-rejeb {@literal <mohamed.ben-rejeb at rte-france.com>}
Expand All @@ -44,13 +43,15 @@ class FilterServiceTest {
private NotificationService notificationService;
@Mock
private DirectoryService directoryService;
@Mock
private FilterEvaluator filterEvaluator;

@Autowired
private FilterService filterService;

@BeforeEach
void setUp() {
filterService = new FilterService(repositoryService, networkStoreService, notificationService, directoryService);
filterService = new FilterService(repositoryService, networkStoreService, notificationService, directoryService, filterEvaluator);
}

@Test
Expand Down
Loading
Loading