Author: rdonkin Date: Tue Mar 4 14:02:26 2008 New Revision: 633666 URL: http://svn.apache.org/viewvc?rev=633666&view=rev Log: Torque search query.
Added: james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.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 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=633666&r1=633665&r2=633666&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 Tue Mar 4 14:02:26 2008 @@ -59,6 +59,16 @@ } /** + * Creates a filter for message size equal to the given value + * @param value messages with size equal to this value will be selected + * by the returned criterion + * @return <code>Criterion</code>, not null + */ + public static final Criterion sizeEquals(long value) { + return new SizeCriterion(new NumericOperator(value, NumericOperator.EQUALS)); + } + + /** * Creates a filter matching messages with internal date after the given date. * @param day one based day of the month * @param month one based month of the year Added: james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java?rev=633666&view=auto ============================================================================== --- james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java (added) +++ james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java Tue Mar 4 14:02:26 2008 @@ -0,0 +1,217 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailboxmanager.torque; + +import java.io.StringReader; +import java.util.Calendar; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; + +import org.apache.james.mailboxmanager.SearchQuery; +import org.apache.james.mailboxmanager.torque.om.MessageHeader; +import org.apache.james.mailboxmanager.torque.om.MessageRow; +import org.apache.james.mime4j.field.datetime.DateTime; +import org.apache.james.mime4j.field.datetime.parser.DateTimeParser; +import org.apache.james.mime4j.field.datetime.parser.ParseException; +import org.apache.torque.TorqueException; + +/** + * Uility methods to help perform search operations. + */ +class SearchUtils { + + public static boolean matches(SearchQuery.Criterion criterion, MessageRow row) throws TorqueException { + final boolean result; + if (criterion instanceof SearchQuery.InternalDateCriterion) { + result = matches((SearchQuery.InternalDateCriterion) criterion, row); + } else if (criterion instanceof SearchQuery.SizeCriterion) { + result = matches((SearchQuery.SizeCriterion) criterion, row); + } else if (criterion instanceof SearchQuery.HeaderCriterion) { + result = matches((SearchQuery.HeaderCriterion) criterion, row); + } else { + throw new UnsupportedSearchException(); + } + return result; + } + + private static boolean matches(SearchQuery.HeaderCriterion criterion, MessageRow row) throws TorqueException { + final SearchQuery.HeaderOperator operator = criterion.getOperator(); + final String headerName = criterion.getHeaderName(); + final boolean result; + if (operator instanceof SearchQuery.DateOperator) { + result = matches((SearchQuery.DateOperator) operator, headerName, row); + } else if (operator instanceof SearchQuery.ContainsOperator) { + result = matches((SearchQuery.ContainsOperator)operator, headerName, row); + } else if (operator instanceof SearchQuery.ExistsOperator) { + result = exists(headerName, row); + } else { + throw new UnsupportedSearchException(); + } + return result; + } + + private static boolean exists(String headerName, MessageRow row) throws TorqueException { + boolean result = false; + final List headers = row.getMessageHeaders(); + for (Iterator it = headers.iterator(); it.hasNext();) { + final MessageHeader header = (MessageHeader) it.next(); + final String name = header.getField(); + if (headerName.equalsIgnoreCase(name)) { + result = true; + break; + } + } + return result; + } + + private static boolean matches(final SearchQuery.ContainsOperator operator, final String headerName, final MessageRow row) throws TorqueException { + final String text = operator.getValue(); + boolean result = false; + final List headers = row.getMessageHeaders(); + for (Iterator it = headers.iterator(); it.hasNext();) { + final MessageHeader header = (MessageHeader) it.next(); + final String name = header.getField(); + if (headerName.equalsIgnoreCase(name)) { + final String value = header.getValue(); + if (value.contains(text)) { + result = true; + break; + } + } + } + return result; + } + + private static boolean matches(final SearchQuery.DateOperator operator, final String headerName, final MessageRow row) throws TorqueException { + final int day = operator.getDay(); + final int month = operator.getMonth(); + final int year = operator.getYear(); + final int iso = toISODate(day, month, year); + final String value = headerValue(headerName, row); + if (value == null) { + return false; + } else { + try { + final int isoFieldValue = toISODate(value); + final int type = operator.getType(); + switch (type) { + case SearchQuery.DateOperator.AFTER: return iso < isoFieldValue; + case SearchQuery.DateOperator.BEFORE: return iso > isoFieldValue; + case SearchQuery.DateOperator.ON: return iso == isoFieldValue; + default: throw new UnsupportedSearchException(); + } + } catch (ParseException e) { + return false; + } + } + } + + private static String headerValue(final String headerName, final MessageRow row) throws TorqueException { + final List headers = row.getMessageHeaders(); + String value = null; + for (Iterator it = headers.iterator(); it.hasNext();) { + final MessageHeader header = (MessageHeader) it.next(); + final String name = header.getField(); + if (headerName.equalsIgnoreCase(name)) { + value = header.getValue(); + break; + } + } + return value; + } + + private static int toISODate(String value) throws ParseException { + final StringReader reader = new StringReader(value); + final DateTime dateTime = new DateTimeParser(reader).parseAll(); + final int isoFieldValue = toISODate(dateTime.getDay(), dateTime.getMonth(), dateTime.getYear()); + return isoFieldValue; + } + + private static boolean matches(SearchQuery.SizeCriterion criterion, MessageRow row) throws UnsupportedSearchException { + final SearchQuery.NumericOperator operator = criterion.getOperator(); + final int size = row.getSize(); + final long value = operator.getValue(); + final int type = operator.getType(); + switch (type) { + case SearchQuery.NumericOperator.LESS_THAN: return size < value; + case SearchQuery.NumericOperator.GREATER_THAN: return size > value; + case SearchQuery.NumericOperator.EQUALS: return size == value; + default: throw new UnsupportedSearchException(); + } + } + + private static boolean matches(SearchQuery.InternalDateCriterion criterion, MessageRow row) throws UnsupportedSearchException { + final SearchQuery.DateOperator operator = criterion.getOperator(); + final boolean result = matchesInternalDate(operator, row); + return result; + } + + private static boolean matchesInternalDate(final SearchQuery.DateOperator operator, final MessageRow row) throws UnsupportedSearchException { + final int day = operator.getDay(); + final int month = operator.getMonth(); + final int year = operator.getYear(); + final Date internalDate = row.getInternalDate(); + final int type = operator.getType(); + switch (type) { + case SearchQuery.DateOperator.ON: return on(day, month, year, internalDate); + case SearchQuery.DateOperator.BEFORE: return before(day, month, year, internalDate); + case SearchQuery.DateOperator.AFTER: return after(day, month, year, internalDate); + default: throw new UnsupportedSearchException(); + } + } + + private static boolean on(final int day, final int month, final int year, final Date date) { + final Calendar gmt = getGMT(); + gmt.setTime(date); + return day == gmt.get(Calendar.DAY_OF_MONTH) + && month == (gmt.get(Calendar.MONTH) + 1) + && year == gmt.get(Calendar.YEAR); + } + + private static boolean before(final int day, final int month, final int year, final Date date) { + return toISODate(date) < toISODate(day, month, year); + } + + private static boolean after(final int day, final int month, final int year, final Date date) { + return toISODate(date) > toISODate(day, month, year); + } + + private static int toISODate(final Date date) { + final Calendar gmt = getGMT(); + gmt.setTime(date); + final int day = gmt.get(Calendar.DAY_OF_MONTH); + final int month = (gmt.get(Calendar.MONTH) + 1); + final int year = gmt.get(Calendar.YEAR); + final int result = toISODate(day, month, year); + return result; + } + + private static Calendar getGMT() { + return Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.UK); + } + + private static int toISODate(final int day, final int month, final int year) { + final int result = (year * 10000) + (month * 100) + day; + return result; + } +} Added: james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java URL: http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java?rev=633666&view=auto ============================================================================== --- james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java (added) +++ james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/UnsupportedSearchException.java Tue Mar 4 14:02:26 2008 @@ -0,0 +1,34 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailboxmanager.torque; + +import org.apache.torque.TorqueException; + +/** + * Indicates that the requested search is not supported by this implementation. + */ +public class UnsupportedSearchException extends TorqueException { + + private static final long serialVersionUID = -7442949630563672557L; + + public UnsupportedSearchException() { + super("Unsupported search."); + } +} Added: 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=633666&view=auto ============================================================================== --- james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java (added) +++ james/server/trunk/torque-mailboxmanager-function/src/test/java/org/apache/james/mailboxmanager/torque/SearchUtilsTest.java Tue Mar 4 14:02:26 2008 @@ -0,0 +1,247 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailboxmanager.torque; + +import java.util.Date; + +import org.apache.james.mailboxmanager.SearchQuery; +import org.apache.james.mailboxmanager.torque.om.MessageHeader; +import org.apache.james.mailboxmanager.torque.om.MessageRow; +import org.apache.mailet.RFC2822Headers; +import org.apache.torque.TorqueException; + +import junit.framework.TestCase; + +public class SearchUtilsTest extends TestCase { + + private static final String RHUBARD = "Rhubard"; + private static final String CUSTARD = "Custard"; + private static final Date SUN_SEP_9TH_2001 = new Date(1000000000000L); + private static final int SIZE = 1729; + private static final String DATE_FIELD = RFC2822Headers.DATE; + private static final String SUBJECT_FIELD = RFC2822Headers.SUBJECT; + private static final String RFC822_SUN_SEP_9TH_2001 = "Sun, 9 Sep 2001 09:10:48 +0000 (GMT)"; + private static final String TEXT = RHUBARD + RHUBARD + RHUBARD; + + MessageRow row; + + protected void setUp() throws Exception { + super.setUp(); + row = new MessageRow(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testMatchSizeLessThan() throws Exception { + row.setSize(SIZE); + assertFalse(SearchUtils.matches(SearchQuery.sizeLessThan(SIZE - 1), row)); + assertFalse(SearchUtils.matches(SearchQuery.sizeLessThan(SIZE), row)); + assertTrue(SearchUtils.matches(SearchQuery.sizeLessThan(SIZE + 1), row)); + assertTrue(SearchUtils.matches(SearchQuery.sizeLessThan(Integer.MAX_VALUE), row)); + } + + public void testMatchSizeMoreThan() throws Exception { + row.setSize(SIZE); + assertTrue(SearchUtils.matches(SearchQuery.sizeGreaterThan(SIZE - 1), row)); + assertFalse(SearchUtils.matches(SearchQuery.sizeGreaterThan(SIZE), row)); + assertFalse(SearchUtils.matches(SearchQuery.sizeGreaterThan(SIZE + 1), row)); + assertFalse(SearchUtils.matches(SearchQuery.sizeGreaterThan(Integer.MAX_VALUE), row)); + } + + public void testMatchSizeEquals() throws Exception { + row.setSize(SIZE); + assertFalse(SearchUtils.matches(SearchQuery.sizeEquals(SIZE - 1), row)); + assertTrue(SearchUtils.matches(SearchQuery.sizeEquals(SIZE), row)); + assertFalse(SearchUtils.matches(SearchQuery.sizeEquals(SIZE + 1), row)); + assertFalse(SearchUtils.matches(SearchQuery.sizeEquals(Integer.MAX_VALUE), row)); + } + + public void testMatchInternalDateEquals() throws Exception { + row.setInternalDate(SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(8, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.internalDateOn(9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateOn(9, 9, 2002), row)); + } + + public void testMatchInternalDateBefore() throws Exception { + row.setInternalDate(SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.internalDateBefore(9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateBefore(8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateBefore(9, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.internalDateBefore(10, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.internalDateBefore(9, 9, 2002), row)); + } + + public void testMatchInternalDateAfter() throws Exception { + row.setInternalDate(SUN_SEP_9TH_2001); + assertTrue(SearchUtils.matches(SearchQuery.internalDateAfter(9, 9, 2000), row)); + assertTrue(SearchUtils.matches(SearchQuery.internalDateAfter(8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateAfter(9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateAfter(10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.internalDateAfter(9, 9, 2002), row)); + } + + public void testMatchHeaderDateAfter() throws Exception { + addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001); + assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row)); + } + + public void testShouldMatchCapsHeaderDateAfter() throws Exception { + addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001); + assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row)); + } + + public void testShouldMatchLowersHeaderDateAfter() throws Exception { + addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001); + assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD, 9, 9, 2000), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateAfter("BOGUS",9, 9, 2001), row)); + } + + public void testMatchHeaderDateOn() throws Exception { + addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row)); + } + + public void testShouldMatchCapsHeaderDateOn() throws Exception { + addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row)); + } + + public void testShouldMatchLowersHeaderDateOn() throws Exception { + addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD, 9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,8, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,10, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateOn("BOGUS",9, 9, 2001), row)); + } + + + public void testMatchHeaderDateBefore() throws Exception { + addHeader(DATE_FIELD, RFC822_SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row)); + } + + public void testShouldMatchCapsHeaderDateBefore() throws Exception { + addHeader(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row)); + } + + public void testShouldMatchLowersHeaderDateBefore() throws Exception { + addHeader(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD, 9, 9, 2000), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,8, 9, 2001), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,10, 9, 2001), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerDateBefore(DATE_FIELD,9, 9, 2002), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerDateBefore("BOGUS",9, 9, 2001), row)); + } + + public void testMatchHeaderContains() throws Exception { + addHeader(SUBJECT_FIELD, TEXT); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, TEXT), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); + } + + public void testShouldMatchLowerHeaderContains() throws Exception { + addHeader(SUBJECT_FIELD.toLowerCase(), TEXT); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, TEXT), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); + } + + public void testShouldMatchCapsHeaderContains() throws Exception { + addHeader(SUBJECT_FIELD.toUpperCase(), TEXT); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, CUSTARD), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(DATE_FIELD, TEXT), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, TEXT), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, RHUBARD), row)); + assertFalse(SearchUtils.matches(SearchQuery.headerContains(SUBJECT_FIELD, CUSTARD), row)); + } + + public void testMatchHeaderExists() throws Exception { + addHeader(SUBJECT_FIELD, TEXT); + assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row)); + } + + public void testShouldMatchLowersHeaderExists() throws Exception { + addHeader(SUBJECT_FIELD.toLowerCase(), TEXT); + assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row)); + } + + public void testShouldMatchUppersHeaderExists() throws Exception { + addHeader(SUBJECT_FIELD.toUpperCase(), TEXT); + assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row)); + assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row)); + } + + private void addHeader(String fieldName, String value) throws TorqueException { + final MessageHeader messageHeader = new MessageHeader(); + messageHeader.setField(fieldName); + messageHeader.setValue(value); + row.addMessageHeader(messageHeader); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]