You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rd...@apache.org on 2008/03/24 21:33:14 UTC

svn commit: r640562 - in /james/server/trunk: core-library/src/main/java/org/apache/james/mailboxmanager/ experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/ imap-mailbox-processor-function/src/main/java/or...

Author: rdonkin
Date: Mon Mar 24 13:33:09 2008
New Revision: 640562

URL: http://svn.apache.org/viewvc?rev=640562&view=rev
Log:
RECENT SEARCH implementation

Modified:
    james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java
    james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/SearchAtoms.test
    james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/UidSearchAtoms.test
    james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java
    james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessorTest.java
    james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/MessageSearches.java
    james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsMultipartMixedTest.java
    james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsRFC822Test.java
    james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java

Modified: james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java (original)
+++ james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java Mon Mar 24 13:33:09 2008
@@ -21,7 +21,9 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import javax.mail.Flags.Flag;
 
@@ -328,8 +330,8 @@
         return AllCriterion.all();
     }
     
-    
-    List criterias = new ArrayList();
+    private final Set recentMessageUids = new HashSet();
+    private final List criterias = new ArrayList();
 	
 	public void andCriteria(Criterion crit) {
 		criterias.add(crit);
@@ -338,6 +340,17 @@
 	public List getCriterias() {
 		return criterias;
 	}
+    
+    /**
+     * Gets the UIDS of messages which are recent for this 
+     * client session.
+     * The list of recent mail is maintained in the protocol
+     * layer since the mechanics are protocol specific.
+     * @return mutable <code>Set</code> of <code>Long</code> UIDS
+     */
+    public Set getRecentMessageUids() {
+        return recentMessageUids;
+    }
 	
 	// @Override
 	public String toString() {

Modified: james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/SearchAtoms.test
URL: http://svn.apache.org/viewvc/james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/SearchAtoms.test?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/SearchAtoms.test (original)
+++ james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/SearchAtoms.test Mon Mar 24 13:33:09 2008
@@ -1704,10 +1704,9 @@
 C: A78 SEARCH LARGER 20000
 S: \* SEARCH
 S: A78 OK SEARCH completed\.
-# TODO: FIX RECENT
-#C: A79 SEARCH NEW
-#S: \* SEARCH 3 4 8 9 13 14 18 19
-#S: A79 OK SEARCH completed\.
+C: A79 SEARCH NEW
+S: \* SEARCH 3 4 8 9 13 14 18 19
+S: A79 OK SEARCH completed\.
 C: A80 SEARCH NOT FLAGGED
 S: \* SEARCH 10 11 12 13 14 15 16 17 18 19
 S: A80 OK SEARCH completed\.
@@ -1720,17 +1719,15 @@
 C: A83 SEARCH 17:*
 S: \* SEARCH 17 18 19
 S: A83 OK SEARCH completed\.
-# TODO FIX RECENT
-#C: A84 SEARCH OLD
-#S: \* SEARCH
-#S: A84 OK SEARCH completed\.
+C: A84 SEARCH OLD
+S: \* SEARCH
+S: A84 OK SEARCH completed\.
 C: A85 SEARCH OR ANSWERED FLAGGED
 S: \* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14
 S: A85 OK SEARCH completed\.
-# TODO: FIX RECENT
-#C: A86 SEARCH RECENT
-#S: \* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-#S: A86 OK SEARCH completed\.
+C: A86 SEARCH RECENT
+S: \* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
+S: A86 OK SEARCH completed\.
 C: A87 SEARCH SEEN
 S: \* SEARCH 1 2 5 6 7 10 11 12 15 16 17
 S: A87 OK SEARCH completed\.

Modified: james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/UidSearchAtoms.test
URL: http://svn.apache.org/viewvc/james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/UidSearchAtoms.test?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/UidSearchAtoms.test (original)
+++ james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/UidSearchAtoms.test Mon Mar 24 13:33:09 2008
@@ -2065,10 +2065,9 @@
 C: A138 UID SEARCH LARGER 20000
 S: \* SEARCH
 S: A138 OK SEARCH completed\.
-# TODO: RECENT
-#C: A139 UID SEARCH NEW
-#S: \* SEARCH 23 24 28 29 33 34 38 39
-#S: A139 OK SEARCH completed\.
+C: A139 UID SEARCH NEW
+S: \* SEARCH 23 24 28 29 33 34 38 39
+S: A139 OK SEARCH completed\.
 C: A140 UID SEARCH NOT FLAGGED
 S: \* SEARCH 30 31 32 33 34 35 36 37 38 39
 S: A140 OK SEARCH completed\.
@@ -2081,17 +2080,15 @@
 C: A143 UID SEARCH 17:*
 S: \* SEARCH 37 38 39
 S: A143 OK SEARCH completed\.
-# TODO: RECENT
-#C: A144 UID SEARCH OLD
-#S: \* SEARCH
-#S: A144 OK SEARCH completed\.
+C: A144 UID SEARCH OLD
+S: \* SEARCH
+S: A144 OK SEARCH completed\.
 C: A145 UID SEARCH OR ANSWERED FLAGGED
 S: \* SEARCH 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 S: A145 OK SEARCH completed\.
-# TODO: RECENT
-#C: A146 UID SEARCH RECENT
-#S: \* SEARCH 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
-#S: A146 OK SEARCH completed\.
+C: A146 UID SEARCH RECENT
+S: \* SEARCH 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
+S: A146 OK SEARCH completed\.
 C: A147 UID SEARCH SEEN
 S: \* SEARCH 21 22 25 26 27 30 31 32 35 36 37
 S: A147 OK SEARCH completed\.

Modified: james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java (original)
+++ james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java Mon Mar 24 13:33:09 2008
@@ -127,6 +127,14 @@
 
     private SearchQuery toQuery(final SearchKey key, final ImapSession session) {
         final SearchQuery result = new SearchQuery();
+        final SelectedImapMailbox selected = session.getSelected();
+        if (selected != null) {
+            final long[] recent = selected.getRecent();
+            for (int i = 0; i < recent.length; i++) {
+                long uid = recent[i];
+                result.getRecentMessageUids().add(new Long(uid));   
+            }
+        }
         final SearchQuery.Criterion criterion = toCriterion(key, session);
         result.andCriteria(criterion);
         return result;

Modified: james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessorTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessorTest.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessorTest.java (original)
+++ james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessorTest.java Mon Mar 24 13:33:09 2008
@@ -37,6 +37,7 @@
 import org.apache.james.api.imap.process.ImapProcessor.Responder;
 import org.apache.james.imap.message.request.imap4rev1.SearchRequest;
 import org.apache.james.imap.message.response.imap4rev1.server.SearchResponse;
+import org.apache.james.imapserver.codec.encode.imap4rev1.legacy.MockImapResponseWriter;
 import org.apache.james.imapserver.processor.base.ImapSessionUtils;
 import org.apache.james.mailboxmanager.MailboxSession;
 import org.apache.james.mailboxmanager.SearchQuery;
@@ -97,7 +98,8 @@
         final SearchQuery.NumericRange[] ranges = {new SearchQuery.NumericRange(Long.MAX_VALUE, 1729L)};
         Mock selectedMailbox = mock(SelectedImapMailbox.class);
         selectedMailbox.expects(once()).method("uid").with(eq(1729)).will(returnValue(1729L));
-        session.expects(once()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
+        session.expects(atLeastOnce()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
+        selectedMailbox.expects(once()).method("getRecent").will(returnValue(EMPTY));
         check(SearchKey.buildSequenceSet(ids), SearchQuery.uid(ranges));
     }
     
@@ -106,7 +108,8 @@
         final SearchQuery.NumericRange[] ranges = {new SearchQuery.NumericRange(42, Long.MAX_VALUE)};
         Mock selectedMailbox = mock(SelectedImapMailbox.class);
         selectedMailbox.expects(once()).method("uid").with(eq(1)).will(returnValue(42L));
-        session.expects(once()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
+        session.expects(atLeastOnce()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
+        selectedMailbox.expects(once()).method("getRecent").will(returnValue(EMPTY));
         check(SearchKey.buildSequenceSet(ids), SearchQuery.uid(ranges));
     }
 
@@ -116,7 +119,8 @@
         Mock selectedMailbox = mock(SelectedImapMailbox.class);
         selectedMailbox.expects(once()).method("uid").with(eq(1)).will(returnValue(42L));
         selectedMailbox.expects(once()).method("uid").with(eq(5)).will(returnValue(1729L));
-        session.expects(once()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
+        selectedMailbox.expects(once()).method("getRecent").will(returnValue(EMPTY));
+        session.expects(atLeastOnce()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
         check(SearchKey.buildSequenceSet(ids), SearchQuery.uid(ranges));
     }
     
@@ -125,82 +129,101 @@
         final SearchQuery.NumericRange[] ranges = {new SearchQuery.NumericRange(42)};
         Mock selectedMailbox = mock(SelectedImapMailbox.class);
         selectedMailbox.expects(exactly(2)).method("uid").with(eq(1)).will(returnValue(42L));
-        session.expects(once()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
+        selectedMailbox.expects(once()).method("getRecent").will(returnValue(EMPTY));
+        session.expects(atLeastOnce()).method("getSelected").will(returnValue(selectedMailbox.proxy()));
         check(SearchKey.buildSequenceSet(ids), SearchQuery.uid(ranges));
     }
 
     public void testALL() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildAll(), SearchQuery.all());
     }
 
     public void testANSWERED() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildAnswered(), SearchQuery.flagIsSet(Flag.ANSWERED));
     }
 
     public void testBCC() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildBcc(ADDRESS), SearchQuery.headerContains(RFC2822Headers.BCC, ADDRESS));
     }
 
     public void testBEFORE() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildBefore(DAY_MONTH_YEAR), SearchQuery.internalDateBefore(DAY, MONTH, YEAR));
     }
 
     public void testBODY() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildBody(SUBJECT), SearchQuery.bodyContains(SUBJECT));
     }
 
     public void testCC() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildCc(ADDRESS), SearchQuery.headerContains(RFC2822Headers.CC, ADDRESS));
     }
 
     public void testDELETED() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildDeleted(), SearchQuery.flagIsSet(Flag.DELETED));
     }
 
     public void testDRAFT() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildDraft(), SearchQuery.flagIsSet(Flag.DRAFT));
     }
 
     public void testFLAGGED() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildFlagged(), SearchQuery.flagIsSet(Flag.FLAGGED));
     }
     
 
     public void testFROM() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildFrom(ADDRESS), SearchQuery.headerContains(RFC2822Headers.FROM, ADDRESS));
     }
 
     public void testHEADER () throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildHeader(RFC2822Headers.IN_REPLY_TO, ADDRESS), SearchQuery.headerContains(RFC2822Headers.IN_REPLY_TO, ADDRESS));
     }
 
     public void testKEYWORD() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildKeyword(KEYWORD), SearchQuery.flagIsSet(KEYWORD));
     }
 
     public void testLARGER() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildLarger(SIZE), SearchQuery.sizeGreaterThan(SIZE));
     }
 
     public void testNEW() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildNew(), 
                 SearchQuery.and(SearchQuery.flagIsSet(Flag.RECENT), SearchQuery.flagIsUnSet(Flag.SEEN)));
     }
 
     public void testNOT() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildNot(SearchKey.buildOn(DAY_MONTH_YEAR)), 
                 SearchQuery.not(SearchQuery.internalDateOn(DAY, MONTH, YEAR)));   
     }
 
     public void testOLD() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildOld(), SearchQuery.flagIsUnSet(Flag.RECENT));
     }
 
     public void testON() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildOn(DAY_MONTH_YEAR), SearchQuery.internalDateOn(DAY, MONTH, YEAR));
     }
 
     public void testAND() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         List keys = new ArrayList();
         keys.add(SearchKey.buildOn(DAY_MONTH_YEAR));
         keys.add(SearchKey.buildOld());
@@ -213,75 +236,93 @@
     }
     
     public void testOR() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildOr(SearchKey.buildOn(DAY_MONTH_YEAR), SearchKey.buildOld()), 
                 SearchQuery.or(SearchQuery.internalDateOn(DAY, MONTH, YEAR), SearchQuery.flagIsUnSet(Flag.RECENT)));
     }
 
     public void testRECENT() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildRecent(), SearchQuery.flagIsSet(Flag.RECENT));
     }
 
     public void testSEEN() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSeen(), SearchQuery.flagIsSet(Flag.SEEN));
     }
 
     public void testSENTBEFORE() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSentBefore(DAY_MONTH_YEAR), SearchQuery.headerDateBefore(RFC2822Headers.DATE, DAY, MONTH, YEAR));
     }
 
     public void testSENTON() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSentOn(DAY_MONTH_YEAR), SearchQuery.headerDateOn(RFC2822Headers.DATE, DAY, MONTH, YEAR));
     }
 
     public void testSENTSINCE() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSentSince(DAY_MONTH_YEAR), SearchQuery.headerDateAfter(RFC2822Headers.DATE, DAY, MONTH, YEAR));
     }
 
     public void testSINCE() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSince(DAY_MONTH_YEAR), SearchQuery.internalDateAfter(DAY, MONTH, YEAR));
     }
 
     public void testSMALLER() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSmaller(SIZE), SearchQuery.sizeLessThan(SIZE));        
     }
 
     public void testSUBJECT() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildSubject(SUBJECT), SearchQuery.headerContains(RFC2822Headers.SUBJECT, SUBJECT));
     }
 
     public void testTEXT() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildText(SUBJECT), SearchQuery.mailContains(SUBJECT));
     }
 
     public void testTO () throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildTo(ADDRESS), SearchQuery.headerContains(RFC2822Headers.TO, ADDRESS));
     }
 
     public void testUID() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUidSet(IDS), SearchQuery.uid(RANGES));
     }
 
     public void testUNANSWERED() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUnanswered(), SearchQuery.flagIsUnSet(Flag.ANSWERED));
     }
 
     public void testUNDELETED() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUndeleted(), SearchQuery.flagIsUnSet(Flag.DELETED));
     }
 
     public void testUNDRAFT() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUndraft(), SearchQuery.flagIsUnSet(Flag.DRAFT));
     }
 
     public void testUNFLAGGED() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUnflagged(), SearchQuery.flagIsUnSet(Flag.FLAGGED));
     }
 
     public void testUNKEYWORD() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUnkeyword(KEYWORD), SearchQuery.flagIsUnSet(KEYWORD));
     }
 
     public void testUNSEEN() throws Exception {
+        session.expects(once()).method("getSelected").will(returnValue(null));
         check(SearchKey.buildUnseen(), SearchQuery.flagIsUnSet(Flag.SEEN));
     }
     

Modified: james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/MessageSearches.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/MessageSearches.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/MessageSearches.java (original)
+++ james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/MessageSearches.java Mon Mar 24 13:33:09 2008
@@ -23,6 +23,7 @@
 import java.io.InputStream;
 import java.io.StringReader;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -74,11 +75,12 @@
      */
     public boolean isMatch(final SearchQuery query, final MessageRow row) throws TorqueException {
         final List criteria = query.getCriterias();
+        final Collection recentMessageUids = query.getRecentMessageUids();
         boolean result = true;
         if (criteria != null) {
             for (Iterator it = criteria.iterator(); it.hasNext();) {
                 final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
-                if (!isMatch(criterion, row)) {
+                if (!isMatch(criterion, row, recentMessageUids)) {
                     result = false;
                     break;
                 }
@@ -95,7 +97,7 @@
      * false otherwise
      * @throws TorqueException
      */
-    public boolean isMatch(SearchQuery.Criterion criterion, MessageRow row) throws TorqueException {
+    public boolean isMatch(SearchQuery.Criterion criterion, MessageRow row, final Collection recentMessageUids) throws TorqueException {
         final boolean result;
         if (criterion instanceof SearchQuery.InternalDateCriterion) {
             result = matches((SearchQuery.InternalDateCriterion) criterion, row);
@@ -106,13 +108,13 @@
         } else if (criterion instanceof SearchQuery.UidCriterion) {
             result = matches((SearchQuery.UidCriterion) criterion, row);
         } else if (criterion instanceof SearchQuery.FlagCriterion) {
-            result = matches((SearchQuery.FlagCriterion) criterion, row);
+            result = matches((SearchQuery.FlagCriterion) criterion, row, recentMessageUids);
         } else if (criterion instanceof SearchQuery.TextCriterion) {
             result = matches((SearchQuery.TextCriterion) criterion, row);
         } else if (criterion instanceof SearchQuery.AllCriterion) {
             result = true;
         } else if (criterion instanceof SearchQuery.ConjunctionCriterion) {
-            result = matches((SearchQuery.ConjunctionCriterion) criterion, row);
+            result = matches((SearchQuery.ConjunctionCriterion) criterion, row, recentMessageUids);
         } else {
             throw new UnsupportedSearchException();
         }
@@ -158,22 +160,22 @@
         return result;
     }
 
-    private boolean matches(SearchQuery.ConjunctionCriterion criterion, MessageRow row) throws TorqueException {
+    private boolean matches(SearchQuery.ConjunctionCriterion criterion, MessageRow row, final Collection recentMessageUids) throws TorqueException {
         final int type = criterion.getType();
         final List criteria = criterion.getCriteria();
         switch (type) {
-            case SearchQuery.ConjunctionCriterion.NOR: return nor(criteria, row);
-            case SearchQuery.ConjunctionCriterion.OR: return or(criteria, row);
-            case SearchQuery.ConjunctionCriterion.AND: return and(criteria, row);
+            case SearchQuery.ConjunctionCriterion.NOR: return nor(criteria, row, recentMessageUids);
+            case SearchQuery.ConjunctionCriterion.OR: return or(criteria, row, recentMessageUids);
+            case SearchQuery.ConjunctionCriterion.AND: return and(criteria, row, recentMessageUids);
             default: return false;
         }
     }
     
-    private boolean and(final List criteria, final MessageRow row) throws TorqueException {
+    private boolean and(final List criteria, final MessageRow row, final Collection recentMessageUids) throws TorqueException {
         boolean result = true;
         for (Iterator it = criteria.iterator(); it.hasNext();) {
             final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
-            final boolean matches = isMatch(criterion, row);
+            final boolean matches = isMatch(criterion, row, recentMessageUids);
             if (!matches) {
                 result = false;
                 break;
@@ -182,11 +184,11 @@
         return result;
     }
     
-    private boolean or(final List criteria, final MessageRow row) throws TorqueException {
+    private boolean or(final List criteria, final MessageRow row, final Collection recentMessageUids) throws TorqueException {
         boolean result = false;
         for (Iterator it = criteria.iterator(); it.hasNext();) {
             final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
-            final boolean matches = isMatch(criterion, row);
+            final boolean matches = isMatch(criterion, row, recentMessageUids);
             if (matches) {
                 result = true;
                 break;
@@ -195,11 +197,11 @@
         return result;
     }
     
-    private boolean nor(final List criteria, final MessageRow row) throws TorqueException {
+    private boolean nor(final List criteria, final MessageRow row, final Collection recentMessageUids) throws TorqueException {
         boolean result = true;
         for (Iterator it = criteria.iterator(); it.hasNext();) {
             final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
-            final boolean matches = isMatch(criterion, row);
+            final boolean matches = isMatch(criterion, row, recentMessageUids);
             if (matches) {
                 result = false;
                 break;
@@ -208,7 +210,7 @@
         return result;
     }
 
-    private boolean matches(SearchQuery.FlagCriterion criterion, MessageRow row) throws TorqueException {
+    private boolean matches(SearchQuery.FlagCriterion criterion, MessageRow row, final Collection recentMessageUids) throws TorqueException {
         final SearchQuery.BooleanOperator operator = criterion.getOperator();
         final boolean isSet = operator.isSet();
         final Flags.Flag flag = criterion.getFlag();
@@ -223,7 +225,8 @@
         } else if (flag == Flags.Flag.FLAGGED) {
             result = isSet == messageFlags.getFlagged();
         } else if (flag == Flags.Flag.RECENT) {
-            result = isSet == messageFlags.getRecent();
+            final long uid = row.getUid();
+            result = isSet == recentMessageUids.contains(new Long(uid));
         } else if (flag == Flags.Flag.DELETED) {
             result = isSet == messageFlags.getDeleted();
         } else {

Modified: james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsMultipartMixedTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsMultipartMixedTest.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsMultipartMixedTest.java (original)
+++ james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsMultipartMixedTest.java Mon Mar 24 13:33:09 2008
@@ -20,6 +20,8 @@
 package org.apache.james.mailboxmanager.torque;
 
 import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import junit.framework.TestCase;
 
@@ -107,6 +109,7 @@
     
     MessageRow row;
     MessageSearches searches;
+    Collection recent;
     
     protected void setUp() throws Exception {
         super.setUp();
@@ -118,6 +121,7 @@
         row.addMessageHeader(new MessageHeader("Content-Type", "multipart/mixed;boundary=1729"));
         row.addMessageBody(new MessageBody(Charset.forName("us-ascii").encode(BODY).array()));
         searches = new MessageSearches();
+        recent = new ArrayList();
     }
 
     protected void tearDown() throws Exception {
@@ -125,54 +129,54 @@
     }
     
     public void testShouldNotFindWhatIsNotThere() throws Exception {
-        assertFalse(searches.isMatch(SearchQuery.bodyContains("BOGUS"), row));
-        assertFalse(searches.isMatch(SearchQuery.mailContains("BOGUS"), row));
+        assertFalse(searches.isMatch(SearchQuery.bodyContains("BOGUS"), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.mailContains("BOGUS"), row, recent));
     }
     
     public void testBodyShouldFindTextInBody() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO), row));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO), row, recent));
     }
     
     public void testBodyShouldFindTextInBodyCaseInsensitive() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE.toUpperCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE.toUpperCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO.toUpperCase()), row));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_BODY_ONE.toUpperCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE.toUpperCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO.toUpperCase()), row, recent));
     }
     
     public void testBodyShouldNotFindTextInHeaders() throws Exception {
-        assertFalse(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_FIELD), row));
-        assertFalse(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO_FIELD), row));
+        assertFalse(searches.isMatch(SearchQuery.bodyContains(SAMPLE_INNER_MAIL_FIELD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO_FIELD), row, recent));
     }
     
     public void testTextShouldFindTextInBody() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO), row));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO), row, recent));
     }
     
     public void testTextShouldFindTextInBodyCaseInsensitive() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE.toUpperCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE.toUpperCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO.toUpperCase()), row));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE.toUpperCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE.toUpperCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO.toUpperCase()), row, recent));
     }
     
     public void testTextShouldFindTextInHeaders() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_FIELD), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO_FIELD), row));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_FIELD), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO_FIELD), row, recent));
     }
 }

Modified: james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsRFC822Test.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsRFC822Test.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsRFC822Test.java (original)
+++ james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsRFC822Test.java Mon Mar 24 13:33:09 2008
@@ -20,6 +20,8 @@
 package org.apache.james.mailboxmanager.torque;
 
 import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import junit.framework.TestCase;
 
@@ -42,9 +44,11 @@
     
     MessageRow row;
     MessageSearches searches;
+    Collection recent;
     
     protected void setUp() throws Exception {
         super.setUp();
+        recent = new ArrayList();
         row = new MessageRow(); 
         row.addMessageHeader(new MessageHeader(RFC2822Headers.FROM, "Alex <alex@example.org"));
         row.addMessageHeader(new MessageHeader(RFC2822Headers.TO, FROM_ADDRESS));
@@ -59,34 +63,34 @@
     }
     
     public void testBodyShouldMatchPhraseInBody() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.bodyContains(CUSTARD + CUSTARD), row));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.bodyContains(CUSTARD + CUSTARD), row, recent));
     }
     
     public void testBodyMatchShouldBeCaseInsensitive() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(RHUBARD), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(RHUBARD.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.bodyContains(RHUBARD.toLowerCase()), row));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(RHUBARD), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(RHUBARD.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.bodyContains(RHUBARD.toLowerCase()), row, recent));
     }
     
     public void testBodyShouldNotMatchPhraseOnlyInHeader() throws Exception {
-        assertFalse(searches.isMatch(SearchQuery.bodyContains(FROM_ADDRESS), row));
-        assertFalse(searches.isMatch(SearchQuery.bodyContains(SUBJECT_PART), row));
+        assertFalse(searches.isMatch(SearchQuery.bodyContains(FROM_ADDRESS), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.bodyContains(SUBJECT_PART), row, recent));
     }
     
     public void testTextShouldMatchPhraseInBody() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.mailContains(CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.mailContains(CUSTARD + CUSTARD), row));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.mailContains(CUSTARD + CUSTARD), row, recent));
     }
     
     public void testTextMatchShouldBeCaseInsensitive() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.mailContains(RHUBARD), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(RHUBARD.toLowerCase()), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(RHUBARD.toLowerCase()), row));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(RHUBARD), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(RHUBARD.toLowerCase()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(RHUBARD.toLowerCase()), row, recent));
     }
     
     public void testBodyShouldMatchPhraseOnlyInHeader() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.mailContains(FROM_ADDRESS), row));
-        assertTrue(searches.isMatch(SearchQuery.mailContains(SUBJECT_PART), row));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(FROM_ADDRESS), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.mailContains(SUBJECT_PART), row, recent));
     }
 }

Modified: james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java?rev=640562&r1=640561&r2=640562&view=diff
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java (original)
+++ james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java Mon Mar 24 13:33:09 2008
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailboxmanager.torque;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 
 import javax.mail.Flags;
@@ -45,10 +47,13 @@
     
     MessageRow row;
     MessageSearches searches;
+    Collection recent;
     
     protected void setUp() throws Exception {
         super.setUp();
+        recent = new ArrayList();
         row = new MessageRow();
+        row.setUid(1009);
         searches = new MessageSearches();
     }
 
@@ -58,367 +63,374 @@
     
     public void testMatchSizeLessThan() throws Exception {
         row.setSize(SIZE);
-        assertFalse(searches.isMatch(SearchQuery.sizeLessThan(SIZE - 1), row));
-        assertFalse(searches.isMatch(SearchQuery.sizeLessThan(SIZE), row));
-        assertTrue(searches.isMatch(SearchQuery.sizeLessThan(SIZE + 1), row));
-        assertTrue(searches.isMatch(SearchQuery.sizeLessThan(Integer.MAX_VALUE), row));
+        assertFalse(searches.isMatch(SearchQuery.sizeLessThan(SIZE - 1), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.sizeLessThan(SIZE), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.sizeLessThan(SIZE + 1), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.sizeLessThan(Integer.MAX_VALUE), row, recent));
     }
     
     public void testMatchSizeMoreThan() throws Exception {
         row.setSize(SIZE);
-        assertTrue(searches.isMatch(SearchQuery.sizeGreaterThan(SIZE - 1), row));
-        assertFalse(searches.isMatch(SearchQuery.sizeGreaterThan(SIZE), row));
-        assertFalse(searches.isMatch(SearchQuery.sizeGreaterThan(SIZE + 1), row));
-        assertFalse(searches.isMatch(SearchQuery.sizeGreaterThan(Integer.MAX_VALUE), row));
+        assertTrue(searches.isMatch(SearchQuery.sizeGreaterThan(SIZE - 1), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.sizeGreaterThan(SIZE), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.sizeGreaterThan(SIZE + 1), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.sizeGreaterThan(Integer.MAX_VALUE), row, recent));
     }
     
     public void testMatchSizeEquals() throws Exception {
         row.setSize(SIZE);
-        assertFalse(searches.isMatch(SearchQuery.sizeEquals(SIZE - 1), row));
-        assertTrue(searches.isMatch(SearchQuery.sizeEquals(SIZE), row));
-        assertFalse(searches.isMatch(SearchQuery.sizeEquals(SIZE + 1), row));
-        assertFalse(searches.isMatch(SearchQuery.sizeEquals(Integer.MAX_VALUE), row));
+        assertFalse(searches.isMatch(SearchQuery.sizeEquals(SIZE - 1), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.sizeEquals(SIZE), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.sizeEquals(SIZE + 1), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.sizeEquals(Integer.MAX_VALUE), row, recent));
     }
     
     public void testMatchInternalDateEquals() throws Exception {
         row.setInternalDate(SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateOn(8, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateOn(10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2002), row));
+        assertFalse(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateOn(8, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateOn(10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateOn(9, 9, 2002), row, recent));
     }
     
     public void testMatchInternalDateBefore() throws Exception {
         row.setInternalDate(SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateBefore(8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.internalDateBefore(10, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2002), row));
+        assertFalse(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateBefore(8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.internalDateBefore(10, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.internalDateBefore(9, 9, 2002), row, recent));
     }
         
     public void testMatchInternalDateAfter() throws Exception {
         row.setInternalDate(SUN_SEP_9TH_2001);
-        assertTrue(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2000), row));
-        assertTrue(searches.isMatch(SearchQuery.internalDateAfter(8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateAfter(10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2002), row));
+        assertTrue(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2000), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.internalDateAfter(8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateAfter(10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.internalDateAfter(9, 9, 2002), row, recent));
     }
     
     public void testMatchHeaderDateAfter() throws Exception {
         addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
-        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row));
+        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testShouldMatchCapsHeaderDateAfter() throws Exception {
         addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
-        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row));
+        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testShouldMatchLowersHeaderDateAfter() throws Exception {
         addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
-        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row));
+        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testMatchHeaderDateOn() throws Exception {
         addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testShouldMatchCapsHeaderDateOn() throws Exception {
         addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row, recent));
      }
     
     public void testShouldMatchLowersHeaderDateOn() throws Exception {
         addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row, recent));
     }
     
     
     public void testMatchHeaderDateBefore() throws Exception {
         addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testShouldMatchCapsHeaderDateBefore() throws Exception {
         addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testShouldMatchLowersHeaderDateBefore() throws Exception {
         addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row));
-        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row));
-        assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row, recent));
     }
     
     public void testMatchHeaderContainsCaps() throws Exception {
         addHeader(SUBJECT_FIELD, TEXT.toUpperCase());
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row, recent)); 
     }
     
     public void testMatchHeaderContainsLowers() throws Exception {
         addHeader(SUBJECT_FIELD, TEXT.toLowerCase());
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row, recent)); 
     }
     
     public void testMatchHeaderContains() throws Exception {
         addHeader(SUBJECT_FIELD, TEXT);
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row, recent)); 
     }
     
     public void testShouldMatchLowerHeaderContains() throws Exception {
         addHeader(SUBJECT_FIELD.toLowerCase(), TEXT);
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row, recent)); 
     }
     
     public void testShouldMatchCapsHeaderContains() throws Exception {
         addHeader(SUBJECT_FIELD.toUpperCase(), TEXT);
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row));
-        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row));
-        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); 
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(DATE_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row, recent)); 
     }
     
     public void testMatchHeaderExists() throws Exception {
         addHeader(SUBJECT_FIELD, TEXT);
-        assertFalse(searches.isMatch(SearchQuery.headerExists(DATE_FIELD), row));
-        assertTrue(searches.isMatch(SearchQuery.headerExists(SUBJECT_FIELD), row));
+        assertFalse(searches.isMatch(SearchQuery.headerExists(DATE_FIELD), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerExists(SUBJECT_FIELD), row, recent));
     }
 
     public void testShouldMatchLowersHeaderExists() throws Exception {
         addHeader(SUBJECT_FIELD.toLowerCase(), TEXT);
-        assertFalse(searches.isMatch(SearchQuery.headerExists(DATE_FIELD), row));
-        assertTrue(searches.isMatch(SearchQuery.headerExists(SUBJECT_FIELD), row));
+        assertFalse(searches.isMatch(SearchQuery.headerExists(DATE_FIELD), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerExists(SUBJECT_FIELD), row, recent));
     }
     
     public void testShouldMatchUppersHeaderExists() throws Exception {
         addHeader(SUBJECT_FIELD.toUpperCase(), TEXT);
-        assertFalse(searches.isMatch(SearchQuery.headerExists(DATE_FIELD), row));
-        assertTrue(searches.isMatch(SearchQuery.headerExists(SUBJECT_FIELD), row));
+        assertFalse(searches.isMatch(SearchQuery.headerExists(DATE_FIELD), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.headerExists(SUBJECT_FIELD), row, recent));
     }
     
     public void testShouldMatchUidRange() throws Exception {
         row.setPrimaryKey(1, 1729);
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1728, 1728)), row));
-        assertTrue(searches.isMatch(SearchQuery.uid(range(1729, 1729)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1730, 1730)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1728)), row));
-        assertTrue(searches.isMatch(SearchQuery.uid(range(1, 1729)), row));
-        assertTrue(searches.isMatch(SearchQuery.uid(range(1729, 1800)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE, 1, 1728)), row));
-        assertTrue(searches.isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE, 1, 1729)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1728, 1800, 1810)), row));
-        assertTrue(searches.isMatch(SearchQuery.uid(range(1, 1, 1729, 1729)), row));
-        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1, 1800, 1800)), row));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1728, 1728)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.uid(range(1729, 1729)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1730, 1730)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1728)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.uid(range(1, 1729)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.uid(range(1729, 1800)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE, 1, 1728)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE, 1, 1729)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1728, 1800, 1810)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.uid(range(1, 1, 1729, 1729)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.uid(range(1, 1, 1800, 1800)), row, recent));
     }
     
     public void testShouldMatchSeenFlagSet() throws Exception {
         setFlags(true, false, false, false, false, false);
-        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchAnsweredFlagSet() throws Exception {
         setFlags(false, false, true, false, false, false);
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchFlaggedFlagSet() throws Exception {
         setFlags(false, true, false, false, false, false);
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchDraftFlagSet() throws Exception {
         setFlags(false, false, false, true, false, false);
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchDeletedFlagSet() throws Exception {
         setFlags(false, false, false, false, true, false);
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchSeenRecentSet() throws Exception {
-        setFlags(false, false, false, false, false, true);
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+        setFlags(false, false, false, false, false, false);
+        recent.add(new Long(row.getUid()));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT), row, recent));
     }
 
     public void testShouldMatchSeenFlagUnSet() throws Exception {
         setFlags(false, true, true, true, true, true);
-        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+        recent.add(new Long(row.getUid()));
+        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchAnsweredFlagUnSet() throws Exception {
         setFlags(true, true, false, true, true, true);
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+        recent.add(new Long(row.getUid()));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchFlaggedFlagUnSet() throws Exception {
         setFlags(true, false, true, true, true, true);
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+        recent.add(new Long(row.getUid()));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchDraftFlagUnSet() throws Exception {
         setFlags(true, true, true, false, true, true);
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+        recent.add(new Long(row.getUid()));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchDeletedFlagUnSet() throws Exception {
         setFlags(true, true, true, true, false, true);
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+        recent.add(new Long(row.getUid()));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchSeenRecentUnSet() throws Exception {
-        setFlags(true, true, true, true, true, false);
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
-        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
-        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+        setFlags(true, true, true, true, true, true);
+        recent.add(new Long(row.getUid() + 1));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent));
     }
     
     public void testShouldMatchAll() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.all(), row));
+        assertTrue(searches.isMatch(SearchQuery.all(), row, recent));
     }
     
     public void testShouldMatchNot() throws Exception {
-        assertFalse(searches.isMatch(SearchQuery.not(SearchQuery.all()), row));
-        assertTrue(searches.isMatch(SearchQuery.not(SearchQuery.headerExists(DATE_FIELD)), row));
+        assertFalse(searches.isMatch(SearchQuery.not(SearchQuery.all()), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.not(SearchQuery.headerExists(DATE_FIELD)), row, recent));
     }
     
     public void testShouldMatchOr() throws Exception {
-        assertTrue(searches.isMatch(SearchQuery.or(SearchQuery.all(), SearchQuery.headerExists(DATE_FIELD)), row));
-        assertTrue(searches.isMatch(SearchQuery.or(SearchQuery.headerExists(DATE_FIELD), SearchQuery.all()), row));
-        assertFalse(searches.isMatch(SearchQuery.or(SearchQuery.headerExists(DATE_FIELD), SearchQuery.headerExists(DATE_FIELD)), row));
-        assertTrue(searches.isMatch(SearchQuery.or(SearchQuery.all(), SearchQuery.all()), row));
+        assertTrue(searches.isMatch(SearchQuery.or(SearchQuery.all(), SearchQuery.headerExists(DATE_FIELD)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.or(SearchQuery.headerExists(DATE_FIELD), SearchQuery.all()), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.or(SearchQuery.headerExists(DATE_FIELD), SearchQuery.headerExists(DATE_FIELD)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.or(SearchQuery.all(), SearchQuery.all()), row, recent));
     }
     
     public void testShouldMatchAnd() throws Exception {
-        assertFalse(searches.isMatch(SearchQuery.and(SearchQuery.all(), SearchQuery.headerExists(DATE_FIELD)), row));
-        assertFalse(searches.isMatch(SearchQuery.and(SearchQuery.headerExists(DATE_FIELD), SearchQuery.all()), row));
-        assertFalse(searches.isMatch(SearchQuery.and(SearchQuery.headerExists(DATE_FIELD), SearchQuery.headerExists(DATE_FIELD)), row));
-        assertTrue(searches.isMatch(SearchQuery.and(SearchQuery.all(), SearchQuery.all()), row));
+        assertFalse(searches.isMatch(SearchQuery.and(SearchQuery.all(), SearchQuery.headerExists(DATE_FIELD)), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.and(SearchQuery.headerExists(DATE_FIELD), SearchQuery.all()), row, recent));
+        assertFalse(searches.isMatch(SearchQuery.and(SearchQuery.headerExists(DATE_FIELD), SearchQuery.headerExists(DATE_FIELD)), row, recent));
+        assertTrue(searches.isMatch(SearchQuery.and(SearchQuery.all(), SearchQuery.all()), row, recent));
     }
     
     private void setFlags(boolean seen, boolean flagged, boolean answered, boolean draft, 



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org