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]
