This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 47056bba6d7833788d1587b30715d17670ad9801
Author: Benoit Tellier <[email protected]>
AuthorDate: Mon May 24 00:03:01 2021 +0700

    [PERFORMANCE] Use static TypeToken for complex CQL types
    
    There computing take up to 1,3% of CPU time, doing reflection
    over and over again to build them.
---
 .../mailbox/cassandra/mail/CassandraMessageDAOV3.java     | 15 +++++++++++----
 .../james/mailbox/cassandra/mail/FlagsExtractor.java      | 10 ++++++++--
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
index 1692d6e..e981078 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
@@ -50,6 +50,7 @@ import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.T
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -75,17 +76,20 @@ import 
org.apache.james.mailbox.store.mail.model.impl.Properties;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
 import com.datastax.driver.core.BoundStatement;
+import com.datastax.driver.core.CodecRegistry;
 import com.datastax.driver.core.ConsistencyLevel;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
+import com.datastax.driver.core.TypeTokens;
 import com.datastax.driver.core.UDTValue;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteSource;
 import com.google.common.primitives.Bytes;
+import com.google.common.reflect.TypeToken;
 
 import reactor.core.publisher.Mono;
 import reactor.util.function.Tuple2;
@@ -93,6 +97,9 @@ import reactor.util.function.Tuple2;
 public class CassandraMessageDAOV3 {
     public static final long DEFAULT_LONG_VALUE = 0L;
     private static final byte[] EMPTY_BYTE_ARRAY = {};
+    private static final TypeToken<Map<String, String>> MAP_OF_STRING = 
TypeTokens.mapOf(String.class, String.class);
+    private static final TypeToken<List<String>> LIST_OF_STRINGS = 
TypeTokens.listOf(String.class);
+    private static final TypeToken<List<UDTValue>> LIST_OF_UDT = 
TypeTokens.listOf(UDTValue.class);
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final CassandraTypesProvider typesProvider;
@@ -326,15 +333,15 @@ public class CassandraMessageDAOV3 {
         property.setContentMD5(row.getString(CONTENT_MD5));
         
property.setContentTransferEncoding(row.getString(CONTENT_TRANSFER_ENCODING));
         property.setContentLocation(row.getString(CONTENT_LOCATION));
-        property.setContentLanguage(row.getList(CONTENT_LANGUAGE, 
String.class));
-        
property.setContentDispositionParameters(row.getMap(CONTENT_DISPOSITION_PARAMETERS,
 String.class, String.class));
-        property.setContentTypeParameters(row.getMap(CONTENT_TYPE_PARAMETERS, 
String.class, String.class));
+        property.setContentLanguage(row.get(CONTENT_LANGUAGE, 
LIST_OF_STRINGS));
+        
property.setContentDispositionParameters(row.get(CONTENT_DISPOSITION_PARAMETERS,
 MAP_OF_STRING));
+        property.setContentTypeParameters(row.get(CONTENT_TYPE_PARAMETERS, 
MAP_OF_STRING));
         property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
         return property.build();
     }
 
     private Stream<MessageAttachmentRepresentation> getAttachments(Row row) {
-        List<UDTValue> udtValues = row.getList(ATTACHMENTS, UDTValue.class);
+        List<UDTValue> udtValues = row.get(ATTACHMENTS, LIST_OF_UDT);
         return attachmentByIds(udtValues);
     }
 
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
index c18d37c..1ae4608 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
@@ -18,13 +18,19 @@
  ****************************************************************/
 package org.apache.james.mailbox.cassandra.mail;
 
+import java.util.Set;
+
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.cassandra.table.Flag;
 
 import com.datastax.driver.core.Row;
+import com.datastax.driver.core.TypeTokens;
+import com.google.common.reflect.TypeToken;
 
 public class FlagsExtractor {
+    public static final TypeToken<Set<String>> STRING_SET = 
TypeTokens.setOf(String.class);
+
     public static Flags getFlags(Row row) {
         Flags flags = new Flags();
         for (String flag : Flag.ALL) {
@@ -32,14 +38,14 @@ public class FlagsExtractor {
                 flags.add(Flag.JAVAX_MAIL_FLAG.get(flag));
             }
         }
-        row.getSet(Flag.USER_FLAGS, String.class)
+        row.get(Flag.USER_FLAGS, STRING_SET)
             .forEach(flags::add);
         return flags;
     }
 
     public static Flags getApplicableFlags(Row row) {
         Flags flags = new Flags();
-        row.getSet(Flag.USER_FLAGS, String.class)
+        row.get(Flag.USER_FLAGS, STRING_SET)
             .forEach(flags::add);
         return flags;
     }

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to