Author: norman
Date: Sat Jun 26 17:45:51 2010
New Revision: 958254

URL: http://svn.apache.org/viewvc?rev=958254&view=rev
Log:
We not need to filter on mailbox uuid with XPATH because we search only in the 
mailbox node. (IMAP-160)

Modified:
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.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=958254&r1=958253&r2=958254&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
 Sat Jun 26 17:45:51 2010
@@ -84,7 +84,7 @@ public class JCRMessageMapper extends Ab
     public long countMessagesInMailbox(String uuid) throws StorageException {
         try {
             // we use order by because without it count will always be 0 in 
jackrabbit
-            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"'] order by @" + JCRMessage.UID_PROPERTY;
+            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message) order by @" + JCRMessage.UID_PROPERTY;
             QueryManager manager = 
getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
             NodeIterator nodes = result.getNodes();
@@ -114,7 +114,7 @@ public class JCRMessageMapper extends Ab
         
         try {
             // we use order by because without it count will always be 0 in 
jackrabbit
-            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"' and @" + JCRMessage.SEEN_PROPERTY +"='false'] order by @" + 
JCRMessage.UID_PROPERTY;
+            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.SEEN_PROPERTY +"='false'] 
order by @" + JCRMessage.UID_PROPERTY;
             QueryManager manager = 
getSession().getWorkspace().getQueryManager();
             QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
             NodeIterator nodes = result.getNodes();
@@ -186,7 +186,7 @@ public class JCRMessageMapper extends Ab
 
     private List<MailboxMembership<String>> 
findMessagesInMailboxAfterUID(String uuid, long uid) throws RepositoryException 
{
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" 
+ uuid + "' and @" + JCRMessage.UID_PROPERTY + ">=" + uid + "] order by @" + 
JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.UID_PROPERTY + ">=" + uid + 
"] order by @" + JCRMessage.UID_PROPERTY;
 
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
@@ -200,7 +200,7 @@ public class JCRMessageMapper extends Ab
 
     private List<MailboxMembership<String>> 
findMessagesInMailboxWithUID(String uuid, long uid) throws RepositoryException  
{
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" 
+ uuid + "' and @" + JCRMessage.UID_PROPERTY + "=" + uid + "] order by @" + 
JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.UID_PROPERTY + "=" + uid + 
"] order by @" + JCRMessage.UID_PROPERTY;
 
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
@@ -214,7 +214,7 @@ public class JCRMessageMapper extends Ab
 
     private List<MailboxMembership<String>> 
findMessagesInMailboxBetweenUIDs(String uuid, long from, long to) throws 
RepositoryException {
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" 
+ uuid + "' and @" + JCRMessage.UID_PROPERTY + ">=" + from + " and @" + 
JCRMessage.UID_PROPERTY + "<=" + to + "] order by @" + JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.UID_PROPERTY + ">=" + from + 
" and @" + JCRMessage.UID_PROPERTY + "<=" + to + "] order by @" + 
JCRMessage.UID_PROPERTY;
         
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
@@ -229,7 +229,7 @@ public class JCRMessageMapper extends Ab
     private List<MailboxMembership<String>> findMessagesInMailbox(String uuid) 
throws RepositoryException {        
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
         
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"'] order by @" + JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message) order by @" + JCRMessage.UID_PROPERTY;
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
 
@@ -244,7 +244,7 @@ public class JCRMessageMapper extends Ab
     
     private List<MailboxMembership<String>> 
findDeletedMessagesInMailboxAfterUID(String uuid, long uid) throws 
RepositoryException {
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" 
+ uuid + "' and @" + JCRMessage.UID_PROPERTY + ">=" + uid + " and @" + 
JCRMessage.DELETED_PROPERTY+ "='true'] order by @" + JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.UID_PROPERTY + ">=" + uid + 
" and @" + JCRMessage.DELETED_PROPERTY+ "='true'] order by @" + 
JCRMessage.UID_PROPERTY;
  
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
@@ -258,7 +258,7 @@ public class JCRMessageMapper extends Ab
 
     private List<MailboxMembership<String>> 
findDeletedMessagesInMailboxWithUID(String uuid, long uid) throws 
RepositoryException  {
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" 
+ uuid + "' and @" + JCRMessage.UID_PROPERTY + "=" + uid + " and @" + 
JCRMessage.DELETED_PROPERTY+ "='true']  order by @" + JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.UID_PROPERTY + "=" + uid + " 
and @" + JCRMessage.DELETED_PROPERTY+ "='true']  order by @" + 
JCRMessage.UID_PROPERTY;
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
 
@@ -272,7 +272,7 @@ public class JCRMessageMapper extends Ab
 
     private List<MailboxMembership<String>> 
findDeletedMessagesInMailboxBetweenUIDs(String uuid, long from, long to) throws 
RepositoryException {
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY + "='" 
+ uuid + "' and @" + JCRMessage.UID_PROPERTY + ">=" + from + " and @" + 
JCRMessage.UID_PROPERTY + "<=" + to + " and @" + JCRMessage.DELETED_PROPERTY+ 
"='true'] order by @" + JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.UID_PROPERTY + ">=" + from + 
" and @" + JCRMessage.UID_PROPERTY + "<=" + to + " and @" + 
JCRMessage.DELETED_PROPERTY+ "='true'] order by @" + JCRMessage.UID_PROPERTY;
        
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
@@ -287,7 +287,7 @@ public class JCRMessageMapper extends Ab
     private List<MailboxMembership<String>> 
findDeletedMessagesInMailbox(String uuid) throws RepositoryException {
         
         List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"' and @" + JCRMessage.DELETED_PROPERTY+ "='true'] order by @" + 
JCRMessage.UID_PROPERTY;
+        String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.DELETED_PROPERTY+ "='true'] 
order by @" + JCRMessage.UID_PROPERTY;
         
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, 
Query.XPATH).execute();
@@ -349,7 +349,7 @@ public class JCRMessageMapper extends Ab
         try {
  
             List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"' and @" + JCRMessage.RECENT_PROPERTY +"='true'] order by @" + 
JCRMessage.UID_PROPERTY;
+            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.RECENT_PROPERTY +"='true'] 
order by @" + JCRMessage.UID_PROPERTY;
             
             QueryManager manager = 
getSession().getWorkspace().getQueryManager();
             Query query = manager.createQuery(queryString, Query.XPATH);
@@ -380,7 +380,7 @@ public class JCRMessageMapper extends Ab
         try {
   
             List<MailboxMembership<String>> list = new 
ArrayList<MailboxMembership<String>>();
-            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"' and @" + JCRMessage.SEEN_PROPERTY +"='false'] order by @" + 
JCRMessage.UID_PROPERTY;
+            String queryString = "/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.SEEN_PROPERTY +"='false'] 
order by @" + JCRMessage.UID_PROPERTY;
 
             QueryManager manager = 
getSession().getWorkspace().getQueryManager();
             
@@ -542,28 +542,35 @@ public class JCRMessageMapper extends Ab
      */
     private String formulateXPath(String uuid, SearchQuery query) throws 
ItemNotFoundException, RepositoryException {
         final StringBuilder queryBuilder = new StringBuilder();
-        queryBuilder.append("/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)[@" + JCRMessage.MAILBOX_UUID_PROPERTY +"='" 
+ uuid +"'");
+        queryBuilder.append("/jcr:root" + getMailboxPath(uuid) + 
"//element(*,jamesMailbox:message)");
         final List<Criterion> criteria = query.getCriterias();
+        boolean crit = false;
         if (criteria.size() == 1) {
             final Criterion firstCriterion = criteria.get(0);
             if (firstCriterion instanceof SearchQuery.UidCriterion) {
                 final SearchQuery.UidCriterion uidCriterion = 
(SearchQuery.UidCriterion) firstCriterion;
                 final NumericRange[] ranges = 
uidCriterion.getOperator().getRange();
+                crit = ranges.length > 0;
                 for (int i = 0; i < ranges.length; i++) {
                     final long low = ranges[i].getLowValue();
                     final long high = ranges[i].getHighValue();
-
+                    if (i > 0) {
+                        queryBuilder.append(" and ");
+                    } else {
+                        queryBuilder.append("[");
+                    }
                     if (low == Long.MAX_VALUE) {
-                        queryBuilder.append(" and @" + JCRMessage.UID_PROPERTY 
+"<=").append(high);
+                        queryBuilder.append("@" + JCRMessage.UID_PROPERTY 
+"<=").append(high);
                     } else if (low == high) {
-                        queryBuilder.append(" and @" + JCRMessage.UID_PROPERTY 
+"=").append(low);
+                        queryBuilder.append("@" + JCRMessage.UID_PROPERTY 
+"=").append(low);
                     } else {
-                        queryBuilder.append(" and @" + JCRMessage.UID_PROPERTY 
+"<=").append(high).append(" and @" + JCRMessage.UID_PROPERTY + 
">=").append(low);
+                        queryBuilder.append("@" + JCRMessage.UID_PROPERTY 
+"<=").append(high).append(" and @" + JCRMessage.UID_PROPERTY + 
">=").append(low);
                     }
                 }
             }
         }
-        queryBuilder.append("] order by @" + JCRMessage.UID_PROPERTY);
+        if (crit) queryBuilder.append("]");
+        queryBuilder.append(" order by @" + JCRMessage.UID_PROPERTY);
         final String jql = queryBuilder.toString();
         return jql;
     }



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

Reply via email to