Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
4 changes: 1 addition & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
<properties>
<gridsuite-dependencies.version>43.1.0</gridsuite-dependencies.version>
<!-- TODO gridsuite-filter.version remove when upgrading gridsuite dependencies -->
<gridsuite-filter.version>1.9.0</gridsuite-filter.version>
<gridsuite-filter.version>1.10.0-SNAPSHOT</gridsuite-filter.version>
<string-template.version>4.3.1</string-template.version>
<liquibase-hibernate-package>org.gridsuite.filter.server</liquibase-hibernate-package>
<sonar.coverage.exclusions>**/migrations/**/*</sonar.coverage.exclusions>
Expand Down Expand Up @@ -88,8 +88,6 @@

<dependencyManagement>
<dependencies>


<!-- imports -->
<dependency>
<groupId>org.gridsuite</groupId>
Expand Down
136 changes: 44 additions & 92 deletions src/main/java/org/gridsuite/filter/server/FilterService.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.gridsuite.filter.server;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.gridsuite.filter.globalfilter.GlobalFilter;
import org.gridsuite.filter.utils.EquipmentType;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.NonNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.HttpClientErrorException;

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

@Validated
@RestController
@RequestMapping(value = "/" + FilterApi.API_VERSION + "/global-filter",
produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@Tag(name = "GlobalFilter component controller")
@AllArgsConstructor
public class GlobalFilterController {
private final GlobalFilterService service;

@PostMapping(value = "/")
@Operation(summary = "Get network equipments IDs that match the filter(s)")
@ApiResponse(responseCode = "200", description = "The filter")
@ApiResponse(responseCode = "400", description = "Invalid parameters")
@ApiResponse(responseCode = "404", description = "The filter does not exists")
public ResponseEntity<List<String>> getResults(
@Parameter(description = "The network UUID") @RequestParam(name = "networkUuid") @NonNull final UUID networkUuid,
@Parameter(description = "The variant ID of the network") @RequestParam(name = "variantId") @NonNull final String variantId,
@Parameter(description = "The equipments types to filter and return") @RequestParam(name = "equipmentTypes") @NonNull final List<EquipmentType> equipmentTypes,
@Parameter(description = "The filter(s) to apply") @RequestBody @NonNull final GlobalFilter filterParams) {
if (filterParams.isEmpty()) {
throw HttpClientErrorException.create(HttpStatus.BAD_REQUEST, "At least one filter must be specified.", null, null, null);
}
return ResponseEntity.ok(service.getFilteredIds(networkUuid, variantId, filterParams, equipmentTypes));
}
}
54 changes: 54 additions & 0 deletions src/main/java/org/gridsuite/filter/server/GlobalFilterService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.gridsuite.filter.server;

import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.Network;
import com.powsybl.network.store.client.NetworkStoreService;
import com.powsybl.network.store.client.PreloadingStrategy;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import org.gridsuite.filter.AbstractFilter;
import org.gridsuite.filter.globalfilter.AbstractGlobalFilterService;
import org.gridsuite.filter.globalfilter.GlobalFilter;
import org.gridsuite.filter.utils.EquipmentType;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;

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

@Service
@AllArgsConstructor
public class GlobalFilterService extends AbstractGlobalFilterService {
private final NetworkStoreService networkStoreService;
private final RepositoryService repositoriesService;

/** {@inheritDoc} */
@Override
protected Network getNetwork(@NonNull final UUID networkUuid, @NonNull final String variantId) {
try {
Network network = networkStoreService.getNetwork(networkUuid, PreloadingStrategy.COLLECTION);
network.getVariantManager().setWorkingVariant(variantId);
return network;
} catch (final PowsyblException ex) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, ex.getMessage());
}
}

/** {@inheritDoc} */
@Override
@Transactional(readOnly = true)
public List<AbstractFilter> getFilters(@NonNull final List<UUID> filtersUuids) {
return this.repositoriesService.getFilters(filtersUuids);
}

/* Expose it publicly */
/** {@inheritDoc} */
@Override
public List<String> getFilteredIds(@NonNull final UUID networkUuid, @NonNull final String variantId,
@NonNull final GlobalFilter globalFilter,
@NonNull final List<EquipmentType> equipmentTypes) {
return super.getFilteredIds(networkUuid, variantId, globalFilter, equipmentTypes);
}
}
98 changes: 98 additions & 0 deletions src/main/java/org/gridsuite/filter/server/RepositoryService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package org.gridsuite.filter.server;

import lombok.Getter;
import lombok.NonNull;
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.server.repositories.expertfilter.ExpertFilterRepository;
import org.gridsuite.filter.server.repositories.identifierlistfilter.IdentifierListFilterRepository;
import org.gridsuite.filter.server.repositories.proxies.AbstractFilterRepositoryProxy;
import org.gridsuite.filter.server.repositories.proxies.expertfiler.ExpertFilterRepositoryProxy;
import org.gridsuite.filter.server.repositories.proxies.identifierlistfilter.IdentifierListFilterRepositoryProxy;
import org.gridsuite.filter.utils.FilterType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Stream;

/**
* More an utility service to call a methode on all {@link AbstractFilterRepositoryProxy repositories}
* and merge the result.
*/
@Service
public class RepositoryService {
private final IdentifierListFilterRepositoryProxy identifierListFilterProxy;
private final ExpertFilterRepositoryProxy expertFilterProxy;
@Getter private final FilterLoader filterLoader;

public RepositoryService(final IdentifierListFilterRepository identifierListFilterRepository,
final ExpertFilterRepository expertFilterRepository) {
this.identifierListFilterProxy = new IdentifierListFilterRepositoryProxy(identifierListFilterRepository);
this.expertFilterProxy = new ExpertFilterRepositoryProxy(expertFilterRepository);
this.filterLoader = new FilterLoaderImpl(Map.of(
FilterType.IDENTIFIER_LIST.name(), this.identifierListFilterProxy,
FilterType.EXPERT.name(), this.expertFilterProxy
));
}

public AbstractFilterRepositoryProxy<?, ?> getRepositoryFromType(@NonNull final FilterType type) {
return switch (type) {
case IDENTIFIER_LIST -> identifierListFilterProxy;
case EXPERT -> expertFilterProxy;
};
}

public AbstractFilterRepositoryProxy<?, ?> getRepositoryFromType(@NonNull final AbstractFilter filter) {
return this.getRepositoryFromType(filter.getType());
}

/** @see AbstractFilterRepositoryProxy#deleteById(UUID) */
public boolean deleteFilter(@NonNull final UUID id) {
return this.identifierListFilterProxy.deleteById(id) || this.expertFilterProxy.deleteById(id);
}

/** @see AbstractFilterRepositoryProxy#deleteAllByIds(List) */
public void deleteFilters(@NonNull final List<UUID> ids) {
this.identifierListFilterProxy.deleteAllByIds(ids);
this.expertFilterProxy.deleteAllByIds(ids);
}

/** @see AbstractFilterRepositoryProxy#deleteAll() */
public void deleteAll() {
this.identifierListFilterProxy.deleteAll();
this.expertFilterProxy.deleteAll();
}

/** @see AbstractFilterRepositoryProxy#getFiltersAttributes() */
@Transactional(readOnly = true)
public Stream<FilterAttributes> getFiltersAttributes() {
return Stream.concat(this.identifierListFilterProxy.getFiltersAttributes(), this.expertFilterProxy.getFiltersAttributes());
}

/** @see AbstractFilterRepositoryProxy#getFiltersAttributes(List) */
@Transactional(readOnly = true)
public Stream<FilterAttributes> getFiltersAttributes(@NonNull final List<UUID> ids) {
return Stream.concat(this.identifierListFilterProxy.getFiltersAttributes(ids), this.expertFilterProxy.getFiltersAttributes(ids));
}

/** @see AbstractFilterRepositoryProxy#getFilters(List) */
@Transactional(readOnly = true)
public List<AbstractFilter> getFilters(@NonNull final List<UUID> ids) {
return ListUtils.union(
this.identifierListFilterProxy.getFilters(ids),
this.expertFilterProxy.getFilters(ids)
);
}

/** @see AbstractFilterRepositoryProxy#getFilter(UUID) */
@Transactional(readOnly = true)
public Optional<AbstractFilter> getFilter(@NonNull final UUID id) {
return this.identifierListFilterProxy.getFilter(id).or(() -> this.expertFilterProxy.getFilter(id));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.lang.NonNull;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
Expand All @@ -28,8 +29,14 @@ public interface FilterRepository<T extends AbstractFilterEntity> extends JpaRep
@Query(value = "SELECT t.id as id, t.modificationDate as modificationDate from #{#entityName} as t WHERE t.id in (:ids)")
List<FilterMetadata> findFiltersMetaDataById(List<UUID> ids);

/**
* Remove a filter by id.
* @param id the filter id
* @return the number of filter(s) removed ({@code 0} or {@code 1})
* @see #deleteById(Object) like deleteById(id) but with the indicator of either a filter has been removed or not
*/
@Transactional
Integer removeById(UUID id);
long removeById(@NonNull UUID id);

@Transactional
void deleteAllByIdIn(List<UUID> ids);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,7 @@ public static SortedSet<String> setToSorterSet(Set<String> set) {

public abstract FilterType getFilterType();

public abstract EquipmentType getEquipmentType();

public EquipmentType getEquipmentType(UUID id) {
return getEquipmentType();
}
public abstract EquipmentType getEquipmentType(UUID id);

public Optional<AbstractFilter> getFilter(UUID id) {
Optional<F> element = getRepository().findById(id);
Expand All @@ -76,7 +72,7 @@ public Stream<FilterAttributes> getFiltersAttributes(List<UUID> ids) {
return getRepository().findFiltersMetaDataById(ids).stream().map(this::metadataToAttribute);
}

FilterAttributes metadataToAttribute(FilterMetadata f) {
private FilterAttributes metadataToAttribute(final FilterMetadata f) {
return new FilterAttributes(f, getFilterType(), getEquipmentType(f.getId()));
}

Expand All @@ -94,8 +90,13 @@ public AbstractFilter modify(UUID id, AbstractFilter f) {
return toDto(getRepository().save(fromDto(f)));
}

/**
* Delete a filter by its id.
* @param id the filter id
* @return true if the filter has been deleted, false otherwise
*/
public boolean deleteById(UUID id) {
return getRepository().removeById(id) != 0;
return getRepository().removeById(id) > 0L;
}

public void deleteAllByIds(List<UUID> ids) {
Expand All @@ -106,7 +107,7 @@ public void deleteAll() {
getRepository().deleteAll();
}

public void buildAbstractFilter(AbstractFilterEntity.AbstractFilterEntityBuilder<?, ?> builder, AbstractFilter dto) {
public static void buildAbstractFilter(AbstractFilterEntity.AbstractFilterEntityBuilder<?, ?> builder, AbstractFilter dto) {
/* modification date is managed by jpa, so we don't process it */
builder.id(dto.getId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,6 @@ public FilterType getFilterType() {
return FilterType.EXPERT;
}

@Override
public EquipmentType getEquipmentType() {
throw new UnsupportedOperationException("A filter id must be provided to get equipment type !!");
}

@Override
public EquipmentType getEquipmentType(UUID id) {
return expertFilterRepository.findById(id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,6 @@ public FilterType getFilterType() {
return FilterType.IDENTIFIER_LIST;
}

@Override
public EquipmentType getEquipmentType() {
throw new UnsupportedOperationException("A filter id must be provided to get equipment type !!");
}

@Override
public EquipmentType getEquipmentType(UUID id) {
return identifierListFilterRepository.findById(id)
Expand Down
Loading