JAMES-1934 implements hasAttachment search for lucene
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/810c764d Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/810c764d Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/810c764d Branch: refs/heads/master Commit: 810c764dedb1a19a2d15c32c981545f390fcf807 Parents: c1357bc Author: Luc DUZAN <[email protected]> Authored: Thu Feb 9 12:57:49 2017 +0100 Committer: Benoit Tellier <[email protected]> Committed: Wed Feb 15 06:59:45 2017 +0700 ---------------------------------------------------------------------- .../lucene/search/LuceneMessageSearchIndex.java | 29 ++++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/810c764d/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java ---------------------------------------------------------------------- diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java index 9b3c0c1..eb7ec7c 100644 --- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java +++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java @@ -52,6 +52,7 @@ import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.MultimailboxesSearchQuery; import org.apache.james.mailbox.model.SearchQuery; import org.apache.james.mailbox.model.SearchQuery.AllCriterion; +import org.apache.james.mailbox.model.SearchQuery.AttachmentCriterion; import org.apache.james.mailbox.model.SearchQuery.ContainsOperator; import org.apache.james.mailbox.model.SearchQuery.Criterion; import org.apache.james.mailbox.model.SearchQuery.CustomFlagCriterion; @@ -67,6 +68,7 @@ import org.apache.james.mailbox.model.UpdatedFlags; import org.apache.james.mailbox.store.mail.MessageMapperFactory; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MailboxMessage; +import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex; import org.apache.james.mailbox.store.search.MessageSearchIndex; import org.apache.james.mailbox.store.search.SearchUtil; @@ -162,6 +164,11 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { public final static String UID_FIELD = "uid"; /** + * {@link Field} boolean field that say if the message as an attachment or not + */ + public final static String HAS_ATTACHMENT_FIELD = "hasAttachment"; + + /** * {@link Field} which will contain the {@link Flags} of the {@link MailboxMessage} */ public final static String FLAGS_FIELD = "flags"; @@ -553,7 +560,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { // TODO: Better handling doc.add(new Field(MAILBOX_ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH), Store.YES, Index.NOT_ANALYZED)); doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(membership.getUid().asLong())); - + doc.add(new Field(HAS_ATTACHMENT_FIELD, Boolean.toString(hasAttachment(membership)), Store.YES, Index.NOT_ANALYZED)); if (shouldIndexMessageId == IndexMessageId.Required) { doc.add(new Field(MESSAGE_ID_FIELD, membership.getMessageId().serialize(), Store.YES, Index.NOT_ANALYZED)); } @@ -575,6 +582,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { SimpleContentHandler handler = new SimpleContentHandler() { + @Override public void headers(Header header) { Date sentDate = null; @@ -756,6 +764,11 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { return doc; } + private static boolean hasAttachment(MailboxMessage membership) { + return FluentIterable.from(membership.getProperties()) + .anyMatch(PropertyBuilder.isHasAttachmentProperty()); + } + private String toSentDateField(DateResolution res) { String field; switch (res) { @@ -972,6 +985,10 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { } } + private Query createAttachmentQuery(boolean isSet, Query inMailboxes) throws MailboxException, UnsupportedSearchException { + return new TermQuery(new Term(HAS_ATTACHMENT_FIELD, Boolean.toString(isSet))); + } + /** * Return a {@link Query} which is build based on the given {@link SearchQuery.FlagCriterion}. This is kind of a hack * as it will do a search for the flags in this method and @@ -1261,6 +1278,9 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { } else if (criterion instanceof SearchQuery.FlagCriterion) { FlagCriterion crit = (FlagCriterion) criterion; return createFlagQuery(toString(crit.getFlag()), crit.getOperator().isSet(), inMailboxes, recentUids); + } else if (criterion instanceof SearchQuery.AttachmentCriterion) { + AttachmentCriterion crit = (AttachmentCriterion) criterion; + return createAttachmentQuery(crit.getOperator().isSet(), inMailboxes); } else if (criterion instanceof SearchQuery.CustomFlagCriterion) { CustomFlagCriterion crit = (CustomFlagCriterion) criterion; return createFlagQuery(crit.getFlag(), crit.getOperator().isSet(), inMailboxes, recentUids); @@ -1284,6 +1304,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { /** * @see org.apache.james.mailbox.store.search.ListeningMessageSearchIndex#add(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, MailboxMessage) */ + @Override public void add(MailboxSession session, Mailbox mailbox, MailboxMessage membership) throws MailboxException { Document doc = createMessageDocument(session, membership); Document flagsDoc = createFlagsDocument(membership); @@ -1424,8 +1445,4 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { throw new MailboxException("Unable to delete message from index", e); } } - - - - -} +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
