This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit b96305a792b5789dbadec52aed8194de641bd898 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Mon Dec 2 11:51:23 2019 +0700 JAMES-2997 MessageFastViewProjection should rely on MessageFastViewPrecomputedProperties --- .../CassandraMessageFastViewProjection.java | 17 ++++-- .../CassandraMessageFastViewProjectionTest.java | 2 +- .../api/projections/MessageFastViewProjection.java | 5 +- .../MemoryMessageFastViewProjection.java | 12 ++--- .../MessageFastViewProjectionContract.java | 60 +++++++++++++--------- 5 files changed, 57 insertions(+), 39 deletions(-) diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java index afdb547..387b39f 100644 --- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java +++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java @@ -31,12 +31,14 @@ import javax.inject.Inject; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.jmap.api.model.Preview; +import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties; import org.apache.james.jmap.api.projections.MessageFastViewProjection; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.model.MessageId; import org.reactivestreams.Publisher; import com.datastax.driver.core.PreparedStatement; +import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.google.common.base.Preconditions; @@ -67,22 +69,21 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec } @Override - public Publisher<Void> store(MessageId messageId, Preview preview) { + public Publisher<Void> store(MessageId messageId, MessageFastViewPrecomputedProperties precomputedProperties) { checkMessage(messageId); return cassandraAsyncExecutor.executeVoid(storeStatement.bind() .setUUID(MESSAGE_ID, ((CassandraMessageId) messageId).get()) - .setString(PREVIEW, preview.getValue())); + .setString(PREVIEW, precomputedProperties.getPreview().getValue())); } @Override - public Publisher<Preview> retrieve(MessageId messageId) { + public Publisher<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) { checkMessage(messageId); return cassandraAsyncExecutor.executeSingleRow(retrieveStatement.bind() .setUUID(MESSAGE_ID, ((CassandraMessageId) messageId).get())) - .map(row -> row.getString(PREVIEW)) - .map(Preview::from); + .map(this::fromRow); } @Override @@ -98,4 +99,10 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec Preconditions.checkArgument(messageId instanceof CassandraMessageId, "MessageId type is required to be CassandraMessageId"); } + + private MessageFastViewPrecomputedProperties fromRow(Row row) { + return MessageFastViewPrecomputedProperties.builder() + .preview(Preview.from(row.getString(PREVIEW))) + .build(); + } } diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java index 3803fbe..36f1b25 100644 --- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java +++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java @@ -57,7 +57,7 @@ class CassandraMessageFastViewProjectionTest implements MessageFastViewProjectio @Test void storeShouldThrowWhenMessageIdIsNotCassandraType() { - assertThatThrownBy(() -> testee.store(TestMessageId.of(1), PREVIEW_1)) + assertThatThrownBy(() -> testee.store(TestMessageId.of(1), MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("MessageId type is required to be CassandraMessageId"); } diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java index 8245651..9dc4bad 100644 --- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java +++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java @@ -19,15 +19,14 @@ package org.apache.james.jmap.api.projections; -import org.apache.james.jmap.api.model.Preview; import org.apache.james.mailbox.model.MessageId; import org.reactivestreams.Publisher; public interface MessageFastViewProjection { - Publisher<Void> store(MessageId messageId, Preview preview); + Publisher<Void> store(MessageId messageId, MessageFastViewPrecomputedProperties preview); - Publisher<Preview> retrieve(MessageId messageId); + Publisher<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId); Publisher<Void> delete(MessageId messageId); } diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java index f049349..c599b8c 100644 --- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java +++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java @@ -21,7 +21,7 @@ package org.apache.james.jmap.memory.projections; import java.util.concurrent.ConcurrentHashMap; -import org.apache.james.jmap.api.model.Preview; +import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties; import org.apache.james.jmap.api.projections.MessageFastViewProjection; import org.apache.james.mailbox.model.MessageId; import org.reactivestreams.Publisher; @@ -32,22 +32,22 @@ import reactor.core.publisher.Mono; public class MemoryMessageFastViewProjection implements MessageFastViewProjection { - private final ConcurrentHashMap<MessageId, Preview> previews; + private final ConcurrentHashMap<MessageId, MessageFastViewPrecomputedProperties> previews; public MemoryMessageFastViewProjection() { this.previews = new ConcurrentHashMap<>(); } @Override - public Publisher<Void> store(MessageId messageId, Preview preview) { + public Publisher<Void> store(MessageId messageId, MessageFastViewPrecomputedProperties precomputedProperties) { Preconditions.checkNotNull(messageId); - Preconditions.checkNotNull(preview); + Preconditions.checkNotNull(precomputedProperties); - return Mono.fromRunnable(() -> previews.put(messageId, preview)); + return Mono.fromRunnable(() -> previews.put(messageId, precomputedProperties)); } @Override - public Publisher<Preview> retrieve(MessageId messageId) { + public Publisher<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) { Preconditions.checkNotNull(messageId); return Mono.fromSupplier(() -> previews.get(messageId)); diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java index eddb59e..f752125 100644 --- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java +++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java @@ -39,6 +39,12 @@ public interface MessageFastViewProjectionContract { Preview PREVIEW_1 = Preview.from("preview 1"); Preview PREVIEW_2 = Preview.from("preview 2"); + MessageFastViewPrecomputedProperties MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1 = MessageFastViewPrecomputedProperties.builder() + .preview(PREVIEW_1) + .build(); + MessageFastViewPrecomputedProperties MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2 = MessageFastViewPrecomputedProperties.builder() + .preview(PREVIEW_2) + .build(); MessageFastViewProjection testee(); @@ -53,18 +59,18 @@ public interface MessageFastViewProjectionContract { @Test default void retrieveShouldReturnStoredPreview() { MessageId messageId = newMessageId(); - Mono.from(testee().store(messageId, PREVIEW_1)) + Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); assertThat(Mono.from(testee().retrieve(messageId)).block()) - .isEqualTo(PREVIEW_1); + .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1); } @Test default void retrieveShouldReturnEmptyWhenMessageIdNotFound() { MessageId messageId1 = newMessageId(); MessageId messageId2 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); assertThat(Mono.from(testee().retrieve(messageId2)).blockOptional()) @@ -75,22 +81,22 @@ public interface MessageFastViewProjectionContract { default void retrieveShouldReturnTheRightPreviewWhenStoringMultipleMessageIds() { MessageId messageId1 = newMessageId(); MessageId messageId2 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); - Mono.from(testee().store(messageId2, PREVIEW_2)) + Mono.from(testee().store(messageId2, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2)) .block(); SoftAssertions.assertSoftly(softly -> { softly.assertThat(Mono.from(testee().retrieve(messageId1)).block()) - .isEqualTo(PREVIEW_1); + .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1); softly.assertThat(Mono.from(testee().retrieve(messageId2)).block()) - .isEqualTo(PREVIEW_2); + .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2); }); } @Test default void storeShouldThrowWhenNullMessageId() { - assertThatThrownBy(() -> Mono.from(testee().store(null, PREVIEW_1)).block()) + assertThatThrownBy(() -> Mono.from(testee().store(null, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)).block()) .isInstanceOf(NullPointerException.class); } @@ -104,27 +110,27 @@ public interface MessageFastViewProjectionContract { @Test default void storeShouldOverrideOldRecord() { MessageId messageId1 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); - Mono.from(testee().store(messageId1, PREVIEW_2)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2)) .block(); assertThat(Mono.from(testee().retrieve(messageId1)).block()) - .isEqualTo(PREVIEW_2); + .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2); } @Test default void storeShouldBeIdempotent() { MessageId messageId1 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); assertThat(Mono.from(testee().retrieve(messageId1)).block()) - .isEqualTo(PREVIEW_1); + .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1); } @Test @@ -138,7 +144,9 @@ public interface MessageFastViewProjectionContract { ConcurrentTestRunner.builder() .reactorOperation((thread, step) -> testee() - .store(messageIds.get(thread), Preview.from(String.valueOf(step)))) + .store(messageIds.get(thread), MessageFastViewPrecomputedProperties.builder() + .preview(Preview.from(String.valueOf(step))) + .build())) .threadCount(threadCount) .operationCount(stepCount) .runSuccessfullyWithin(Duration.ofMinutes(1)); @@ -147,7 +155,9 @@ public interface MessageFastViewProjectionContract { .forEach(index -> assertThat(Mono.from(testee() .retrieve(messageIds.get(index))) .block()) - .isEqualTo(Preview.from(String.valueOf(stepCount - 1)))); + .isEqualTo(MessageFastViewPrecomputedProperties.builder() + .preview(Preview.from(String.valueOf(stepCount - 1))) + .build())); } @Test @@ -158,13 +168,15 @@ public interface MessageFastViewProjectionContract { ConcurrentTestRunner.builder() .reactorOperation((thread, step) -> testee() - .store(messageId, Preview.from(String.valueOf(step * threadCount + thread)))) + .store(messageId, MessageFastViewPrecomputedProperties.builder() + .preview(Preview.from(String.valueOf(step * threadCount + thread))) + .build())) .threadCount(threadCount) .operationCount(operationCount) .runSuccessfullyWithin(Duration.ofMinutes(1)); - Preview preview = Mono.from(testee().retrieve(messageId)).block(); - Integer previewAsInt = Integer.valueOf(preview.getValue()); + MessageFastViewPrecomputedProperties preview = Mono.from(testee().retrieve(messageId)).block(); + Integer previewAsInt = Integer.valueOf(preview.getPreview().getValue()); assertThat(previewAsInt) .describedAs("Ensure the stored result was generated by the last operation of one of the threads") @@ -187,7 +199,7 @@ public interface MessageFastViewProjectionContract { @Test default void deleteShouldDeleteStoredRecord() { MessageId messageId1 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); Mono.from(testee().delete(messageId1)) @@ -201,22 +213,22 @@ public interface MessageFastViewProjectionContract { default void deleteShouldNotDeleteAnotherRecord() { MessageId messageId1 = newMessageId(); MessageId messageId2 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); - Mono.from(testee().store(messageId2, PREVIEW_2)) + Mono.from(testee().store(messageId2, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2)) .block(); Mono.from(testee().delete(messageId1)) .block(); assertThat(Mono.from(testee().retrieve(messageId2)).block()) - .isEqualTo(PREVIEW_2); + .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2); } @Test default void deleteShouldBeIdempotent() { MessageId messageId1 = newMessageId(); - Mono.from(testee().store(messageId1, PREVIEW_1)) + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) .block(); Mono.from(testee().delete(messageId1)) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org