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]

Reply via email to