JAMES-1934 add hasAttachment criterion
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3705c186 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3705c186 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3705c186 Branch: refs/heads/master Commit: 3705c186061dd77a7387cd2ccef45dcaba2bd66d Parents: de54a6e Author: Luc DUZAN <[email protected]> Authored: Thu Feb 9 12:54:34 2017 +0100 Committer: Benoit Tellier <[email protected]> Committed: Wed Feb 15 06:59:45 2017 +0700 ---------------------------------------------------------------------- .../apache/james/mailbox/model/SearchQuery.java | 53 ++++++++++++++++++++ .../store/mail/model/impl/PropertyBuilder.java | 13 +++++ .../mailbox/store/search/MessageSearches.java | 13 +++++ .../search/AbstractMessageSearchIndexTest.java | 27 +++++++++- 4 files changed, 105 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java ---------------------------------------------------------------------- diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java index 914a7b6..a5eeca6 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java @@ -32,6 +32,7 @@ import javax.mail.Flags; import javax.mail.Flags.Flag; import org.apache.james.mailbox.MessageUid; +import org.apache.james.mailbox.model.SearchQuery.Sort; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; @@ -594,6 +595,14 @@ public class SearchQuery implements Serializable { return result; } + public static Criterion hasAttachment() { + return new AttachmentCriterion(BooleanOperator.set()); + } + + public static Criterion hasNoAttachment() { + return new AttachmentCriterion(BooleanOperator.unset()); + } + /** * Creates a filter on the given flag selecting messages where the given * flag is selected. @@ -1308,6 +1317,50 @@ public class SearchQuery implements Serializable { } } + /*** + * Filter on attachment presence + */ + public static class AttachmentCriterion extends Criterion { + private final BooleanOperator operator; + + private AttachmentCriterion(BooleanOperator operator) { + this.operator = operator; + } + + /** + * Gets the test to be preformed. + * + * @return the <code>BooleanOperator</code>, not null + */ + public BooleanOperator getOperator() { + return operator; + } + + @Override + public int hashCode() { + return Objects.hashCode(operator); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AttachmentCriterion) { + AttachmentCriterion that = (AttachmentCriterion) obj; + + return Objects.equal(this.operator, that.operator); + } + + return false; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("operator", operator) + .toString(); + } + } + + /** * Filters on a standard flag. */ http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java index c42aa0c..152f874 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java @@ -49,6 +49,8 @@ import java.util.TreeMap; import org.apache.james.mailbox.store.mail.model.Property; +import com.google.common.base.Predicate; + /** * Builds properties */ @@ -58,6 +60,17 @@ public class PropertyBuilder { public static final String JAMES_INTERNALS = "JAMES_INTERNALS"; public static final String HAS_ATTACHMENT = "HAS_ATTACHMENT"; + public static Predicate<Property> isHasAttachmentProperty() { + return new Predicate<Property>() { + @Override + public boolean apply(Property input) { + return input.getNamespace().equals(PropertyBuilder.JAMES_INTERNALS) + && input.getLocalName().equals(PropertyBuilder.HAS_ATTACHMENT) + && input.getValue().equals("true"); + } + }; + } + private Long textualLineCount; private final List<SimpleProperty> properties; http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java index 6fe58b5..6a440b2 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java @@ -47,6 +47,8 @@ import org.apache.james.mailbox.model.SearchQuery.DateResolution; import org.apache.james.mailbox.model.SearchQuery.UidRange; import org.apache.james.mailbox.store.ResultUtils; import org.apache.james.mailbox.store.mail.model.MailboxMessage; +import org.apache.james.mailbox.store.mail.model.Property; +import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; import org.apache.james.mailbox.store.search.comparator.CombinedComparator; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.MimeIOException; @@ -69,6 +71,7 @@ import org.apache.james.mime4j.utils.search.MessageMatcher; import com.google.common.base.Function; import com.google.common.base.Optional; +import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -94,6 +97,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search public MessageSearches() { } + @Override public Iterator<SimpleMessageSearchIndex.SearchResult> iterator() { ImmutableList.Builder<MailboxMessage> builder = ImmutableList.builder(); while (messages.hasNext()) { @@ -187,6 +191,8 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search result = true; } else if (criterion instanceof SearchQuery.ConjunctionCriterion) { result = matches((SearchQuery.ConjunctionCriterion) criterion, message, recentMessageUids); + } else if (criterion instanceof SearchQuery.AttachmentCriterion) { + result = matches((SearchQuery.AttachmentCriterion) criterion, message); } else if (criterion instanceof SearchQuery.ModSeqCriterion) { result = matches((SearchQuery.ModSeqCriterion) criterion, message); } else { @@ -523,6 +529,13 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search return cal.getTime(); } + + private boolean matches(SearchQuery.AttachmentCriterion criterion, MailboxMessage message) throws UnsupportedSearchException { + boolean mailHasAttachments = FluentIterable.from(message.getProperties()) + .anyMatch(PropertyBuilder.isHasAttachmentProperty()); + return mailHasAttachments == criterion.getOperator().isSet(); + } + private boolean matches(SearchQuery.SizeCriterion criterion, MailboxMessage message) throws UnsupportedSearchException { SearchQuery.NumericOperator operator = criterion.getOperator(); long size = message.getFullContentOctets(); http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java index b3cd404..f64f88d 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java @@ -67,6 +67,7 @@ public abstract class AbstractMessageSearchIndexTest { private ComposedMessageId m7; private ComposedMessageId m8; private ComposedMessageId m9; + private ComposedMessageId mailWithAttachment; private ComposedMessageId mOther; @Before @@ -162,6 +163,14 @@ public abstract class AbstractMessageSearchIndexTest { session, true, new Flags("Hello you")); + + mailWithAttachment = myFolderMessageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"), + new Date(1409608900000L), + session, + true, + new Flags("Hello you")); + await(); } @@ -224,6 +233,22 @@ public abstract class AbstractMessageSearchIndexTest { } @Test + public void hasAttachmentShouldOnlyReturnMessageThatHasAttachmentWhichAreNotInline() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.hasAttachment()); + assertThat(messageSearchIndex.search(session, mailbox2, searchQuery)) + .containsOnly(mailWithAttachment.getUid()); + } + + @Test + public void hasNoAttachmenShouldOnlyReturnMessageThatHasNoAttachmentWhichAreNotInline() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.hasNoAttachment()); + assertThat(messageSearchIndex.search(session, mailbox2, searchQuery)) + .containsOnly(mOther.getUid()); + } + + @Test public void flagIsSetShouldReturnUidOfMessageMarkedAsDeletedWhenUsedWithFlagDeleted() throws MailboxException { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DELETED)); @@ -910,6 +935,6 @@ public abstract class AbstractMessageSearchIndexTest { List<MessageId> actual = messageSearchIndex.search(session, MultimailboxesSearchQuery.from(searchQuery).build(), LIMIT); assertThat(actual).containsOnly(m1.getMessageId(), m2.getMessageId(), m3.getMessageId(), m4.getMessageId(), m5.getMessageId(), - m6.getMessageId(), m7.getMessageId(), m8.getMessageId(), m9.getMessageId(), mOther.getMessageId()); + m6.getMessageId(), m7.getMessageId(), m8.getMessageId(), m9.getMessageId(), mOther.getMessageId(), mailWithAttachment.getMessageId()); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
