Skip to content
Snippets Groups Projects
Commit 2a2fd2b4 authored by Lukasz Lopatowski's avatar Lukasz Lopatowski
Browse files

Merge branch...

Merge branch '213-reduce-the-amount-of-data-to-make-the-list-of-applications-load-faster' into 'develop'

Resolve "Reduce the amount of data to make the list of applications load faster"

See merge request !24
parents 601ab7c7 c478795f
No related branches found
No related tags found
1 merge request!24Resolve "Reduce the amount of data to make the list of applications load faster"
Pipeline #88841 passed
...@@ -20,6 +20,7 @@ import net.geant.nmaas.portal.api.domain.AppConfigurationSpecView; ...@@ -20,6 +20,7 @@ import net.geant.nmaas.portal.api.domain.AppConfigurationSpecView;
import net.geant.nmaas.portal.api.domain.AppDeploymentSpecView; import net.geant.nmaas.portal.api.domain.AppDeploymentSpecView;
import net.geant.nmaas.portal.api.domain.AppStorageVolumeView; import net.geant.nmaas.portal.api.domain.AppStorageVolumeView;
import net.geant.nmaas.portal.api.domain.ApplicationBaseView; import net.geant.nmaas.portal.api.domain.ApplicationBaseView;
import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS;
import net.geant.nmaas.portal.api.domain.ApplicationDTO; import net.geant.nmaas.portal.api.domain.ApplicationDTO;
import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest; import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest;
import net.geant.nmaas.portal.api.domain.ApplicationView; import net.geant.nmaas.portal.api.domain.ApplicationView;
...@@ -122,12 +123,13 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup { ...@@ -122,12 +123,13 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup {
@Test @Test
void shouldGetActiveApplications() throws Exception { void shouldGetActiveApplications() throws Exception {
log.error("Test = {} {}", this.applicationBaseRepository.findAll().size(), this.applicationBaseRepository.findAllSmall().size());
MvcResult result = mvc.perform(get("/api/apps/base") MvcResult result = mvc.perform(get("/api/apps/base")
.header("Authorization", "Bearer " + getValidTokenForUser(UsersHelper.ADMIN)) .header("Authorization", "Bearer " + getValidTokenForUser(UsersHelper.ADMIN))
.accept(MediaType.APPLICATION_JSON)) .accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()) .andExpect(status().isOk())
.andReturn(); .andReturn();
ApplicationBaseView[] resultView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationBaseView[].class); ApplicationBaseViewS[] resultView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationBaseViewS[].class);
assertEquals(1, resultView.length); assertEquals(1, resultView.length);
assertEquals(APP_1_NAME, resultView[0].getName()); assertEquals(APP_1_NAME, resultView[0].getName());
} }
...@@ -313,6 +315,14 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup { ...@@ -313,6 +315,14 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup {
.andReturn(); .andReturn();
ApplicationView applicationView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationView.class); ApplicationView applicationView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationView.class);
assertEquals(ApplicationState.DISABLED, applicationView.getState()); assertEquals(ApplicationState.DISABLED, applicationView.getState());
//reverse state to active again
mvc.perform(patch("/api/apps/state/" + id)
.header("Authorization", "Bearer " + getValidTokenForUser(UsersHelper.ADMIN))
.content(objectMapper.writeValueAsString(new ApplicationStateChangeRequest(ApplicationState.ACTIVE, "reason", false)))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
} }
@Test @Test
......
...@@ -91,7 +91,6 @@ public class ApplicationController extends AppBaseController { ...@@ -91,7 +91,6 @@ public class ApplicationController extends AppBaseController {
@Transactional @Transactional
public List<ApplicationBaseViewS> getAllActiveApplicationBase() { public List<ApplicationBaseViewS> getAllActiveApplicationBase() {
return appBaseService.findAllActiveAppsSmall().stream() return appBaseService.findAllActiveAppsSmall().stream()
.map(app -> modelMapper.map(app, ApplicationBaseViewS.class))
.map(this::setAppRating) .map(this::setAppRating)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
......
package net.geant.nmaas.portal.persistent.repositories; package net.geant.nmaas.portal.persistent.repositories;
import net.geant.nmaas.portal.api.domain.ApplicationBaseS; import net.geant.nmaas.portal.api.domain.ApplicationBaseS;
import net.geant.nmaas.portal.persistent.entity.AppDescription;
import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationBase;
import net.geant.nmaas.portal.persistent.entity.Tag;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
...@@ -26,7 +29,18 @@ public interface ApplicationBaseRepository extends JpaRepository<ApplicationBase ...@@ -26,7 +29,18 @@ public interface ApplicationBaseRepository extends JpaRepository<ApplicationBase
// " WHERE a.state = 'ACTIVE' ", nativeQuery = true) // " WHERE a.state = 'ACTIVE' ", nativeQuery = true)
// List<ApplicationBaseSTest> findAllSmallQuery(); // List<ApplicationBaseSTest> findAllSmallQuery();
@Query("Select ab from ApplicationBase ab JOIN ApplicationVersion av on av.appVersionId = ab.id WHERE av.state = 'ACTIVE'") @Query(value = "Select ab.* from application_base ab JOIN application_base_versions abv on abv.application_base_id = ab.id JOIN application_version av ON av.id = abv.versions_id WHERE av.state = 'ACTIVE'", nativeQuery = true)
List<ApplicationBaseS> findAllSmall(); List<ApplicationBaseS> findAllSmall();
// @Query(value = "select ad.* FROM app_description ad JOIN application_base_descriptions abd ON ad.id = abd.descriptions_id WHERE abd.application_base_id =:base_id", nativeQuery = true)
// List<AppDescription> findDescriptionsForBase(Long base_id);
//
// @Query(value = "select tg.* FROM tag tg JOIN application_base_tag abt ON tg.tag_id = abt.tag_id WHERE abt.application_base_id =?1", nativeQuery = true)
// List<Object> findTagsForBase(Long base_id);
@Query("Select ab.tags FROM ApplicationBase ab where ab.id =?1")
List<Tag> findAllBaseTag(Long base_id);
@Query("Select ab.descriptions FROM ApplicationBase ab where ab.id =?1")
List<AppDescription> findAllBaseDescription(Long base_id);
} }
\ No newline at end of file
package net.geant.nmaas.portal.persistent.repositories; package net.geant.nmaas.portal.persistent.repositories;
import java.util.Optional; import net.geant.nmaas.portal.persistent.entity.Tag;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import net.geant.nmaas.portal.persistent.entity.Tag; import java.util.Optional;
public interface TagRepository extends JpaRepository<Tag, Long> { public interface TagRepository extends JpaRepository<Tag, Long> {
Optional<Tag> findByName(String source); Optional<Tag> findByName(String source);
} }
\ No newline at end of file
...@@ -19,7 +19,7 @@ public interface ApplicationBaseService { ...@@ -19,7 +19,7 @@ public interface ApplicationBaseService {
List<ApplicationBase> findAll(); List<ApplicationBase> findAll();
List<ApplicationBase> findAllActiveApps(); List<ApplicationBase> findAllActiveApps();
List<ApplicationBaseS> findAllActiveAppsSmall(); List<ApplicationBaseViewS> findAllActiveAppsSmall();
ApplicationBase getBaseApp(Long id); ApplicationBase getBaseApp(Long id);
ApplicationBase findByName(String name); ApplicationBase findByName(String name);
......
...@@ -2,7 +2,9 @@ package net.geant.nmaas.portal.service.impl; ...@@ -2,7 +2,9 @@ package net.geant.nmaas.portal.service.impl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.geant.nmaas.portal.api.domain.ApplicationBaseS; import net.geant.nmaas.portal.api.domain.AppDescriptionView;
import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS;
import net.geant.nmaas.portal.api.domain.TagView;
import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.MissingElementException;
import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.api.exception.ProcessingException;
import net.geant.nmaas.portal.events.ApplicationActivatedEvent; import net.geant.nmaas.portal.events.ApplicationActivatedEvent;
...@@ -16,6 +18,8 @@ import net.geant.nmaas.portal.service.ApplicationBaseService; ...@@ -16,6 +18,8 @@ import net.geant.nmaas.portal.service.ApplicationBaseService;
import net.geant.nmaas.portal.service.ApplicationStatePerDomainService; import net.geant.nmaas.portal.service.ApplicationStatePerDomainService;
import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.DomainService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -24,6 +28,7 @@ import java.time.OffsetDateTime; ...@@ -24,6 +28,7 @@ import java.time.OffsetDateTime;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
...@@ -39,6 +44,9 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { ...@@ -39,6 +44,9 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService {
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
private final DomainService domainService; private final DomainService domainService;
@Autowired
protected ModelMapper modelMapper;
@Override @Override
@Transactional @Transactional
public ApplicationBase create(ApplicationBase applicationBase) { public ApplicationBase create(ApplicationBase applicationBase) {
...@@ -121,8 +129,14 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { ...@@ -121,8 +129,14 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
public List<ApplicationBaseS> findAllActiveAppsSmall() { @Override
return appBaseRepository.findAllSmall(); public List<ApplicationBaseViewS> findAllActiveAppsSmall() {
return appBaseRepository.findAllSmall().stream()
.map(app -> modelMapper.map(app, ApplicationBaseViewS.class))
.peek(app -> app.setDescriptions(List.of(modelMapper.map(appBaseRepository.findAllBaseDescription(app.getId()), AppDescriptionView[].class))))
.peek(app -> app.setTags(Set.of(modelMapper.map(appBaseRepository.findAllBaseTag(app.getId()), TagView[].class))))
.collect(Collectors.toList());
} }
@Override @Override
......
...@@ -14,6 +14,7 @@ import net.geant.nmaas.portal.service.ApplicationStatePerDomainService; ...@@ -14,6 +14,7 @@ import net.geant.nmaas.portal.service.ApplicationStatePerDomainService;
import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.DomainService;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.modelmapper.ModelMapper;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import java.util.Collections; import java.util.Collections;
...@@ -43,11 +44,13 @@ public class ApplicationBaseServiceTest { ...@@ -43,11 +44,13 @@ public class ApplicationBaseServiceTest {
private final ApplicationEventPublisher eventPublisher= mock(ApplicationEventPublisher.class); private final ApplicationEventPublisher eventPublisher= mock(ApplicationEventPublisher.class);
private final DomainService domainService = mock(DomainService.class); private final DomainService domainService = mock(DomainService.class);
private final ModelMapper modelMapper = new ModelMapper();
private ApplicationBaseService appBaseService; private ApplicationBaseService appBaseService;
@BeforeEach @BeforeEach
void setup() { void setup() {
this.appBaseService = new ApplicationBaseServiceImpl(appBaseRepo, tagRepo, applicationStatePerDomainService,eventPublisher, domainService); this.appBaseService = new ApplicationBaseServiceImpl(appBaseRepo, tagRepo, applicationStatePerDomainService,eventPublisher, domainService, modelMapper);
applicationBase1.setDescriptions(Collections.singletonList( applicationBase1.setDescriptions(Collections.singletonList(
new AppDescription(11L, "en", "description", "full description") new AppDescription(11L, "en", "description", "full description")
)); ));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment