public UidRange(MessageUid minValue, MessageUid messageUid) { if (minValue.compareTo(messageUid) > 0) { throw new IllegalArgumentException("LowVal must be <= HighVal"); } this.range = MessageRange.range(minValue, messageUid); }
private MessageRange msnRangeToMessageRange(SelectedMailbox selected, long lowVal, long highVal) throws MessageRangeException { // Take care of "*" and "*:*" values by return the last message in // the mailbox. See IMAP-289 if (lowVal == Long.MAX_VALUE && highVal == Long.MAX_VALUE) { Optional<MessageUid> last = selected.getLastUid(); if (!last.isPresent()) { throw new MessageRangeException("Mailbox is empty"); } return last.get().toRange(); } MessageUid lowUid = msnlowValToUid(selected, lowVal); MessageUid highUid = msnHighValToUid(selected, highVal); return MessageRange.range(lowUid, highUid); }
private List<SearchResult> searchResults(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException { MessageMapper mapper = messageMapperFactory.getMessageMapper(session); final SortedSet<MailboxMessage> hitSet = new TreeSet<>(); UidCriterion uidCrit = findConjugatedUidCriterion(query.getCriterias()); if (uidCrit != null) { // if there is a conjugated uid range criterion in the query tree we can optimize by // only fetching this uid range UidRange[] ranges = uidCrit.getOperator().getRange(); for (UidRange r : ranges) { Iterator<MailboxMessage> it = mapper.findInMailbox(mailbox, MessageRange.range(r.getLowValue(), r.getHighValue()), FetchType.Metadata, -1); while (it.hasNext()) { hitSet.add(it.next()); } } } else { // we have to fetch all messages Iterator<MailboxMessage> messages = mapper.findInMailbox(mailbox, MessageRange.all(), FetchType.Full, -1); while (messages.hasNext()) { MailboxMessage m = messages.next(); hitSet.add(m); } } return ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, textExtractor).iterator()); }
/** * Tries to split the given {@link MessageRange} to a {@link List} of {@link MessageRange}'s which * select only a max amount of items. This only work for {@link MessageRange}'s with {@link Type} of * {@link Type#RANGE}. */ public List<MessageRange> split(int maxItems) { List<MessageRange> ranges = new ArrayList<>(); if (getType() == Type.RANGE) { long from = getUidFrom().asLong(); long to = getUidTo().asLong(); long realTo = to; while (from <= realTo) { if (from + maxItems - 1 < realTo) { to = from + maxItems - 1; } else { to = realTo; } if (from == to) { ranges.add(MessageUid.of(from).toRange()); } else { ranges.add(MessageRange.range(MessageUid.of(from), MessageUid.of(to))); } from = to + 1; } } else { ranges.add(this); } return ranges; }
@Test void retrieveDeletedMessageShouldReturnMessageInRangeForMessageRangeRange() { addMessageForRetrieveTest(); List<MessageUid> result = testee .retrieveDeletedMessage(MAILBOX_ID, MessageRange.range(MessageUid.of(3), MessageUid.of(7))) .join() .collect(Guavate.toImmutableList()); assertThat(result).containsExactly(UID_3, UID_4, UID_7); }
@Test public void splitTenElementsRangeShouldReturn4Ranges() { MessageRange range = MessageRange.range(MessageUid.of(1),MessageUid.of(10)); List<MessageRange> ranges = range.split(3); assertThat(ranges).containsExactly( MessageRange.range(MessageUid.of(1), MessageUid.of(3)), MessageRange.range(MessageUid.of(4), MessageUid.of(6)), MessageRange.range(MessageUid.of(7), MessageUid.of(9)), MessageUid.of(10).toRange()); }
private void readBatch() throws MailboxException { MessageRange range; switch (type) { default: case ALL: // In case of all, we start on cursor and don't specify a to range = MessageRange.from(cursor); break; case FROM: range = MessageRange.from(cursor); break; case ONE: range = MessageRange.one(cursor); break; case RANGE: range = MessageRange.range(cursor, to); break; } next = mapper.findInMailbox(mailbox, range, ftype, batchSizeFromFetchType(ftype)); }
@Test public void includeShouldBeTrueWhenInRange() { MessageRange range = MessageRange.range(MessageUid.of(3), MessageUid.of(6)); boolean actual = range.includes(MessageUid.of(4)); assertThat(actual).isTrue(); }
@Test void retrieveDeletedMessageShouldReturnNoMessageForMessageRangeRangeIfNoDeletedMessageInThatRange() { addMessageForRetrieveTest(); List<MessageUid> result = testee .retrieveDeletedMessage(MAILBOX_ID, MessageRange.range(MessageUid.of(5), MessageUid.of(6))) .join() .collect(Guavate.toImmutableList()); assertThat(result).isEmpty(); }
@Test public void includeShouldBeFalseWhenAfterRange() { MessageRange range = MessageRange.range(MessageUid.of(3), MessageUid.of(6)); boolean actual = range.includes(MessageUid.of(7)); assertThat(actual).isFalse(); } }
@Test public void testTwoSeqUidToRange() { List<MessageRange> ranges = MessageRange.toRanges(Arrays.asList(MessageUid.of(1L), MessageUid.of(2L))); assertThat(ranges).containsExactly(MessageRange.range(MessageUid.of(1), MessageUid.of(2))); }
@Test public void includeShouldBeTrueWhenEqualsToRange() { MessageRange range = MessageRange.range(MessageUid.of(3), MessageUid.of(6)); boolean actual = range.includes(MessageUid.of(6)); assertThat(actual).isTrue(); }
@Test public void includeShouldBeFalseWhenBeforeRange() { MessageRange range = MessageRange.range(MessageUid.of(3), MessageUid.of(6)); boolean actual = range.includes(MessageUid.of(1)); assertThat(actual).isFalse(); }
@Test public void includeShouldBeTrueWhenEqualsFromRange() { MessageRange range = MessageRange.range(MessageUid.of(3), MessageUid.of(6)); boolean actual = range.includes(MessageUid.of(3)); assertThat(actual).isTrue(); }
@Test public void toMessageRangeShouldContainSameValues() { assertThat(new UidRange(_1, _4).toMessageRange()).isEqualTo(MessageRange.range(_1, _4)); }
StatusResponse okResponse = mock(StatusResponse.class); when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse); when(mockMailboxManager.moveMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mockMailboxSession)) .thenReturn(Lists.<MessageRange>newArrayList(MessageRange.range(MessageUid.of(4), MessageUid.of(6)))); verify(mockMailboxManager).mailboxExists(inbox, mockMailboxSession); verify(mockMailboxManager).getMailbox(inbox, mockMailboxSession); verify(mockMailboxManager).moveMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mockMailboxSession); verify(targetMessageManager).getMetaData(false, mockMailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN); verify(mockResponder).respond(okResponse);
StatusResponse okResponse = mock(StatusResponse.class); when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse); when(mockMailboxManager.moveMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mockMailboxSession)).thenReturn(Lists.<MessageRange>newArrayList(MessageRange.range(MessageUid.of(4), MessageUid.of(6)))); verify(mockMailboxManager).mailboxExists(inbox, mockMailboxSession); verify(mockMailboxManager).getMailbox(inbox, mockMailboxSession); verify(mockMailboxManager).copyMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mockMailboxSession); verify(targetMessageManager).getMetaData(false, mockMailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN); verify(mockResponder).respond(okResponse);
verify(mockMailboxManager).mailboxExists(inbox, mockMailboxSession); verify(mockMailboxManager).getMailbox(inbox, mockMailboxSession); verify(mockMailboxManager).moveMessages(MessageRange.range(MessageUid.of(5), MessageUid.of(6)), selected, inbox, mockMailboxSession); verify(mockMailboxManager).moveMessages(MessageRange.range(MessageUid.of(1), MessageUid.of(3)), selected, inbox, mockMailboxSession); verify(targetMessageManager).getMetaData(false, mockMailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN); verify(mockResponder).respond(okResponse);
@Test public void givenSomeNumbersToRangeShouldReturnThreeRanges() { List<MessageRange> ranges = MessageRange.toRanges( Arrays.asList( MessageUid.of(1L), MessageUid.of(2L), MessageUid.of(3L), MessageUid.of(5L), MessageUid.of(6L), MessageUid.of(9L))); assertThat(ranges).containsExactly( MessageRange.range(MessageUid.of(1), MessageUid.of(3)), MessageRange.range(MessageUid.of(5), MessageUid.of(6)), MessageUid.of(9).toRange()); }
/** * Return a {@link MessageRange} for the given values. If the MessageRange * can not be generated a {@link MailboxException} will get thrown */ protected MessageRange messageRange(SelectedMailbox selected, IdRange range, boolean useUids) throws MessageRangeException { long lowVal = range.getLowVal(); long highVal = range.getHighVal(); if (useUids == false) { return msnRangeToMessageRange(selected, lowVal, highVal); } else { if (selected.existsCount() <= 0) { return null; } // Take care of "*" and "*:*" values by return the last message in // the mailbox. See IMAP-289 MessageUid lastUid = selected.getLastUid().orElse(MessageUid.MIN_VALUE); if (lowVal == Long.MAX_VALUE && highVal == Long.MAX_VALUE) { return MessageRange.one(lastUid); } else if (highVal == Long.MAX_VALUE && lastUid.compareTo(MessageUid.of(lowVal)) < 0) { // Sequence uid ranges which use *:<uid-higher-then-last-uid> // MUST return at least the highest uid in the mailbox // See IMAP-291 return MessageRange.one(lastUid); } return MessageRange.range(MessageUid.of(lowVal), MessageUid.of(highVal)); } }