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]