Author: norman
Date: Fri Jun 18 15:49:41 2010
New Revision: 956028
URL: http://svn.apache.org/viewvc?rev=956028&view=rev
Log:
Allow to only fetch a specified number of unseen and recent messages to improve
performance on select command. See IMAP-155
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java?rev=956028&r1=956027&r2=956028&view=diff
==============================================================================
---
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
(original)
+++
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
Fri Jun 18 15:49:41 2010
@@ -325,17 +325,24 @@ public class JCRMessageMapper extends Ab
}
/*
+ *
+ * TODO: Maybe we should better use an ItemVisitor and just traverse
through the child nodes. This could be a way faster
+ *
* (non-Javadoc)
*
* @see
*
org.apache.james.imap.store.mail.MessageMapper#findRecentMessagesInMailbox
* ()
*/
- public List<MailboxMembership<String>> findRecentMessagesInMailbox(String
uuid) throws StorageException {
+ public List<MailboxMembership<String>> findRecentMessagesInMailbox(String
uuid, int limit) throws StorageException {
try {
+
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
String queryString = "//" + MAILBOXES_PATH +
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='"
+ uuid +"'] AND [@" + JCRMessage.RECENT_PROPERTY +"='true'] order by @" +
JCRMessage.UID_PROPERTY;
+ if (limit > 0) {
+ queryString = queryString + " limit " + limit;
+ }
QueryManager manager =
getSession().getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
@@ -345,6 +352,7 @@ public class JCRMessageMapper extends Ab
list.add(new JCRMessage(iterator.nextNode(), getLogger()));
}
return list;
+
} catch (RepositoryException e) {
e.printStackTrace();
throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
@@ -353,14 +361,20 @@ public class JCRMessageMapper extends Ab
/*
+ * TODO: Maybe we should better use an ItemVisitor and just traverse
through the child nodes. This could be a way faster
+ *
* (non-Javadoc)
* @see
org.apache.james.imap.store.mail.MessageMapper#findUnseenMessagesInMailbox()
*/
- public List<MailboxMembership<String>> findUnseenMessagesInMailbox(String
uuid) throws StorageException {
+ public List<MailboxMembership<String>> findUnseenMessagesInMailbox(String
uuid, int limit) throws StorageException {
try {
+
List<MailboxMembership<String>> list = new
ArrayList<MailboxMembership<String>>();
String queryString = "//" + MAILBOXES_PATH +
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='"
+ uuid +"'] AND [@" + JCRMessage.SEEN_PROPERTY +"='false'] order by @" +
JCRMessage.UID_PROPERTY;
+ if (limit > 0) {
+ queryString = queryString + " limit " + limit;
+ }
QueryManager manager =
getSession().getWorkspace().getQueryManager();
QueryResult result = manager.createQuery(queryString,
Query.XPATH).execute();
@@ -417,7 +431,7 @@ public class JCRMessageMapper extends Ab
// we lock the whole mailbox with all its childs while
// adding the folder structure for the date
- // TODO: Maybe we should just lock the last child folder
+ // TODO: Maybe we should just lock the last child folder
to improve performance
dayNode = locker.execute(new
NodeLocker.NodeLockedExecution<Node>() {
public Node execute(Node node) throws
RepositoryException {
@@ -541,4 +555,5 @@ public class JCRMessageMapper extends Ab
final String jql = queryBuilder.toString();
return jql;
}
+
}
Modified:
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java?rev=956028&r1=956027&r2=956028&view=diff
==============================================================================
---
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
(original)
+++
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
Fri Jun 18 15:49:41 2010
@@ -22,6 +22,7 @@ import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
+import javax.persistence.Query;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.jpa.JPATransactionalMapper;
@@ -237,9 +238,13 @@ public class JPAMessageMapper extends JP
* @see
org.apache.james.imap.store.mail.MessageMapper#findUnseenMessagesInMailbox()
*/
@SuppressWarnings("unchecked")
- public List<MailboxMembership<Long>> findUnseenMessagesInMailbox(Long
mailboxId) throws StorageException {
+ public List<MailboxMembership<Long>> findUnseenMessagesInMailbox(Long
mailboxId, int limit) throws StorageException {
try {
- return
getEntityManager().createNamedQuery("findUnseenMessagesInMailboxOrderByUid").setParameter("idParam",
mailboxId).getResultList();
+ Query query =
getEntityManager().createNamedQuery("findUnseenMessagesInMailbox").setParameter("idParam",
mailboxId);
+ if (limit > 0) {
+ query = query.setMaxResults(limit);
+ }
+ return query.getResultList();
} catch (PersistenceException e) {
throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
}
@@ -249,9 +254,13 @@ public class JPAMessageMapper extends JP
* @see
org.apache.james.imap.store.mail.MessageMapper#findRecentMessagesInMailbox()
*/
@SuppressWarnings("unchecked")
- public List<MailboxMembership<Long>> findRecentMessagesInMailbox(Long
mailboxId) throws StorageException {
+ public List<MailboxMembership<Long>> findRecentMessagesInMailbox(Long
mailboxId, int limit) throws StorageException {
try {
- return
getEntityManager().createNamedQuery("findRecentMessagesInMailbox").setParameter("idParam",
mailboxId).getResultList();
+ Query query =
getEntityManager().createNamedQuery("findRecentMessagesInMailbox").setParameter("idParam",
mailboxId);
+ if (limit > 0) {
+ query = query.setMaxResults(limit);
+ }
+ return query.getResultList();
} catch (PersistenceException e) {
throw new StorageException(HumanReadableText.SEARCH_FAILED, e);
}
Modified:
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java?rev=956028&r1=956027&r2=956028&view=diff
==============================================================================
---
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java
(original)
+++
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java
Fri Jun 18 15:49:41 2010
@@ -121,7 +121,7 @@ public class InMemoryMessageMapper imple
* (non-Javadoc)
* @see
org.apache.james.imap.store.mail.MessageMapper#findRecentMessagesInMailbox()
*/
- public List<MailboxMembership<Long>> findRecentMessagesInMailbox(Long
mailboxId) throws StorageException {
+ public List<MailboxMembership<Long>> findRecentMessagesInMailbox(Long
mailboxId,int limit) throws StorageException {
final List<MailboxMembership<Long>> results = new
ArrayList<MailboxMembership<Long>>();
for(MailboxMembership<Long>
member:getMembershipByUidForMailbox(mailboxId).values()) {
if (member.isRecent()) {
@@ -129,6 +129,9 @@ public class InMemoryMessageMapper imple
}
}
Collections.sort(results, MailboxMembershipComparator.INSTANCE);
+ if (limit > 0 && limit > results.size()) {
+ return results.subList(0, limit -1);
+ }
return results;
}
@@ -136,7 +139,7 @@ public class InMemoryMessageMapper imple
* (non-Javadoc)
* @see
org.apache.james.imap.store.mail.MessageMapper#findUnseenMessagesInMailbox()
*/
- public List<MailboxMembership<Long>> findUnseenMessagesInMailbox(Long
mailboxId) throws StorageException {
+ public List<MailboxMembership<Long>> findUnseenMessagesInMailbox(Long
mailboxId, int limit) throws StorageException {
final List<MailboxMembership<Long>> results = new
ArrayList<MailboxMembership<Long>>();
for(MailboxMembership<Long>
member:getMembershipByUidForMailbox(mailboxId).values()) {
if (!member.isSeen()) {
@@ -144,6 +147,9 @@ public class InMemoryMessageMapper imple
}
}
Collections.sort(results, MailboxMembershipComparator.INSTANCE);
+ if (limit > 0 && limit > results.size()) {
+ return results.subList(0, limit -1);
+ }
return results;
}
@@ -175,8 +181,7 @@ public class InMemoryMessageMapper imple
}
public void endRequest() {
- // TODO Auto-generated method stub
-
+ // Do nothing
}
}
Modified:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java?rev=956028&r1=956027&r2=956028&view=diff
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java
(original)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java
Fri Jun 18 15:49:41 2010
@@ -414,7 +414,7 @@ public abstract class StoreMessageManage
messageMapper.execute(new TransactionalMapper.Transaction() {
public void run() throws MailboxException {
- final List<MailboxMembership<Id>> members =
messageMapper.findRecentMessagesInMailbox(getMailboxId());
+ final List<MailboxMembership<Id>> members =
messageMapper.findRecentMessagesInMailbox(getMailboxId(), -1);
for (MailboxMembership<Id> member:members) {
results.add(member.getUid());
@@ -432,7 +432,7 @@ public abstract class StoreMessageManage
private Long getFirstUnseen(MailboxSession mailboxSession) throws
MailboxException {
try {
- final List<MailboxMembership<Id>> members =
messageMapper.findUnseenMessagesInMailbox(getMailboxId());
+ final List<MailboxMembership<Id>> members =
messageMapper.findUnseenMessagesInMailbox(getMailboxId(),1);
final Iterator<MailboxMembership<Id>> it = members.iterator();
final Long result;
if (it.hasNext()) {
Modified:
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java?rev=956028&r1=956027&r2=956028&view=diff
==============================================================================
---
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
(original)
+++
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
Fri Jun 18 15:49:41 2010
@@ -94,20 +94,28 @@ public interface MessageMapper<Id> exten
/**
* Return a List of {...@link MailboxMembership} which are unseen.
* The list must be ordered by the {...@link Document} uid.
+ * If a limit was given the list will maximal be the size of the limit. Id
a
+ * limit smaller then 1 is given the List must contain all messages
*
+ * @param mailboxId
+ * @param limit
* @return list
* @throws StorageException
*/
- public abstract List<MailboxMembership<Id>> findUnseenMessagesInMailbox(Id
mailboxId) throws StorageException;
+ public abstract List<MailboxMembership<Id>> findUnseenMessagesInMailbox(Id
mailboxId, int limit) throws StorageException;
/**
* Return a List of {...@link MailboxMembership} which are recent.
- * The list must be ordered by the {...@link Document} uid
+ * The list must be ordered by the {...@link Document} uid.
+ * If a limit was given the list will maximal be the size of the limit. Id
a
+ * limit smaller then 1 is given the List must contain all messages
*
+ * @param mailboxId
+ * @param limit
* @return recentList
* @throws StorageException
*/
- public abstract List<MailboxMembership<Id>> findRecentMessagesInMailbox(Id
mailboxId) throws StorageException;
+ public abstract List<MailboxMembership<Id>> findRecentMessagesInMailbox(Id
mailboxId, int limit) throws StorageException;
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]