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]