@Override public void delete(Multimap<MessageId, MailboxId> ids) { ids.asMap() .entrySet() .stream() .collect(JamesCollectors.chunker(cassandraConfiguration.getExpungeChunkSize())) .forEach(chunk -> FluentFutureStream.of(chunk.stream() .map(entry -> deleteAsFuture(entry.getKey(), entry.getValue()))) .join()); }
public CompletableFuture<Stream<MessageResult>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) { return CompletableFutureUtil.chainAll( limit.applyOnStream(messageIds.stream().distinct()) .collect(JamesCollectors.chunker(configuration.getMessageReadChunkSize())), ids -> rowToMessages(fetchType, ids)) .thenApply(stream -> stream.flatMap(Function.identity())); }
@Override public List<MailboxMessage> find(Collection<MessageId> messageIds, FetchType fetchType) { return messageIds.stream() .collect(JamesCollectors.chunker(cassandraConfiguration.getMessageReadChunkSize())) .flatMap(chuckedIds -> findAsStream(messageIds, fetchType)) .collect(Guavate.toImmutableList()); }
private FlagsUpdateStageResult runUpdateStage(CassandraId mailboxId, Stream<ComposedMessageIdWithMetaData> toBeUpdated, FlagsUpdateCalculator flagsUpdateCalculator) { Long newModSeq = modSeqProvider.nextModSeq(mailboxId).join().orElseThrow(() -> new RuntimeException("ModSeq generation failed for mailbox " + mailboxId.asUuid())); return toBeUpdated.collect(JamesCollectors.chunker(cassandraConfiguration.getFlagsUpdateChunkSize())) .map(uidChunk -> performUpdatesForChunk(mailboxId, flagsUpdateCalculator, newModSeq, uidChunk)) .map(CompletableFuture::join) .reduce(FlagsUpdateStageResult.none(), FlagsUpdateStageResult::merge); }
@Override public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange messageRange) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return deletedMessageDAO.retrieveDeletedMessage(mailboxId, messageRange) .join() .collect(JamesCollectors.chunker(cassandraConfiguration.getExpungeChunkSize())) .map(uidChunk -> expungeUidChunk(mailboxId, uidChunk)) .flatMap(CompletableFuture::join) .collect(Guavate.toImmutableMap(MailboxMessage::getUid, SimpleMessageMetaData::new)); }
@Test void chunkerShouldAcceptEmptyStrem() { Stream<Integer> emptyStream = Stream.of(); assertThat(emptyStream.collect(JamesCollectors.chunker(10)) .collect(Guavate.toImmutableList())) .isEmpty(); }
@Test public void chunkerShouldAcceptEmptyStrem() { Stream<Integer> emptyStream = Stream.of(); assertThat(emptyStream.collect(JamesCollectors.chunker(10)) .collect(Guavate.toImmutableList())) .isEmpty(); }
@Test public void chunkerShouldChunkStreamsBiggerThanChunkSize() { Stream<Integer> stream = Stream.of(1, 2, 3, 4); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of( ImmutableList.of(1, 2, 3), ImmutableList.of(4))); }
@Test public void chunkerShouldChunkStreamsAsBigAsChunkSize() { Stream<Integer> stream = Stream.of(1, 2, 3); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of(ImmutableList.of(1, 2, 3))); }
@Test void chunkerShouldChunkStreamsBiggerThanChunkSize() { Stream<Integer> stream = Stream.of(1, 2, 3, 4); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of( ImmutableList.of(1, 2, 3), ImmutableList.of(4))); }
@Test void chunkerShouldChunkMonoValueStreams() { Stream<Integer> monoValueStream = Stream.of(1); List<List<Integer>> values = monoValueStream.collect(JamesCollectors.chunker(10)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of(ImmutableList.of(1))); }
@Test public void chunkerShouldChunkStreamsSmallerThanChunkSize() { Stream<Integer> stream = Stream.of(1, 2); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of(ImmutableList.of(1, 2))); }
@Test void chunkerShouldChunkInSeveralBuckets() { Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of( ImmutableList.of(1, 2, 3), ImmutableList.of(4, 5, 6), ImmutableList.of(7))); } }
@Test void chunkerShouldChunkStreamsSmallerThanChunkSize() { Stream<Integer> stream = Stream.of(1, 2); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of(ImmutableList.of(1, 2))); }
@Test void chunkerShouldChunkStreamsAsBigAsChunkSize() { Stream<Integer> stream = Stream.of(1, 2, 3); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of(ImmutableList.of(1, 2, 3))); }
@Test public void chunkerShouldChunkMonoValueStreams() { Stream<Integer> monoValueStream = Stream.of(1); List<List<Integer>> values = monoValueStream.collect(JamesCollectors.chunker(10)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of(ImmutableList.of(1))); }
@Test public void chunkerShouldChunkInSeveralBuckets() { Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7); List<List<Integer>> values = stream.collect(JamesCollectors.chunker(3)) .map(ImmutableList::copyOf) .collect(Guavate.toImmutableList()); assertThat(values) .isEqualTo(ImmutableList.of( ImmutableList.of(1, 2, 3), ImmutableList.of(4, 5, 6), ImmutableList.of(7))); } }
@Test public void chunkerShouldThrowOnZeroChunkSize() { expectedException.expect(IllegalArgumentException.class); JamesCollectors.chunker(0); }
@Test public void chunkerShouldThrowOnNegativeChunkSize() { expectedException.expect(IllegalArgumentException.class); JamesCollectors.chunker(-1); }
@Test void retrieveOwnersShouldNotThrowWhenMoreReferencesThanPaging() { int referenceCountExceedingPaging = 5050; IntStream.range(0, referenceCountExceedingPaging) .boxed() .collect(JamesCollectors.chunker(128)) .forEach(chunk -> FluentFutureStream.of( chunk.stream() .map(i -> testee.addOwner(ATTACHMENT_ID, Username.fromRawValue("owner" + i)))) .join()); assertThat(testee.retrieveOwners(ATTACHMENT_ID).join()) .hasSize(referenceCountExceedingPaging); } }