Author: norman
Date: Thu Jun 16 16:05:49 2011
New Revision: 1136510

URL: http://svn.apache.org/viewvc?rev=1136510&view=rev
Log:
Fix sorting with lucene search index. See MAILBOX-92

Modified:
    
james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
    
james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java

Modified: 
james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java?rev=1136510&r1=1136509&r2=1136510&view=diff
==============================================================================
--- 
james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
 (original)
+++ 
james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
 Thu Jun 16 16:05:49 2011
@@ -30,6 +30,7 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -304,14 +305,14 @@ public class LuceneMessageSearchIndex<Id
     private final static SortField SIZE_SORT = new SortField(SIZE_FIELD, 
SortField.LONG);
     private final static SortField SIZE_SORT_REVERSE = new 
SortField(SIZE_FIELD, SortField.LONG, true);
 
-    private final static SortField FIRST_CC_MAILBOX_SORT = new 
SortField(FIRST_CC_MAILBOX_NAME_FIELD, SortField.LONG);
-    private final static SortField FIRST_CC_MAILBOX_SORT_REVERSE = new 
SortField(FIRST_CC_MAILBOX_NAME_FIELD, SortField.LONG, true);
+    private final static SortField FIRST_CC_MAILBOX_SORT = new 
SortField(FIRST_CC_MAILBOX_NAME_FIELD, SortField.STRING);
+    private final static SortField FIRST_CC_MAILBOX_SORT_REVERSE = new 
SortField(FIRST_CC_MAILBOX_NAME_FIELD, SortField.STRING, true);
 
-    private final static SortField FIRST_TO_MAILBOX_SORT = new 
SortField(FIRST_TO_MAILBOX_NAME_FIELD, SortField.LONG);
-    private final static SortField FIRST_TO_MAILBOX_SORT_REVERSE = new 
SortField(FIRST_TO_MAILBOX_NAME_FIELD, SortField.LONG, true);
+    private final static SortField FIRST_TO_MAILBOX_SORT = new 
SortField(FIRST_TO_MAILBOX_NAME_FIELD, SortField.STRING);
+    private final static SortField FIRST_TO_MAILBOX_SORT_REVERSE = new 
SortField(FIRST_TO_MAILBOX_NAME_FIELD, SortField.STRING, true);
 
-    private final static SortField FIRST_FROM_MAILBOX_SORT = new 
SortField(FIRST_FROM_MAILBOX_NAME_FIELD, SortField.LONG);
-    private final static SortField FIRST_FROM_MAILBOX_SORT_REVERSE = new 
SortField(FIRST_FROM_MAILBOX_NAME_FIELD, SortField.LONG, true);
+    private final static SortField FIRST_FROM_MAILBOX_SORT = new 
SortField(FIRST_FROM_MAILBOX_NAME_FIELD, SortField.STRING);
+    private final static SortField FIRST_FROM_MAILBOX_SORT_REVERSE = new 
SortField(FIRST_FROM_MAILBOX_NAME_FIELD, SortField.STRING, true);
 
     
     private final static SortField ARRIVAL_MAILBOX_SORT = new 
SortField(INTERNAL_DATE_FIELD_MILLISECOND_RESOLUTION, SortField.LONG);
@@ -323,11 +324,11 @@ public class LuceneMessageSearchIndex<Id
     private final static SortField SENT_DATE_SORT = new 
SortField(SENT_DATE_SORT_FIELD_MILLISECOND_RESOLUTION, SortField.LONG);
     private final static SortField SENT_DATE_SORT_REVERSE = new 
SortField(SENT_DATE_SORT_FIELD_MILLISECOND_RESOLUTION, SortField.LONG, true);
     
-    private final static SortField FIRST_TO_MAILBOX_DISPLAY_SORT = new 
SortField(FIRST_TO_MAILBOX_DISPLAY_FIELD, SortField.LONG);
-    private final static SortField FIRST_TO_MAILBOX_DISPLAY_SORT_REVERSE = new 
SortField(FIRST_TO_MAILBOX_DISPLAY_FIELD, SortField.LONG, true);
+    private final static SortField FIRST_TO_MAILBOX_DISPLAY_SORT = new 
SortField(FIRST_TO_MAILBOX_DISPLAY_FIELD, SortField.STRING);
+    private final static SortField FIRST_TO_MAILBOX_DISPLAY_SORT_REVERSE = new 
SortField(FIRST_TO_MAILBOX_DISPLAY_FIELD, SortField.STRING, true);
 
-    private final static SortField FIRST_FROM_MAILBOX_DISPLAY_SORT = new 
SortField(FIRST_FROM_MAILBOX_DISPLAY_FIELD, SortField.LONG);
-    private final static SortField FIRST_FROM_MAILBOX_DISPLAY_SORT_REVERSE = 
new SortField(FIRST_FROM_MAILBOX_DISPLAY_FIELD, SortField.LONG, true);
+    private final static SortField FIRST_FROM_MAILBOX_DISPLAY_SORT = new 
SortField(FIRST_FROM_MAILBOX_DISPLAY_FIELD, SortField.STRING);
+    private final static SortField FIRST_FROM_MAILBOX_DISPLAY_SORT_REVERSE = 
new SortField(FIRST_FROM_MAILBOX_DISPLAY_FIELD, SortField.STRING, true);
 
     
     public LuceneMessageSearchIndex(MessageMapperFactory<Id> factory, 
Directory directory) throws CorruptIndexException, LockObtainFailedException, 
IOException {
@@ -401,7 +402,7 @@ public class LuceneMessageSearchIndex<Id
      * @see 
org.apache.james.mailbox.store.MessageSearchIndex#search(org.apache.james.mailbox.MailboxSession,
 org.apache.james.mailbox.store.mail.model.Mailbox, 
org.apache.james.mailbox.SearchQuery)
      */
     public Iterator<Long> search(MailboxSession session, Mailbox<Id> mailbox, 
SearchQuery searchQuery) throws MailboxException {
-        Set<Long> uids = new HashSet<Long>();
+        Set<Long> uids = new LinkedHashSet<Long>();
         IndexSearcher searcher = null;
 
         try {
@@ -1035,6 +1036,8 @@ public class LuceneMessageSearchIndex<Id
                 }
             }
         }
+        // add the uid sorting as last so if no other sorting was able todo 
the job it will get sorted by the uid
+        fields.add(UID_SORT);
         sort.setSort(fields.toArray(new SortField[0]));
         return sort;
     }

Modified: 
james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java?rev=1136510&r1=1136509&r2=1136510&view=diff
==============================================================================
--- 
james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
 (original)
+++ 
james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
 Thu Jun 16 16:05:49 2011
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertTrue;
 
 import java.nio.charset.Charset;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
@@ -36,6 +37,7 @@ import javax.mail.Flags.Flag;
 import org.apache.james.mailbox.SearchQuery;
 import org.apache.james.mailbox.SearchQuery.AddressType;
 import org.apache.james.mailbox.SearchQuery.DateResolution;
+import org.apache.james.mailbox.SearchQuery.Sort.SortClause;
 import org.apache.james.mailbox.store.MessageBuilder;
 import org.apache.james.mailbox.store.SimpleMailboxMembership;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -76,16 +78,22 @@ public class LuceneMessageSearchIndexTes
         index = new LuceneMessageSearchIndex<Long>(null, new RAMDirectory(), 
true, useLenient());
         index.setEnableSuffixMatch(true);
         Map<String, String> headersSubject = new HashMap<String, String>();
-        headersSubject.put("Subject", "test");
-       
+        headersSubject.put("Subject", "test (fwd)");
+        headersSubject.put("From", "test99 <test99@localhost>");
+        headersSubject.put("To", "test2 <test2@localhost>, test3 
<test3@localhost>");
+
         Map<String, String> headersTest = new HashMap<String, String>();
-        headersSubject.put("Test", "test");
-        
+        headersTest.put("Test", "test");
+        headersTest.put("From", "test1 <test1@localhost>");
+        headersTest.put("To", "test3 <test3@localhost>, test4 
<test4@localhost>");
+        headersTest.put("Cc", "test21 <test21@localhost>, test6 
<test6@foobar>");
+
         Map<String, String> headersTestSubject =  new HashMap<String, 
String>();
         headersTestSubject.put("Test", "test");
         headersTestSubject.put("Subject", "test2");
-
-
+        headersTestSubject.put("Date", "Thu, 14 Feb 1990 12:00:00 +0000 
(GMT)");
+        headersTestSubject.put("From", "test12 <test12@localhost>");
+        headersTestSubject.put("Cc", "test211 <test21@localhost>, test6 
<test6@foobar>");
         
         SimpleMailboxMembership m2 = new 
SimpleMailboxMembership(mailbox2.getMailboxId(),1, 0, new Date(), 20, new 
Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
         index.add(null, mailbox2, m2);
@@ -97,7 +105,6 @@ public class LuceneMessageSearchIndexTes
         cal.set(1980, 2, 10);
         SimpleMailboxMembership m3 = new 
SimpleMailboxMembership(mailbox.getMailboxId(),2, 0, cal.getTime(), 20, new 
Flags(Flag.DELETED), "My Otherbody".getBytes(), headersTest);
         index.add(null, mailbox, m3);
-        System.out.println(new Date(Long.MAX_VALUE).toGMTString());
         Calendar cal2 = Calendar.getInstance();
         cal2.set(8000, 2, 10);
         SimpleMailboxMembership m4 = new 
SimpleMailboxMembership(mailbox.getMailboxId(),3, 0, cal2.getTime(), 20, new 
Flags(Flag.DELETED), "My Otherbody2".getBytes(), headersTestSubject);
@@ -411,6 +418,281 @@ public class LuceneMessageSearchIndexTes
     }
     
     @Test
+    public void testSortUid() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortUidReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Uid, true)));
+        q2.andCriteria(SearchQuery.all());
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortSentDate() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.SentDate, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortSentDateReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.SentDate, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertFalse(it4.hasNext());
+    }
+    @Test
+    public void testSortBaseSubject() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.BaseSubject, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortBaseSubjectReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.BaseSubject, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortMailboxFrom() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxFrom, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void  testSortMailboxFromReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxFrom, 
true)));
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    
+    @Test
+    public void testSortMailboxCc() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxCc, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void  testSortMailboxCcReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxCc, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+
+        assertEquals(1L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortMailboxTo() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxTo, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void  testSortMailboxToReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxTo, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortDisplayTo() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayTo, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void  testSortDisplayToReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayTo, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    
+    @Test
+    public void testSortDisplayFrom() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayFrom, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void  testSortDisplayFromReverse() throws Exception {
+       
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayFrom, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortArrival() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Arrival, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortArrivalReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Arrival, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertFalse(it4.hasNext());
+    }
+    @Test
+    public void testSortSize() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Size, 
false)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertEquals(1L, it4.next().longValue());
+
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
+    public void testSortSizeReverse() throws Exception {
+        SearchQuery q2 = new SearchQuery();
+        q2.andCriteria(SearchQuery.all());
+        q2.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Size, 
true)));
+
+        Iterator<Long> it4 = index.search(null, mailbox, q2);
+        assertEquals(1L, it4.next().longValue());
+        assertEquals(2L, it4.next().longValue());
+        assertEquals(3L, it4.next().longValue());
+        assertFalse(it4.hasNext());
+    }
+    
+    @Test
     public void testNot() throws Exception {
         SearchQuery q2 = new SearchQuery();
         q2.andCriteria(SearchQuery.not(SearchQuery.uid(new 
SearchQuery.NumericRange[] { new SearchQuery.NumericRange(1)})));

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java?rev=1136510&r1=1136509&r2=1136510&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
 Thu Jun 16 16:05:49 2011
@@ -83,7 +83,7 @@ public class SearchUtil {
      * @return display
      */
     public static String getDisplayAddress(Mailbox mailbox) {
-        String display = mailbox.getDisplayString();
+        String display = mailbox.getName();
         if (display == null || display.length() < 1) {
             String localPart = mailbox.getLocalPart();
             String domainPart = mailbox.getDomain();



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

Reply via email to