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/05 22:54:05 UTC
svn commit: r634041 - in /james/server/trunk:
core-library/src/main/java/org/apache/james/mailboxmanager/
torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/
torque-mailboxmanager-function/src/test/java/org/apache/james...
Author: rdonkin
Date: Wed Mar 5 13:54:03 2008
New Revision: 634041
URL: http://svn.apache.org/viewvc?rev=634041&view=rev
Log:
More searches
Modified:
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/SearchQuery.java
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.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=634041&r1=634040&r2=634041&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 Wed Mar 5 13:54:03 2008
@@ -407,6 +407,16 @@
}
/**
+ * Is the given value in this range?
+ * @param value value to be tested
+ * @return true if the value is in range,
+ * false otherwise
+ */
+ public boolean isIn(long value) {
+ return lowValue <= value && highValue >= value;
+ }
+
+ /**
* @see java.lang.Object#hashCode()
*/
//@Override
Modified: 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=634041&r1=634040&r2=634041&view=diff
==============================================================================
--- james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java (original)
+++ james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/SearchUtils.java Wed Mar 5 13:54:03 2008
@@ -27,7 +27,11 @@
import java.util.Locale;
import java.util.TimeZone;
+import javax.mail.Flags;
+
import org.apache.james.mailboxmanager.SearchQuery;
+import org.apache.james.mailboxmanager.SearchQuery.NumericRange;
+import org.apache.james.mailboxmanager.torque.om.MessageFlags;
import org.apache.james.mailboxmanager.torque.om.MessageHeader;
import org.apache.james.mailboxmanager.torque.om.MessageRow;
import org.apache.james.mime4j.field.datetime.DateTime;
@@ -48,8 +52,106 @@
result = matches((SearchQuery.SizeCriterion) criterion, row);
} else if (criterion instanceof SearchQuery.HeaderCriterion) {
result = matches((SearchQuery.HeaderCriterion) criterion, row);
+ } else if (criterion instanceof SearchQuery.UidCriterion) {
+ result = matches((SearchQuery.UidCriterion) criterion, row);
+ } else if (criterion instanceof SearchQuery.FlagCriterion) {
+ result = matches((SearchQuery.FlagCriterion) criterion, row);
+ } else if (criterion instanceof SearchQuery.AllCriterion) {
+ result = true;
+ } else if (criterion instanceof SearchQuery.ConjunctionCriterion) {
+ result = matches((SearchQuery.ConjunctionCriterion) criterion, row);
} else {
throw new UnsupportedSearchException();
+ }
+ return result;
+ }
+
+ private static boolean matches(SearchQuery.ConjunctionCriterion criterion, MessageRow row) 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);
+ default: return false;
+ }
+ }
+
+ private static boolean and(final List criteria, final MessageRow row) throws TorqueException {
+ boolean result = true;
+ for (Iterator it = criteria.iterator(); it.hasNext();) {
+ final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
+ final boolean matches = matches(criterion, row);
+ if (!matches) {
+ result = false;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private static boolean or(final List criteria, final MessageRow row) throws TorqueException {
+ boolean result = false;
+ for (Iterator it = criteria.iterator(); it.hasNext();) {
+ final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
+ final boolean matches = matches(criterion, row);
+ if (matches) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private static boolean nor(final List criteria, final MessageRow row) throws TorqueException {
+ boolean result = true;
+ for (Iterator it = criteria.iterator(); it.hasNext();) {
+ final SearchQuery.Criterion criterion = (SearchQuery.Criterion) it.next();
+ final boolean matches = matches(criterion, row);
+ if (matches) {
+ result = false;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private static boolean matches(SearchQuery.FlagCriterion criterion, MessageRow row) throws TorqueException {
+ final SearchQuery.BooleanOperator operator = criterion.getOperator();
+ final boolean isSet = operator.isSet();
+ final Flags.Flag flag = criterion.getFlag();
+ final MessageFlags messageFlags = row.getMessageFlags();
+ final boolean result;
+ if (flag == Flags.Flag.ANSWERED) {
+ result = isSet == messageFlags.getAnswered();
+ } else if (flag == Flags.Flag.SEEN) {
+ result = isSet == messageFlags.getSeen();
+ } else if (flag == Flags.Flag.DRAFT) {
+ result = isSet == messageFlags.getDraft();
+ } else if (flag == Flags.Flag.FLAGGED) {
+ result = isSet == messageFlags.getFlagged();
+ } else if (flag == Flags.Flag.RECENT) {
+ result = isSet == messageFlags.getRecent();
+ } else if (flag == Flags.Flag.DELETED) {
+ result = isSet == messageFlags.getDeleted();
+ } else {
+ result = false;
+ }
+ return result;
+ }
+
+ private static boolean matches(SearchQuery.UidCriterion criterion, MessageRow row) throws TorqueException {
+ final SearchQuery.InOperator operator = criterion.getOperator();
+ final NumericRange[] ranges = operator.getRange();
+ final long uid = row.getUid();
+ final int length = ranges.length;
+ boolean result = false;
+ for (int i = 0; i < length; i++) {
+ final NumericRange numericRange = ranges[i];
+ if (numericRange.isIn(uid)) {
+ result = true;
+ break;
+ }
}
return result;
}
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=634041&r1=634040&r2=634041&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 Wed Mar 5 13:54:03 2008
@@ -21,7 +21,10 @@
import java.util.Date;
+import javax.mail.Flags;
+
import org.apache.james.mailboxmanager.SearchQuery;
+import org.apache.james.mailboxmanager.torque.om.MessageFlags;
import org.apache.james.mailboxmanager.torque.om.MessageHeader;
import org.apache.james.mailboxmanager.torque.om.MessageRow;
import org.apache.mailet.RFC2822Headers;
@@ -236,6 +239,188 @@
addHeader(SUBJECT_FIELD.toUpperCase(), TEXT);
assertFalse(SearchUtils.matches(SearchQuery.headerExists(DATE_FIELD), row));
assertTrue(SearchUtils.matches(SearchQuery.headerExists(SUBJECT_FIELD), row));
+ }
+
+ public void testShouldMatchUidRange() throws Exception {
+ row.setPrimaryKey(1, 1729);
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1, 1)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1728, 1728)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.uid(range(1729, 1729)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1730, 1730)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1, 1728)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.uid(range(1, 1729)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.uid(range(1729, 1800)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1730, Long.MAX_VALUE)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1730, Long.MAX_VALUE, 1, 1728)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.uid(range(1730, Long.MAX_VALUE, 1, 1729)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1, 1728, 1800, 1810)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.uid(range(1, 1, 1729, 1729)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.uid(range(1, 1, 1800, 1800)), row));
+ }
+
+ public void testShouldMatchSeenFlagSet() throws Exception {
+ setFlags(true, false, false, false, false, false);
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchAnsweredFlagSet() throws Exception {
+ setFlags(false, false, true, false, false, false);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchFlaggedFlagSet() throws Exception {
+ setFlags(false, true, false, false, false, false);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchDraftFlagSet() throws Exception {
+ setFlags(false, false, false, true, false, false);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchDeletedFlagSet() throws Exception {
+ setFlags(false, false, false, false, true, false);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchSeenRecentSet() throws Exception {
+ setFlags(false, false, false, false, false, true);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.DELETED), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchSeenFlagUnSet() throws Exception {
+ setFlags(false, true, true, true, true, true);
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchAnsweredFlagUnSet() throws Exception {
+ setFlags(true, true, false, true, true, true);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchFlaggedFlagUnSet() throws Exception {
+ setFlags(true, false, true, true, true, true);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchDraftFlagUnSet() throws Exception {
+ setFlags(true, true, true, false, true, true);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchDeletedFlagUnSet() throws Exception {
+ setFlags(true, true, true, true, false, true);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchSeenRecentUnSet() throws Exception {
+ setFlags(true, true, true, true, true, false);
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.SEEN), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT), row));
+ assertFalse(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row));
+ assertTrue(SearchUtils.matches(SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row));
+ }
+
+ public void testShouldMatchAll() throws Exception {
+ assertTrue(SearchUtils.matches(SearchQuery.all(), row));
+ }
+
+ public void testShouldMatchNot() throws Exception {
+ assertFalse(SearchUtils.matches(SearchQuery.not(SearchQuery.all()), row));
+ assertTrue(SearchUtils.matches(SearchQuery.not(SearchQuery.headerExists(DATE_FIELD)), row));
+ }
+
+ public void testShouldMatchOr() throws Exception {
+ assertTrue(SearchUtils.matches(SearchQuery.or(SearchQuery.all(), SearchQuery.headerExists(DATE_FIELD)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.or(SearchQuery.headerExists(DATE_FIELD), SearchQuery.all()), row));
+ assertFalse(SearchUtils.matches(SearchQuery.or(SearchQuery.headerExists(DATE_FIELD), SearchQuery.headerExists(DATE_FIELD)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.or(SearchQuery.all(), SearchQuery.all()), row));
+ }
+
+ public void testShouldMatchAnd() throws Exception {
+ assertFalse(SearchUtils.matches(SearchQuery.and(SearchQuery.all(), SearchQuery.headerExists(DATE_FIELD)), row));
+ assertFalse(SearchUtils.matches(SearchQuery.and(SearchQuery.headerExists(DATE_FIELD), SearchQuery.all()), row));
+ assertFalse(SearchUtils.matches(SearchQuery.and(SearchQuery.headerExists(DATE_FIELD), SearchQuery.headerExists(DATE_FIELD)), row));
+ assertTrue(SearchUtils.matches(SearchQuery.and(SearchQuery.all(), SearchQuery.all()), row));
+ }
+
+ private void setFlags(boolean seen, boolean flagged, boolean answered, boolean draft,
+ boolean deleted, boolean recent) throws TorqueException {
+ final MessageFlags messageFlags = new MessageFlags();
+ messageFlags.setSeen(seen);
+ messageFlags.setFlagged(flagged);
+ messageFlags.setAnswered(answered);
+ messageFlags.setDraft(draft);
+ messageFlags.setDeleted(deleted);
+ messageFlags.setRecent(recent);
+ row.addMessageFlags(messageFlags);
+ }
+
+ private SearchQuery.NumericRange[] range(long low, long high) {
+ SearchQuery.NumericRange[] results = {new SearchQuery.NumericRange(low, high)};
+ return results;
+ }
+
+ private SearchQuery.NumericRange[] range(long lowOne, long highOne, long lowTwo, long highTwo) {
+ SearchQuery.NumericRange[] results = {new SearchQuery.NumericRange(lowOne, highOne), new SearchQuery.NumericRange(lowTwo, highTwo)};
+ return results;
}
private void addHeader(String fieldName, String value) throws TorqueException {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org