You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2023/03/03 01:53:15 UTC

[james-project] branch master updated: JAMES-2643 Optimize listing mapping by destination on top of JPA (#1472)

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e0d5e1750 JAMES-2643 Optimize listing mapping by destination on top of JPA (#1472)
9e0d5e1750 is described below

commit 9e0d5e1750dde8a88946ef7a4c87e78171f90be2
Author: Houssem Nasri <ho...@gmail.com>
AuthorDate: Fri Mar 3 02:53:07 2023 +0100

    JAMES-2643 Optimize listing mapping by destination on top of JPA (#1472)
---
 .../james/rrt/jpa/JPARecipientRewriteTable.java    | 38 +++++++++++++++++++---
 .../james/rrt/jpa/model/JPARecipientRewrite.java   | 22 ++++++++++---
 2 files changed, 51 insertions(+), 9 deletions(-)

diff --git a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
index 2b6d74e80f..1d33448a54 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
@@ -18,9 +18,16 @@
  ****************************************************************/
 package org.apache.james.rrt.jpa;
 
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.DELETE_MAPPING_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.SELECT_ALL_MAPPINGS_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.SELECT_SOURCES_BY_MAPPING_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.SELECT_USER_DOMAIN_MAPPING_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.UPDATE_MAPPING_QUERY;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
@@ -41,6 +48,8 @@ import org.apache.james.rrt.lib.MappingsImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
+
 /**
  * Class responsible to implement the Virtual User Table in database with JPA
  * access.
@@ -91,7 +100,7 @@ public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         try {
             @SuppressWarnings("unchecked")
-            List<JPARecipientRewrite> virtualUsers = entityManager.createNamedQuery("selectUserDomainMapping")
+            List<JPARecipientRewrite> virtualUsers = entityManager.createNamedQuery(SELECT_USER_DOMAIN_MAPPING_QUERY)
                 .setParameter("user", source.getFixedUser())
                 .setParameter("domain", source.getFixedDomain())
                 .getResultList();
@@ -113,7 +122,7 @@ public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
         Map<MappingSource, Mappings> mapping = new HashMap<>();
         try {
             @SuppressWarnings("unchecked")
-            List<JPARecipientRewrite> virtualUsers = entityManager.createNamedQuery("selectAllMappings").getResultList();
+            List<JPARecipientRewrite> virtualUsers = entityManager.createNamedQuery(SELECT_ALL_MAPPINGS_QUERY).getResultList();
             for (JPARecipientRewrite virtualUser : virtualUsers) {
                 mapping.put(MappingSource.fromUser(virtualUser.getUser(), virtualUser.getDomain()), MappingsImpl.fromRawString(virtualUser.getTargetAddress()));
             }
@@ -126,6 +135,27 @@ public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
         }
     }
 
+    @Override
+    public Stream<MappingSource> listSources(Mapping mapping) throws RecipientRewriteTableException {
+        Preconditions.checkArgument(listSourcesSupportedType.contains(mapping.getType()),
+                "Not supported mapping of type %s", mapping.getType());
+
+        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        try {
+            return entityManager.createNamedQuery(SELECT_SOURCES_BY_MAPPING_QUERY, JPARecipientRewrite.class)
+                .setParameter("targetAddress", mapping.asString())
+                .getResultList()
+                .stream()
+                .map(user -> MappingSource.fromUser(user.getUser(), user.getDomain()));
+        } catch (PersistenceException e) {
+             String error = "Unable to list sources by mapping";
+             LOGGER.debug(error, e);
+            throw new RecipientRewriteTableException(error, e);
+        } finally {
+            EntityManagerUtils.safelyClose(entityManager);
+        }
+    }
+
     @Override
     public void removeMapping(MappingSource source, Mapping mapping) throws RecipientRewriteTableException {
         Mappings map = getStoredMappings(source);
@@ -148,7 +178,7 @@ public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
         try {
             transaction.begin();
             int updated = entityManager
-                .createNamedQuery("updateMapping")
+                .createNamedQuery(UPDATE_MAPPING_QUERY)
                 .setParameter("targetAddress", mapping)
                 .setParameter("user", source.getFixedUser())
                 .setParameter("domain", source.getFixedDomain())
@@ -177,7 +207,7 @@ public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
         final EntityTransaction transaction = entityManager.getTransaction();
         try {
             transaction.begin();
-            entityManager.createNamedQuery("deleteMapping")
+            entityManager.createNamedQuery(DELETE_MAPPING_QUERY)
                 .setParameter("user", source.getFixedUser())
                 .setParameter("domain", source.getFixedDomain())
                 .setParameter("targetAddress", mapping)
diff --git a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
index 1edebadeef..47402762c0 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
@@ -18,6 +18,12 @@
  ****************************************************************/
 package org.apache.james.rrt.jpa.model;
 
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.DELETE_MAPPING_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.SELECT_ALL_MAPPINGS_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.SELECT_SOURCES_BY_MAPPING_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.SELECT_USER_DOMAIN_MAPPING_QUERY;
+import static org.apache.james.rrt.jpa.model.JPARecipientRewrite.UPDATE_MAPPING_QUERY;
+
 import java.io.Serializable;
 
 import javax.persistence.Column;
@@ -38,13 +44,19 @@ import com.google.common.base.Objects;
  */
 @Entity(name = "JamesRecipientRewrite")
 @Table(name = JPARecipientRewrite.JAMES_RECIPIENT_REWRITE)
-@NamedQueries({ 
-    @NamedQuery(name = "selectUserDomainMapping", query = "SELECT rrt FROM JamesRecipientRewrite rrt WHERE rrt.user=:user AND rrt.domain=:domain"),
-    @NamedQuery(name = "selectAllMappings", query = "SELECT rrt FROM JamesRecipientRewrite rrt"),
-    @NamedQuery(name = "deleteMapping", query = "DELETE FROM JamesRecipientRewrite rrt WHERE rrt.user=:user AND rrt.domain=:domain AND rrt.targetAddress=:targetAddress"),
-    @NamedQuery(name = "updateMapping", query = "UPDATE JamesRecipientRewrite rrt SET rrt.targetAddress=:targetAddress WHERE rrt.user=:user AND rrt.domain=:domain") })
+@NamedQueries({
+        @NamedQuery(name = SELECT_USER_DOMAIN_MAPPING_QUERY, query = "SELECT rrt FROM JamesRecipientRewrite rrt WHERE rrt.user=:user AND rrt.domain=:domain"),
+        @NamedQuery(name = SELECT_ALL_MAPPINGS_QUERY, query = "SELECT rrt FROM JamesRecipientRewrite rrt"),
+        @NamedQuery(name = DELETE_MAPPING_QUERY, query = "DELETE FROM JamesRecipientRewrite rrt WHERE rrt.user=:user AND rrt.domain=:domain AND rrt.targetAddress=:targetAddress"),
+        @NamedQuery(name = UPDATE_MAPPING_QUERY, query = "UPDATE JamesRecipientRewrite rrt SET rrt.targetAddress=:targetAddress WHERE rrt.user=:user AND rrt.domain=:domain"),
+        @NamedQuery(name = SELECT_SOURCES_BY_MAPPING_QUERY, query = "SELECT rrt FROM JamesRecipientRewrite rrt WHERE rrt.targetAddress=:targetAddress")})
 @IdClass(JPARecipientRewrite.RecipientRewriteTableId.class)
 public class JPARecipientRewrite {
+    public static final String SELECT_USER_DOMAIN_MAPPING_QUERY = "selectUserDomainMapping";
+    public static final String SELECT_ALL_MAPPINGS_QUERY = "selectAllMappings";
+    public static final String DELETE_MAPPING_QUERY = "deleteMapping";
+    public static final String UPDATE_MAPPING_QUERY = "updateMapping";
+    public static final String SELECT_SOURCES_BY_MAPPING_QUERY = "selectSourcesByMapping";
 
     public static final String JAMES_RECIPIENT_REWRITE = "JAMES_RECIPIENT_REWRITE";
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org