Author: norman
Date: Wed Apr 13 16:02:56 2011
New Revision: 1091836

URL: http://svn.apache.org/viewvc?rev=1091836&view=rev
Log:
Optimize StoreMessageManager.expunge(..). See MAILBOX-50

Modified:
    
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
    
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
    
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMembership.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
    
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java

Modified: 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
 (original)
+++ 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
 Wed Apr 13 16:02:56 2011
@@ -375,14 +375,12 @@ public class JCRMessageMapper extends Ab
         return list;
     }
 
+
     /*
      * (non-Javadoc)
-     * 
-     * @see
-     * 
org.apache.james.mailbox.store.mail.MessageMapper#findMarkedForDeletionInMailbox
-     * (org.apache.james.mailbox.MessageRange)
+     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
 org.apache.james.mailbox.MessageRange)
      */
-    public List<MailboxMembership<String>> 
findMarkedForDeletionInMailbox(Mailbox<String> mailbox, MessageRange set) 
throws MailboxException {
+    public Iterator<Long> expungeMarkedForDeletionInMailbox(Mailbox<String> 
mailbox, MessageRange set) throws MailboxException {
         try {
             final List<MailboxMembership<String>> results;
             final long from = set.getUidFrom();
@@ -403,7 +401,14 @@ public class JCRMessageMapper extends Ab
                     results = findDeletedMessagesInMailboxBetweenUIDs(mailbox, 
from, to);
                     break;       
             }
-            return results;
+            List<Long> uids = new ArrayList<Long>();
+            for (int i = 0; i < results.size(); i++) {
+                MailboxMembership<String> m = results.get(i);
+                long uid = m.getUid();
+                delete(mailbox, m);
+                uids.add(uid);
+            }
+            return uids.iterator();
         } catch (RepositoryException e) {
             throw new MailboxException("Unable to search MessageRange " + set 
+ " in mailbox " + mailbox, e);
         }

Modified: 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
 Wed Apr 13 16:02:56 2011
@@ -135,56 +135,88 @@ public class JPAMessageMapper extends JP
          return query.getResultList();
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findMarkedForDeletionInMailbox(org.apache.james.mailbox.MessageRange)
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
 org.apache.james.mailbox.MessageRange)
      */
-    public List<MailboxMembership<Long>> 
findMarkedForDeletionInMailbox(Mailbox<Long> mailbox, final MessageRange set) 
throws MailboxException {
+    public Iterator<Long> expungeMarkedForDeletionInMailbox(Mailbox<Long> 
mailbox, final MessageRange set) throws MailboxException {
         try {
-            final List<MailboxMembership<Long>> results;
+            final List<Long> results;
             final long from = set.getUidFrom();
             final long to = set.getUidTo();
             switch (set.getType()) {
                 case ONE:
                     results = findDeletedMessagesInMailboxWithUID(mailbox, 
from);
+                    deleteDeletedMessagesInMailboxWithUID(mailbox, from);
                     break;
                 case RANGE:
                     results = findDeletedMessagesInMailboxBetweenUIDs(mailbox, 
from, to);
+                    deleteDeletedMessagesInMailboxBetweenUIDs(mailbox, from, 
to);
                     break;
                 case FROM:
                     results = findDeletedMessagesInMailboxAfterUID(mailbox, 
from);
+                    deleteDeletedMessagesInMailboxAfterUID(mailbox, from);
                     break;
                 default:
                 case ALL:
                     results = findDeletedMessagesInMailbox(mailbox);
+                    deleteDeletedMessagesInMailbox(mailbox);
                     break;
             }
-            return results;
+            
+            return results.iterator();
         } catch (PersistenceException e) {
             throw new MailboxException("Search of MessageRange " + set + " 
failed in mailbox " + mailbox, e);
         }
     }
 
+
+    private int deleteDeletedMessagesInMailbox(Mailbox<Long> mailbox) {
+        return 
getEntityManager().createNamedQuery("deleteDeletedMessagesInMailbox").setParameter("idParam",
 mailbox.getMailboxId()).executeUpdate();
+    }
+
+    private int deleteDeletedMessagesInMailboxAfterUID(Mailbox<Long> mailbox, 
long uid) {
+        return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailboxAfterUID")
+        .setParameter("idParam", mailbox.getMailboxId())
+        .setParameter("uidParam", uid).executeUpdate();
+    }
+
+    private int deleteDeletedMessagesInMailboxWithUID(Mailbox<Long> mailbox, 
long uid) {
+        return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailboxWithUID")
+        .setParameter("idParam", mailbox.getMailboxId())
+        .setParameter("uidParam", uid).setMaxResults(1).executeUpdate();
+    }
+
+    private int deleteDeletedMessagesInMailboxBetweenUIDs(Mailbox<Long> 
mailbox, long from, long to) {
+        return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailboxBetweenUIDs")
+        .setParameter("idParam", mailbox.getMailboxId())
+        .setParameter("fromParam", from)
+        .setParameter("toParam", to).executeUpdate();
+    }
+
+    
     @SuppressWarnings("unchecked")
-    private List<MailboxMembership<Long>> 
findDeletedMessagesInMailbox(Mailbox<Long> mailbox) {
+    private List<Long> findDeletedMessagesInMailbox(Mailbox<Long> mailbox) {
         return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailbox").setParameter("idParam",
 mailbox.getMailboxId()).getResultList();
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMembership<Long>> 
findDeletedMessagesInMailboxAfterUID(Mailbox<Long> mailbox, long uid) {
+    private List<Long> findDeletedMessagesInMailboxAfterUID(Mailbox<Long> 
mailbox, long uid) {
         return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailboxAfterUID")
         .setParameter("idParam", mailbox.getMailboxId())
         .setParameter("uidParam", uid).getResultList();
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMembership<Long>> 
findDeletedMessagesInMailboxWithUID(Mailbox<Long> mailbox, long uid) {
+    private List<Long> findDeletedMessagesInMailboxWithUID(Mailbox<Long> 
mailbox, long uid) {
         return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailboxWithUID")
         .setParameter("idParam", mailbox.getMailboxId())
         .setParameter("uidParam", uid).setMaxResults(1).getResultList();
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMembership<Long>> 
findDeletedMessagesInMailboxBetweenUIDs(Mailbox<Long> mailbox, long from, long 
to) {
+    private List<Long> findDeletedMessagesInMailboxBetweenUIDs(Mailbox<Long> 
mailbox, long from, long to) {
         return 
getEntityManager().createNamedQuery("findDeletedMessagesInMailboxBetweenUIDs")
         .setParameter("idParam", mailbox.getMailboxId())
         .setParameter("fromParam", from)

Modified: 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMembership.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMembership.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMembership.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMembership.java
 Wed Apr 13 16:02:56 2011
@@ -58,13 +58,23 @@ import org.apache.openjpa.persistence.jd
     @NamedQuery(name="findMessagesInMailboxAfterUID",
             query="SELECT membership FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid>=:uidParam"),        
            
     @NamedQuery(name="findDeletedMessagesInMailbox",
-            query="SELECT membership FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.deleted=TRUE"),          
         
+            query="SELECT membership.uid FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.deleted=TRUE"),        
     @NamedQuery(name="findDeletedMessagesInMailboxBetweenUIDs",
-            query="SELECT membership FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid BETWEEN :fromParam 
AND :toParam AND membership.deleted=TRUE"),        
+            query="SELECT membership.uid FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid BETWEEN :fromParam 
AND :toParam AND membership.deleted=TRUE"),        
     @NamedQuery(name="findDeletedMessagesInMailboxWithUID",
-            query="SELECT membership FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid=:uidParam AND 
membership.deleted=TRUE"),                    
+            query="SELECT membership.uid FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid=:uidParam AND 
membership.deleted=TRUE"),                    
     @NamedQuery(name="findDeletedMessagesInMailboxAfterUID",
-            query="SELECT membership FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid>=:uidParam AND 
membership.deleted=TRUE"),                    
+            query="SELECT membership.uid FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid>=:uidParam AND 
membership.deleted=TRUE"),          
+            
+    @NamedQuery(name="deleteDeletedMessagesInMailbox",
+            query="DELETE FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.deleted=TRUE"),        
+    @NamedQuery(name="deleteDeletedMessagesInMailboxBetweenUIDs",
+            query="DELETE FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid BETWEEN :fromParam 
AND :toParam AND membership.deleted=TRUE"),        
+    @NamedQuery(name="deleteDeletedMessagesInMailboxWithUID",
+            query="DELETE FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid=:uidParam AND 
membership.deleted=TRUE"),                    
+    @NamedQuery(name="deleteDeletedMessagesInMailboxAfterUID",
+            query="DELETE FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.uid>=:uidParam AND 
membership.deleted=TRUE"),  
+                    
     @NamedQuery(name="countUnseenMessagesInMailbox",
             query="SELECT COUNT(membership) FROM Membership membership WHERE 
membership.mailbox.mailboxId = :idParam AND membership.seen=FALSE"),            
         
     @NamedQuery(name="countMessagesInMailbox",

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
 Wed Apr 13 16:02:56 2011
@@ -194,11 +194,12 @@ public class MaildirMessageMapper extend
         return messages;
     }
 
-    /* 
+
+    /*
      * (non-Javadoc)
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
 org.apache.james.mailbox.MessageRange)
+     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
 org.apache.james.mailbox.MessageRange)
      */
-    public List<MailboxMembership<Integer>> 
findMarkedForDeletionInMailbox(Mailbox<Integer> mailbox, MessageRange set) 
throws MailboxException {
+    public Iterator<Long> expungeMarkedForDeletionInMailbox(Mailbox<Integer> 
mailbox, MessageRange set) throws MailboxException {
         List<MailboxMembership<Integer>> results = new 
ArrayList<MailboxMembership<Integer>>();
         final long from = set.getUidFrom();
         final long to = set.getUidTo();
@@ -218,7 +219,12 @@ public class MaildirMessageMapper extend
             results = findMessagesInMailboxBetweenUIDs(mailbox, 
MaildirMessageName.FILTER_DELETED_MESSAGES, from, to);
             break;       
         }
-        return results;
+        List<Long> uids = new ArrayList<Long>();
+        for (int i = 0; i < results.size(); i++) {
+            MailboxMembership<Integer> m = results.get(i);
+            delete(mailbox, m);
+        }
+        return uids.iterator();
     }
 
     private List<MailboxMembership<Integer>> 
findMessagesInMailbox(Mailbox<Integer> mailbox,
@@ -427,6 +433,10 @@ public class MaildirMessageMapper extend
     }
 
 
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox,
 javax.mail.Flags, boolean, boolean, org.apache.james.mailbox.MessageRange)
+     */
     public Iterator<UpdatedFlags> updateFlags(final Mailbox<Integer> mailbox, 
final Flags flags, final boolean value, final boolean replace, MessageRange 
set) throws MailboxException {
         final List<UpdatedFlags> updatedFlags = new ArrayList<UpdatedFlags>();
         final MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);

Modified: 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
 (original)
+++ 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
 Wed Apr 13 16:02:56 2011
@@ -142,27 +142,28 @@ public class InMemoryMessageMapper exten
         }
     }
     
+
     /*
      * (non-Javadoc)
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findMarkedForDeletionInMailbox(org.apache.james.mailbox.MessageRange)
+     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
 org.apache.james.mailbox.MessageRange)
      */
-    public List<MailboxMembership<Long>> 
findMarkedForDeletionInMailbox(Mailbox<Long> mailbox, MessageRange set) throws 
MailboxException {
-       final List<MailboxMembership<Long>> filteredResult = new 
ArrayList<MailboxMembership<Long>>();
-       
+    public Iterator<Long> expungeMarkedForDeletionInMailbox(final 
Mailbox<Long> mailbox, MessageRange set) throws MailboxException {
+        final List<Long> filteredResult = new ArrayList<Long>();
+
         findInMailbox(mailbox, set, new MailboxMembershipCallback<Long>() {
-               
-                       public void 
onMailboxMembers(List<MailboxMembership<Long>> results)
-                                       throws MailboxException {
-                               for(final Iterator<MailboxMembership<Long>> 
it=results.iterator();it.hasNext();) {
-                                       MailboxMembership<Long> member = 
it.next();
-                           if (member.isDeleted()) {
-                               filteredResult.add(member);
-                           }
-                       }
-                       }
-               });
-        
-               return filteredResult;
+
+            public void onMailboxMembers(List<MailboxMembership<Long>> 
results) throws MailboxException {
+                for (final Iterator<MailboxMembership<Long>> it = 
results.iterator(); it.hasNext();) {
+                    MailboxMembership<Long> member = it.next();
+                    if (member.isDeleted()) {
+                        delete(mailbox, member);
+                        filteredResult.add(member.getUid());
+                    }
+                }
+            }
+        });
+
+        return filteredResult.iterator();
     }
 
     /*

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 Wed Apr 13 16:02:56 2011
@@ -25,14 +25,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.PushbackInputStream;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
-import java.util.TreeSet;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -556,15 +554,7 @@ public abstract class StoreMessageManage
         return messageMapper.execute(new Mapper.Transaction<Iterator<Long>>() {
 
             public Iterator<Long> run() throws MailboxException {
-                final Collection<Long> uids = new TreeSet<Long>();
-
-                final List<MailboxMembership<Id>> members = 
messageMapper.findMarkedForDeletionInMailbox(getMailboxEntity(), range);
-                for (MailboxMembership<Id> message:members) {
-                    uids.add(message.getUid());
-                    messageMapper.delete(getMailboxEntity(), message);
-                    
-                }  
-                return uids.iterator();
+                return 
messageMapper.deleteMarkedForDeletionInMailbox(getMailboxEntity(), range);
             }
             
         });       

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java?rev=1091836&r1=1091835&r2=1091836&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
 Wed Apr 13 16:02:56 2011
@@ -51,14 +51,14 @@ public interface MessageMapper<Id> exten
             throws MailboxException;
     
     /**
-     * Return a List of {@link MailboxMembership} for the given {@link 
MessageRange} which are marked for deletion
-     * The list must be ordered by the {@link Message} uid
+     * Return a {@link Iterator} which holds the uids for all deleted Messages 
for the given {@link MessageRange} which are marked for deletion
+     * The list must be ordered
      * @param mailbox
      * @param set 
-     * @return list
+     * @return uids
      * @throws MailboxException
      */
-    public abstract List<MailboxMembership<Id>> findMarkedForDeletionInMailbox(
+    public abstract Iterator<Long> expungeMarkedForDeletionInMailbox(
             Mailbox<Id> mailbox, final MessageRange set)
             throws MailboxException;
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to