private SearchQuery convertCondition(FilterCondition filter) { SearchQuery searchQuery = new SearchQuery(); filter.getText().ifPresent(text -> searchQuery.andCriteria( SearchQuery.or(ImmutableList.of( SearchQuery.address(AddressType.From, text), SearchQuery.address(AddressType.To, text), SearchQuery.address(AddressType.Cc, text), SearchQuery.address(AddressType.Bcc, text), SearchQuery.headerContains("Subject", text), SearchQuery.attachmentContains(text), SearchQuery.bodyContains(text), SearchQuery.attachmentFileName(text))) )); filter.getFrom().ifPresent(from -> searchQuery.andCriteria(SearchQuery.address(AddressType.From, from))); filter.getTo().ifPresent(to -> searchQuery.andCriteria(SearchQuery.address(AddressType.To, to))); filter.getCc().ifPresent(cc -> searchQuery.andCriteria(SearchQuery.address(AddressType.Cc, cc))); filter.getBcc().ifPresent(bcc -> searchQuery.andCriteria(SearchQuery.address(AddressType.Bcc, bcc))); filter.getSubject().ifPresent(subject -> searchQuery.andCriteria(SearchQuery.headerContains("Subject", subject))); filter.getAttachments().ifPresent(attachments -> searchQuery.andCriteria(SearchQuery.attachmentContains(attachments))); filter.getBody().ifPresent(body -> searchQuery.andCriteria(SearchQuery.bodyContains(body))); filter.getAfter().ifPresent(after -> searchQuery.andCriteria(SearchQuery.sentDateAfter(Date.from(after.toInstant()), DateResolution.Second))); filter.getBefore().ifPresent(before -> searchQuery.andCriteria(SearchQuery.sentDateBefore(Date.from(before.toInstant()), DateResolution.Second))); filter.getHeader().ifPresent(header -> searchQuery.andCriteria(SearchQuery.headerContains(header.getName(), header.getValue().orElse(null)))); filter.getIsAnswered().ifPresent(isAnswered -> searchQuery.andCriteria(SearchQuery.flag(Flag.ANSWERED, isAnswered))); filter.getIsDraft().ifPresent(isDraft -> searchQuery.andCriteria(SearchQuery.flag(Flag.DRAFT, isDraft))); filter.getIsFlagged().ifPresent(isFlagged -> searchQuery.andCriteria(SearchQuery.flag(Flag.FLAGGED, isFlagged))); filter.getIsUnread().ifPresent(isUnread -> searchQuery.andCriteria(SearchQuery.flag(Flag.SEEN, !isUnread))); filter.getIsForwarded().ifPresent(isForwarded -> searchQuery.andCriteria(SearchQuery.flagSet(Keyword.FORWARDED.getFlagName(), isForwarded))); filter.getMaxSize().ifPresent(maxSize -> searchQuery.andCriteria(SearchQuery.sizeLessThan(maxSize.asLong()))); filter.getMinSize().ifPresent(minSize -> searchQuery.andCriteria(SearchQuery.sizeGreaterThan(minSize.asLong())));
switch (type) { case SearchKey.TYPE_ALL: return SearchQuery.all(); case SearchKey.TYPE_AND: return and(key.getKeys(), session); case SearchKey.TYPE_ANSWERED: return SearchQuery.flagIsSet(Flag.ANSWERED); case SearchKey.TYPE_BCC: return SearchQuery.address(AddressType.Bcc, key.getValue()); case SearchKey.TYPE_BEFORE: return SearchQuery.internalDateBefore(date.toDate(), DateResolution.Day); case SearchKey.TYPE_BODY: return SearchQuery.bodyContains(key.getValue()); case SearchKey.TYPE_CC: return SearchQuery.address(AddressType.Cc, key.getValue()); case SearchKey.TYPE_DELETED: return SearchQuery.flagIsSet(Flag.DELETED); case SearchKey.TYPE_DRAFT: return SearchQuery.flagIsSet(Flag.DRAFT); case SearchKey.TYPE_FLAGGED: return SearchQuery.flagIsSet(Flag.FLAGGED); case SearchKey.TYPE_FROM: return SearchQuery.address(AddressType.From, key.getValue()); case SearchKey.TYPE_HEADER: String value = key.getValue(); return SearchQuery.headerExists(key.getName()); } else { return SearchQuery.headerContains(key.getName(), value);
private Criterion convertOperator(FilterOperator filter) { switch (filter.getOperator()) { case AND: return SearchQuery.and(convertCriterias(filter)); case OR: return SearchQuery.or(convertCriterias(filter)); case NOT: return SearchQuery.not(convertCriterias(filter)); } throw new RuntimeException("Unknown operator"); }
/** * Creates a filter on the given flag. * * @param flag * <code>Flag</code>, not null * @param isSet * true if the messages with the flag set should be matched, * false otherwise * @return <code>Criterion</code>, not null */ public static Criterion flagSet(Flag flag, boolean isSet) { final Criterion result; if (isSet) { result = flagIsSet(flag); } else { result = flagIsUnSet(flag); } return result; }
private SearchQuery toQuery(final SearchKey key, final ImapSession session) throws MessageRangeException { final SearchQuery result = new SearchQuery(); final SelectedMailbox selected = session.getSelected(); if (selected != null) { result.addRecentMessageUids(selected.getRecent()); } final SearchQuery.Criterion criterion = toCriterion(key, session); result.andCriteria(criterion); return result; }
@Override public Iterator<MessageUid> search(SearchQuery query, MailboxSession mailboxSession) throws MailboxException { if (query.equals(new SearchQuery(SearchQuery.all()))) { return listAllMessageUids(mailboxSession); } return index.search(mailboxSession, getMailboxEntity(), query); }
@Test public void filterConditionShouldMapWhenText() { String text = "text"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.or(ImmutableList.of( SearchQuery.address(AddressType.From, text), SearchQuery.address(AddressType.To, text), SearchQuery.address(AddressType.Cc, text), SearchQuery.address(AddressType.Bcc, text), SearchQuery.headerContains("Subject", text), SearchQuery.bodyContains(text), SearchQuery.attachmentContains(text), SearchQuery.attachmentFileName(text)))); SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder() .text(text) .build()); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenHasKeywordWithUserFlag() { SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.flagIsSet(FORWARDED)); SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder() .hasKeyword(Optional.of(FORWARDED)) .build()); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenNotKeywordWithUserFlag() { SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.flagIsUnSet(FORWARDED)); SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder() .notKeyword(Optional.of(FORWARDED)) .build()); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenAndOperator() { String from = "sender@james.org"; String to = "recipient@james.org"; String subject = "subject"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.and(ImmutableList.of( SearchQuery.address(AddressType.From, from), SearchQuery.address(AddressType.To, to), SearchQuery.headerContains("Subject", subject)))); Filter complexFilter = FilterOperator.and( FilterCondition.builder() .from(from) .to(to) .subject(subject) .build()); SearchQuery searchQuery = new FilterToSearchQuery().convert(complexFilter); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenBcc() { String bcc = "blindcopy@james.org"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.address(AddressType.Bcc, bcc)); SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder() .bcc(bcc) .build()); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenComplexFilterTree() { String from = "sender@james.org"; String to = "recipient@james.org"; String cc = "copy@james.org"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.and(ImmutableList.of( SearchQuery.address(AddressType.From, from), SearchQuery.or(ImmutableList.of( SearchQuery.not(SearchQuery.address(AddressType.To, to)), SearchQuery.address(AddressType.Cc, cc)) ) ))); Filter complexFilter = FilterOperator.and( FilterCondition.builder() .from(from) .build(), FilterOperator.or( FilterOperator.not( FilterCondition.builder() .to(to) .build()), FilterCondition.builder() .cc(cc) .build() )); SearchQuery searchQuery = new FilterToSearchQuery().convert(complexFilter); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenOrOperator() { String from = "sender@james.org"; String to = "recipient@james.org"; String subject = "subject"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.or(ImmutableList.of( SearchQuery.address(AddressType.From, from), SearchQuery.address(AddressType.To, to), SearchQuery.headerContains("Subject", subject)))); Filter complexFilter = FilterOperator.or( FilterCondition.builder() .from(from) .to(to) .subject(subject) .build()); SearchQuery searchQuery = new FilterToSearchQuery().convert(complexFilter); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void filterConditionShouldMapWhenNotOperator() { String from = "sender@james.org"; String to = "recipient@james.org"; String subject = "subject"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.not(ImmutableList.of( SearchQuery.address(AddressType.From, from), SearchQuery.address(AddressType.To, to), SearchQuery.headerContains("Subject", subject)))); Filter complexFilter = FilterOperator.not( FilterCondition.builder() .from(from) .to(to) .subject(subject) .build()); SearchQuery searchQuery = new FilterToSearchQuery().convert(complexFilter); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
@Test public void equalsShouldCompareCriteria() { SearchQuery searchQuery1 = new SearchQuery(); SearchQuery searchQuery2 = new SearchQuery(); searchQuery1.andCriteria(SearchQuery.all()); searchQuery2.andCriteria(SearchQuery.all()); assertThat(searchQuery1).isEqualTo(searchQuery2); }
@Test public void filterConditionShouldMapWhenSubject() { String subject = "subject"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.headerContains("Subject", subject)); SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder() .subject(subject) .build()); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
SearchQuery searchQuery = new SearchQuery(); NumericRange[] nRanges = new NumericRange[ranges.size()]; Set<Long> vanishedUids = new HashSet<Long>(); searchQuery.andCriteria(SearchQuery.uid(nRanges)); searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(changedSince)); Iterator<Long> uids = mailbox.search(searchQuery, session); while(uids.hasNext()) {
@Test public void fieldsWithTooLongTermShouldStillBeIndexed() throws Exception { MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, INBOX); MockMailboxSession session = new MockMailboxSession(USERNAME); MessageManager messageManager = storeMailboxManager.getMailbox(mailboxPath, session); String recipient = "benwa@linagora.com"; ComposedMessageId composedMessageId = messageManager.appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setTo(recipient) .setBody(Strings.repeat("0123456789 ", 5000) + " matchMe", StandardCharsets.UTF_8)), session); embeddedElasticSearch.awaitForElasticSearch(); assertThat(messageManager.search(new SearchQuery(SearchQuery.bodyContains("matchMe")), session)) .containsExactly(composedMessageId.getUid()); }
@Test public void filterConditionShouldMapWhenBody() { String body = "body"; SearchQuery expectedSearchQuery = new SearchQuery(); expectedSearchQuery.andCriteria(SearchQuery.bodyContains(body)); SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder() .body(body) .build()); assertThat(searchQuery).isEqualTo(expectedSearchQuery); }
SearchQuery sq = new SearchQuery(); sq.andCriteria(SearchQuery.modSeqGreaterThan(request.getKnownModSeq()));