From 2a47a442be3eefca23a4261e996078cf40ddecb9 Mon Sep 17 00:00:00 2001 From: Trisha Anand Date: Wed, 11 Dec 2019 10:29:12 +0000 Subject: [PATCH] Removes pageId from actions no longer in DSL and adds pageIds for actions in DSL in actions collection --- .../server/repositories/ActionRepository.java | 8 +++ .../server/services/ActionService.java | 7 +++ .../server/services/ActionServiceImpl.java | 10 ++++ .../server/services/LayoutServiceImpl.java | 53 +++++++++++++++---- 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ActionRepository.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ActionRepository.java index 739521093d..519cb012c0 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ActionRepository.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ActionRepository.java @@ -2,13 +2,21 @@ package com.appsmith.server.repositories; import com.appsmith.server.domains.Action; import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.List; +import java.util.Set; + @Repository public interface ActionRepository extends BaseRepository { Mono findById(String id); Mono findByName(String name); + + Flux findActionsByNameIn(Set names); + + Flux saveAll(List actions); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionService.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionService.java index 1f31165b6c..7c6b34f8ae 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionService.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionService.java @@ -3,8 +3,12 @@ package com.appsmith.server.services; import com.appsmith.external.models.ActionExecutionResult; import com.appsmith.server.domains.Action; import com.appsmith.server.dtos.ExecuteActionDTO; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.List; +import java.util.Set; + public interface ActionService extends CrudService { Mono executeAction(ExecuteActionDTO executeActionDTO); @@ -13,4 +17,7 @@ public interface ActionService extends CrudService { Mono findByName(String name); + Flux findActionsByNameIn(Set names); + + Flux saveAll(List actions); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java index 1b789dae34..88937ff3c7 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java @@ -381,6 +381,16 @@ public class ActionServiceImpl extends BaseService findActionsByNameIn(Set names) { + return repository.findActionsByNameIn(names); + } + + @Override + public Flux saveAll(List actions) { + return repository.saveAll(actions); + } + /** * This function replaces the variables in the Object with the actual params diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/LayoutServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/LayoutServiceImpl.java index de17771f1d..a311fe9cce 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/LayoutServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/LayoutServiceImpl.java @@ -1,6 +1,7 @@ package com.appsmith.server.services; import com.appsmith.server.constants.FieldName; +import com.appsmith.server.domains.Action; import com.appsmith.server.domains.Layout; import com.appsmith.server.domains.Page; import com.appsmith.server.dtos.DslActionDTO; @@ -15,6 +16,8 @@ import org.jgrapht.graph.DefaultEdge; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -97,16 +100,8 @@ public class LayoutServiceImpl implements LayoutService { //Walk through the DSL and extract the basic relationship of widgets with actions in the DSL. extractWidgetRelationship(dsl, graph); - Mono> actionsInPage = Flux.fromIterable(graph.vertexSet()) - /** - * TODO : Instead of finding each action by name, bulk search for actions by Name should be done. - */ - .flatMap(mustacheKey -> actionService.findByName(mustacheKey)) - .map(action -> { - action.setPageId(pageId); - return action; - }) - .flatMap(actionService::save) + Mono> actionsInPage = updatePageIdsForActionsAndReturnDslActions(graph.vertexSet(), pageId) + .flatMapMany(Flux::fromIterable) .map(action -> { //Update the graph here to include action-widget dependecy via dynamic bindings in the action. if (action.getJsonPathKeys() != null && !action.getJsonPathKeys().isEmpty()) { @@ -271,5 +266,43 @@ public class LayoutServiceImpl implements LayoutService { return topVertices; } + Mono> updatePageIdsForActionsAndReturnDslActions(Set nodes, String pageId) { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.set(FieldName.PAGE_ID, pageId); + + Flux actionsInPage = actionService.get(params); + Flux actionsInDsl = actionService.findActionsByNameIn(nodes); + + Mono> actionsWithoutPage = actionsInPage + .map(action -> { + action.setPageId(null); + return action; + }).collectList(); + + Mono> actionsWithPage = actionsInDsl + .map(action -> { + action.setPageId(pageId); + return action; + }).collectList(); + + return Mono.zip(actionsWithoutPage, actionsWithPage) + .flatMap(tuple -> { + List olderActions = tuple.getT1(); + List newActions = tuple.getT2(); + for (Action oldAction:olderActions) { + for (Action newAction:newActions) { + if (oldAction.getName() == newAction.getName()) { + olderActions.remove(oldAction); + } + } + } + + newActions.addAll(olderActions); + return actionService.saveAll(newActions) + .collectList() + .then(actionsInDsl.collectList()); + }); + } + }