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