You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2019/12/03 02:02:18 UTC

[james-project] 07/15: JAMES-2997 Add hasAttachment to MessageFastViewPrecomputedProperties

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 f107618aca43e88dc69fec64992c12d87f1c6371
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 2 12:00:34 2019 +0700

    JAMES-2997 Add hasAttachment to MessageFastViewPrecomputedProperties
---
 .../CassandraMessageFastViewProjection.java        |  8 +++--
 .../CassandraMessageFastViewProjectionModule.java  | 18 ++++++-----
 .../CassandraMessageFastViewProjectionTable.java   |  1 +
 .../MessageFastViewPrecomputedProperties.java      | 36 +++++++++++++++++-----
 .../MessageFastViewProjectionContract.java         |  5 +++
 5 files changed, 52 insertions(+), 16 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 387b39f..47fa83d 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
@@ -23,6 +23,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.HAS_ATTACHMENT;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.MESSAGE_ID;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.PREVIEW;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.TABLE_NAME;
@@ -61,7 +62,8 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
 
         this.storeStatement = session.prepare(insertInto(TABLE_NAME)
             .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
-            .value(PREVIEW, bindMarker(PREVIEW)));
+            .value(PREVIEW, bindMarker(PREVIEW))
+            .value(HAS_ATTACHMENT, bindMarker(HAS_ATTACHMENT)));
 
         this.retrieveStatement = session.prepare(select()
             .from(TABLE_NAME)
@@ -74,7 +76,8 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
 
         return cassandraAsyncExecutor.executeVoid(storeStatement.bind()
             .setUUID(MESSAGE_ID, ((CassandraMessageId) messageId).get())
-            .setString(PREVIEW, precomputedProperties.getPreview().getValue()));
+            .setString(PREVIEW, precomputedProperties.getPreview().getValue())
+            .setBool(HAS_ATTACHMENT, precomputedProperties.hasAttachment()));
     }
 
     @Override
@@ -103,6 +106,7 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
     private MessageFastViewPrecomputedProperties fromRow(Row row) {
         return MessageFastViewPrecomputedProperties.builder()
             .preview(Preview.from(row.getString(PREVIEW)))
+            .hasAttachment(row.getBool(HAS_ATTACHMENT))
             .build();
     }
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionModule.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionModule.java
index 5c56e9b..0b7df7d 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionModule.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionModule.java
@@ -19,23 +19,27 @@
 
 package org.apache.james.jmap.cassandra.projections;
 
+import static com.datastax.driver.core.DataType.cboolean;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.uuid;
+import static org.apache.james.backends.cassandra.utils.CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION;
+import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.HAS_ATTACHMENT;
+import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.MESSAGE_ID;
+import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.PREVIEW;
+import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.TABLE_NAME;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.utils.CassandraConstants;
-import org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
 
 public interface CassandraMessageFastViewProjectionModule {
-    CassandraModule MODULE = CassandraModule.table(CassandraMessageFastViewProjectionTable.TABLE_NAME)
+    CassandraModule MODULE = CassandraModule.table(TABLE_NAME)
         .comment("Storing the JMAP preview property extracted from message bodies")
         .options(options -> options
-            .caching(SchemaBuilder.KeyCaching.ALL,
-                SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
+            .caching(SchemaBuilder.KeyCaching.ALL, SchemaBuilder.rows(DEFAULT_CACHED_ROW_PER_PARTITION)))
         .statement(statement -> statement
-            .addPartitionKey(CassandraMessageFastViewProjectionTable.MESSAGE_ID, uuid())
-            .addColumn(CassandraMessageFastViewProjectionTable.PREVIEW, text()))
+            .addPartitionKey(MESSAGE_ID, uuid())
+            .addColumn(PREVIEW, text())
+            .addColumn(HAS_ATTACHMENT, cboolean()))
         .build();
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraMessageFastViewProjectionTable.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraMessageFastViewProjectionTable.java
index 4035626..add0037 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraMessageFastViewProjectionTable.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraMessageFastViewProjectionTable.java
@@ -24,4 +24,5 @@ public interface CassandraMessageFastViewProjectionTable {
 
     String MESSAGE_ID = "messageId";
     String PREVIEW = "preview";
+    String HAS_ATTACHMENT = "hasAttachment";
 }
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
index ee2cdca..452f7fd 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
@@ -29,49 +29,71 @@ public class MessageFastViewPrecomputedProperties {
     public static class Builder {
         @FunctionalInterface
         public interface RequirePreview {
-            FinalStage preview(Preview preview);
+            RequireHasAttachment preview(Preview preview);
+        }
+
+        @FunctionalInterface
+        public interface RequireHasAttachment {
+            FinalStage hasAttachment(boolean hasAttachment);
+
+            default FinalStage hasAttachment() {
+                return hasAttachment(true);
+            }
+
+            default FinalStage noAttachments() {
+                return hasAttachment(false);
+            }
         }
 
         public static class FinalStage {
             private final Preview preview;
+            private final boolean hasAttachment;
 
-            private FinalStage(Preview preview) {
+            private FinalStage(Preview preview, boolean hasAttachment) {
+                this.hasAttachment = hasAttachment;
                 Preconditions.checkNotNull(preview, "'preview' cannot be null");
                 this.preview = preview;
             }
 
             public MessageFastViewPrecomputedProperties build() {
-                return new MessageFastViewPrecomputedProperties(preview);
+                return new MessageFastViewPrecomputedProperties(preview, hasAttachment);
             }
         }
     }
 
     public static Builder.RequirePreview builder() {
-        return preview -> new Builder.FinalStage(preview);
+        return preview -> hasAttachment -> new Builder.FinalStage(preview, hasAttachment);
     }
 
     private final Preview preview;
+    private final boolean hasAttachment;
 
-    private MessageFastViewPrecomputedProperties(Preview preview) {
+    private MessageFastViewPrecomputedProperties(Preview preview, boolean hasAttachment) {
         this.preview = preview;
+        this.hasAttachment = hasAttachment;
     }
 
     public Preview getPreview() {
         return preview;
     }
 
+    public boolean hasAttachment() {
+        return hasAttachment;
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof MessageFastViewPrecomputedProperties) {
             MessageFastViewPrecomputedProperties that = (MessageFastViewPrecomputedProperties) o;
 
-            return Objects.equals(this.preview, that.preview);
+            return Objects.equals(this.preview, that.preview)
+                && Objects.equals(this.hasAttachment, that.hasAttachment);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(preview);
+        return Objects.hash(preview, hasAttachment);
     }
 }
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 f752125..d2dfdfe 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
@@ -41,9 +41,11 @@ public interface MessageFastViewProjectionContract {
     Preview PREVIEW_2 = Preview.from("preview 2");
     MessageFastViewPrecomputedProperties MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1 = MessageFastViewPrecomputedProperties.builder()
         .preview(PREVIEW_1)
+        .hasAttachment()
         .build();
     MessageFastViewPrecomputedProperties MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2 = MessageFastViewPrecomputedProperties.builder()
         .preview(PREVIEW_2)
+        .noAttachments()
         .build();
 
     MessageFastViewProjection testee();
@@ -146,6 +148,7 @@ public interface MessageFastViewProjectionContract {
             .reactorOperation((thread, step) -> testee()
                 .store(messageIds.get(thread), MessageFastViewPrecomputedProperties.builder()
                     .preview(Preview.from(String.valueOf(step)))
+                    .hasAttachment()
                     .build()))
             .threadCount(threadCount)
             .operationCount(stepCount)
@@ -157,6 +160,7 @@ public interface MessageFastViewProjectionContract {
                     .block())
                 .isEqualTo(MessageFastViewPrecomputedProperties.builder()
                     .preview(Preview.from(String.valueOf(stepCount - 1)))
+                    .hasAttachment()
                     .build()));
     }
 
@@ -170,6 +174,7 @@ public interface MessageFastViewProjectionContract {
             .reactorOperation((thread, step) -> testee()
                 .store(messageId, MessageFastViewPrecomputedProperties.builder()
                     .preview(Preview.from(String.valueOf(step * threadCount + thread)))
+                    .hasAttachment()
                     .build()))
             .threadCount(threadCount)
             .operationCount(operationCount)


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org