From 2fa33e347005fc973f13f9d52d01561fef5743c4 Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Fri, 23 Aug 2024 13:18:33 +0300 Subject: [PATCH] added pagination to get all registries controller --- .../queue/register/RegistryController.java | 94 ++++++++++++++----- .../backendapi/service/IStateLoader.java | 9 +- .../service/impl/StateLoaderImpl.java | 16 +++- .../iml/hazelcast/adapter/ImdgHazelcast.java | 18 ++++ .../java/ru/spcex/platform/imdg/api/Imdg.java | 4 + 5 files changed, 113 insertions(+), 28 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java index 8a9a88bba..d33499275 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java @@ -4,16 +4,33 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import java.time.LocalDate; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.StopWatch; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.server.ResponseStatusException; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController; -import ru.spcex.clearing.backendapi.controller.request.cud.registry.*; +import ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeRefundDateActionNew; +import ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeStatusExtractActionNew; +import ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew; +import ru.spcex.clearing.backendapi.controller.request.cud.registry.RSplitDepositActionNew; +import ru.spcex.clearing.backendapi.controller.request.cud.registry.ReturnDepositActionNew; import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse; @@ -22,14 +39,11 @@ import ru.spcex.clearing.backendapi.service.IStateLoader; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; - -import java.time.LocalDate; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ExecutionException; +import ru.spcex.platform.utils.enumeration.IEnumKey; @Controller @RequestMapping("/registries") @@ -51,26 +65,64 @@ public class RegistryController extends AbstractQueueController { @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) @RequestMapping(method = RequestMethod.GET) @ResponseBody - public CommonGetAllResponse getAll() { -// long t1 = System.currentTimeMillis(); - ImdgPredicate filter = predicateBuilder.or( + public CommonGetAllResponse getAll(@RequestParam(name = "designation", required = false) List designations, + @RequestParam(name = "status", required = false) String status, + @RequestParam(name = "pageSize", required = false) Integer pageSize, + @RequestParam(name = "pageIndex", required = false) Integer pageIndex) { + if (designations != null && !designations.isEmpty()) { + for (String designation : designations) { + if (IEnumKey.getEnumByKey(RegistryDesignation.class, designation) == null) { + throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Unknown registry designation: " + designation); + } + } + } + if (status != null && !status.isEmpty() && IEnumKey.getEnumByKey(RegistryStatus.class, status) == null) { + throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Unknown registry status: " + status); + } + + StopWatch sw = new StopWatch("registry-controller-stopwatch"); + sw.start(); + ImdgPredicate filter; + if (designations == null || designations.isEmpty()) { + filter = predicateBuilder.or( predicateBuilder.equals("registryDesignation", RegistryDesignation.A.getKey()), predicateBuilder.equals("registryDesignation", RegistryDesignation.D.getKey()), predicateBuilder.and( - predicateBuilder.or( - predicateBuilder.equals("registryDesignation", RegistryDesignation.O.getKey()), - predicateBuilder.equals("registryDesignation", RegistryDesignation.T.getKey()) - ), - predicateBuilder.greatEqual("settlementDate", LocalDate.now()) + predicateBuilder.or( + predicateBuilder.equals("registryDesignation", RegistryDesignation.O.getKey()), + predicateBuilder.equals("registryDesignation", RegistryDesignation.T.getKey()) + ), + predicateBuilder.greatEqual("settlementDate", LocalDate.now()) ) - ); - Collection> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, - filter); -// long t2 = System.currentTimeMillis(); -// log.info("Info select and format {} data {}", all.size(), t2 - t1); + ); + + if (status != null && !status.isEmpty()) { + filter = predicateBuilder.and(filter, predicateBuilder.in("status", status)); + } + } else if (status == null || status.isEmpty()) { + filter = predicateBuilder.in("registryDesignation", designations.toArray(String[]::new)); + } else { + filter = predicateBuilder.and( + predicateBuilder.in("registryDesignation", designations.toArray(String[]::new)), + predicateBuilder.in("status", status) + ); + } + + Collection> all; + if (pageSize != null && pageIndex != null) { + all = stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_Registry, Registry.class, filter, pageSize, pageIndex); + } else { + all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, filter); + } + + sw.stop(); + log.info("Info select and format {} data took {} ms", all.size(), sw.getLastTaskTimeMillis()); + + sw.start(); CommonGetAllResponse response = new CommonGetAllResponse(); response.fromEntity(all); -// log.info("Info select and format {} data {}", all.size(), System.currentTimeMillis() - t2); + sw.stop(); + log.info("Info select and format {} data {}", all.size(), sw.getLastTaskTimeMillis()); return response; } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java index 6b403ccc2..ac8442ffc 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java @@ -17,9 +17,10 @@ public interface IStateLoader { Collection> getAllMetaTransformSpecificClass(String mapName, Class clazz); Collection> getAllMetaTransform(String mapName, Class clazz, Map> conditions); Collection> getAllMetaTransform(String mapName, Class clazz, ImdgPredicate conditions); + Collection> getAllMetaTransformWithPagination(String mapName, Class clazz, ImdgPredicate conditions, Integer pageSize, Integer pageIndex); Collection> getAllMetaTransform( - String searchMapName, - String mapName, - Class clazz, - ImdgPredicate conditions); + String searchMapName, + String mapName, + Class clazz, + ImdgPredicate conditions); } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java index dcc6f5fee..eaa7dbf73 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.backendapi.service.impl; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -10,9 +16,6 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - @Service public class StateLoaderImpl implements IStateLoader { private final Map> allImdgMaps; @@ -73,6 +76,13 @@ public class StateLoaderImpl implements IStateLoader { return responseFactory.responseFromObjectCollection(all); } + @Override + public Collection> getAllMetaTransformWithPagination(String mapName, Class clazz, ImdgPredicate conditions, Integer pageSize, Integer pageIndex) { + Imdg imdg = getImdg(mapName, clazz); + Collection all = imdg.getCollectionObjectsByPredicateWithPaging(conditions, pageSize, pageIndex); + return responseFactory.responseFromObjectCollection(all); + } + @SuppressWarnings("unchecked") private Imdg getImdg(String mapName, Class clazz) { return (Imdg) allImdgMaps.computeIfAbsent(mapName, (mapName1) -> imdgProvider.getImdg(mapName, clazz)); diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index ffa8bc146..99d766c1b 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -1,5 +1,6 @@ package ru.spcex.platform.imdg.iml.hazelcast.adapter; +import com.hazelcast.query.PagingPredicate; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -319,6 +320,23 @@ public class ImdgHazelcast implements Imdg { return searchResult; } + public Collection getCollectionObjectsByPredicateWithPaging(ImdgPredicate predicate, Integer pageSize, Integer pageIndex) { + Predicate hazelcastPredicate = ((ImdgPredicateHazelcast) predicate).getRawPredicate(); + PagingPredicate pagingPredicate = new PagingPredicate(hazelcastPredicate, pageSize); + pagingPredicate.setPage(pageIndex); + + Set ids = map.keySet(pagingPredicate); + Iterator idIterator = ids.iterator(); + Collection searchResult = new ArrayList<>(); + while (idIterator.hasNext()) { + T element = map.get(idIterator.next()); + if (element != null) { + searchResult.add(element); + } + } + return searchResult; + } + @Override public T getSingleObjectByPredicate(ImdgPredicate predicate) { Collection els = getCollectionObjectsByPredicate(predicate); diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java index d728806c8..996fec6e5 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java @@ -116,6 +116,10 @@ public interface Imdg { throw new UnsupportedOperationException("not implemented getCollectionObjectsByPredicate"); } + default Collection getCollectionObjectsByPredicateWithPaging(ImdgPredicate predicate, Integer pageSize, Integer pageIndex) { + throw new UnsupportedOperationException("not implemented getCollectionObjectsByPredicateWithPaging"); + } + // Predicate API default T getSingleObjectByPredicate(ImdgPredicate predicate) { throw new UnsupportedOperationException("not implemented getSingleObjectByPredicate");