You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/12/06 08:03:51 UTC

[james-project] branch master updated (7153ee2277 -> e3904e5dab)

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

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


    from 7153ee2277 Bump commons-net from 3.8.0 to 3.9.0 (#1351)
     new 6f33b2c336 [PERF] Adopt CqlIdentifier in mailbox/cassandra
     new 51582169c5 [PERF] Adopt CqlIdentifier within server/data/data-cassandra
     new baede3f6cc [PERF] Adopt CqlIdentifier within server/data/data-jmap-cassandra
     new dc3af39311 [PERF] Adopt CqlIdentifier within backend-commons/cassandra
     new 6ff79b0142 [PERF] Adopt CqlIdentifier within eventsourcing-cassandra
     new db5cd2366d [PERF] Adopt CqlIdentifier within eventbus-cassandra
     new c5a3958e8f [PERF] Adopt CqlIdentifier within cassandra blob store
     new 9389ca477f [PERF] Remove logger call in LockLessConcurrencyLimitingRequestThrottler
     new f4f3d35fb1 [PERF] Increase forked process timeout for mailbox/cassandra
     new 10ffe70792 [PERF] Fix tests that was timing out
     new 63d865dda3 [PERF] Improve Cassandra rows interpretation in mailbox/cassandra
     new 64c6fb24a4 [PERF] Improve Cassandra rows interpretation in mailbox/cassandra
     new 033d7bdecc [PERF] Quota: avoid streaming where possible
     new faafc02dd4 [PERF] Continue improve mailbox/cassandra row reading
     new e3904e5dab [PERF] Allow disabling SERIAL read for non critical UID/ModSeq read operations

The 15 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../init/CassandraZonedDateTimeModule.java         |   5 +-
 .../init/configuration/CassandraConfiguration.java |  44 +++++++-
 ...ockLessConcurrencyLimitingRequestThrottler.java |   6 --
 .../table/CassandraSchemaVersionTable.java         |   8 +-
 .../CassandraEventDeadLettersGroupTable.java       |   4 +-
 .../tables/CassandraEventDeadLettersTable.java     |   8 +-
 .../cassandra/CassandraEventStoreTable.scala       |   8 +-
 .../eventstore/cassandra/EventStoreDao.scala       |   7 +-
 .../java/org/apache/james/mailbox/model/Quota.java |   7 +-
 .../james/mailbox/quota/MaxQuotaManager.java       |   1 -
 mailbox/cassandra/pom.xml                          |   1 +
 .../mailbox/cassandra/mail/CassandraACLDAOV2.java  |   3 +-
 .../cassandra/mail/CassandraApplicableFlagDAO.java |   4 +-
 .../cassandra/mail/CassandraDeletedMessageDAO.java |   7 +-
 .../cassandra/mail/CassandraFirstUnseenDAO.java    |  14 ++-
 .../cassandra/mail/CassandraMailboxCounterDAO.java |   3 +-
 .../cassandra/mail/CassandraMailboxDAO.java        |  16 ++-
 .../cassandra/mail/CassandraMailboxPathV3DAO.java  |  17 +--
 .../cassandra/mail/CassandraMailboxRecentsDAO.java |   8 +-
 .../cassandra/mail/CassandraMessageDAO.java        |   7 +-
 .../cassandra/mail/CassandraMessageDAOV3.java      |  84 +++++++--------
 .../cassandra/mail/CassandraMessageIdDAO.java      | 119 ++++++++++++---------
 .../mail/CassandraMessageIdToImapUidDAO.java       |  49 ++++-----
 .../cassandra/mail/CassandraModSeqProvider.java    |  27 +++--
 .../mailbox/cassandra/mail/CassandraThreadDAO.java |  19 ++--
 .../cassandra/mail/CassandraThreadLookupDAO.java   |  19 ++--
 .../cassandra/mail/CassandraUidProvider.java       |  25 +++--
 .../mailbox/cassandra/mail/FlagsExtractor.java     |  15 ++-
 .../cassandra/mail/utils/MailboxBaseTupleUtil.java |   2 +-
 .../cassandra/modules/CassandraMailboxModule.java  |   4 +-
 .../cassandra/modules/CassandraMessageModule.java  |   4 +-
 .../mailbox/cassandra/table/CassandraACLTable.java |   8 +-
 .../cassandra/table/CassandraACLV2Table.java       |   8 +-
 .../cassandra/table/CassandraAnnotationTable.java  |  14 +--
 .../table/CassandraApplicableFlagTable.java        |   6 +-
 .../table/CassandraAttachmentMessageIdTable.java   |  10 +-
 .../table/CassandraAttachmentOwnerTable.java       |   7 +-
 .../table/CassandraAttachmentV2Table.java          |  16 +--
 .../cassandra/table/CassandraCurrentQuota.java     |   8 +-
 .../table/CassandraDeletedMessageTable.java        |   6 +-
 .../cassandra/table/CassandraDomainMaxQuota.java   |   8 +-
 .../cassandra/table/CassandraFirstUnseenTable.java |   6 +-
 .../cassandra/table/CassandraGlobalMaxQuota.java   |   8 +-
 .../table/CassandraMailboxCountersTable.java       |   8 +-
 .../cassandra/table/CassandraMailboxPathTable.java |  34 ------
 .../table/CassandraMailboxPathV2Table.java         |  36 -------
 .../table/CassandraMailboxPathV3Table.java         |  14 +--
 .../table/CassandraMailboxRecentsTable.java        |   6 +-
 .../cassandra/table/CassandraMailboxTable.java     |  15 +--
 .../mailbox/cassandra/table/CassandraMaxQuota.java |   8 +-
 .../cassandra/table/CassandraMessageIdTable.java   |  12 +--
 .../cassandra/table/CassandraMessageIds.java       |  11 +-
 .../table/CassandraMessageModseqTable.java         |   6 +-
 .../cassandra/table/CassandraMessageUidTable.java  |   6 +-
 .../cassandra/table/CassandraMessageV2Table.java   |  34 +++---
 .../cassandra/table/CassandraMessageV3Table.java   |  57 +++++-----
 .../table/CassandraSubscriptionTable.java          |   7 +-
 .../table/CassandraThreadLookupTable.java          |   7 +-
 .../cassandra/table/CassandraThreadTable.java      |  11 +-
 .../table/CassandraUserMailboxRightsTable.java     |   8 +-
 .../apache/james/mailbox/cassandra/table/Flag.java |  53 +++++----
 .../cassandra/table/MessageIdToImapUid.java        |  15 +--
 .../cassandra/mail/CassandraACLMapperV2Test.java   |   4 +-
 .../cassandra/mail/CassandraMessageIdDAOTest.java  |  17 ++-
 .../modules/ROOT/pages/configure/cassandra.adoc    |  14 +++
 .../org/apache/james/CassandraCacheQueryTest.java  |   2 +-
 .../apache/james/blob/cassandra/BlobTables.java    |  32 +++---
 .../cassandra/cache/CassandraBlobStoreCache.java   |   5 +-
 .../blob/cassandra/cache/CachedBlobStoreTest.java  |   3 +-
 .../domainlist/cassandra/CassandraDomainList.java  |   9 +-
 .../cassandra/tables/CassandraDomainsTable.java    |   4 +-
 .../tables/CassandraMappingsSourcesTable.java      |   8 +-
 .../tables/CassandraSieveActiveTable.java          |   8 +-
 .../tables/CassandraSieveClusterQuotaTable.java    |   6 +-
 .../cassandra/tables/CassandraSieveQuotaTable.java |   6 +-
 .../cassandra/tables/CassandraSieveSpaceTable.java |   6 +-
 .../cassandra/tables/CassandraSieveTable.java      |  12 ++-
 .../user/cassandra/tables/CassandraUserTable.java  |  12 ++-
 .../cassandra/access/CassandraAccessTokenDAO.java  |   7 +-
 .../access/table/CassandraAccessTokenTable.java    |   6 +-
 .../cassandra/change/EmailChangeRepositoryDAO.java |  21 ++--
 .../change/MailboxChangeRepositoryDAO.java         |  21 ++--
 .../change/tables/CassandraEmailChangeTable.java   |  17 +--
 .../change/tables/CassandraMailboxChangeTable.java |  20 ++--
 .../projections/CassandraEmailQueryView.java       |  57 +++++-----
 .../CassandraMessageFastViewProjection.java        |  11 +-
 .../table/CassandraEmailQueryViewTable.java        |  11 +-
 .../CassandraMessageFastViewProjectionTable.java   |  10 +-
 .../tables/CassandraPushSubscriptionTable.java     |  23 ++--
 .../james/jmap/cassandra/upload/UploadModule.java  |  13 +--
 .../identity/CassandraCustomIdentityModule.scala   |   6 +-
 .../tables/CassandraCustomIdentityTable.scala      |  29 ++---
 .../cassandra/utils/EmailAddressTupleUtil.scala    |   2 +-
 93 files changed, 736 insertions(+), 664 deletions(-)
 delete mode 100644 mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
 delete mode 100644 mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV2Table.java


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


[james-project] 12/15: [PERF] Improve Cassandra rows interpretation in mailbox/cassandra

Posted by bt...@apache.org.
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 64c6fb24a4d2be945549975495f5190265f7fda0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 2 12:56:18 2022 +0700

    [PERF] Improve Cassandra rows interpretation in mailbox/cassandra
---
 .../mailbox/cassandra/mail/CassandraACLDAOV2.java  |  3 ++-
 .../cassandra/mail/CassandraDeletedMessageDAO.java |  7 +++---
 .../cassandra/mail/CassandraFirstUnseenDAO.java    |  5 ++--
 .../cassandra/mail/CassandraMailboxCounterDAO.java |  3 ++-
 .../cassandra/mail/CassandraMailboxDAO.java        | 16 ++++++++----
 .../cassandra/mail/CassandraMailboxPathV3DAO.java  | 17 +++++++------
 .../cassandra/mail/CassandraMailboxRecentsDAO.java |  5 ++--
 .../cassandra/mail/CassandraMessageDAOV3.java      | 29 ++++++++++++----------
 .../cassandra/mail/CassandraMessageIdDAO.java      | 28 ++++++++++-----------
 .../mail/CassandraMessageIdToImapUidDAO.java       | 17 +++++++------
 .../cassandra/mail/CassandraModSeqProvider.java    |  9 ++++---
 .../mailbox/cassandra/mail/CassandraThreadDAO.java | 19 +++++++-------
 .../cassandra/mail/CassandraThreadLookupDAO.java   | 19 +++++++++-----
 .../cassandra/mail/CassandraUidProvider.java       |  7 +++---
 14 files changed, 105 insertions(+), 79 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLDAOV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLDAOV2.java
index 2958a7602b..86fbd1da50 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLDAOV2.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLDAOV2.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -106,7 +107,7 @@ public class CassandraACLDAOV2 {
     public Mono<MailboxACL> getACL(CassandraId cassandraId) {
         return executor.executeRows(
                 read.bind()
-                    .setUuid(CassandraACLTable.ID, cassandraId.asUuid()))
+                    .set(CassandraACLTable.ID, cassandraId.asUuid(), TypeCodecs.TIMEUUID))
             .map(Throwing.function(row -> {
                 MailboxACL.EntryKey entryKey = MailboxACL.EntryKey.deserialize(row.getString(CassandraACLV2Table.KEY));
                 MailboxACL.Rfc4314Rights rights = row.getSet(CassandraACLV2Table.RIGHTS, String.class)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAO.java
index 5aa632e956..ee4624d847 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAO.java
@@ -44,6 +44,7 @@ import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.BatchType;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.collect.Lists;
 
 import reactor.core.publisher.Flux;
@@ -186,12 +187,12 @@ public class CassandraDeletedMessageDAO {
 
     public Mono<Void> removeAll(CassandraId cassandraId) {
         return cassandraAsyncExecutor.executeVoid(deleteAllStatement.bind()
-            .setUuid(MAILBOX_ID, cassandraId.asUuid()));
+            .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.TIMEUUID));
     }
 
     public Flux<MessageUid> retrieveDeletedMessage(CassandraId cassandraId, MessageRange range) {
         return retrieveResultSetOfDeletedMessage(cassandraId, range)
-            .map(row -> MessageUid.of(row.getLong(UID)));
+            .map(row -> MessageUid.of(row.getLong(0)));
     }
 
     private Flux<Row> retrieveResultSetOfDeletedMessage(CassandraId cassandraId, MessageRange range) {
@@ -212,7 +213,7 @@ public class CassandraDeletedMessageDAO {
     private Flux<Row> retrieveAllDeleted(CassandraId cassandraId) {
         return cassandraAsyncExecutor.executeRows(
             selectAllUidStatement.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid()));
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.TIMEUUID));
     }
 
     private Flux<Row> retrieveOneDeleted(CassandraId cassandraId, MessageUid uid) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
index 9f3f5d78d2..bd5eeb2aff 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
@@ -43,6 +43,7 @@ import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.BatchType;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.metadata.schema.ClusteringOrder;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.collect.Lists;
 
 import reactor.core.publisher.Flux;
@@ -177,8 +178,8 @@ public class CassandraFirstUnseenDAO {
     public Flux<MessageUid> listUnseen(CassandraId cassandraId) {
         return cassandraAsyncExecutor.executeRows(
                 listStatement.bind()
-                    .setUuid(MAILBOX_ID, cassandraId.asUuid()))
-            .map(row -> MessageUid.of(row.getLong(UID)));
+                    .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.TIMEUUID))
+            .map(row -> MessageUid.of(row.getLong(0)));
     }
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
index eff494fee9..d84d67c8e6 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.model.MailboxCounters;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.querybuilder.update.Assignment;
 
 import reactor.core.publisher.Mono;
@@ -208,6 +209,6 @@ public class CassandraMailboxCounterDAO {
 
     private BoundStatement bindWithMailbox(CassandraId mailboxId, PreparedStatement statement) {
         return statement.bind()
-            .setUuid(MAILBOX_ID, mailboxId.asUuid());
+            .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID);
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
index 0740401d7b..79dd21da8f 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
@@ -52,6 +52,9 @@ import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.data.UdtValue;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
+import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -67,6 +70,7 @@ public class CassandraMailboxDAO {
     private final PreparedStatement updateUidValidityStatement;
     private final CqlSession session;
     private final DriverExecutionProfile lwtProfile;
+    private final TypeCodec<UdtValue> mailboxBaseTypeCodec;
 
     @Inject
     public CassandraMailboxDAO(CqlSession session, CassandraTypesProvider typesProvider) {
@@ -80,6 +84,8 @@ public class CassandraMailboxDAO {
         this.listStatement = prepareList();
         this.readStatement = prepareRead();
         this.lwtProfile = JamesExecutionProfiles.getLWTProfile(session);
+
+        this.mailboxBaseTypeCodec = CodecRegistry.DEFAULT.codecFor(typesProvider.getDefinedUserType(MAILBOX_BASE.asCql(true)));
     }
 
     private PreparedStatement prepareInsert() {
@@ -148,7 +154,7 @@ public class CassandraMailboxDAO {
 
     public Mono<Mailbox> retrieveMailbox(CassandraId mailboxId) {
         return executor.executeSingleRow(readStatement.bind()
-                .setUuid(ID, mailboxId.asUuid())
+                .set(ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setExecutionProfile(lwtProfile))
             .flatMap(row -> mailboxFromRow(row, mailboxId));
     }
@@ -156,12 +162,12 @@ public class CassandraMailboxDAO {
     private Mono<Mailbox> mailboxFromRow(Row row, CassandraId cassandraId) {
         return sanitizeUidValidity(cassandraId, row.getLong(UIDVALIDITY))
             .map(uidValidity -> {
-                UdtValue mailboxBase = row.getUdtValue(MAILBOX_BASE);
+                UdtValue mailboxBase = row.get(MAILBOX_BASE, mailboxBaseTypeCodec);
                 return new Mailbox(
                     new MailboxPath(
-                        mailboxBase.getString(CassandraMailboxTable.MailboxBase.NAMESPACE),
-                        Username.of(mailboxBase.getString(CassandraMailboxTable.MailboxBase.USER)),
-                        row.getString(NAME)),
+                        mailboxBase.get(CassandraMailboxTable.MailboxBase.NAMESPACE, TypeCodecs.TEXT),
+                        Username.of(mailboxBase.get(CassandraMailboxTable.MailboxBase.USER, TypeCodecs.TEXT)),
+                        row.get(NAME, TypeCodecs.TEXT)),
                     uidValidity,
                     cassandraId);
             });
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV3DAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV3DAO.java
index fdb4f76865..b2c67991ee 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV3DAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV3DAO.java
@@ -53,6 +53,7 @@ import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -128,9 +129,9 @@ public class CassandraMailboxPathV3DAO {
 
     public Mono<Mailbox> retrieve(MailboxPath mailboxPath, JamesExecutionProfiles.ConsistencyChoice consistencyChoice) {
         BoundStatement statement = select.bind()
-            .setString(NAMESPACE, mailboxPath.getNamespace())
-            .setString(USER, sanitizeUser(mailboxPath.getUser()))
-            .setString(MAILBOX_NAME, mailboxPath.getName());
+            .set(NAMESPACE, mailboxPath.getNamespace(), TypeCodecs.TEXT)
+            .set(USER, sanitizeUser(mailboxPath.getUser()), TypeCodecs.TEXT)
+            .set(MAILBOX_NAME, mailboxPath.getName(), TypeCodecs.TEXT);
 
         return cassandraAsyncExecutor.executeSingleRow(setExecutionProfileIfNeeded(statement, consistencyChoice))
             .map(row -> fromRow(row, mailboxPath.getUser(), mailboxPath.getNamespace(), mailboxPath.getName()))
@@ -140,8 +141,8 @@ public class CassandraMailboxPathV3DAO {
 
     public Flux<Mailbox> listUserMailboxes(String namespace, Username user, JamesExecutionProfiles.ConsistencyChoice consistencyChoice) {
         BoundStatementBuilder statementBuilder = selectUser.boundStatementBuilder()
-            .setString(NAMESPACE, namespace)
-            .setString(USER, sanitizeUser(user));
+            .set(NAMESPACE, namespace, TypeCodecs.TEXT)
+            .set(USER, sanitizeUser(user), TypeCodecs.TEXT);
 
         if (consistencyChoice.equals(STRONG)) {
             statementBuilder.setExecutionProfile(lwtProfile);
@@ -194,11 +195,11 @@ public class CassandraMailboxPathV3DAO {
     }
 
     private Mailbox fromRowToCassandraIdAndPath(Row row) {
-        return fromRow(row, Username.of(row.getString(USER)), row.getString(NAMESPACE));
+        return fromRow(row, Username.of(row.get(USER, TypeCodecs.TEXT)), row.get(NAMESPACE, TypeCodecs.TEXT));
     }
 
     private Mailbox fromRow(Row row, Username username, String namespace) {
-        return fromRow(row, username, namespace, row.getString(MAILBOX_NAME));
+        return fromRow(row, username, namespace, row.get(MAILBOX_NAME, TypeCodecs.TEXT));
     }
 
     private Mailbox fromRow(Row row, Username username, String namespace, String name) {
@@ -207,7 +208,7 @@ public class CassandraMailboxPathV3DAO {
                 username,
                 name),
             UidValidity.of(row.getLong(UIDVALIDITY)),
-            CassandraId.of(row.getUuid(MAILBOX_ID)));
+            CassandraId.of(row.get(MAILBOX_ID, TypeCodecs.TIMEUUID)));
     }
 
     public Mono<Boolean> save(Mailbox mailbox) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
index 1d800e6510..da5552eaa5 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
@@ -41,6 +41,7 @@ import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.BatchType;
 import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.collect.Lists;
 
 import reactor.core.publisher.Flux;
@@ -98,13 +99,13 @@ public class CassandraMailboxRecentsDAO {
 
     public Flux<MessageUid> getRecentMessageUidsInMailbox(CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeRows(bindWithMailbox(mailboxId, readStatement))
-            .map(row -> row.getLong(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID))
+            .map(row -> row.getLong(0))
             .map(MessageUid::of);
     }
 
     private BoundStatement bindWithMailbox(CassandraId mailboxId, PreparedStatement statement) {
         return statement.bind()
-            .setUuid(CassandraMailboxRecentsTable.MAILBOX_ID, mailboxId.asUuid());
+            .set(CassandraMailboxRecentsTable.MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID);
     }
 
     public Mono<Void> removeFromRecent(CassandraId mailboxId, MessageUid messageUid) {
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 3b2ea9b4e4..ebe0675bcc 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
@@ -120,6 +120,7 @@ public class CassandraMessageDAOV3 {
     private final Cid.CidParser cidParser;
     private final DriverExecutionProfile lwtProfile;
     private final UserDefinedType attachmentsType;
+    private final TypeCodec<List<UdtValue>> attachmentCodec;
 
     @Inject
     public CassandraMessageDAOV3(CqlSession session, CassandraTypesProvider typesProvider, BlobStore blobStore,
@@ -135,6 +136,7 @@ public class CassandraMessageDAOV3 {
         this.listBlobs = prepareSelectBlobs(session);
         this.cidParser = Cid.parser().relaxed();
         this.attachmentsType = typesProvider.getDefinedUserType(ATTACHMENTS.asCql(true));
+        this.attachmentCodec = CodecRegistry.DEFAULT.codecFor(listOf(attachmentsType));
     }
 
     private PreparedStatement prepareSelect(CqlSession session) {
@@ -356,14 +358,14 @@ public class CassandraMessageDAOV3 {
 
     private Properties getProperties(Row row) {
         PropertyBuilder property = new PropertyBuilder();
-        property.setContentDescription(row.getString(CONTENT_DESCRIPTION));
-        property.setContentDispositionType(row.getString(CONTENT_DISPOSITION_TYPE));
-        property.setMediaType(row.getString(MEDIA_TYPE));
-        property.setSubType(row.getString(SUB_TYPE));
-        property.setContentID(row.getString(CONTENT_ID));
-        property.setContentMD5(row.getString(CONTENT_MD5));
-        property.setContentTransferEncoding(row.getString(CONTENT_TRANSFER_ENCODING));
-        property.setContentLocation(row.getString(CONTENT_LOCATION));
+        property.setContentDescription(row.get(CONTENT_DESCRIPTION, TypeCodecs.TEXT));
+        property.setContentDispositionType(row.get(CONTENT_DISPOSITION_TYPE, TypeCodecs.TEXT));
+        property.setMediaType(row.get(MEDIA_TYPE, TypeCodecs.TEXT));
+        property.setSubType(row.get(SUB_TYPE, TypeCodecs.TEXT));
+        property.setContentID(row.get(CONTENT_ID, TypeCodecs.TEXT));
+        property.setContentMD5(row.get(CONTENT_MD5, TypeCodecs.TEXT));
+        property.setContentTransferEncoding(row.get(CONTENT_TRANSFER_ENCODING, TypeCodecs.TEXT));
+        property.setContentLocation(row.get(CONTENT_LOCATION, TypeCodecs.TEXT));
         property.setContentLanguage(row.get(CONTENT_LANGUAGE, LIST_OF_STRINGS_CODEC));
         property.setContentDispositionParameters(row.get(CONTENT_DISPOSITION_PARAMETERS, MAP_OF_STRINGS_CODEC));
         property.setContentTypeParameters(row.get(CONTENT_TYPE_PARAMETERS, MAP_OF_STRINGS_CODEC));
@@ -372,8 +374,9 @@ public class CassandraMessageDAOV3 {
     }
 
     private Stream<MessageAttachmentRepresentation> getAttachments(Row row) {
-        List<UdtValue> udtValues = Optional.<List<UdtValue>>ofNullable(row.get(ATTACHMENTS, CodecRegistry.DEFAULT.codecFor(listOf(attachmentsType)))).orElse(List.of());
-        return attachmentByIds(udtValues);
+        return Optional.ofNullable(row.get(ATTACHMENTS, attachmentCodec))
+            .map(this::attachmentByIds)
+            .orElseGet(Stream::of);
     }
 
     private Stream<MessageAttachmentRepresentation> attachmentByIds(List<UdtValue> udtValues) {
@@ -383,9 +386,9 @@ public class CassandraMessageDAOV3 {
 
     private MessageAttachmentRepresentation messageAttachmentByIdFrom(UdtValue udtValue) {
         return MessageAttachmentRepresentation.builder()
-            .attachmentId(AttachmentId.from(udtValue.getString(Attachments.ID)))
-            .name(udtValue.getString(Attachments.NAME))
-            .cid(cidParser.parse(udtValue.getString(Attachments.CID)))
+            .attachmentId(AttachmentId.from(udtValue.get(Attachments.ID, TypeCodecs.TEXT)))
+            .name(udtValue.get(Attachments.NAME, TypeCodecs.TEXT))
+            .cid(cidParser.parse(udtValue.get(Attachments.CID, TypeCodecs.TEXT)))
             .isInline(udtValue.getBoolean(Attachments.IS_INLINE))
             .build();
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
index edb99eb80c..9382e7a62a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
@@ -295,7 +295,7 @@ public class CassandraMessageIdDAO {
 
     public Mono<Void> delete(CassandraId mailboxId, MessageUid uid) {
         return cassandraAsyncExecutor.executeVoid(delete.bind()
-            .setUuid(MAILBOX_ID, mailboxId.asUuid())
+            .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
             .setLong(IMAP_UID, uid.asLong()));
     }
 
@@ -313,7 +313,7 @@ public class CassandraMessageIdDAO {
             statementBuilder.setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags()), String.class);
         }
         return cassandraAsyncExecutor.executeVoid(statementBuilder
-            .setUuid(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
+            .set(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid(), TypeCodecs.TIMEUUID)
             .setLong(IMAP_UID, composedMessageId.getUid().asLong())
             .setUuid(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
             .setUuid(THREAD_ID, ((CassandraMessageId) threadId.getBaseMessageId()).get())
@@ -408,7 +408,7 @@ public class CassandraMessageIdDAO {
 
     private Mono<Row> selectOneRow(CassandraId mailboxId, MessageUid uid) {
         return cassandraAsyncExecutor.executeSingleRow(select.bind()
-            .setUuid(MAILBOX_ID, mailboxId.asUuid())
+            .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
             .setLong(IMAP_UID, uid.asLong()));
     }
 
@@ -490,32 +490,32 @@ public class CassandraMessageIdDAO {
     private Flux<Row> selectAll(CassandraId mailboxId, Limit limit) {
         return cassandraAsyncExecutor.executeRows(limit.getLimit()
             .map(limitAsInt -> selectAllLimited.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setInt(LIMIT, limitAsInt))
             .orElseGet(() -> selectAll.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())));
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)));
     }
 
     private Flux<Row> selectFrom(CassandraId mailboxId, MessageUid uid, Limit limit) {
         return cassandraAsyncExecutor.executeRows(limit.getLimit()
             .map(limitAsInt -> selectUidGteLimited.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID, uid.asLong())
                 .setInt(LIMIT, limitAsInt))
             .orElseGet(() -> selectUidGte.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID, uid.asLong())));
     }
 
     private Flux<Row> selectRange(CassandraId mailboxId, MessageUid from, MessageUid to, Limit limit) {
         return cassandraAsyncExecutor.executeRows(limit.getLimit()
             .map(limitAsInt -> selectUidRangeLimited.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID_GTE, from.asLong())
                 .setLong(IMAP_UID_LTE, to.asLong())
                 .setInt(LIMIT, limitAsInt))
             .orElseGet(() -> selectUidRange.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID_GTE, from.asLong())
                 .setLong(IMAP_UID_LTE, to.asLong())));
     }
@@ -525,7 +525,7 @@ public class CassandraMessageIdDAO {
         if (rowAsUuid == null) {
             // Out of order updates with concurrent deletes can result in the row being partially deleted
             // We filter out such records, and cleanup them.
-            delete(CassandraId.of(row.getUuid(MAILBOX_ID)),
+            delete(CassandraId.of(row.get(MAILBOX_ID, TypeCodecs.TIMEUUID)),
                 MessageUid.of(row.getLong(IMAP_UID)))
                 .subscribeOn(Schedulers.parallel())
                 .subscribe();
@@ -535,7 +535,7 @@ public class CassandraMessageIdDAO {
         return Optional.of(CassandraMessageMetadata.builder()
             .ids(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(
-                    CassandraId.of(row.getUuid(MAILBOX_ID)),
+                    CassandraId.of(row.get(MAILBOX_ID, TypeCodecs.TIMEUUID)),
                     messageId,
                     MessageUid.of(row.getLong(IMAP_UID))))
                 .flags(FlagsExtractor.getFlags(row))
@@ -543,16 +543,16 @@ public class CassandraMessageIdDAO {
                 .threadId(getThreadIdFromRow(row, messageId))
                 .build())
             .bodyStartOctet(row.get(BODY_START_OCTET, Integer.class))
-            .internalDate(Optional.ofNullable(row.getInstant(INTERNAL_DATE))
+            .internalDate(Optional.ofNullable(row.get(INTERNAL_DATE, TypeCodecs.TIMESTAMP))
                 .map(Date::from))
             .size(row.get(FULL_CONTENT_OCTETS, Long.class))
-            .headerContent(Optional.ofNullable(row.getString(HEADER_CONTENT))
+            .headerContent(Optional.ofNullable(row.get(HEADER_CONTENT, TypeCodecs.TEXT))
                 .map(blobIdFactory::from))
             .build());
     }
 
     private ThreadId getThreadIdFromRow(Row row, MessageId messageId) {
-        UUID threadIdUUID = row.getUuid(THREAD_ID);
+        UUID threadIdUUID = row.get(THREAD_ID, TypeCodecs.TIMEUUID);
         if (threadIdUUID == null) {
             return ThreadId.fromBaseMessageId(messageId);
         }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
index 824f7f3038..19d450e1ac 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
@@ -75,6 +75,7 @@ import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
 import com.datastax.oss.driver.api.querybuilder.insert.Insert;
 import com.datastax.oss.driver.api.querybuilder.update.Update;
@@ -253,8 +254,8 @@ public class CassandraMessageIdToImapUidDAO {
         }
 
         return cassandraAsyncExecutor.executeVoid(statementBuilder
-            .setUuid(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
-            .setUuid(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
+            .set(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get(), TypeCodecs.TIMEUUID)
+            .set(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid(), TypeCodecs.TIMEUUID)
             .setLong(IMAP_UID, composedMessageId.getUid().asLong())
             .setLong(MOD_SEQ, metadata.getComposedMessageId().getModSeq().asLong())
             .setUuid(THREAD_ID, ((CassandraMessageId) threadId.getBaseMessageId()).get())
@@ -276,8 +277,8 @@ public class CassandraMessageIdToImapUidDAO {
         ComposedMessageId composedMessageId = metadata.getComposedMessageId().getComposedMessageId();
         Flags flags = metadata.getComposedMessageId().getFlags();
         return cassandraAsyncExecutor.executeVoid(insertForced.bind()
-            .setUuid(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
-            .setUuid(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
+            .set(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get(), TypeCodecs.TIMEUUID)
+            .set(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid(), TypeCodecs.TIMEUUID)
             .setLong(IMAP_UID, composedMessageId.getUid().asLong())
             .setLong(MOD_SEQ, metadata.getComposedMessageId().getModSeq().asLong())
             .setBoolean(ANSWERED, flags.contains(Flag.ANSWERED))
@@ -395,7 +396,7 @@ public class CassandraMessageIdToImapUidDAO {
                 .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
                 .build())
             .bodyStartOctet(row.get(BODY_START_OCTET, Integer.class))
-            .internalDate(Optional.ofNullable(row.getInstant(INTERNAL_DATE))
+            .internalDate(Optional.ofNullable(row.get(INTERNAL_DATE, TypeCodecs.TIMESTAMP))
                 .map(Date::from))
             .size(row.get(FULL_CONTENT_OCTETS, Long.class))
             .headerContent(Optional.ofNullable(row.getString(HEADER_CONTENT))
@@ -404,7 +405,7 @@ public class CassandraMessageIdToImapUidDAO {
     }
 
     private ThreadId getThreadIdFromRow(Row row, MessageId messageId) {
-        UUID threadIdUUID = row.getUuid(THREAD_ID);
+        UUID threadIdUUID = row.get(THREAD_ID, TypeCodecs.TIMEUUID);
         if (threadIdUUID == null) {
             return ThreadId.fromBaseMessageId(messageId);
         }
@@ -441,8 +442,8 @@ public class CassandraMessageIdToImapUidDAO {
         }
 
         return cassandraAsyncExecutor.executeVoid(statementBuilder
-            .setUuid(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
-            .setUuid(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
+            .set(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get(), TypeCodecs.TIMEUUID)
+            .set(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid(), TypeCodecs.TIMEUUID)
             .setLong(IMAP_UID, composedMessageId.getUid().asLong())
             .setLong(MOD_SEQ, metadata.getComposedMessageId().getModSeq().asLong())
             .setUuid(THREAD_ID, ((CassandraMessageId) threadId.getBaseMessageId()).get())
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
index 3c7fbdf6b1..dd31a7bdcf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 
 import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
@@ -152,16 +153,16 @@ public class CassandraModSeqProvider implements ModSeqProvider {
     private Mono<Optional<ModSeq>> findHighestModSeq(CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeSingleRowOptional(
                 select.bind()
-                    .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                     .setExecutionProfile(lwtProfile))
-            .map(maybeRow -> maybeRow.map(row -> ModSeq.of(row.getLong(NEXT_MODSEQ))));
+            .map(maybeRow -> maybeRow.map(row -> ModSeq.of(row.getLong(0))));
     }
 
     private Mono<ModSeq> tryInsertModSeq(CassandraId mailboxId, ModSeq modSeq) {
         ModSeq nextModSeq = modSeq.next();
         return cassandraAsyncExecutor.executeReturnApplied(
                 insert.bind()
-                    .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                     .setLong(NEXT_MODSEQ, nextModSeq.asLong()))
             .map(success -> successToModSeq(nextModSeq, success))
             .handle(publishIfPresent());
@@ -171,7 +172,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
         ModSeq nextModSeq = modSeq.next();
         return cassandraAsyncExecutor.executeReturnApplied(
                 update.bind()
-                    .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                     .setLong(NEXT_MODSEQ, nextModSeq.asLong())
                     .setLong(MOD_SEQ_CONDITION, modSeq.asLong()))
             .map(success -> successToModSeq(nextModSeq, success))
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadDAO.java
index 8da46e864d..5af4b990c1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadDAO.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.store.mail.model.Subject;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 
 import reactor.core.publisher.Flux;
 
@@ -85,19 +86,19 @@ public class CassandraThreadDAO {
     public Flux<Void> insertSome(Username username, Set<MimeMessageId> mimeMessageIds, MessageId messageId, ThreadId threadId, Optional<Subject> baseSubject) {
         return Flux.fromIterable(mimeMessageIds)
             .flatMap(mimeMessageId -> executor.executeVoid(insertOne.bind()
-                .setString(USERNAME, username.asString())
-                .setString(MIME_MESSAGE_ID, mimeMessageId.getValue())
-                .setUuid(MESSAGE_ID, ((CassandraMessageId) messageId).get())
-                .setUuid(THREAD_ID, ((CassandraMessageId) threadId.getBaseMessageId()).get())
-                .setString(BASE_SUBJECT, baseSubject.map(Subject::getValue).orElse(null))), DEFAULT_CONCURRENCY);
+                .set(USERNAME, username.asString(), TypeCodecs.TEXT)
+                .set(MIME_MESSAGE_ID, mimeMessageId.getValue(), TypeCodecs.TEXT)
+                .set(MESSAGE_ID, ((CassandraMessageId) messageId).get(), TypeCodecs.TIMEUUID)
+                .set(THREAD_ID, ((CassandraMessageId) threadId.getBaseMessageId()).get(), TypeCodecs.TIMEUUID)
+                .set(BASE_SUBJECT, baseSubject.map(Subject::getValue).orElse(null), TypeCodecs.TEXT)), DEFAULT_CONCURRENCY);
     }
 
     public Flux<Pair<Optional<Subject>, ThreadId>> selectSome(Username username, Set<MimeMessageId> mimeMessageIds) {
         return Flux.fromIterable(mimeMessageIds)
             .flatMap(mimeMessageId -> executor
                 .executeSingleRow(selectOne.bind()
-                    .setString(USERNAME, username.asString())
-                    .setString(MIME_MESSAGE_ID, mimeMessageId.getValue()))
+                    .set(USERNAME, username.asString(), TypeCodecs.TEXT)
+                    .set(MIME_MESSAGE_ID, mimeMessageId.getValue(), TypeCodecs.TEXT))
                 .map(this::readRow), DEFAULT_CONCURRENCY)
             .distinct();
     }
@@ -105,8 +106,8 @@ public class CassandraThreadDAO {
     public Flux<Void> deleteSome(Username username, Set<MimeMessageId> mimeMessageIds) {
         return Flux.fromIterable(mimeMessageIds)
             .flatMap(mimeMessageId -> executor.executeVoid(deleteOne.bind()
-                .setString(USERNAME, username.asString())
-                .setString(MIME_MESSAGE_ID, mimeMessageId.getValue())));
+                .set(USERNAME, username.asString(), TypeCodecs.TEXT)
+                .set(MIME_MESSAGE_ID, mimeMessageId.getValue(), TypeCodecs.TEXT)));
     }
 
     public Pair<Optional<Subject>, ThreadId> readRow(Row row) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadLookupDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadLookupDAO.java
index ff6e96a04b..5913c0622b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadLookupDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadLookupDAO.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import static com.datastax.oss.driver.api.core.type.DataTypes.TEXT;
+import static com.datastax.oss.driver.api.core.type.DataTypes.frozenSetOf;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.bindMarker;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.deleteFrom;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.insertInto;
@@ -42,11 +44,16 @@ import org.apache.james.mailbox.store.mail.model.MimeMessageId;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
+import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
 import com.google.common.collect.ImmutableSet;
 
 import reactor.core.publisher.Mono;
 
 public class CassandraThreadLookupDAO {
+    private static final TypeCodec<Set<String>> SET_OF_STRINGS_CODEC = CodecRegistry.DEFAULT.codecFor(frozenSetOf(TEXT));
+
     private final CassandraAsyncExecutor executor;
     private final PreparedStatement insert;
     private final PreparedStatement select;
@@ -75,24 +82,24 @@ public class CassandraThreadLookupDAO {
     public Mono<Void> insert(MessageId messageId, Username username, Set<MimeMessageId> mimeMessageIds) {
         Set<String> mimeMessageIdsString = mimeMessageIds.stream().map(MimeMessageId::getValue).collect(ImmutableSet.toImmutableSet());
         return executor.executeVoid(insert.bind()
-            .setUuid(MESSAGE_ID, ((CassandraMessageId) messageId).get())
-            .setString(USERNAME, username.asString())
-            .setSet(MIME_MESSAGE_IDS, mimeMessageIdsString, String.class));
+            .set(MESSAGE_ID, ((CassandraMessageId) messageId).get(), TypeCodecs.TIMEUUID)
+            .set(USERNAME, username.asString(), TypeCodecs.TEXT)
+            .set(MIME_MESSAGE_IDS, mimeMessageIdsString, SET_OF_STRINGS_CODEC));
     }
 
     public Mono<ThreadTablePartitionKey> selectOneRow(MessageId messageId) {
         return executor.executeSingleRow(
-                select.bind().setUuid(MESSAGE_ID, ((CassandraMessageId) messageId).get()))
+                select.bind().set(MESSAGE_ID, ((CassandraMessageId) messageId).get(), TypeCodecs.TIMEUUID))
             .map(this::readRow);
     }
 
     public Mono<Void> deleteOneRow(MessageId messageId) {
         return executor.executeVoid(delete.bind()
-            .setUuid(MESSAGE_ID, ((CassandraMessageId) messageId).get()));
+            .set(MESSAGE_ID, ((CassandraMessageId) messageId).get(), TypeCodecs.TIMEUUID));
     }
 
     private ThreadTablePartitionKey readRow(Row row) {
-        Set<MimeMessageId> mimeMessageIds = row.getSet(MIME_MESSAGE_IDS, String.class)
+        Set<MimeMessageId> mimeMessageIds = row.get(MIME_MESSAGE_IDS, SET_OF_STRINGS_CODEC)
             .stream()
             .map(MimeMessageId::new)
             .collect(ImmutableSet.toImmutableSet());
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
index ef4eae061d..570ed05f9b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.store.mail.UidProvider;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.collect.ImmutableList;
 
 import reactor.core.publisher.Mono;
@@ -165,9 +166,9 @@ public class CassandraUidProvider implements UidProvider {
     private Mono<MessageUid> findHighestUid(CassandraId mailboxId) {
         return executor.executeSingleRow(
                 selectStatement.bind()
-                    .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                     .setExecutionProfile(lwtProfile))
-            .map(row -> MessageUid.of(row.getLong(NEXT_UID)));
+            .map(row -> MessageUid.of(row.getLong(0)));
     }
 
     private Mono<MessageUid> tryUpdateUid(CassandraId mailboxId, MessageUid uid) {
@@ -178,7 +179,7 @@ public class CassandraUidProvider implements UidProvider {
         MessageUid nextUid = uid.next(count);
         return executor.executeReturnApplied(
                 updateStatement.bind()
-                    .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                     .setLong(CONDITION, uid.asLong())
                     .setLong(NEXT_UID, nextUid.asLong()))
             .map(success -> successToUid(nextUid, success))


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


[james-project] 07/15: [PERF] Adopt CqlIdentifier within cassandra blob store

Posted by bt...@apache.org.
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 c5a3958e8f0b462cfa49e0b012674b2b5d420705
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 2 16:27:14 2022 +0700

    [PERF] Adopt CqlIdentifier within cassandra blob store
---
 .../apache/james/blob/cassandra/BlobTables.java    | 32 ++++++++++++----------
 .../cassandra/cache/CassandraBlobStoreCache.java   |  5 ++--
 .../blob/cassandra/cache/CachedBlobStoreTest.java  |  3 +-
 3 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTables.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTables.java
index 09a6823911..11ca1d40f0 100644
--- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTables.java
+++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTables.java
@@ -19,40 +19,42 @@
 
 package org.apache.james.blob.cassandra;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface BlobTables {
 
     interface DefaultBucketBlobTable {
         String TABLE_NAME = "blobs";
-        String ID = "id";
-        String NUMBER_OF_CHUNK = "position";
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier NUMBER_OF_CHUNK = CqlIdentifier.fromCql("position");
     }
 
     interface DefaultBucketBlobParts {
         String TABLE_NAME = "blobParts";
-        String ID = "id";
-        String CHUNK_NUMBER = "chunkNumber";
-        String DATA = "data";
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier CHUNK_NUMBER = CqlIdentifier.fromCql("chunkNumber");
+        CqlIdentifier DATA = CqlIdentifier.fromCql("data");
     }
 
     interface BucketBlobTable {
         String TABLE_NAME = "blobsInBucket";
-        String BUCKET = "bucket";
-        String ID = "id";
-        String NUMBER_OF_CHUNK = "position";
+        CqlIdentifier BUCKET = CqlIdentifier.fromCql("bucket");
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier NUMBER_OF_CHUNK = CqlIdentifier.fromCql("position");
     }
 
     interface BucketBlobParts {
         String TABLE_NAME = "blobPartsInBucket";
-        String BUCKET = "bucket";
-        String ID = "id";
-        String CHUNK_NUMBER = "chunkNumber";
-        String DATA = "data";
+        CqlIdentifier BUCKET = CqlIdentifier.fromCql("bucket");
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier CHUNK_NUMBER = CqlIdentifier.fromCql("chunkNumber");
+        CqlIdentifier DATA = CqlIdentifier.fromCql("data");
     }
 
     interface BlobStoreCache {
         String TABLE_NAME = "blob_cache";
-        String ID = "id";
-        String DATA = "data";
-        String TTL_FOR_ROW = "ttl";
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier DATA = CqlIdentifier.fromCql("data");
+        CqlIdentifier TTL_FOR_ROW = CqlIdentifier.fromCql("ttl");
     }
 }
diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java
index 8d66ccc8bc..cdfd3d3d47 100644
--- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java
+++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java
@@ -45,6 +45,7 @@ import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.annotations.VisibleForTesting;
 
 import reactor.core.publisher.Mono;
@@ -75,7 +76,7 @@ public class CassandraBlobStoreCache implements BlobStoreCache {
             .build());
 
         this.selectStatement = session.prepare(selectFrom(TABLE_NAME)
-            .all()
+            .column(DATA)
             .whereColumn(ID).isEqualTo(bindMarker(ID))
             .build());
 
@@ -130,7 +131,7 @@ public class CassandraBlobStoreCache implements BlobStoreCache {
     }
 
     private byte[] toByteArray(Row row) {
-        ByteBuffer byteBuffer = row.getByteBuffer(DATA);
+        ByteBuffer byteBuffer = row.get(0, TypeCodecs.BLOB);
         assert byteBuffer != null;
         byte[] data = new byte[byteBuffer.remaining()];
         byteBuffer.get(data);
diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java
index f7a20799ba..c273a25316 100644
--- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java
+++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java
@@ -354,6 +354,7 @@ public class CachedBlobStoreTest implements BlobStoreContract {
 
     @Test
     public void cachedBlobStoreShouldOnlyBeQueriedForHeaders(CassandraCluster cassandra) throws Exception {
+        cassandra.getConf().printStatements();
         MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
             .addHeader("Date", "Thu, 6 Sep 2018 13:29:13 +0700 (ICT)")
             .addHeader("Message-ID", "<84...@localhost.localdomain>")
@@ -374,7 +375,7 @@ public class CachedBlobStoreTest implements BlobStoreContract {
 
         mimeMessageStore.read(partsId).block();
 
-        assertThat(statementRecorder.listExecutedStatements(Selector.preparedStatementStartingWith("SELECT * FROM blob_cache")))
+        assertThat(statementRecorder.listExecutedStatements(Selector.preparedStatementStartingWith("SELECT data FROM blob_cache")))
             .hasSize(1);
     }
 


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


[james-project] 03/15: [PERF] Adopt CqlIdentifier within server/data/data-jmap-cassandra

Posted by bt...@apache.org.
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 baede3f6cc9eb947c32352c2fd8cc1172871f38e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 1 09:32:19 2022 +0700

    [PERF] Adopt CqlIdentifier within server/data/data-jmap-cassandra
---
 .../cassandra/access/CassandraAccessTokenDAO.java  |  7 +--
 .../access/table/CassandraAccessTokenTable.java    |  6 ++-
 .../cassandra/change/EmailChangeRepositoryDAO.java | 21 ++++----
 .../change/MailboxChangeRepositoryDAO.java         | 21 ++++----
 .../change/tables/CassandraEmailChangeTable.java   | 17 ++++---
 .../change/tables/CassandraMailboxChangeTable.java | 20 ++++----
 .../projections/CassandraEmailQueryView.java       | 57 ++++++++++------------
 .../CassandraMessageFastViewProjection.java        | 11 ++---
 .../table/CassandraEmailQueryViewTable.java        | 11 ++---
 .../CassandraMessageFastViewProjectionTable.java   | 10 ++--
 .../tables/CassandraPushSubscriptionTable.java     | 23 +++++----
 .../james/jmap/cassandra/upload/UploadModule.java  | 13 ++---
 .../identity/CassandraCustomIdentityModule.scala   |  6 +--
 .../tables/CassandraCustomIdentityTable.scala      | 29 ++++++-----
 .../cassandra/utils/EmailAddressTupleUtil.scala    |  2 +-
 15 files changed, 132 insertions(+), 122 deletions(-)

diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
index d104bc9f34..b4facc69ea 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
@@ -37,6 +37,7 @@ import org.apache.james.jmap.cassandra.access.table.CassandraAccessTokenTable;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.primitives.Ints;
 
 import reactor.core.publisher.Mono;
@@ -67,7 +68,7 @@ public class CassandraAccessTokenDAO {
             .build());
 
         this.selectStatement = session.prepare(selectFrom(CassandraAccessTokenTable.TABLE_NAME)
-            .all()
+            .column(CassandraAccessTokenTable.USERNAME)
             .whereColumn(CassandraAccessTokenTable.TOKEN)
             .isEqualTo(bindMarker(CassandraAccessTokenTable.TOKEN))
             .build());
@@ -87,8 +88,8 @@ public class CassandraAccessTokenDAO {
 
     public Mono<Username> getUsernameFromToken(AccessToken accessToken) {
         return cassandraAsyncExecutor.executeSingleRow(selectStatement.bind()
-                .setUuid(CassandraAccessTokenTable.TOKEN, accessToken.asUUID()))
-            .map(row -> row.getString(CassandraAccessTokenTable.USERNAME))
+                .set(CassandraAccessTokenTable.TOKEN, accessToken.asUUID(), TypeCodecs.UUID))
+            .map(row -> row.get(0, TypeCodecs.TEXT))
             .map(Username::of);
     }
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/table/CassandraAccessTokenTable.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/table/CassandraAccessTokenTable.java
index 482e4ef62f..026f80eb99 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/table/CassandraAccessTokenTable.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/table/CassandraAccessTokenTable.java
@@ -19,11 +19,13 @@
 
 package org.apache.james.jmap.cassandra.access.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraAccessTokenTable {
 
     String TABLE_NAME = "access_token";
 
-    String TOKEN = "access_token";
-    String USERNAME = "username";
+    CqlIdentifier TOKEN = CqlIdentifier.fromCql("access_token");
+    CqlIdentifier USERNAME = CqlIdentifier.fromCql("username");
 
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/EmailChangeRepositoryDAO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/EmailChangeRepositoryDAO.java
index c34bf02e49..adb6c35224 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/EmailChangeRepositoryDAO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/EmailChangeRepositoryDAO.java
@@ -55,6 +55,7 @@ import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.type.DataTypes;
 import com.datastax.oss.driver.api.core.type.UserDefinedType;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
 import com.datastax.oss.driver.api.core.type.reflect.GenericType;
 import com.google.common.collect.ImmutableList;
@@ -140,32 +141,32 @@ public class EmailChangeRepositoryDAO {
 
     Flux<EmailChange> getAllChanges(AccountId accountId) {
         return executor.executeRows(selectAllStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier()))
-            .map(this::readRow);
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT))
+            .map(row -> readRow(row, accountId));
     }
 
     Flux<EmailChange> getChangesSince(AccountId accountId, State state) {
         return executor.executeRows(selectFromStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier())
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT)
             .setUuid(STATE, state.getValue()))
-            .map(this::readRow);
+            .map(row -> readRow(row, accountId));
     }
 
     Mono<State> latestState(AccountId accountId) {
         return executor.executeSingleRow(selectLatestStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier()))
-            .map(row -> State.of(row.getUuid(STATE)));
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT))
+            .map(row -> State.of(row.getUuid(0)));
     }
 
     Mono<State> latestStateNotDelegated(AccountId accountId) {
         return executor.executeSingleRow(selectLatestNotDelegatedStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier()))
-            .map(row -> State.of(row.getUuid(STATE)));
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT))
+            .map(row -> State.of(row.getUuid(0)));
     }
 
-    private EmailChange readRow(Row row) {
+    private EmailChange readRow(Row row, AccountId accountId) {
         return EmailChange.builder()
-            .accountId(AccountId.fromString(row.getString(ACCOUNT_ID)))
+            .accountId(accountId)
             .state(State.of(row.getUuid(STATE)))
             .date(CassandraZonedDateTimeModule.fromUDT(row.getUdtValue(DATE)))
             .isDelegated(row.getBoolean(IS_DELEGATED))
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/MailboxChangeRepositoryDAO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/MailboxChangeRepositoryDAO.java
index 11e7f6b622..a4db97412c 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/MailboxChangeRepositoryDAO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/MailboxChangeRepositoryDAO.java
@@ -55,6 +55,7 @@ import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.type.DataTypes;
 import com.datastax.oss.driver.api.core.type.UserDefinedType;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
 import com.datastax.oss.driver.api.core.type.reflect.GenericType;
 import com.datastax.oss.driver.internal.core.type.codec.BooleanCodec;
@@ -144,32 +145,32 @@ public class MailboxChangeRepositoryDAO {
 
     Flux<MailboxChange> getAllChanges(AccountId accountId) {
         return executor.executeRows(selectAllStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier()))
-            .map(this::readRow);
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT))
+            .map(row -> readRow(row, accountId));
     }
 
     Flux<MailboxChange> getChangesSince(AccountId accountId, State state) {
         return executor.executeRows(selectFromStatement.bind()
-                .setString(ACCOUNT_ID, accountId.getIdentifier())
+                .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT)
                 .setUuid(STATE, state.getValue()))
-            .map(this::readRow);
+            .map(row -> readRow(row, accountId));
     }
 
     Mono<State> latestState(AccountId accountId) {
         return executor.executeSingleRow(selectLatestStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier()))
-            .map(row -> State.of(row.getUuid(STATE)));
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT))
+            .map(row -> State.of(row.getUuid(0)));
     }
 
     Mono<State> latestStateNotDelegated(AccountId accountId) {
         return executor.executeSingleRow(selectLatestNotDelegatedStatement.bind()
-            .setString(ACCOUNT_ID, accountId.getIdentifier()))
-            .map(row -> State.of(row.getUuid(STATE)));
+            .set(ACCOUNT_ID, accountId.getIdentifier(), TypeCodecs.TEXT))
+            .map(row -> State.of(row.getUuid(0)));
     }
 
-    private MailboxChange readRow(Row row) {
+    private MailboxChange readRow(Row row, AccountId accountId) {
         return MailboxChange.builder()
-            .accountId(AccountId.fromString(row.getString(ACCOUNT_ID)))
+            .accountId(accountId)
             .state(State.of(row.getUuid(STATE)))
             .date(CassandraZonedDateTimeModule.fromUDT(row.getUdtValue(DATE)))
             .isCountChange(row.getBoolean(IS_COUNT_CHANGE))
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraEmailChangeTable.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraEmailChangeTable.java
index 945f038463..846a3cbea7 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraEmailChangeTable.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraEmailChangeTable.java
@@ -19,13 +19,16 @@
 
 package org.apache.james.jmap.cassandra.change.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraEmailChangeTable {
     String TABLE_NAME = "email_change";
-    String ACCOUNT_ID = "account_id";
-    String STATE = "state";
-    String DATE = "date";
-    String IS_DELEGATED = "is_delegated";
-    String CREATED = "created";
-    String UPDATED = "updated";
-    String DESTROYED = "destroyed";
+
+    CqlIdentifier ACCOUNT_ID = CqlIdentifier.fromCql("account_id");
+    CqlIdentifier STATE = CqlIdentifier.fromCql("state");
+    CqlIdentifier DATE = CqlIdentifier.fromCql("date");
+    CqlIdentifier IS_DELEGATED = CqlIdentifier.fromCql("is_delegated");
+    CqlIdentifier CREATED = CqlIdentifier.fromCql("created");
+    CqlIdentifier UPDATED = CqlIdentifier.fromCql("updated");
+    CqlIdentifier DESTROYED = CqlIdentifier.fromCql("destroyed");
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraMailboxChangeTable.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraMailboxChangeTable.java
index 392ebbce8f..2cacddebc2 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraMailboxChangeTable.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraMailboxChangeTable.java
@@ -19,15 +19,17 @@
 
 package org.apache.james.jmap.cassandra.change.tables;
 
-public interface CassandraMailboxChangeTable {
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
+public interface CassandraMailboxChangeTable {
     String TABLE_NAME = "mailbox_change";
-    String ACCOUNT_ID = "account_id";
-    String STATE = "state";
-    String DATE = "date";
-    String IS_DELEGATED = "is_delegated";
-    String IS_COUNT_CHANGE = "is_count_change";
-    String CREATED = "created";
-    String UPDATED = "updated";
-    String DESTROYED = "destroyed";
+
+    CqlIdentifier ACCOUNT_ID = CqlIdentifier.fromCql("account_id");
+    CqlIdentifier STATE = CqlIdentifier.fromCql("state");
+    CqlIdentifier DATE = CqlIdentifier.fromCql("date");
+    CqlIdentifier IS_DELEGATED = CqlIdentifier.fromCql("is_delegated");
+    CqlIdentifier IS_COUNT_CHANGE = CqlIdentifier.fromCql("is_count_change");
+    CqlIdentifier CREATED = CqlIdentifier.fromCql("created");
+    CqlIdentifier UPDATED = CqlIdentifier.fromCql("updated");
+    CqlIdentifier DESTROYED = CqlIdentifier.fromCql("destroyed");
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
index 2f993b38ff..20cae833cf 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java
@@ -27,19 +27,18 @@ import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.DATE_LOOKUP_TABLE;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MAILBOX_ID;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MESSAGE_ID;
-import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.MESSAGE_ID_LOWERCASE;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.RECEIVED_AT;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.SENT_AT;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.TABLE_NAME_RECEIVED_AT;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.TABLE_NAME_SENT_AT;
 
 import java.time.Instant;
-import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.util.Comparator;
 
 import javax.inject.Inject;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.jmap.api.projections.EmailQueryView;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -51,6 +50,7 @@ import org.apache.james.util.streams.Limit;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
 import com.google.common.base.Preconditions;
 
@@ -81,21 +81,21 @@ public class CassandraEmailQueryView implements EmailQueryView {
         this.executor = new CassandraAsyncExecutor(session);
 
         listMailboxContentBySentAt = session.prepare(selectFrom(TABLE_NAME_SENT_AT)
-            .all()
+            .column(MESSAGE_ID)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .orderBy(SENT_AT, DESC)
             .limit(bindMarker(LIMIT_MARKER))
             .build());
 
         listMailboxContentByReceivedAt = session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
-            .all()
+            .column(MESSAGE_ID)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .orderBy(RECEIVED_AT, DESC)
             .limit(bindMarker(LIMIT_MARKER))
             .build());
 
         listMailboxContentSinceSentAt = session.prepare(selectFrom(TABLE_NAME_SENT_AT)
-            .all()
+            .column(MESSAGE_ID)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .whereColumn(SENT_AT).isGreaterThanOrEqualTo(bindMarker(SENT_AT))
             .orderBy(SENT_AT, DESC)
@@ -103,7 +103,7 @@ public class CassandraEmailQueryView implements EmailQueryView {
             .build());
 
         listMailboxContentSinceReceivedAt = session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
-            .all()
+            .columns(MESSAGE_ID, SENT_AT)
             .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
             .whereColumn(RECEIVED_AT).isGreaterThanOrEqualTo(bindMarker(RECEIVED_AT))
             .orderBy(RECEIVED_AT, DESC)
@@ -171,9 +171,9 @@ public class CassandraEmailQueryView implements EmailQueryView {
 
         CassandraId cassandraId = (CassandraId) mailboxId;
         return executor.executeRows(listMailboxContentBySentAt.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setInt(LIMIT_MARKER, limit.getLimit().get()))
-            .map(row -> CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID)));
+            .map(row -> CassandraMessageId.Factory.of(row.get(0, TypeCodecs.UUID)));
     }
 
     @Override
@@ -182,9 +182,9 @@ public class CassandraEmailQueryView implements EmailQueryView {
 
         CassandraId cassandraId = (CassandraId) mailboxId;
         return executor.executeRows(listMailboxContentByReceivedAt.bind()
-            .setUuid(MAILBOX_ID, cassandraId.asUuid())
+            .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
             .setInt(LIMIT_MARKER, limit.getLimit().get()))
-            .map(row -> CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID)));
+            .map(row -> CassandraMessageId.Factory.of(row.get(0, TypeCodecs.UUID)));
     }
 
     @Override
@@ -194,19 +194,16 @@ public class CassandraEmailQueryView implements EmailQueryView {
         CassandraId cassandraId = (CassandraId) mailboxId;
 
         return executor.executeRows(listMailboxContentSinceReceivedAt.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setInstant(RECEIVED_AT, since.toInstant()))
             .map(row -> {
                 CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID));
-                Instant receivedAt = row.getInstant(RECEIVED_AT);
                 Instant sentAt = row.getInstant(SENT_AT);
 
-                return new Entry(cassandraId, messageId,
-                    ZonedDateTime.ofInstant(sentAt, ZoneOffset.UTC),
-                    ZonedDateTime.ofInstant(receivedAt, ZoneOffset.UTC));
+                return Pair.of(messageId, sentAt);
             })
-            .sort(Comparator.comparing(Entry::getSentAt).reversed())
-            .map(Entry::getMessageId)
+            .sort(Comparator.<Pair<CassandraMessageId, Instant>, Instant>comparing(Pair::getValue).reversed())
+            .map(pair -> (MessageId) pair.getKey())
             .take(limit.getLimit().get());
     }
 
@@ -217,9 +214,9 @@ public class CassandraEmailQueryView implements EmailQueryView {
         CassandraId cassandraId = (CassandraId) mailboxId;
 
         return executor.executeRows(listMailboxContentSinceReceivedAt.bind()
-            .setUuid(MAILBOX_ID, cassandraId.asUuid())
+            .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
             .setInstant(RECEIVED_AT, since.toInstant()))
-            .<MessageId>map(row -> CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID)))
+            .<MessageId>map(row -> CassandraMessageId.Factory.of(row.get(0, TypeCodecs.UUID)))
             .take(limit.getLimit().get());
     }
 
@@ -230,10 +227,10 @@ public class CassandraEmailQueryView implements EmailQueryView {
         CassandraId cassandraId = (CassandraId) mailboxId;
 
         return executor.executeRows(listMailboxContentSinceSentAt.bind()
-            .setUuid(MAILBOX_ID, cassandraId.asUuid())
+            .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
             .setInt(LIMIT_MARKER, limit.getLimit().get())
             .setInstant(SENT_AT, since.toInstant()))
-            .map(row -> CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID_LOWERCASE)));
+            .map(row -> CassandraMessageId.Factory.of(row.get(0, TypeCodecs.UUID)));
     }
 
     @Override
@@ -242,7 +239,7 @@ public class CassandraEmailQueryView implements EmailQueryView {
         CassandraId cassandraId = (CassandraId) mailboxId;
 
         return executor.executeSingleRow(lookupDate.bind()
-            .setUuid(MAILBOX_ID, cassandraId.asUuid())
+            .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
             .setUuid(MESSAGE_ID, cassandraMessageId.get()))
             .flatMap(row -> doDelete(cassandraMessageId, cassandraId, row));
     }
@@ -253,15 +250,15 @@ public class CassandraEmailQueryView implements EmailQueryView {
 
         return Flux.concat(
             executor.executeVoid(deleteSentAt.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setUuid(MESSAGE_ID, cassandraMessageId.get())
                 .setInstant(SENT_AT, sentAt)),
             executor.executeVoid(deleteReceivedAt.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setUuid(MESSAGE_ID, cassandraMessageId.get())
                 .setInstant(RECEIVED_AT, receivedAt)))
             .then(executor.executeVoid(deleteLookupRecord.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                 .setUuid(MESSAGE_ID, cassandraMessageId.get())));
     }
 
@@ -271,9 +268,9 @@ public class CassandraEmailQueryView implements EmailQueryView {
 
         return Flux.concat(
             executor.executeVoid(deleteAllSentAt.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())),
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)),
             executor.executeVoid(deleteAllReceivedAt.bind()
-                .setUuid(MAILBOX_ID, cassandraId.asUuid())))
+                .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)))
             .then(executor.executeVoid(deleteAllLookupRecords.bind()
                 .setUuid(MAILBOX_ID, ((CassandraId) mailboxId).asUuid())));
     }
@@ -285,17 +282,17 @@ public class CassandraEmailQueryView implements EmailQueryView {
 
         return executor.executeVoid(insertInLookupTable.bind()
             .setUuid(MESSAGE_ID, cassandraMessageId.get())
-            .setUuid(MAILBOX_ID, cassandraId.asUuid())
+            .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
             .setInstant(RECEIVED_AT, receivedAt.toInstant())
             .setInstant(SENT_AT, sentAt.toInstant()))
             .then(Flux.concat(
                 executor.executeVoid(insertSentAt.bind()
                     .setUuid(MESSAGE_ID, cassandraMessageId.get())
-                    .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                    .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                     .setInstant(SENT_AT, sentAt.toInstant())),
                 executor.executeVoid(insertReceivedAt.bind()
                     .setUuid(MESSAGE_ID, cassandraMessageId.get())
-                    .setUuid(MAILBOX_ID, cassandraId.asUuid())
+                    .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
                     .setInstant(RECEIVED_AT, receivedAt.toInstant())
                     .setInstant(SENT_AT, sentAt.toInstant())))
                 .then());
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 af4a0f117f..4d31fe9ca0 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
@@ -24,9 +24,7 @@ import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.deleteFrom;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.HAS_ATTACHMENT;
-import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.HAS_ATTACHMENT_LOWERCASE;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.MESSAGE_ID;
-import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.MESSAGE_ID_LOWERCASE;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.PREVIEW;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.TABLE_NAME;
 
@@ -48,6 +46,7 @@ import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
 import com.google.common.base.Preconditions;
 
@@ -83,7 +82,7 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
 
         this.retrieveStatement = session.prepare(selectFrom(TABLE_NAME)
             .all()
-            .whereColumn(MESSAGE_ID_LOWERCASE).isEqualTo(bindMarker(MESSAGE_ID_LOWERCASE))
+            .whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
             .build());
 
         this.truncateStatement = session.prepare(QueryBuilder.truncate(TABLE_NAME).build());
@@ -110,7 +109,7 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
         checkMessage(messageId);
 
         return cassandraAsyncExecutor.executeSingleRow(retrieveStatement.bind()
-                .setUuid(MESSAGE_ID_LOWERCASE, ((CassandraMessageId) messageId).get())
+                .set(MESSAGE_ID, ((CassandraMessageId) messageId).get(), TypeCodecs.UUID)
                 .setExecutionProfile(cachingProfile))
             .map(this::fromRow)
             .doOnNext(preview -> metricRetrieveHitCount.increment())
@@ -142,8 +141,8 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
 
     private MessageFastViewPrecomputedProperties fromRow(Row row) {
         return MessageFastViewPrecomputedProperties.builder()
-            .preview(Preview.from(row.getString(PREVIEW)))
-            .hasAttachment(row.getBoolean(HAS_ATTACHMENT_LOWERCASE))
+            .preview(Preview.from(row.get(PREVIEW, TypeCodecs.TEXT)))
+            .hasAttachment(row.getBoolean(HAS_ATTACHMENT))
             .build();
     }
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
index cdc8109dfb..65747c722f 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java
@@ -19,16 +19,15 @@
 
 package org.apache.james.jmap.cassandra.projections.table;
 
-import java.util.Locale;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraEmailQueryViewTable {
     String TABLE_NAME_SENT_AT = "email_query_view_sent_at";
     String TABLE_NAME_RECEIVED_AT = "email_query_view_received_at";
     String DATE_LOOKUP_TABLE = "email_query_view_date_lookup";
 
-    String MAILBOX_ID = "mailboxId";
-    String MESSAGE_ID = "messageId";
-    String MESSAGE_ID_LOWERCASE = MESSAGE_ID.toLowerCase(Locale.US);
-    String RECEIVED_AT = "receivedAt";
-    String SENT_AT = "sentAt";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("messageId");
+    CqlIdentifier RECEIVED_AT = CqlIdentifier.fromCql("receivedAt");
+    CqlIdentifier SENT_AT = CqlIdentifier.fromCql("sentAt");
 }
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 fcdbd682a2..57f87f0c68 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
@@ -19,14 +19,12 @@
 
 package org.apache.james.jmap.cassandra.projections.table;
 
-import java.util.Locale;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraMessageFastViewProjectionTable {
     String TABLE_NAME = "message_fast_view_projection";
 
-    String MESSAGE_ID = "messageId";
-    String MESSAGE_ID_LOWERCASE = MESSAGE_ID.toLowerCase(Locale.US);
-    String PREVIEW = "preview";
-    String HAS_ATTACHMENT = "hasAttachment";
-    String HAS_ATTACHMENT_LOWERCASE = HAS_ATTACHMENT.toLowerCase(Locale.US);
+    CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("messageId");
+    CqlIdentifier PREVIEW = CqlIdentifier.fromCql("preview");
+    CqlIdentifier HAS_ATTACHMENT = CqlIdentifier.fromCql("hasAttachment");
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/tables/CassandraPushSubscriptionTable.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/tables/CassandraPushSubscriptionTable.java
index 7d56857918..a8fdc1ee76 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/tables/CassandraPushSubscriptionTable.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/tables/CassandraPushSubscriptionTable.java
@@ -19,16 +19,19 @@
 
 package org.apache.james.jmap.cassandra.pushsubscription.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraPushSubscriptionTable {
     String TABLE_NAME = "push_subscription";
-    String USER = "user";
-    String DEVICE_CLIENT_ID = "device_client_id";
-    String ID = "id";
-    String EXPIRES = "expires";
-    String TYPES = "types";
-    String URL = "url";
-    String VERIFICATION_CODE = "verification_code";
-    String ENCRYPT_PUBLIC_KEY = "encrypt_public_key";
-    String ENCRYPT_AUTH_SECRET = "encrypt_auth_secret";
-    String VALIDATED = "validated";
+
+    CqlIdentifier USER = CqlIdentifier.fromCql("user");
+    CqlIdentifier DEVICE_CLIENT_ID = CqlIdentifier.fromCql("device_client_id");
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier EXPIRES = CqlIdentifier.fromCql("expires");
+    CqlIdentifier TYPES = CqlIdentifier.fromCql("types");
+    CqlIdentifier URL = CqlIdentifier.fromCql("url");
+    CqlIdentifier VERIFICATION_CODE = CqlIdentifier.fromCql("verification_code");
+    CqlIdentifier ENCRYPT_PUBLIC_KEY = CqlIdentifier.fromCql("encrypt_public_key");
+    CqlIdentifier ENCRYPT_AUTH_SECRET = CqlIdentifier.fromCql("encrypt_auth_secret");
+    CqlIdentifier VALIDATED = CqlIdentifier.fromCql("validated");
 }
\ No newline at end of file
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadModule.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadModule.java
index bb24c7503d..979398dd37 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadModule.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadModule.java
@@ -25,6 +25,7 @@ import static org.apache.james.backends.cassandra.utils.CassandraConstants.DEFAU
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.type.DataTypes;
 import com.datastax.oss.driver.api.querybuilder.SchemaBuilder;
 
@@ -32,12 +33,12 @@ public interface UploadModule {
 
     String TABLE_NAME = "uploads";
 
-    String ID = "id";
-    String CONTENT_TYPE = "content_type";
-    String SIZE = "size";
-    String BUCKET_ID = "bucket_id";
-    String BLOB_ID = "blob_id";
-    String USER = "user";
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier CONTENT_TYPE = CqlIdentifier.fromCql("content_type");
+    CqlIdentifier SIZE = CqlIdentifier.fromCql("size");
+    CqlIdentifier BUCKET_ID = CqlIdentifier.fromCql("bucket_id");
+    CqlIdentifier BLOB_ID = CqlIdentifier.fromCql("blob_id");
+    CqlIdentifier USER = CqlIdentifier.fromCql("user");
 
     CassandraModule MODULE = CassandraModule.table(TABLE_NAME)
         .comment("Holds JMAP uploads")
diff --git a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityModule.scala b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityModule.scala
index 45e5d9624b..2d277aff3a 100644
--- a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityModule.scala
+++ b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityModule.scala
@@ -26,7 +26,7 @@ import org.apache.james.jmap.cassandra.identity.tables.CassandraCustomIdentityTa
 
 object CassandraCustomIdentityModule {
   val MODULE: CassandraModule = CassandraModule.builder()
-    .`type`(EMAIL_ADDRESS)
+    .`type`(EMAIL_ADDRESS.asCql(true))
     .statement(statement => statement
       .withField(EmailAddress.NAME, TEXT)
       .withField(EmailAddress.EMAIL, TEXT))
@@ -38,8 +38,8 @@ object CassandraCustomIdentityModule {
       .withClusteringColumn(ID, UUID)
       .withColumn(NAME, TEXT)
       .withColumn(EMAIL, TEXT)
-      .withColumn(REPLY_TO, frozenSetOf(types.getDefinedUserType(EMAIL_ADDRESS)))
-      .withColumn(BCC, frozenSetOf(types.getDefinedUserType(EMAIL_ADDRESS)))
+      .withColumn(REPLY_TO, frozenSetOf(types.getDefinedUserType(EMAIL_ADDRESS.asCql(true))))
+      .withColumn(BCC, frozenSetOf(types.getDefinedUserType(EMAIL_ADDRESS.asCql(true))))
       .withColumn(TEXT_SIGNATURE, TEXT)
       .withColumn(HTML_SIGNATURE, TEXT)
       .withColumn(SORT_ORDER, INT)
diff --git a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/tables/CassandraCustomIdentityTable.scala b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/tables/CassandraCustomIdentityTable.scala
index acb9e64179..117bc2cbbf 100644
--- a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/tables/CassandraCustomIdentityTable.scala
+++ b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/tables/CassandraCustomIdentityTable.scala
@@ -19,22 +19,25 @@
 
 package org.apache.james.jmap.cassandra.identity.tables
 
+import com.datastax.oss.driver.api.core.CqlIdentifier
+
 object CassandraCustomIdentityTable {
   val TABLE_NAME: String = "custom_identity"
-  val USER: String = "user"
-  val ID: String = "id"
-  val NAME: String = "name"
-  val EMAIL: String = "email"
-  val REPLY_TO: String = "reply_to"
-  val BCC: String = "bcc"
-  val TEXT_SIGNATURE: String = "text_signature"
-  val HTML_SIGNATURE: String = "html_signature"
-  val MAY_DELETE: String = "may_delete"
-  val EMAIL_ADDRESS: String = "email_address"
-  val SORT_ORDER: String = "sort_order"
+
+  val USER: CqlIdentifier = CqlIdentifier.fromCql("user")
+  val ID: CqlIdentifier = CqlIdentifier.fromCql("id")
+  val NAME: CqlIdentifier = CqlIdentifier.fromCql("name")
+  val EMAIL: CqlIdentifier = CqlIdentifier.fromCql("email")
+  val REPLY_TO: CqlIdentifier = CqlIdentifier.fromCql("reply_to")
+  val BCC: CqlIdentifier = CqlIdentifier.fromCql("bcc")
+  val TEXT_SIGNATURE: CqlIdentifier = CqlIdentifier.fromCql("text_signature")
+  val HTML_SIGNATURE: CqlIdentifier = CqlIdentifier.fromCql("html_signature")
+  val MAY_DELETE: CqlIdentifier = CqlIdentifier.fromCql("may_delete")
+  val EMAIL_ADDRESS: CqlIdentifier = CqlIdentifier.fromCql("email_address")
+  val SORT_ORDER: CqlIdentifier = CqlIdentifier.fromCql("sort_order")
 
   object EmailAddress {
-    val NAME: String = "name"
-    val EMAIL: String = "email"
+    val NAME: CqlIdentifier = CqlIdentifier.fromCql("name")
+    val EMAIL: CqlIdentifier = CqlIdentifier.fromCql("email")
   }
 }
\ No newline at end of file
diff --git a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/utils/EmailAddressTupleUtil.scala b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/utils/EmailAddressTupleUtil.scala
index d3ebe15f02..862ad0a330 100644
--- a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/utils/EmailAddressTupleUtil.scala
+++ b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/utils/EmailAddressTupleUtil.scala
@@ -24,7 +24,7 @@ import org.apache.james.backends.cassandra.init.CassandraTypesProvider
 import org.apache.james.jmap.cassandra.identity.tables.CassandraCustomIdentityTable
 
 case class EmailAddressTupleUtil(typesProvider: CassandraTypesProvider) {
-  val emailAddressType = typesProvider.getDefinedUserType(CassandraCustomIdentityTable.EMAIL_ADDRESS)
+  val emailAddressType = typesProvider.getDefinedUserType(CassandraCustomIdentityTable.EMAIL_ADDRESS.asCql(true))
 
   def createEmailAddressUDT(name: Option[String], email: String): UdtValue = {
     val value = emailAddressType


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


[james-project] 01/15: [PERF] Adopt CqlIdentifier in mailbox/cassandra

Posted by bt...@apache.org.
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 6f33b2c3369a81f73797f09372d836061d9bcbd5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 2 12:10:58 2022 +0700

    [PERF] Adopt CqlIdentifier in mailbox/cassandra
---
 .../cassandra/mail/CassandraApplicableFlagDAO.java |  4 +-
 .../cassandra/mail/CassandraMessageDAO.java        |  7 +--
 .../cassandra/mail/CassandraMessageDAOV3.java      | 26 ++++------
 .../cassandra/mail/CassandraMessageIdDAO.java      | 59 +++++++++-------------
 .../mail/CassandraMessageIdToImapUidDAO.java       | 36 +++++--------
 .../mailbox/cassandra/mail/FlagsExtractor.java     |  9 ++--
 .../cassandra/mail/utils/MailboxBaseTupleUtil.java |  2 +-
 .../cassandra/modules/CassandraMailboxModule.java  |  4 +-
 .../cassandra/modules/CassandraMessageModule.java  |  4 +-
 .../mailbox/cassandra/table/CassandraACLTable.java |  8 +--
 .../cassandra/table/CassandraACLV2Table.java       |  8 +--
 .../cassandra/table/CassandraAnnotationTable.java  | 14 ++---
 .../table/CassandraApplicableFlagTable.java        |  6 +--
 .../table/CassandraAttachmentMessageIdTable.java   | 10 ++--
 .../table/CassandraAttachmentOwnerTable.java       |  7 +--
 .../table/CassandraAttachmentV2Table.java          | 16 +++---
 .../cassandra/table/CassandraCurrentQuota.java     |  8 +--
 .../table/CassandraDeletedMessageTable.java        |  6 ++-
 .../cassandra/table/CassandraDomainMaxQuota.java   |  8 +--
 .../cassandra/table/CassandraFirstUnseenTable.java |  6 ++-
 .../cassandra/table/CassandraGlobalMaxQuota.java   |  8 +--
 .../table/CassandraMailboxCountersTable.java       |  8 +--
 .../cassandra/table/CassandraMailboxPathTable.java | 34 -------------
 .../table/CassandraMailboxPathV2Table.java         | 36 -------------
 .../table/CassandraMailboxPathV3Table.java         | 14 ++---
 .../table/CassandraMailboxRecentsTable.java        |  6 ++-
 .../cassandra/table/CassandraMailboxTable.java     | 15 +++---
 .../mailbox/cassandra/table/CassandraMaxQuota.java |  8 +--
 .../cassandra/table/CassandraMessageIdTable.java   | 12 ++---
 .../cassandra/table/CassandraMessageIds.java       | 11 ++--
 .../table/CassandraMessageModseqTable.java         |  6 ++-
 .../cassandra/table/CassandraMessageUidTable.java  |  6 ++-
 .../cassandra/table/CassandraMessageV2Table.java   | 34 +++++++------
 .../cassandra/table/CassandraMessageV3Table.java   | 57 +++++++++------------
 .../table/CassandraSubscriptionTable.java          |  7 +--
 .../table/CassandraThreadLookupTable.java          |  7 +--
 .../cassandra/table/CassandraThreadTable.java      | 11 ++--
 .../table/CassandraUserMailboxRightsTable.java     |  8 +--
 .../apache/james/mailbox/cassandra/table/Flag.java | 53 +++++++++----------
 .../cassandra/table/MessageIdToImapUid.java        | 15 ++----
 .../cassandra/mail/CassandraMessageIdDAOTest.java  | 17 +++----
 41 files changed, 268 insertions(+), 353 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java
index 16e460085e..9d8270902d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java
@@ -23,7 +23,6 @@ import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.bindMarker;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.deleteFrom;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom;
 import static com.datastax.oss.driver.api.querybuilder.relation.Relation.column;
-import static org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable.FIELDS;
 import static org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable.MAILBOX_ID;
 import static org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable.TABLE_NAME;
 import static org.apache.james.mailbox.cassandra.table.Flag.USER_FLAGS;
@@ -35,6 +34,7 @@ import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
+import org.apache.james.mailbox.cassandra.table.Flag;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
@@ -58,7 +58,7 @@ public class CassandraApplicableFlagDAO {
 
     private PreparedStatement prepareSelect(CqlSession session) {
         return session.prepare(selectFrom(TABLE_NAME)
-            .columns(FIELDS)
+            .columns(Flag.USER_FLAGS)
             .where(column(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID)))
             .build());
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
index a852986ec8..876daffdb9 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
@@ -69,6 +69,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.BoundStatement;
@@ -208,7 +209,7 @@ public class CassandraMessageDAO {
     }
 
     private UdtValue toUDT(MessageAttachmentMetadata messageAttachment) {
-        UdtValue result = typesProvider.getDefinedUserType(ATTACHMENTS)
+        UdtValue result = typesProvider.getDefinedUserType(ATTACHMENTS.asCql(true))
             .newValue()
             .setString(Attachments.ID, messageAttachment.getAttachmentId().getId())
             .setBoolean(Attachments.IS_INLINE, messageAttachment.isInline());
@@ -228,7 +229,7 @@ public class CassandraMessageDAO {
         return message.getProperties()
             .toProperties()
             .stream()
-            .map(property -> typesProvider.getDefinedUserType(PROPERTIES)
+            .map(property -> typesProvider.getDefinedUserType(PROPERTIES.asCql(true))
                 .newValue()
                 .setString(Properties.NAMESPACE, property.getNamespace())
                 .setString(Properties.NAME, property.getLocalName())
@@ -346,7 +347,7 @@ public class CassandraMessageDAO {
         return Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), blobId, storagePolicy));
     }
 
-    private BlobId retrieveBlobId(String field, Row row) {
+    private BlobId retrieveBlobId(CqlIdentifier field, Row row) {
         return blobIdFactory.from(row.getString(field));
     }
 }
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 5e6240279c..3b2ea9b4e4 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
@@ -35,16 +35,11 @@ import static org.apache.james.blob.api.BlobStore.StoragePolicy.SIZE_BASED;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.ATTACHMENTS;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_CONTENT_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_OCTECTS;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.INTERNAL_DATE;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.INTERNAL_DATE_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Properties.CONTENT_DESCRIPTION;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Properties.CONTENT_DISPOSITION_PARAMETERS;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Properties.CONTENT_DISPOSITION_TYPE;
@@ -58,7 +53,6 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.P
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Properties.SUB_TYPE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.TABLE_NAME;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.TEXTUAL_LINE_COUNT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.TEXTUAL_LINE_COUNT_LOWERCASE;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -91,6 +85,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.Properties;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.BoundStatement;
@@ -100,6 +95,7 @@ import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.data.UdtValue;
 import com.datastax.oss.driver.api.core.type.UserDefinedType;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteSource;
@@ -138,7 +134,7 @@ public class CassandraMessageDAOV3 {
         this.select = prepareSelect(session);
         this.listBlobs = prepareSelectBlobs(session);
         this.cidParser = Cid.parser().relaxed();
-        this.attachmentsType = typesProvider.getDefinedUserType(ATTACHMENTS);
+        this.attachmentsType = typesProvider.getDefinedUserType(ATTACHMENTS.asCql(true));
     }
 
     private PreparedStatement prepareSelect(CqlSession session) {
@@ -348,9 +344,9 @@ public class CassandraMessageDAOV3 {
             .map(content ->
                 new MessageRepresentation(
                     cassandraMessageId,
-                    Optional.ofNullable(row.getInstant(INTERNAL_DATE_LOWERCASE)).map(Date::from).orElse(null),
-                    row.getLong(FULL_CONTENT_OCTETS_LOWERCASE),
-                    row.getInt(BODY_START_OCTET_LOWERCASE),
+                    Optional.ofNullable(row.get(INTERNAL_DATE, TypeCodecs.TIMESTAMP)).map(Date::from).orElse(null),
+                    row.getLong(FULL_CONTENT_OCTETS),
+                    row.getInt(BODY_START_OCTET),
                     content,
                     getProperties(row),
                     getAttachments(row).collect(ImmutableList.toImmutableList()),
@@ -371,7 +367,7 @@ public class CassandraMessageDAOV3 {
         property.setContentLanguage(row.get(CONTENT_LANGUAGE, LIST_OF_STRINGS_CODEC));
         property.setContentDispositionParameters(row.get(CONTENT_DISPOSITION_PARAMETERS, MAP_OF_STRINGS_CODEC));
         property.setContentTypeParameters(row.get(CONTENT_TYPE_PARAMETERS, MAP_OF_STRINGS_CODEC));
-        property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT_LOWERCASE));
+        property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
         return property.build();
     }
 
@@ -422,14 +418,14 @@ public class CassandraMessageDAOV3 {
         return Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), blobId, storagePolicy));
     }
 
-    private BlobId retrieveBlobId(String field, Row row) {
-        return blobIdFactory.from(row.getString(field));
+    private BlobId retrieveBlobId(CqlIdentifier field, Row row) {
+        return blobIdFactory.from(row.get(field, TypeCodecs.TEXT));
     }
 
     Flux<BlobId> listBlobs() {
         return cassandraAsyncExecutor.executeRows(listBlobs.bind())
             .flatMapIterable(row -> ImmutableList.of(
-                blobIdFactory.from(row.getString(HEADER_CONTENT_LOWERCASE)),
-                blobIdFactory.from(row.getString(BODY_CONTENT_LOWERCASE))));
+                blobIdFactory.from(row.get(HEADER_CONTENT, TypeCodecs.TEXT)),
+                blobIdFactory.from(row.get(BODY_CONTENT, TypeCodecs.TEXT))));
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
index 6d950d997f..8e4d26823a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
@@ -30,17 +30,11 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMessageIdTable.T
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIdTable.THREAD_ID;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.IMAP_UID;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MAILBOX_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MAILBOX_ID_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.INTERNAL_DATE;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.INTERNAL_DATE_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.Flag.ANSWERED;
 import static org.apache.james.mailbox.cassandra.table.Flag.DELETED;
 import static org.apache.james.mailbox.cassandra.table.Flag.DRAFT;
@@ -49,15 +43,11 @@ import static org.apache.james.mailbox.cassandra.table.Flag.RECENT;
 import static org.apache.james.mailbox.cassandra.table.Flag.SEEN;
 import static org.apache.james.mailbox.cassandra.table.Flag.USER;
 import static org.apache.james.mailbox.cassandra.table.Flag.USER_FLAGS;
-import static org.apache.james.mailbox.cassandra.table.Flag.USER_FLAGS_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.MOD_SEQ;
-import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.MOD_SEQ_LOWERCASE;
-import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.THREAD_ID_LOWERCASE;
 import static org.apache.james.util.ReactorUtils.publishIfPresent;
 
 import java.time.Duration;
 import java.util.Date;
-import java.util.Locale;
 import java.util.Optional;
 import java.util.UUID;
 
@@ -84,6 +74,7 @@ import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
@@ -261,16 +252,16 @@ public class CassandraMessageIdDAO {
             QueryBuilder.selectFrom(TABLE_NAME)
                 .columns(IMAP_UID,
                     MESSAGE_ID,
-                    THREAD_ID_LOWERCASE,
-                    ANSWERED.toLowerCase(Locale.US),
-                    DELETED.toLowerCase(Locale.US),
-                    DRAFT.toLowerCase(Locale.US),
-                    RECENT.toLowerCase(Locale.US),
-                    SEEN.toLowerCase(Locale.US),
-                    FLAGGED.toLowerCase(Locale.US),
-                    USER.toLowerCase(Locale.US),
-                    USER_FLAGS_LOWERCASE,
-                    MOD_SEQ_LOWERCASE)
+                    THREAD_ID,
+                    ANSWERED,
+                    DELETED,
+                    DRAFT,
+                    RECENT,
+                    SEEN,
+                    FLAGGED,
+                    USER,
+                    USER_FLAGS,
+                    MOD_SEQ)
                 .where(column(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID)),
                     column(IMAP_UID).isGreaterThanOrEqualTo(bindMarker(IMAP_UID_GTE)),
                     column(IMAP_UID).isLessThanOrEqualTo(bindMarker(IMAP_UID_LTE)))
@@ -281,7 +272,7 @@ public class CassandraMessageIdDAO {
         return session.prepare(
             QueryBuilder.selectFrom(TABLE_NAME)
                 .columns(IMAP_UID,
-                    DELETED.toLowerCase(Locale.US))
+                    DELETED)
                 .where(column(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID)),
                     column(IMAP_UID).isGreaterThanOrEqualTo(bindMarker(IMAP_UID_GTE)),
                     column(IMAP_UID).isLessThanOrEqualTo(bindMarker(IMAP_UID_LTE)))
@@ -425,19 +416,19 @@ public class CassandraMessageIdDAO {
 
     public Flux<MessageUid> listUids(CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeRows(selectAllUids.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid()))
-            .map(row -> MessageUid.of(row.getLong(IMAP_UID)));
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID))
+            .map(row -> MessageUid.of(row.getLong(0)));
     }
 
     public Flux<ComposedMessageIdWithMetaData> listMessagesMetadata(CassandraId mailboxId, MessageRange range) {
         return cassandraAsyncExecutor.executeRows(selectMetadataRange.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID_GTE, range.getUidFrom().asLong())
                 .setLong(IMAP_UID_LTE, range.getUidTo().asLong()))
             .map(row -> {
-                CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID_LOWERCASE));
+                CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID));
                 return ComposedMessageIdWithMetaData.builder()
-                    .modSeq(ModSeq.of(row.getLong(MOD_SEQ_LOWERCASE)))
+                    .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
                     .threadId(getThreadIdFromRow(row, messageId))
                     .flags(FlagsExtractor.getFlags(row))
                     .composedMessageId(new ComposedMessageId(mailboxId,
@@ -535,28 +526,28 @@ public class CassandraMessageIdDAO {
                 .subscribe();
             return Optional.empty();
         }
-        final CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID_LOWERCASE));
+        final CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID));
         return Optional.of(CassandraMessageMetadata.builder()
             .ids(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(
-                    CassandraId.of(row.getUuid(MAILBOX_ID_LOWERCASE)),
+                    CassandraId.of(row.getUuid(MAILBOX_ID)),
                     messageId,
                     MessageUid.of(row.getLong(IMAP_UID))))
                 .flags(FlagsExtractor.getFlags(row))
-                .modSeq(ModSeq.of(row.getLong(MOD_SEQ_LOWERCASE)))
+                .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
                 .threadId(getThreadIdFromRow(row, messageId))
                 .build())
-            .bodyStartOctet(row.get(BODY_START_OCTET_LOWERCASE, Integer.class))
-            .internalDate(Optional.ofNullable(row.getInstant(INTERNAL_DATE_LOWERCASE))
+            .bodyStartOctet(row.get(BODY_START_OCTET, Integer.class))
+            .internalDate(Optional.ofNullable(row.getInstant(INTERNAL_DATE))
                 .map(Date::from))
-            .size(row.get(FULL_CONTENT_OCTETS_LOWERCASE, Long.class))
-            .headerContent(Optional.ofNullable(row.getString(HEADER_CONTENT_LOWERCASE))
+            .size(row.get(FULL_CONTENT_OCTETS, Long.class))
+            .headerContent(Optional.ofNullable(row.getString(HEADER_CONTENT))
                 .map(blobIdFactory::from))
             .build());
     }
 
     private ThreadId getThreadIdFromRow(Row row, MessageId messageId) {
-        UUID threadIdUUID = row.getUuid(THREAD_ID_LOWERCASE);
+        UUID threadIdUUID = row.getUuid(THREAD_ID);
         if (threadIdUUID == null) {
             return ThreadId.fromBaseMessageId(messageId);
         }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
index 26e4d2da46..824f7f3038 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
@@ -28,17 +28,11 @@ import static com.datastax.oss.driver.api.querybuilder.update.Assignment.setColu
 import static org.apache.james.backends.cassandra.init.configuration.JamesExecutionProfiles.ConsistencyChoice.STRONG;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.IMAP_UID;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MAILBOX_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MAILBOX_ID_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.BODY_START_OCTET_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.FULL_CONTENT_OCTETS_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.HEADER_CONTENT_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.INTERNAL_DATE;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.INTERNAL_DATE_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.Flag.ANSWERED;
 import static org.apache.james.mailbox.cassandra.table.Flag.DELETED;
 import static org.apache.james.mailbox.cassandra.table.Flag.DRAFT;
@@ -48,10 +42,8 @@ import static org.apache.james.mailbox.cassandra.table.Flag.SEEN;
 import static org.apache.james.mailbox.cassandra.table.Flag.USER;
 import static org.apache.james.mailbox.cassandra.table.Flag.USER_FLAGS;
 import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.MOD_SEQ;
-import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.MOD_SEQ_LOWERCASE;
 import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.TABLE_NAME;
 import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.THREAD_ID;
-import static org.apache.james.mailbox.cassandra.table.MessageIdToImapUid.THREAD_ID_LOWERCASE;
 
 import java.time.Duration;
 import java.util.Date;
@@ -226,7 +218,7 @@ public class CassandraMessageIdToImapUidDAO {
     private PreparedStatement prepareSelectAll() {
         return session.prepare(selectFrom(TABLE_NAME)
             .all()
-            .where(column(MESSAGE_ID_LOWERCASE).isEqualTo(bindMarker(MESSAGE_ID_LOWERCASE)))
+            .where(column(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID)))
             .build());
     }
 
@@ -237,8 +229,8 @@ public class CassandraMessageIdToImapUidDAO {
     private PreparedStatement prepareSelect() {
         return session.prepare(selectFrom(TABLE_NAME)
             .all()
-            .where(column(MESSAGE_ID_LOWERCASE).isEqualTo(bindMarker(MESSAGE_ID_LOWERCASE)),
-                column(MAILBOX_ID_LOWERCASE).isEqualTo(bindMarker(MAILBOX_ID_LOWERCASE)))
+            .where(column(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID)),
+                column(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID)))
             .build());
     }
 
@@ -391,28 +383,28 @@ public class CassandraMessageIdToImapUidDAO {
     }
 
     private CassandraMessageMetadata toComposedMessageIdWithMetadata(Row row) {
-        final CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID_LOWERCASE));
+        final CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID));
         return CassandraMessageMetadata.builder()
             .ids(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(
-                    CassandraId.of(row.getUuid(MAILBOX_ID_LOWERCASE)),
+                    CassandraId.of(row.getUuid(MAILBOX_ID)),
                     messageId,
                     MessageUid.of(row.getLong(IMAP_UID))))
                 .flags(FlagsExtractor.getFlags(row))
                 .threadId(getThreadIdFromRow(row, messageId))
-                .modSeq(ModSeq.of(row.getLong(MOD_SEQ_LOWERCASE)))
+                .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
                 .build())
-            .bodyStartOctet(row.get(BODY_START_OCTET_LOWERCASE, Integer.class))
-            .internalDate(Optional.ofNullable(row.getInstant(INTERNAL_DATE_LOWERCASE))
+            .bodyStartOctet(row.get(BODY_START_OCTET, Integer.class))
+            .internalDate(Optional.ofNullable(row.getInstant(INTERNAL_DATE))
                 .map(Date::from))
-            .size(row.get(FULL_CONTENT_OCTETS_LOWERCASE, Long.class))
-            .headerContent(Optional.ofNullable(row.getString(HEADER_CONTENT_LOWERCASE))
+            .size(row.get(FULL_CONTENT_OCTETS, Long.class))
+            .headerContent(Optional.ofNullable(row.getString(HEADER_CONTENT))
                 .map(blobIdFactory::from))
             .build();
     }
 
     private ThreadId getThreadIdFromRow(Row row, MessageId messageId) {
-        UUID threadIdUUID = row.getUuid(THREAD_ID_LOWERCASE);
+        UUID threadIdUUID = row.getUuid(THREAD_ID);
         if (threadIdUUID == null) {
             return ThreadId.fromBaseMessageId(messageId);
         }
@@ -422,9 +414,9 @@ public class CassandraMessageIdToImapUidDAO {
     private BoundStatement selectStatement(CassandraMessageId messageId, Optional<CassandraId> mailboxId) {
         return mailboxId
             .map(cassandraId -> select.bind()
-                .setUuid(MESSAGE_ID_LOWERCASE, messageId.get())
-                .setUuid(MAILBOX_ID_LOWERCASE, cassandraId.asUuid()))
-            .orElseGet(() -> selectAll.bind().setUuid(MESSAGE_ID_LOWERCASE, messageId.get()));
+                .setUuid(MESSAGE_ID, messageId.get())
+                .setUuid(MAILBOX_ID, cassandraId.asUuid()))
+            .orElseGet(() -> selectAll.bind().setUuid(MESSAGE_ID, messageId.get()));
     }
 
     private BoundStatement setExecutionProfileIfNeeded(BoundStatement statement, JamesExecutionProfiles.ConsistencyChoice consistencyChoice) {
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 7a58ce946a..e20871266e 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
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.cassandra.table.Flag;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
 import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
@@ -36,12 +37,12 @@ public class FlagsExtractor {
 
     public static Flags getFlags(Row row) {
         Flags flags = new Flags();
-        for (String flag : Flag.ALL_LOWERCASE) {
-            if (row.getBoolean(flag)) {
-                flags.add(Flag.JAVAX_MAIL_FLAG.get(flag));
+        for (CqlIdentifier cqlId : Flag.ALL_LOWERCASE) {
+            if (row.getBoolean(cqlId)) {
+                flags.add(Flag.JAVAX_MAIL_FLAG.get(cqlId));
             }
         }
-        row.get(Flag.USER_FLAGS_LOWERCASE, SET_OF_STRINGS_CODEC)
+        row.get(Flag.USER_FLAGS, SET_OF_STRINGS_CODEC)
             .forEach(flags::add);
         return flags;
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
index 6f88c5b70b..68a85f3064 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
@@ -33,7 +33,7 @@ public class MailboxBaseTupleUtil {
     }
 
     public UdtValue createMailboxBaseUDT(String namespace, Username user) {
-        return typesProvider.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE)
+        return typesProvider.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE.asCql(true))
             .newValue()
             .setString(CassandraMailboxTable.MailboxBase.NAMESPACE, namespace)
             .setString(CassandraMailboxTable.MailboxBase.USER, user.asString());
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
index e30cfea2f2..13457c012a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
 public interface CassandraMailboxModule {
     CassandraModule MODULE = CassandraModule.builder()
 
-        .type(CassandraMailboxTable.MAILBOX_BASE)
+        .type(CassandraMailboxTable.MAILBOX_BASE.asCql(true))
         .statement(statement -> statement
             .withField(CassandraMailboxTable.MailboxBase.NAMESPACE, TEXT)
             .withField(CassandraMailboxTable.MailboxBase.USER, TEXT))
@@ -44,7 +44,7 @@ public interface CassandraMailboxModule {
             .withLZ4Compression(8, 1))
         .statement(statement -> types -> statement
             .withPartitionKey(CassandraMailboxTable.ID, TIMEUUID)
-            .withColumn(CassandraMailboxTable.MAILBOX_BASE, types.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE))
+            .withColumn(CassandraMailboxTable.MAILBOX_BASE, types.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE.asCql(true)))
             .withColumn(CassandraMailboxTable.NAME, TEXT)
             .withColumn(CassandraMailboxTable.UIDVALIDITY, BIGINT))
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
index 5e57f99bab..96304e5af3 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
@@ -132,12 +132,12 @@ public interface CassandraMessageModule {
             .withColumn(CassandraMessageV3Table.Properties.CONTENT_DISPOSITION_PARAMETERS, frozenMapOf(TEXT, TEXT))
             .withColumn(CassandraMessageV3Table.Properties.CONTENT_TYPE_PARAMETERS, frozenMapOf(TEXT, TEXT))
             .withColumn(CassandraMessageV3Table.ATTACHMENTS, listOf(SchemaBuilder.udt(CassandraMessageV3Table.ATTACHMENTS, true))))
-        .type(CassandraMessageV2Table.PROPERTIES)
+        .type(CassandraMessageV2Table.PROPERTIES.asCql(true))
         .statement(statement -> statement
             .withField(CassandraMessageV2Table.Properties.NAMESPACE, TEXT)
             .withField(CassandraMessageV2Table.Properties.NAME, TEXT)
             .withField(CassandraMessageV2Table.Properties.VALUE, TEXT))
-        .type(CassandraMessageV2Table.ATTACHMENTS)
+        .type(CassandraMessageV2Table.ATTACHMENTS.asCql(true))
         .statement(statement -> statement
             .withField(CassandraMessageV2Table.Attachments.ID, TEXT)
             .withField(CassandraMessageV2Table.Attachments.NAME, TEXT)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLTable.java
index 4b8d8b252f..d6b68db521 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLTable.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraACLTable {
     String TABLE_NAME = "acl";
 
-    String ID = "id";
-    String ACL = "acl";
-    String VERSION = "version";
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier ACL = CqlIdentifier.fromCql("acl");
+    CqlIdentifier VERSION = CqlIdentifier.fromCql("version");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLV2Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLV2Table.java
index 94d1ea1d14..3356f64b41 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLV2Table.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLV2Table.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraACLV2Table {
     String TABLE_NAME = "aclv2";
 
-    String ID = "id";
-    String KEY = "key";
-    String RIGHTS = "rights";
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier KEY = CqlIdentifier.fromCql("key");
+    CqlIdentifier RIGHTS = CqlIdentifier.fromCql("rights");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAnnotationTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAnnotationTable.java
index fcd11892ad..167a97bbb6 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAnnotationTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAnnotationTable.java
@@ -19,15 +19,17 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraAnnotationTable {
     String TABLE_NAME = "annotation";
 
-    String MAILBOX_ID = "mailboxId";
-    String KEY = "key";
-    String VALUE = "value";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier KEY = CqlIdentifier.fromCql("key");
+    CqlIdentifier VALUE = CqlIdentifier.fromCql("value");
 
-    String GREATER_BIND_KEY = "greater_bind_key";
-    String LESSER_BIND_KEY = "lesser_bind_key";
+    CqlIdentifier GREATER_BIND_KEY = CqlIdentifier.fromCql("greater_bind_key");
+    CqlIdentifier LESSER_BIND_KEY = CqlIdentifier.fromCql("lesser_bind_key");
 
-    String[] SELECT_FIELDS = { KEY, VALUE };
+    CqlIdentifier[] SELECT_FIELDS = { KEY, VALUE };
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java
index cb97028009..4d76ed1814 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java
@@ -19,10 +19,10 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraApplicableFlagTable {
 
     String TABLE_NAME = "applicableFlag";
-    String MAILBOX_ID = "mailboxId";
-
-    String[] FIELDS = { MAILBOX_ID, Flag.USER_FLAGS };
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentMessageIdTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentMessageIdTable.java
index 42655fb0aa..a6a5f1f976 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentMessageIdTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentMessageIdTable.java
@@ -19,12 +19,14 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraAttachmentMessageIdTable {
 
     String TABLE_NAME = "attachmentMessageId";
-    String ATTACHMENT_ID_AS_UUID = "attachmentIdAsUUID";
-    String ATTACHMENT_ID = "attachmentId";
-    String MESSAGE_ID = "messageId";
-    String[] FIELDS = { ATTACHMENT_ID_AS_UUID, ATTACHMENT_ID, MESSAGE_ID };
+    CqlIdentifier ATTACHMENT_ID_AS_UUID = CqlIdentifier.fromCql("attachmentIdAsUUID");
+    CqlIdentifier ATTACHMENT_ID = CqlIdentifier.fromCql("attachmentId");
+    CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("messageId");
+    CqlIdentifier[] FIELDS = { ATTACHMENT_ID_AS_UUID, ATTACHMENT_ID, MESSAGE_ID };
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentOwnerTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentOwnerTable.java
index ff4b1a0541..07ea43126d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentOwnerTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentOwnerTable.java
@@ -19,11 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraAttachmentOwnerTable {
 
     String TABLE_NAME = "attachmentOwners";
-    String ID = "id";
-    String OWNER = "owner";
-    String[] FIELDS = { ID, OWNER };
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier OWNER = CqlIdentifier.fromCql("owner");
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentV2Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentV2Table.java
index 6e39068d10..8a509aaf2b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentV2Table.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentV2Table.java
@@ -19,15 +19,17 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraAttachmentV2Table {
 
     String TABLE_NAME = "attachmentV2";
-    String ID_AS_UUID = "idAsUUID";
-    String ID = "id";
-    String BLOB_ID = "blobId";
-    String MESSAGE_ID = "message_id";
-    String TYPE = "type";
-    String SIZE = "size";
-    String[] FIELDS = { ID, BLOB_ID, MESSAGE_ID, TYPE, SIZE };
+    CqlIdentifier ID_AS_UUID = CqlIdentifier.fromCql("idAsUUID");
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier BLOB_ID = CqlIdentifier.fromCql("blobId");
+    CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("message_id");
+    CqlIdentifier TYPE = CqlIdentifier.fromCql("type");
+    CqlIdentifier SIZE = CqlIdentifier.fromCql("size");
+    CqlIdentifier[] FIELDS = { ID, BLOB_ID, MESSAGE_ID, TYPE, SIZE };
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java
index 09a02809ba..2e5970e568 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java
@@ -19,11 +19,13 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraCurrentQuota {
 
     String TABLE_NAME = "currentQuota";
 
-    String QUOTA_ROOT = "quotaRoot";
-    String MESSAGE_COUNT = "messageCount";
-    String STORAGE = "storage";
+    CqlIdentifier QUOTA_ROOT = CqlIdentifier.fromCql("quotaRoot");
+    CqlIdentifier MESSAGE_COUNT = CqlIdentifier.fromCql("messageCount");
+    CqlIdentifier STORAGE = CqlIdentifier.fromCql("storage");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDeletedMessageTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDeletedMessageTable.java
index b4773fb4d2..90a1657aeb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDeletedMessageTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDeletedMessageTable.java
@@ -19,9 +19,11 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraDeletedMessageTable {
     String TABLE_NAME = "messageDeleted";
 
-    String MAILBOX_ID = "mailboxId";
-    String UID = "uid";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier UID = CqlIdentifier.fromCql("uid");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDomainMaxQuota.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDomainMaxQuota.java
index 66372f8fa5..a2145eb70f 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDomainMaxQuota.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDomainMaxQuota.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraDomainMaxQuota {
     String TABLE_NAME = "domainMaxQuota";
 
-    String DOMAIN = "domain";
-    String MESSAGE_COUNT = "maxMessageCount";
-    String STORAGE = "maxStorage";
+    CqlIdentifier DOMAIN = CqlIdentifier.fromCql("domain");
+    CqlIdentifier MESSAGE_COUNT = CqlIdentifier.fromCql("maxMessageCount");
+    CqlIdentifier STORAGE = CqlIdentifier.fromCql("maxStorage");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraFirstUnseenTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraFirstUnseenTable.java
index bf6583a19c..d753866390 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraFirstUnseenTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraFirstUnseenTable.java
@@ -19,9 +19,11 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraFirstUnseenTable {
     String TABLE_NAME = "firstUnseen";
 
-    String MAILBOX_ID = "mailboxId";
-    String UID = "uid";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier UID = CqlIdentifier.fromCql("uid");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraGlobalMaxQuota.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraGlobalMaxQuota.java
index f366871f05..29f9f26345 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraGlobalMaxQuota.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraGlobalMaxQuota.java
@@ -19,12 +19,14 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraGlobalMaxQuota {
     String TABLE_NAME = "defaultMaxQuota2";
 
-    String KEY = "key";
+    CqlIdentifier KEY = CqlIdentifier.fromCql("key");
     String VALUE = "value";
 
-    String MESSAGE = "message";
-    String STORAGE = "storage";
+    CqlIdentifier MESSAGE = CqlIdentifier.fromCql("message");
+    CqlIdentifier STORAGE = CqlIdentifier.fromCql("storage");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxCountersTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxCountersTable.java
index f48840638d..404d79076c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxCountersTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxCountersTable.java
@@ -19,9 +19,11 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMailboxCountersTable {
     String TABLE_NAME = "mailboxCounters";
-    String MAILBOX_ID = "mailboxId";
-    String COUNT = "count";
-    String UNSEEN = "unseen";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier COUNT = CqlIdentifier.fromCql("count");
+    CqlIdentifier UNSEEN = CqlIdentifier.fromCql("unseen");
 }
\ No newline at end of file
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
deleted file mode 100644
index efc6168b8e..0000000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.table;
-
-public interface CassandraMailboxPathTable {
-
-    String TABLE_NAME = "mailboxPath";
-
-    String NAMESPACE_AND_USER = "namespaceAndUser";
-
-    String MAILBOX_NAME = "mailboxName";
-
-    String MAILBOX_ID = "mailboxId";
-
-    String[] FIELDS = { NAMESPACE_AND_USER, MAILBOX_NAME, MAILBOX_ID};
-
-}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV2Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV2Table.java
deleted file mode 100644
index 6788606fbe..0000000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV2Table.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.table;
-
-public interface CassandraMailboxPathV2Table {
-
-    String TABLE_NAME = "mailboxPathV2";
-
-    String NAMESPACE = "namespace";
-
-    String USER = "user";
-
-    String MAILBOX_NAME = "mailboxName";
-
-    String MAILBOX_ID = "mailboxId";
-
-    String[] FIELDS = { NAMESPACE, USER, MAILBOX_NAME, MAILBOX_ID};
-
-}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV3Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV3Table.java
index 078824f4d1..093bd52697 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV3Table.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV3Table.java
@@ -19,19 +19,21 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMailboxPathV3Table {
 
     String TABLE_NAME = "mailboxPathV3";
 
-    String NAMESPACE = "namespace";
+    CqlIdentifier NAMESPACE = CqlIdentifier.fromCql("namespace");
 
-    String USER = "user";
+    CqlIdentifier USER = CqlIdentifier.fromCql("user");
 
-    String MAILBOX_NAME = "mailboxName";
+    CqlIdentifier MAILBOX_NAME = CqlIdentifier.fromCql("mailboxName");
 
-    String MAILBOX_ID = "mailboxId";
-    String UIDVALIDITY = "uidvalidity";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier UIDVALIDITY = CqlIdentifier.fromCql("uidvalidity");
 
-    String[] FIELDS = { NAMESPACE, USER, MAILBOX_NAME, MAILBOX_ID, UIDVALIDITY};
+    CqlIdentifier[] FIELDS = { NAMESPACE, USER, MAILBOX_NAME, MAILBOX_ID, UIDVALIDITY};
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxRecentsTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxRecentsTable.java
index d729ae4728..b239d4ba96 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxRecentsTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxRecentsTable.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMailboxRecentsTable {
     String TABLE_NAME = "mailboxRecents";
-    String MAILBOX_ID = "mailboxId";
-    String RECENT_MESSAGE_UID = "recent_mesage_uid";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier RECENT_MESSAGE_UID = CqlIdentifier.fromCql("recent_mesage_uid");
 }
\ No newline at end of file
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
index e301552be0..faa06df3ca 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
@@ -19,17 +19,18 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraMailboxTable {
     String TABLE_NAME = "mailbox";
-    String ID = "id";
-    String MAILBOX_BASE = "mailboxbase";
-    String UIDVALIDITY = "uidvalidity";
-    String NAME = "name";
-    String[] FIELDS = { ID, MAILBOX_BASE, UIDVALIDITY, NAME };
+    CqlIdentifier ID = CqlIdentifier.fromCql("id");
+    CqlIdentifier MAILBOX_BASE = CqlIdentifier.fromCql("mailboxbase");
+    CqlIdentifier UIDVALIDITY = CqlIdentifier.fromCql("uidvalidity");
+    CqlIdentifier NAME = CqlIdentifier.fromCql("name");
+    CqlIdentifier[] FIELDS = { ID, MAILBOX_BASE, UIDVALIDITY, NAME };
 
     interface MailboxBase {
-        String USER = "user";
-        String NAMESPACE = "namespace";
+        CqlIdentifier USER = CqlIdentifier.fromCql("user");
+        CqlIdentifier NAMESPACE = CqlIdentifier.fromCql("namespace");
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMaxQuota.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMaxQuota.java
index 4fba65cb5f..8cb9c6a5fd 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMaxQuota.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMaxQuota.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMaxQuota {
     String TABLE_NAME = "maxQuota";
 
-    String QUOTA_ROOT = "quotaRoot";
-    String MESSAGE_COUNT = "maxMessageCount";
-    String STORAGE = "maxStorage";
+    CqlIdentifier QUOTA_ROOT = CqlIdentifier.fromCql("quotaRoot");
+    CqlIdentifier MESSAGE_COUNT = CqlIdentifier.fromCql("maxMessageCount");
+    CqlIdentifier STORAGE = CqlIdentifier.fromCql("maxStorage");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIdTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIdTable.java
index a3ad5e6abf..6ab2d26bd2 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIdTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIdTable.java
@@ -19,18 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.IMAP_UID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MAILBOX_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraMessageIdTable {
-
     String TABLE_NAME = "messageIdTable";
 
-    String MOD_SEQ = "modSeq";
-
-    String THREAD_ID = "threadId";
+    CqlIdentifier MOD_SEQ = CqlIdentifier.fromCql("modSeq");
 
-    String[] FIELDS = { MESSAGE_ID, MAILBOX_ID, IMAP_UID, THREAD_ID, MOD_SEQ,
-            Flag.ANSWERED, Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, Flag.USER_FLAGS};
+    CqlIdentifier THREAD_ID = CqlIdentifier.fromCql("threadId");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIds.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIds.java
index 8ab4e90dc8..8d40435fbd 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIds.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIds.java
@@ -19,13 +19,10 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
-import java.util.Locale;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraMessageIds {
-
-    String MESSAGE_ID = "messageId";
-    String MESSAGE_ID_LOWERCASE = MESSAGE_ID.toLowerCase(Locale.US);
-    String MAILBOX_ID = "mailboxId";
-    String MAILBOX_ID_LOWERCASE = MAILBOX_ID.toLowerCase(Locale.US);
-    String IMAP_UID = "uid";
+    CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("messageId");
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier IMAP_UID = CqlIdentifier.fromCql("uid");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageModseqTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageModseqTable.java
index 41a6df0438..21b22b6dd0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageModseqTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageModseqTable.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMessageModseqTable {
     String TABLE_NAME = "modseq";
-    String MAILBOX_ID = "mailboxId";
-    String NEXT_MODSEQ = "nextModseq";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier NEXT_MODSEQ = CqlIdentifier.fromCql("nextModseq");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageUidTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageUidTable.java
index 0566e2bf41..abf696ba02 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageUidTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageUidTable.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMessageUidTable {
     String TABLE_NAME = "messageCounter";
-    String MAILBOX_ID = "mailboxId";
-    String NEXT_UID = "nextUid";
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
+    CqlIdentifier NEXT_UID = CqlIdentifier.fromCql("nextUid");
 }
\ No newline at end of file
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV2Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV2Table.java
index 8ceb86ae5b..3a32ccef84 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV2Table.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV2Table.java
@@ -19,30 +19,32 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMessageV2Table {
 
     String TABLE_NAME = "messageV2";
-    String INTERNAL_DATE = "internalDate";
-    String BODY_START_OCTET = "bodyStartOctet";
-    String FULL_CONTENT_OCTETS = "fullContentOctets";
-    String BODY_OCTECTS = "bodyOctets";
-    String TEXTUAL_LINE_COUNT = "textualLineCount";
-    String BODY_CONTENT = "bodyContent";
-    String HEADER_CONTENT = "headerContent";
-    String PROPERTIES = "properties";
-    String ATTACHMENTS = "attachments";
+    CqlIdentifier INTERNAL_DATE = CqlIdentifier.fromCql("internalDate");
+    CqlIdentifier BODY_START_OCTET = CqlIdentifier.fromCql("bodyStartOctet");
+    CqlIdentifier FULL_CONTENT_OCTETS = CqlIdentifier.fromCql("fullContentOctets");
+    CqlIdentifier BODY_OCTECTS = CqlIdentifier.fromCql("bodyOctets");
+    CqlIdentifier TEXTUAL_LINE_COUNT = CqlIdentifier.fromCql("textualLineCount");
+    CqlIdentifier BODY_CONTENT = CqlIdentifier.fromCql("bodyContent");
+    CqlIdentifier HEADER_CONTENT = CqlIdentifier.fromCql("headerContent");
+    CqlIdentifier PROPERTIES = CqlIdentifier.fromCql("properties");
+    CqlIdentifier ATTACHMENTS = CqlIdentifier.fromCql("attachments");
 
     interface Properties {
-        String NAMESPACE = "namespace";
-        String NAME = "name";
-        String VALUE = "value";
+        CqlIdentifier NAMESPACE = CqlIdentifier.fromCql("namespace");
+        CqlIdentifier NAME = CqlIdentifier.fromCql("name");
+        CqlIdentifier VALUE = CqlIdentifier.fromCql("value");
     }
 
     interface Attachments {
-        String ID = "id";
-        String NAME = "name";
-        String CID = "cid";
-        String IS_INLINE = "isInline";
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier NAME = CqlIdentifier.fromCql("name");
+        CqlIdentifier CID = CqlIdentifier.fromCql("cid");
+        CqlIdentifier IS_INLINE = CqlIdentifier.fromCql("isInline");
     }
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
index 52a23d4ec6..a597ce0b57 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java
@@ -19,45 +19,38 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
-import java.util.Locale;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraMessageV3Table {
-
     String TABLE_NAME = "messageV3";
-    String INTERNAL_DATE = "internalDate";
-    String INTERNAL_DATE_LOWERCASE = INTERNAL_DATE.toLowerCase(Locale.US);
-    String BODY_START_OCTET = "bodyStartOctet";
-    String BODY_START_OCTET_LOWERCASE = BODY_START_OCTET.toLowerCase(Locale.US);
-    String FULL_CONTENT_OCTETS = "fullContentOctets";
-    String FULL_CONTENT_OCTETS_LOWERCASE = FULL_CONTENT_OCTETS.toLowerCase(Locale.US);
-    String BODY_OCTECTS = "bodyOctets";
-    String TEXTUAL_LINE_COUNT = "textualLineCount";
-    String TEXTUAL_LINE_COUNT_LOWERCASE = TEXTUAL_LINE_COUNT.toLowerCase(Locale.US);
-    String BODY_CONTENT = "bodyContent";
-    String BODY_CONTENT_LOWERCASE = BODY_CONTENT.toLowerCase(Locale.US);
-    String HEADER_CONTENT = "headerContent";
-    String HEADER_CONTENT_LOWERCASE = HEADER_CONTENT.toLowerCase(Locale.US);
-    String ATTACHMENTS = "attachments";
+
+    CqlIdentifier INTERNAL_DATE = CqlIdentifier.fromCql("internalDate");
+    CqlIdentifier BODY_START_OCTET = CqlIdentifier.fromCql("bodyStartOctet");
+    CqlIdentifier FULL_CONTENT_OCTETS = CqlIdentifier.fromCql("fullContentOctets");
+    CqlIdentifier BODY_OCTECTS = CqlIdentifier.fromCql("bodyOctets");
+    CqlIdentifier TEXTUAL_LINE_COUNT = CqlIdentifier.fromCql("textualLineCount");
+    CqlIdentifier BODY_CONTENT = CqlIdentifier.fromCql("bodyContent");
+    CqlIdentifier HEADER_CONTENT = CqlIdentifier.fromCql("headerContent");
+    CqlIdentifier ATTACHMENTS = CqlIdentifier.fromCql("attachments");
 
     interface Properties {
-        String MEDIA_TYPE = "mediaType";
-        String SUB_TYPE = "subType";
-        String CONTENT_ID = "contentId";
-        String CONTENT_LOCATION = "contentLocation";
-        String CONTENT_DESCRIPTION = "contentDescription";
-        String CONTENT_TRANSFER_ENCODING = "contentTransferEncoding";
-        String CONTENT_DISPOSITION_TYPE = "contentDispositionType";
-        String CONTENT_DISPOSITION_PARAMETERS = "contentDispositionParameters";
-        String CONTENT_TYPE_PARAMETERS = "contentTypeParameters";
-        String CONTENT_MD5 = "contentMd5";
-        String CONTENT_LANGUAGE = "contentLanguage";
+        CqlIdentifier MEDIA_TYPE = CqlIdentifier.fromCql("mediaType");
+        CqlIdentifier SUB_TYPE = CqlIdentifier.fromCql("subType");
+        CqlIdentifier CONTENT_ID = CqlIdentifier.fromCql("contentId");
+        CqlIdentifier CONTENT_LOCATION = CqlIdentifier.fromCql("contentLocation");
+        CqlIdentifier CONTENT_DESCRIPTION = CqlIdentifier.fromCql("contentDescription");
+        CqlIdentifier CONTENT_TRANSFER_ENCODING = CqlIdentifier.fromCql("contentTransferEncoding");
+        CqlIdentifier CONTENT_DISPOSITION_TYPE = CqlIdentifier.fromCql("contentDispositionType");
+        CqlIdentifier CONTENT_DISPOSITION_PARAMETERS = CqlIdentifier.fromCql("contentDispositionParameters");
+        CqlIdentifier CONTENT_TYPE_PARAMETERS = CqlIdentifier.fromCql("contentTypeParameters");
+        CqlIdentifier CONTENT_MD5 = CqlIdentifier.fromCql("contentMd5");
+        CqlIdentifier CONTENT_LANGUAGE = CqlIdentifier.fromCql("contentLanguage");
     }
 
     interface Attachments {
-        String ID = "id";
-        String NAME = "name";
-        String CID = "cid";
-        String IS_INLINE = "isInline";
+        CqlIdentifier ID = CqlIdentifier.fromCql("id");
+        CqlIdentifier NAME = CqlIdentifier.fromCql("name");
+        CqlIdentifier CID = CqlIdentifier.fromCql("cid");
+        CqlIdentifier IS_INLINE = CqlIdentifier.fromCql("isInline");
     }
-
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraSubscriptionTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraSubscriptionTable.java
index 91b2d12cb2..7ea4079c6c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraSubscriptionTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraSubscriptionTable.java
@@ -19,11 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSubscriptionTable {
 
     String TABLE_NAME = "subscription";
-    String USER = "user";
-    String MAILBOX = "mailbox";
-    String[] FIELDS = { MAILBOX, USER };
+    CqlIdentifier USER = CqlIdentifier.fromCql("user");
+    CqlIdentifier MAILBOX = CqlIdentifier.fromCql("mailbox");
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadLookupTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadLookupTable.java
index 7a8c1b37c5..53275ade14 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadLookupTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadLookupTable.java
@@ -19,13 +19,10 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraThreadTable.USERNAME;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraThreadLookupTable {
     String TABLE_NAME = "threadLookupTable";
 
-    String MIME_MESSAGE_IDS = "mimeMessageIds";
-
-    String[] FIELDS = {MESSAGE_ID, USERNAME, MIME_MESSAGE_IDS};
+    CqlIdentifier MIME_MESSAGE_IDS = CqlIdentifier.fromCql("mimeMessageIds");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadTable.java
index 0db322a150..b437a9f35c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadTable.java
@@ -19,17 +19,14 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIdTable.THREAD_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface CassandraThreadTable {
     String TABLE_NAME = "threadTable";
 
-    String USERNAME = "username";
+    CqlIdentifier USERNAME = CqlIdentifier.fromCql("username");
 
-    String MIME_MESSAGE_ID = "mimeMessageId";
+    CqlIdentifier MIME_MESSAGE_ID = CqlIdentifier.fromCql("mimeMessageId");
 
-    String BASE_SUBJECT = "baseSubject";
-
-    String[] FIELDS = {MESSAGE_ID, THREAD_ID, USERNAME, MIME_MESSAGE_ID, BASE_SUBJECT};
+    CqlIdentifier BASE_SUBJECT = CqlIdentifier.fromCql("baseSubject");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraUserMailboxRightsTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraUserMailboxRightsTable.java
index 65dff9fa24..d575d76151 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraUserMailboxRightsTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraUserMailboxRightsTable.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraUserMailboxRightsTable {
     String TABLE_NAME = "UserMailboxACL";
 
-    String USER_NAME = "userName";
-    String MAILBOX_ID = "mailboxid";
-    String RIGHTS = "rights";
+    CqlIdentifier USER_NAME = CqlIdentifier.fromCql("userName");
+    CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxid");
+    CqlIdentifier RIGHTS = CqlIdentifier.fromCql("rights");
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/Flag.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/Flag.java
index 0788b5dfc6..e0dd53208a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/Flag.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/Flag.java
@@ -18,41 +18,38 @@
  ****************************************************************/
 package org.apache.james.mailbox.cassandra.table;
 
-import java.util.Locale;
-
 import javax.mail.Flags;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.google.common.collect.ImmutableMap;
 
 public interface Flag {
+    CqlIdentifier ANSWERED = CqlIdentifier.fromCql("flagAnswered");
+    CqlIdentifier DELETED = CqlIdentifier.fromCql("flagDeleted");
+    CqlIdentifier DRAFT = CqlIdentifier.fromCql("flagDraft");
+    CqlIdentifier RECENT = CqlIdentifier.fromCql("flagRecent");
+    CqlIdentifier SEEN = CqlIdentifier.fromCql("flagSeen");
+    CqlIdentifier FLAGGED = CqlIdentifier.fromCql("flagFlagged");
+    CqlIdentifier USER = CqlIdentifier.fromCql("flagUser");
+    CqlIdentifier USER_FLAGS = CqlIdentifier.fromCql("userFlags");
 
-    String ANSWERED = "flagAnswered";
-    String DELETED = "flagDeleted";
-    String DRAFT = "flagDraft";
-    String RECENT = "flagRecent";
-    String SEEN = "flagSeen";
-    String FLAGGED = "flagFlagged";
-    String USER = "flagUser";
-    String USER_FLAGS = "userFlags";
-    String USER_FLAGS_LOWERCASE = USER_FLAGS.toLowerCase(Locale.US);
-
-    String[] ALL_LOWERCASE = {
-        ANSWERED.toLowerCase(Locale.US),
-        DELETED.toLowerCase(Locale.US),
-        DRAFT.toLowerCase(Locale.US),
-        RECENT.toLowerCase(Locale.US),
-        SEEN.toLowerCase(Locale.US),
-        FLAGGED.toLowerCase(Locale.US),
-        USER.toLowerCase(Locale.US)
+    CqlIdentifier[] ALL_LOWERCASE = {
+        ANSWERED,
+        DELETED,
+        DRAFT,
+        RECENT,
+        SEEN,
+        FLAGGED,
+        USER
     };
 
-    ImmutableMap<String, Flags.Flag> JAVAX_MAIL_FLAG = ImmutableMap.<String, Flags.Flag>builder()
-        .put(ANSWERED.toLowerCase(Locale.US), Flags.Flag.ANSWERED)
-        .put(DELETED.toLowerCase(Locale.US), Flags.Flag.DELETED)
-        .put(DRAFT.toLowerCase(Locale.US), Flags.Flag.DRAFT)
-        .put(RECENT.toLowerCase(Locale.US), Flags.Flag.RECENT)
-        .put(SEEN.toLowerCase(Locale.US), Flags.Flag.SEEN)
-        .put(FLAGGED.toLowerCase(Locale.US), Flags.Flag.FLAGGED)
-        .put(USER.toLowerCase(Locale.US), Flags.Flag.USER)
+    ImmutableMap<CqlIdentifier, Flags.Flag> JAVAX_MAIL_FLAG = ImmutableMap.<CqlIdentifier, Flags.Flag>builder()
+        .put(ANSWERED, Flags.Flag.ANSWERED)
+        .put(DELETED, Flags.Flag.DELETED)
+        .put(DRAFT, Flags.Flag.DRAFT)
+        .put(RECENT, Flags.Flag.RECENT)
+        .put(SEEN, Flags.Flag.SEEN)
+        .put(FLAGGED, Flags.Flag.FLAGGED)
+        .put(USER, Flags.Flag.USER)
         .build();
 }
\ No newline at end of file
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/MessageIdToImapUid.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/MessageIdToImapUid.java
index df1dd3c1ac..27884a3ae8 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/MessageIdToImapUid.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/MessageIdToImapUid.java
@@ -19,22 +19,13 @@
 
 package org.apache.james.mailbox.cassandra.table;
 
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.IMAP_UID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MAILBOX_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-
-import java.util.Locale;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 
 public interface MessageIdToImapUid {
 
     String TABLE_NAME = "imapUidTable";
 
-    String MOD_SEQ = "modSeq";
-    String MOD_SEQ_LOWERCASE = MOD_SEQ.toLowerCase(Locale.US);
-
-    String THREAD_ID = "threadId";
-    String THREAD_ID_LOWERCASE = THREAD_ID.toLowerCase(Locale.US);
+    CqlIdentifier MOD_SEQ = CqlIdentifier.fromCql("modSeq");
 
-    String[] FIELDS = { MESSAGE_ID, MAILBOX_ID, IMAP_UID, THREAD_ID, MOD_SEQ,
-            Flag.ANSWERED, Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, Flag.USER_FLAGS };
+    CqlIdentifier THREAD_ID = CqlIdentifier.fromCql("threadId");
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
index ad005d037b..6f76a71fef 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
@@ -36,7 +36,6 @@ import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.cassandra.table.Flag;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageRange;
@@ -122,7 +121,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData metadata = ComposedMessageIdWithMetaData.builder()
             .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
-            .flags(new Flags(Flag.ANSWERED))
+            .flags(new Flags(Flags.Flag.ANSWERED))
             .modSeq(ModSeq.of(2))
             .threadId(ThreadId.fromBaseMessageId(messageId))
             .build();
@@ -273,7 +272,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.ANSWERED))
+                .flags(new Flags(Flags.Flag.ANSWERED))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();
@@ -315,7 +314,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.DELETED))
+                .flags(new Flags(Flags.Flag.DELETED))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();
@@ -357,7 +356,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.DRAFT))
+                .flags(new Flags(Flags.Flag.DRAFT))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();
@@ -399,7 +398,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.FLAGGED))
+                .flags(new Flags(Flags.Flag.FLAGGED))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();
@@ -441,7 +440,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.RECENT))
+                .flags(new Flags(Flags.Flag.RECENT))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();
@@ -483,7 +482,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.SEEN))
+                .flags(new Flags(Flags.Flag.SEEN))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();
@@ -525,7 +524,7 @@ class CassandraMessageIdDAOTest {
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
-                .flags(new Flags(Flag.USER))
+                .flags(new Flags(Flags.Flag.USER))
                 .modSeq(ModSeq.of(2))
                 .threadId(ThreadId.fromBaseMessageId(messageId))
                 .build();


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


[james-project] 15/15: [PERF] Allow disabling SERIAL read for non critical UID/ModSeq read operations

Posted by bt...@apache.org.
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 e3904e5dabe7135793b38e639020ff47bf1123e6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 5 16:00:12 2022 +0700

    [PERF] Allow disabling SERIAL read for non critical UID/ModSeq read operations
---
 .../init/configuration/CassandraConfiguration.java | 44 ++++++++++++++++++++--
 .../cassandra/mail/CassandraModSeqProvider.java    | 20 ++++++----
 .../cassandra/mail/CassandraUidProvider.java       | 20 ++++++----
 .../modules/ROOT/pages/configure/cassandra.adoc    | 14 +++++++
 4 files changed, 80 insertions(+), 18 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/CassandraConfiguration.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/CassandraConfiguration.java
index 2df55e6641..76c90968d6 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/CassandraConfiguration.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/CassandraConfiguration.java
@@ -76,6 +76,8 @@ public class CassandraConfiguration {
     private static final String MAILBOX_READ_STRONG_CONSISTENCY = "mailbox.read.strong.consistency";
     private static final String MESSAGE_READ_STRONG_CONSISTENCY = "message.read.strong.consistency";
     private static final String MESSAGE_WRITE_STRONG_CONSISTENCY = "message.write.strong.consistency.unsafe";
+    private static final String UID_READ_STRONG_CONSISTENCY = "uid.read.strong.consistency.unsafe";
+    private static final String MODSEQ_READ_STRONG_CONSISTENCY = "modseq.read.strong.consistency.unsafe";
     private static final String CONSISTENCY_LEVEL_REGULAR = "cassandra.consistency_level.regular";
     private static final String CONSISTENCY_LEVEL_LIGHTWEIGHT_TRANSACTION = "cassandra.consistency_level.lightweight_transaction";
     private static final String OPTIMISTIC_CONSISTENCY_LEVEL = "optimistic.consistency.level.enabled";
@@ -102,6 +104,8 @@ public class CassandraConfiguration {
         private Optional<Boolean> mailboxReadStrongConsistency = Optional.empty();
         private Optional<Boolean> messageReadStrongConsistency = Optional.empty();
         private Optional<Boolean> messageWriteStrongConsistency = Optional.empty();
+        private Optional<Boolean> uidReadStrongConsistency = Optional.empty();
+        private Optional<Boolean> modseqReadStrongConsistency = Optional.empty();
         private Optional<Boolean> optimisticConsistencyLevel = Optional.empty();
         private Optional<Boolean> mailRepositoryStrongConsistency = Optional.empty();
 
@@ -125,6 +129,16 @@ public class CassandraConfiguration {
             return this;
         }
 
+        public Builder uidReadStrongConsistency(Optional<Boolean> value) {
+            this.uidReadStrongConsistency = value;
+            return this;
+        }
+
+        public Builder modseqReadStrongConsistency(Optional<Boolean> value) {
+            this.modseqReadStrongConsistency = value;
+            return this;
+        }
+
         public Builder messageWriteStrongConsistency(boolean value) {
             this.messageWriteStrongConsistency = Optional.of(value);
             return this;
@@ -348,7 +362,9 @@ public class CassandraConfiguration {
                 messageReadStrongConsistency.orElse(DEFAULT_STRONG_CONSISTENCY),
                 messageWriteStrongConsistency.orElse(DEFAULT_STRONG_CONSISTENCY),
                 optimisticConsistencyLevel.orElse(DEFAULT_OPTIMISTIC_CONSISTENCY_LEVEL),
-                mailRepositoryStrongConsistency.orElse(DEFAULT_MAIL_REPOSITORY_STRONG_CONSISTENCY));
+                mailRepositoryStrongConsistency.orElse(DEFAULT_MAIL_REPOSITORY_STRONG_CONSISTENCY),
+                uidReadStrongConsistency.orElse(DEFAULT_STRONG_CONSISTENCY),
+                modseqReadStrongConsistency.orElse(DEFAULT_STRONG_CONSISTENCY));
         }
     }
 
@@ -392,6 +408,10 @@ public class CassandraConfiguration {
                 propertiesConfiguration.getBoolean(MAILBOX_READ_STRONG_CONSISTENCY, null)))
             .messageReadStrongConsistency(Optional.ofNullable(
                 propertiesConfiguration.getBoolean(MESSAGE_READ_STRONG_CONSISTENCY, null)))
+            .uidReadStrongConsistency(Optional.ofNullable(
+                propertiesConfiguration.getBoolean(UID_READ_STRONG_CONSISTENCY, null)))
+            .modseqReadStrongConsistency(Optional.ofNullable(
+                propertiesConfiguration.getBoolean(MODSEQ_READ_STRONG_CONSISTENCY, null)))
             .messageWriteStrongConsistency(Optional.ofNullable(
                 propertiesConfiguration.getBoolean(MESSAGE_WRITE_STRONG_CONSISTENCY, null)))
             .optimisticConsistencyLevel(Optional.ofNullable(
@@ -421,6 +441,8 @@ public class CassandraConfiguration {
     private final boolean messageWriteStrongConsistency;
     private final boolean optimisticConsistencyLevel;
     private final boolean mailRepositoryStrongConsistency;
+    private final boolean uidReadStrongConsistency;
+    private final boolean modseqReadStrongConsistency;
 
     @VisibleForTesting
     CassandraConfiguration(int aclMaxRetry, int expungeChunkSize,
@@ -431,7 +453,8 @@ public class CassandraConfiguration {
                            float mailboxReadRepair, float mailboxCountersReadRepairChanceMax,
                            float mailboxCountersReadRepairChanceOneHundred, boolean mailboxReadStrongConsistency,
                            boolean messageReadStrongConsistency, boolean messageWriteStrongConsistency,
-                           boolean optimisticConsistencyLevel, boolean mailRepositoryStrongConsistency) {
+                           boolean optimisticConsistencyLevel, boolean mailRepositoryStrongConsistency,
+                           boolean uidReadStrongConsistency, boolean modseqReadStrongConsistency) {
         this.aclMaxRetry = aclMaxRetry;
         this.expungeChunkSize = expungeChunkSize;
         this.flagsUpdateMessageIdMaxRetry = flagsUpdateMessageIdMaxRetry;
@@ -452,6 +475,16 @@ public class CassandraConfiguration {
         this.messageWriteStrongConsistency = messageWriteStrongConsistency;
         this.optimisticConsistencyLevel = optimisticConsistencyLevel;
         this.mailRepositoryStrongConsistency = mailRepositoryStrongConsistency;
+        this.uidReadStrongConsistency = uidReadStrongConsistency;
+        this.modseqReadStrongConsistency = modseqReadStrongConsistency;
+    }
+
+    public boolean isUidReadStrongConsistency() {
+        return uidReadStrongConsistency;
+    }
+
+    public boolean isModseqReadStrongConsistency() {
+        return modseqReadStrongConsistency;
     }
 
     public boolean isMailboxReadStrongConsistency() {
@@ -558,6 +591,8 @@ public class CassandraConfiguration {
                 && Objects.equals(this.consistencyLevelRegular, that.consistencyLevelRegular)
                 && Objects.equals(this.consistencyLevelLightweightTransaction, that.consistencyLevelLightweightTransaction)
                 && Objects.equals(this.optimisticConsistencyLevel, that.optimisticConsistencyLevel)
+                && Objects.equals(this.uidReadStrongConsistency, that.uidReadStrongConsistency)
+                && Objects.equals(this.modseqReadStrongConsistency, that.modseqReadStrongConsistency)
                 && Objects.equals(this.mailRepositoryStrongConsistency, that.mailRepositoryStrongConsistency);
 
         }
@@ -572,7 +607,8 @@ public class CassandraConfiguration {
             blobPartSize, attachmentV2MigrationReadTimeout, messageAttachmentIdsReadTimeout,
             consistencyLevelRegular, consistencyLevelLightweightTransaction, mailboxReadRepair,
             messageReadStrongConsistency, mailboxReadStrongConsistency, messageWriteStrongConsistency,
-            optimisticConsistencyLevel, mailRepositoryStrongConsistency);
+            optimisticConsistencyLevel, mailRepositoryStrongConsistency, uidReadStrongConsistency,
+            modseqReadStrongConsistency);
     }
 
     @Override
@@ -598,6 +634,8 @@ public class CassandraConfiguration {
             .add("consistencyLevelLightweightTransaction", consistencyLevelLightweightTransaction)
             .add("optimisticConsistencyLevel", optimisticConsistencyLevel)
             .add("mailRepositoryStrongConsistency", mailRepositoryStrongConsistency)
+            .add("modseqReadStrongConsistency", modseqReadStrongConsistency)
+            .add("uidReadStrongConsistency", uidReadStrongConsistency)
             .toString();
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
index dd31a7bdcf..4aeca8e044 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.store.mail.ModSeqProvider;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
+import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 
@@ -90,6 +91,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
     private final PreparedStatement insert;
     private final RetryBackoffSpec retrySpec;
     private final DriverExecutionProfile lwtProfile;
+    private final CassandraConfiguration cassandraConfiguration;
 
     @Inject
     public CassandraModSeqProvider(CqlSession session, CassandraConfiguration cassandraConfiguration) {
@@ -101,6 +103,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
         Duration firstBackoff = Duration.ofMillis(10);
         this.retrySpec = Retry.backoff(cassandraConfiguration.getModSeqMaxRetry(), firstBackoff)
             .scheduler(Schedulers.parallel());
+        this.cassandraConfiguration = cassandraConfiguration;
     }
 
     private PreparedStatement prepareInsert(CqlSession session) {
@@ -147,14 +150,17 @@ public class CassandraModSeqProvider implements ModSeqProvider {
 
     @Override
     public ModSeq highestModSeq(MailboxId mailboxId) throws MailboxException {
-        return unbox(() -> findHighestModSeq((CassandraId) mailboxId).block().orElse(ModSeq.first()));
+        return unbox(() -> findHighestModSeq((CassandraId) mailboxId,
+            Optional.of(lwtProfile).filter(any -> cassandraConfiguration.isUidReadStrongConsistency()))
+            .block().orElse(ModSeq.first()));
     }
 
-    private Mono<Optional<ModSeq>> findHighestModSeq(CassandraId mailboxId) {
+    private Mono<Optional<ModSeq>> findHighestModSeq(CassandraId mailboxId, Optional<DriverExecutionProfile> executionProfile) {
+        BoundStatement statement = select.bind()
+            .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID);
         return cassandraAsyncExecutor.executeSingleRowOptional(
-                select.bind()
-                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
-                    .setExecutionProfile(lwtProfile))
+            executionProfile.map(statement::setExecutionProfile)
+                .orElse(statement))
             .map(maybeRow -> maybeRow.map(row -> ModSeq.of(row.getLong(0))));
     }
 
@@ -189,7 +195,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
     @Override
     public Mono<ModSeq> nextModSeqReactive(MailboxId mailboxId) {
         CassandraId cassandraId = (CassandraId) mailboxId;
-        return findHighestModSeq(cassandraId)
+        return findHighestModSeq(cassandraId, Optional.of(lwtProfile))
             .flatMap(maybeHighestModSeq -> maybeHighestModSeq
                 .map(highestModSeq -> tryUpdateModSeq(cassandraId, highestModSeq))
                 .orElseGet(() -> tryInsertModSeq(cassandraId, ModSeq.first())))
@@ -199,7 +205,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
 
     @Override
     public Mono<ModSeq> highestModSeqReactive(Mailbox mailbox) {
-        return findHighestModSeq((CassandraId) mailbox.getMailboxId())
+        return findHighestModSeq((CassandraId) mailbox.getMailboxId(), Optional.empty())
             .map(optional -> optional.orElse(ModSeq.first()));
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
index 570ed05f9b..1a019d35fa 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.store.mail.UidProvider;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
+import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.collect.ImmutableList;
@@ -66,6 +67,7 @@ public class CassandraUidProvider implements UidProvider {
     private final PreparedStatement selectStatement;
     private final DriverExecutionProfile lwtProfile;
     private final RetryBackoffSpec retrySpec;
+    private final CassandraConfiguration cassandraConfiguration;
 
     @Inject
     public CassandraUidProvider(CqlSession session, CassandraConfiguration cassandraConfiguration) {
@@ -77,6 +79,7 @@ public class CassandraUidProvider implements UidProvider {
         Duration firstBackoff = Duration.ofMillis(10);
         this.retrySpec = Retry.backoff(cassandraConfiguration.getUidMaxRetry(), firstBackoff)
             .scheduler(Schedulers.parallel());
+        this.cassandraConfiguration = cassandraConfiguration;
     }
 
     private PreparedStatement prepareSelect(CqlSession session) {
@@ -118,7 +121,7 @@ public class CassandraUidProvider implements UidProvider {
     @Override
     public Mono<MessageUid> nextUidReactive(MailboxId mailboxId) {
         CassandraId cassandraId = (CassandraId) mailboxId;
-        Mono<MessageUid> updateUid = findHighestUid(cassandraId)
+        Mono<MessageUid> updateUid = findHighestUid(cassandraId, Optional.of(lwtProfile))
             .flatMap(messageUid -> tryUpdateUid(cassandraId, messageUid));
 
         return updateUid
@@ -132,7 +135,7 @@ public class CassandraUidProvider implements UidProvider {
     public Mono<List<MessageUid>> nextUids(MailboxId mailboxId, int count) {
         CassandraId cassandraId = (CassandraId) mailboxId;
 
-        Mono<List<MessageUid>> updateUid = findHighestUid(cassandraId)
+        Mono<List<MessageUid>> updateUid = findHighestUid(cassandraId, Optional.of(lwtProfile))
             .flatMap(messageUid -> tryUpdateUid(cassandraId, messageUid, count)
                 .map(highest -> range(messageUid, highest)));
 
@@ -152,22 +155,23 @@ public class CassandraUidProvider implements UidProvider {
 
     @Override
     public Optional<MessageUid> lastUid(Mailbox mailbox) {
-        return findHighestUid((CassandraId) mailbox.getMailboxId())
+        return findHighestUid((CassandraId) mailbox.getMailboxId(), Optional.of(lwtProfile).filter(any -> cassandraConfiguration.isUidReadStrongConsistency()))
             .blockOptional();
     }
 
     @Override
     public Mono<Optional<MessageUid>> lastUidReactive(Mailbox mailbox) {
-        return findHighestUid((CassandraId) mailbox.getMailboxId())
+        return findHighestUid((CassandraId) mailbox.getMailboxId(), Optional.of(lwtProfile).filter(any -> cassandraConfiguration.isUidReadStrongConsistency()))
             .map(Optional::of)
             .switchIfEmpty(Mono.just(Optional.empty()));
     }
 
-    private Mono<MessageUid> findHighestUid(CassandraId mailboxId) {
+    private Mono<MessageUid> findHighestUid(CassandraId mailboxId, Optional<DriverExecutionProfile> executionProfile) {
+        BoundStatement statement = selectStatement.bind()
+            .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID);
         return executor.executeSingleRow(
-                selectStatement.bind()
-                    .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
-                    .setExecutionProfile(lwtProfile))
+            executionProfile.map(statement::setExecutionProfile)
+                .orElse(statement))
             .map(row -> MessageUid.of(row.getLong(0)));
     }
 
diff --git a/server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc b/server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc
index bb91e32536..d72b530cc8 100644
--- a/server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc
+++ b/server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc
@@ -115,6 +115,20 @@ in stale reads as the system.paxos table will not be checked for latest updates.
 by turning it off. Note that reads performed as part of write transactions are always performed with a strong
 consistency.
 
+| uid.read.strong.consistency.unsafe
+| Optional. Boolean, defaults to true. Disabling should be considered experimental.
+If enabled, regular consistency level is used for read transactions for uid upon read oepration (eg IMAP status, select).
+Not doing so might result in stale reads as the system.paxos table will not be checked for latest updates.
+Better performance are expected by turning it off.
+Note that reads performed as part of write transactions are always performed with a strong consistency.
+
+| modseq.read.strong.consistency.unsafe
+| Optional. Boolean, defaults to true. Disabling should be considered experimental.
+If enabled, regular consistency level is used for read transactions for modseq upon read operation (eg IMAP status, select).
+Not doing so might result in stale reads as the system.paxos table will not be checked for latest updates.
+Better performance are expected by turning it off.
+Note that reads performed as part of write transactions are always performed with a strong consistency.
+
 | message.read.strong.consistency
 | Optional. Boolean, defaults to true. Disabling should be considered experimental.
 If enabled, regular consistency level is used for read transactions for message. Not doing so might result


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


[james-project] 06/15: [PERF] Adopt CqlIdentifier within eventbus-cassandra

Posted by bt...@apache.org.
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 db5cd2366dc47781a44863f2b817c75ee4f94f9e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 1 09:41:16 2022 +0700

    [PERF] Adopt CqlIdentifier within eventbus-cassandra
---
 .../james/events/tables/CassandraEventDeadLettersGroupTable.java  | 4 +++-
 .../james/events/tables/CassandraEventDeadLettersTable.java       | 8 +++++---
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersGroupTable.java b/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersGroupTable.java
index fff28aac92..e6df7a4284 100644
--- a/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersGroupTable.java
+++ b/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersGroupTable.java
@@ -19,9 +19,11 @@
 
 package org.apache.james.events.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraEventDeadLettersGroupTable {
 
     String TABLE_NAME = "group_table";
 
-    String GROUP = "group";
+    CqlIdentifier GROUP = CqlIdentifier.fromCql("group");
 }
diff --git a/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersTable.java b/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersTable.java
index 51cbef8adb..e8e33e2110 100644
--- a/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersTable.java
+++ b/event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersTable.java
@@ -19,11 +19,13 @@
 
 package org.apache.james.events.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraEventDeadLettersTable {
 
     String TABLE_NAME = "event_dead_letters";
 
-    String GROUP = "group";
-    String INSERTION_ID = "insertionId";
-    String EVENT = "event";
+    CqlIdentifier GROUP = CqlIdentifier.fromCql("group");
+    CqlIdentifier INSERTION_ID = CqlIdentifier.fromCql("insertionId");
+    CqlIdentifier EVENT = CqlIdentifier.fromCql("event");
 }


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


[james-project] 09/15: [PERF] Increase forked process timeout for mailbox/cassandra

Posted by bt...@apache.org.
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 f4f3d35fb1bb8c20c5e26cf6b468d76e2881beea
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 27 14:08:31 2022 +0700

    [PERF] Increase forked process timeout for mailbox/cassandra
---
 mailbox/cassandra/pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index 1f5de33188..290df88663 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -202,6 +202,7 @@
                 <configuration>
                     <reuseForks>true</reuseForks>
                     <forkCount>2</forkCount>
+                    <forkedProcessTimeoutInSeconds>1800</forkedProcessTimeoutInSeconds>
                 </configuration>
             </plugin>
         </plugins>


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


[james-project] 13/15: [PERF] Quota: avoid streaming where possible

Posted by bt...@apache.org.
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 033d7bdecc942e3fd75146a50bd0f169d7c37d35
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 5 14:52:58 2022 +0700

    [PERF] Quota: avoid streaming where possible
---
 .../api/src/main/java/org/apache/james/mailbox/model/Quota.java    | 7 +++----
 .../main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java  | 1 -
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
index 5d1ed44d78..8f64fbb83f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
@@ -18,9 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.model;
 
-import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
+import java.util.stream.Stream;
 
 import org.apache.james.core.quota.QuotaLimitValue;
 import org.apache.james.core.quota.QuotaUsageValue;
@@ -37,8 +36,8 @@ public class Quota<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>
         User
     }
 
-    public static List<Scope> allScopes() {
-        return Arrays.asList(Quota.Scope.User, Quota.Scope.Domain, Quota.Scope.Global);
+    public static Stream<Scope> allScopes() {
+        return Stream.of(Quota.Scope.User, Quota.Scope.Domain, Quota.Scope.Global);
     }
 
     public static <T extends QuotaLimitValue<T>,  U extends QuotaUsageValue<U, T>> Builder<T, U> builder() {
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
index 0e30eecb2d..367f79fec2 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
@@ -128,7 +128,6 @@ public interface MaxQuotaManager {
 
     default Optional<QuotaSizeLimit> getMaxStorage(Map<Quota.Scope, QuotaSizeLimit> maxStorageDetails) {
         return Quota.allScopes()
-            .stream()
             .map(maxStorageDetails::get)
             .filter(Objects::nonNull)
             .findFirst();


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


[james-project] 04/15: [PERF] Adopt CqlIdentifier within backend-commons/cassandra

Posted by bt...@apache.org.
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 dc3af393112d0e4ff7bf9f0d6c0ab4686e5ab1bb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 1 09:35:37 2022 +0700

    [PERF] Adopt CqlIdentifier within backend-commons/cassandra
---
 .../backends/cassandra/init/CassandraZonedDateTimeModule.java     | 5 +++--
 .../cassandra/versions/table/CassandraSchemaVersionTable.java     | 8 ++++----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraZonedDateTimeModule.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraZonedDateTimeModule.java
index f1b288d064..b02548ab65 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraZonedDateTimeModule.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraZonedDateTimeModule.java
@@ -25,14 +25,15 @@ import java.util.Optional;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.ZonedDateTimeRepresentation;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.data.UdtValue;
 import com.datastax.oss.driver.api.core.type.DataTypes;
 import com.datastax.oss.driver.api.core.type.UserDefinedType;
 
 public interface CassandraZonedDateTimeModule {
     String ZONED_DATE_TIME = "zonedDateTime";
-    String DATE = "date";
-    String TIME_ZONE = "timeZone";
+    CqlIdentifier DATE = CqlIdentifier.fromCql("date");
+    CqlIdentifier TIME_ZONE = CqlIdentifier.fromCql("timeZone");
 
     CassandraModule MODULE = CassandraModule.type(ZONED_DATE_TIME)
         .statement(statement -> statement
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/table/CassandraSchemaVersionTable.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/table/CassandraSchemaVersionTable.java
index 6793d2a483..ef3ecd4412 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/table/CassandraSchemaVersionTable.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/table/CassandraSchemaVersionTable.java
@@ -19,11 +19,11 @@
 
 package org.apache.james.backends.cassandra.versions.table;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSchemaVersionTable {
     String TABLE_NAME = "schemaversion";
 
-    String KEY = "key";
-    String VALUE = "value";
-
-    int KEY_FOR_VERSION = 0;
+    CqlIdentifier KEY = CqlIdentifier.fromCql("key");
+    CqlIdentifier VALUE = CqlIdentifier.fromCql("value");
 }


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


[james-project] 05/15: [PERF] Adopt CqlIdentifier within eventsourcing-cassandra

Posted by bt...@apache.org.
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 6ff79b01422243ce96ae0d8ca1cfb56175265126
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 1 09:38:24 2022 +0700

    [PERF] Adopt CqlIdentifier within eventsourcing-cassandra
---
 .../eventstore/cassandra/CassandraEventStoreTable.scala           | 8 +++++---
 .../james/eventsourcing/eventstore/cassandra/EventStoreDao.scala  | 7 ++++---
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTable.scala b/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTable.scala
index 1b901e217f..57c6754976 100644
--- a/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTable.scala
+++ b/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTable.scala
@@ -18,9 +18,11 @@
  ****************************************************************/
 package org.apache.james.eventsourcing.eventstore.cassandra
 
+import com.datastax.oss.driver.api.core.CqlIdentifier
+
 object CassandraEventStoreTable {
   val EVENTS_TABLE = "eventStore"
-  val AGGREGATE_ID = "aggregateId"
-  val EVENT = "event"
-  val EVENT_ID = "eventId"
+  val AGGREGATE_ID = CqlIdentifier.fromCql("aggregateId")
+  val EVENT = CqlIdentifier.fromCql("event")
+  val EVENT_ID = CqlIdentifier.fromCql("eventId")
 }
\ No newline at end of file
diff --git a/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala b/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala
index 254ded1cac..b83bb626b2 100644
--- a/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala
+++ b/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala
@@ -20,6 +20,7 @@
 package org.apache.james.eventsourcing.eventstore.cassandra
 
 import com.datastax.oss.driver.api.core.CqlSession
+import com.datastax.oss.driver.api.core.`type`.codec.TypeCodecs
 import com.datastax.oss.driver.api.core.cql.{BatchStatementBuilder, BatchType, BoundStatement, PreparedStatement, Row, Statement}
 import com.datastax.oss.driver.api.querybuilder.QueryBuilder
 import com.datastax.oss.driver.api.querybuilder.QueryBuilder.{bindMarker, insertInto}
@@ -52,7 +53,7 @@ class EventStoreDao @Inject() (val session: CqlSession,
   private def prepareSelect(session: CqlSession): PreparedStatement =
     session.prepare(QueryBuilder
       .selectFrom(EVENTS_TABLE)
-      .all()
+      .column(EVENT)
       .whereColumn(AGGREGATE_ID).isEqualTo(bindMarker(AGGREGATE_ID))
       .build())
 
@@ -83,7 +84,7 @@ class EventStoreDao @Inject() (val session: CqlSession,
 
   private[cassandra] def getEventsOfAggregate(aggregateId: AggregateId): SMono[History] = {
     val preparedStatement = select.bind()
-      .setString(AGGREGATE_ID, aggregateId.asAggregateKey)
+      .set(AGGREGATE_ID, aggregateId.asAggregateKey, TypeCodecs.TEXT)
       .setExecutionProfile(executionProfile)
     val rows: SFlux[Row] = SFlux[Row](cassandraAsyncExecutor.executeRows(preparedStatement))
 
@@ -100,6 +101,6 @@ class EventStoreDao @Inject() (val session: CqlSession,
       .setString(AGGREGATE_ID, aggregateId.asAggregateKey)))
       .`then`()
 
-  private def toEvent(row: Row): SMono[Event] = SMono.fromCallable(() => jsonEventSerializer.deserialize(row.getString(EVENT)))
+  private def toEvent(row: Row): SMono[Event] = SMono.fromCallable(() => jsonEventSerializer.deserialize(row.get(0, TypeCodecs.TEXT)))
     .subscribeOn(ReactorUtils.BLOCKING_CALL_WRAPPER)
 }
\ No newline at end of file


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


[james-project] 02/15: [PERF] Adopt CqlIdentifier within server/data/data-cassandra

Posted by bt...@apache.org.
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 51582169c5b8e6248585974fc7a2e630cca57955
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 1 09:01:37 2022 +0700

    [PERF] Adopt CqlIdentifier within server/data/data-cassandra
---
 .../james/domainlist/cassandra/CassandraDomainList.java      |  9 +++++----
 .../domainlist/cassandra/tables/CassandraDomainsTable.java   |  4 +++-
 .../rrt/cassandra/tables/CassandraMappingsSourcesTable.java  |  8 +++++---
 .../sieve/cassandra/tables/CassandraSieveActiveTable.java    |  8 +++++---
 .../cassandra/tables/CassandraSieveClusterQuotaTable.java    |  6 ++++--
 .../sieve/cassandra/tables/CassandraSieveQuotaTable.java     |  6 ++++--
 .../sieve/cassandra/tables/CassandraSieveSpaceTable.java     |  6 ++++--
 .../james/sieve/cassandra/tables/CassandraSieveTable.java    | 12 +++++++-----
 .../james/user/cassandra/tables/CassandraUserTable.java      | 12 +++++++-----
 9 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
index 015eb8abbc..3440be908d 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
@@ -38,6 +38,7 @@ import org.apache.james.domainlist.lib.AbstractDomainList;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 
 public class CassandraDomainList extends AbstractDomainList {
     private final CassandraAsyncExecutor executor;
@@ -73,7 +74,7 @@ public class CassandraDomainList extends AbstractDomainList {
     @Override
     protected List<Domain> getDomainListInternal() throws DomainListException {
         return executor.executeRows(readAllStatement.bind())
-            .map(row -> Domain.of(row.getString(DOMAIN)))
+            .map(row -> Domain.of(row.get(0, TypeCodecs.TEXT)))
             .collectList()
             .block();
     }
@@ -81,7 +82,7 @@ public class CassandraDomainList extends AbstractDomainList {
     @Override
     protected boolean containsDomainInternal(Domain domain) throws DomainListException {
         return executor.executeSingleRowOptional(readStatement.bind()
-                .setString(DOMAIN, domain.asString()))
+                .set(DOMAIN, domain.asString(), TypeCodecs.TEXT))
             .block()
             .isPresent();
     }
@@ -89,7 +90,7 @@ public class CassandraDomainList extends AbstractDomainList {
     @Override
     public void addDomain(Domain domain) throws DomainListException {
         boolean executed = executor.executeReturnApplied(insertStatement.bind()
-                .setString(DOMAIN, domain.asString()))
+                .set(DOMAIN, domain.asString(), TypeCodecs.TEXT))
             .block();
         if (!executed) {
             throw new DomainListException(domain.name() + " already exists.");
@@ -99,7 +100,7 @@ public class CassandraDomainList extends AbstractDomainList {
     @Override
     public void doRemoveDomain(Domain domain) throws DomainListException {
         boolean executed = executor.executeReturnApplied(removeStatement.bind()
-                .setString(DOMAIN, domain.asString()))
+                .set(DOMAIN, domain.asString(), TypeCodecs.TEXT))
             .block();
         if (!executed) {
             throw new DomainListException(domain.name() + " was not found");
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java
index 451346785a..2313516a9f 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.domainlist.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraDomainsTable {
     String TABLE_NAME = "domains";
 
-    String DOMAIN = "domain";
+    CqlIdentifier DOMAIN = CqlIdentifier.fromCql("domain");
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/tables/CassandraMappingsSourcesTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/tables/CassandraMappingsSourcesTable.java
index 81a3c3103f..0161b3f890 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/tables/CassandraMappingsSourcesTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/tables/CassandraMappingsSourcesTable.java
@@ -19,11 +19,13 @@
 
 package org.apache.james.rrt.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraMappingsSourcesTable {
 
     String TABLE_NAME = "mappings_sources";
 
-    String MAPPING_TYPE = "mapping_type";
-    String MAPPING_VALUE = "mapping_value";
-    String SOURCE = "source";
+    CqlIdentifier MAPPING_TYPE = CqlIdentifier.fromCql("mapping_type");
+    CqlIdentifier MAPPING_VALUE = CqlIdentifier.fromCql("mapping_value");
+    CqlIdentifier SOURCE = CqlIdentifier.fromCql("source");
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveActiveTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveActiveTable.java
index efc64d0a42..631e18392a 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveActiveTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveActiveTable.java
@@ -19,12 +19,14 @@
 
 package org.apache.james.sieve.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSieveActiveTable {
 
     String TABLE_NAME = "sieve_active";
 
-    String USER_NAME = "user_name";
-    String SCRIPT_NAME = "script_name";
-    String DATE = "date";
+    CqlIdentifier USER_NAME = CqlIdentifier.fromCql("user_name");
+    CqlIdentifier SCRIPT_NAME = CqlIdentifier.fromCql("script_name");
+    CqlIdentifier DATE = CqlIdentifier.fromCql("date");
 
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java
index 16beb0ff6f..f07c97761b 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java
@@ -19,11 +19,13 @@
 
 package org.apache.james.sieve.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSieveClusterQuotaTable {
     String TABLE_NAME = "sieve_cluster_quota";
 
-    String NAME = "name";
-    String VALUE = "value";
+    CqlIdentifier NAME = CqlIdentifier.fromCql("name");
+    CqlIdentifier VALUE = CqlIdentifier.fromCql("value");
 
     String DEFAULT_NAME = "cluster_quota";
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java
index 94c6425699..803163c46a 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java
@@ -19,9 +19,11 @@
 
 package org.apache.james.sieve.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSieveQuotaTable {
     String TABLE_NAME = "sieve_quota";
 
-    String USER_NAME = "user_name";
-    String QUOTA = "quota";
+    CqlIdentifier USER_NAME = CqlIdentifier.fromCql("user_name");
+    CqlIdentifier QUOTA = CqlIdentifier.fromCql("quota");
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java
index 8156e772e9..d35ec7118a 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java
@@ -19,9 +19,11 @@
 
 package org.apache.james.sieve.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSieveSpaceTable {
     String TABLE_NAME = "sieve_space";
 
-    String USER_NAME = "user_name";
-    String SPACE_USED = "space_used";
+    CqlIdentifier USER_NAME = CqlIdentifier.fromCql("user_name");
+    CqlIdentifier SPACE_USED = CqlIdentifier.fromCql("space_used");
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java
index c24735224e..38a19557bc 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java
@@ -19,12 +19,14 @@
 
 package org.apache.james.sieve.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraSieveTable {
     String TABLE_NAME = "sieve";
 
-    String USER_NAME = "user_name";
-    String SCRIPT_NAME = "script_name";
-    String SCRIPT_CONTENT = "script_content";
-    String IS_ACTIVE = "is_active";
-    String SIZE = "size";
+    CqlIdentifier USER_NAME = CqlIdentifier.fromCql("user_name");
+    CqlIdentifier SCRIPT_NAME = CqlIdentifier.fromCql("script_name");
+    CqlIdentifier SCRIPT_CONTENT = CqlIdentifier.fromCql("script_content");
+    CqlIdentifier IS_ACTIVE = CqlIdentifier.fromCql("is_active");
+    CqlIdentifier SIZE = CqlIdentifier.fromCql("size");
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/tables/CassandraUserTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/tables/CassandraUserTable.java
index 48a0ea6a3b..fbac598ade 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/tables/CassandraUserTable.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/tables/CassandraUserTable.java
@@ -19,12 +19,14 @@
 
 package org.apache.james.user.cassandra.tables;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
+
 public interface CassandraUserTable {
     String TABLE_NAME = "user";
 
-    String ALGORITHM = "algorithm";
-    String NAME = "name";
-    String PASSWORD = "passwd";
-    String REALNAME = "realname";
-    String AUTHORIZED_USERS = "authorized_users";
+    CqlIdentifier ALGORITHM = CqlIdentifier.fromCql("algorithm");
+    CqlIdentifier NAME = CqlIdentifier.fromCql("name");
+    CqlIdentifier PASSWORD = CqlIdentifier.fromCql("passwd");
+    CqlIdentifier REALNAME = CqlIdentifier.fromCql("realname");
+    CqlIdentifier AUTHORIZED_USERS = CqlIdentifier.fromCql("authorized_users");
 }


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


[james-project] 14/15: [PERF] Continue improve mailbox/cassandra row reading

Posted by bt...@apache.org.
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 faafc02dd4a846249f60937462e87e553f3adb4a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 5 15:26:22 2022 +0700

    [PERF] Continue improve mailbox/cassandra row reading
---
 .../cassandra/mail/CassandraFirstUnseenDAO.java    | 11 ++++++--
 .../cassandra/mail/CassandraMailboxRecentsDAO.java |  5 +++-
 .../cassandra/mail/CassandraMessageDAOV3.java      | 31 +++++++++-------------
 .../cassandra/mail/CassandraMessageIdDAO.java      | 27 ++++++++++++++++---
 4 files changed, 50 insertions(+), 24 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
index bd5eeb2aff..53fa2726cf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
@@ -38,10 +38,12 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 
 import com.datastax.oss.driver.api.core.CqlSession;
+import com.datastax.oss.driver.api.core.ProtocolVersion;
 import com.datastax.oss.driver.api.core.cql.BatchStatement;
 import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.BatchType;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
+import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.metadata.schema.ClusteringOrder;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.google.common.collect.Lists;
@@ -59,6 +61,7 @@ public class CassandraFirstUnseenDAO {
     private final PreparedStatement deleteAllStatement;
     private final PreparedStatement readStatement;
     private final PreparedStatement listStatement;
+    private final ProtocolVersion protocolVersion;
 
     @Inject
     public CassandraFirstUnseenDAO(CqlSession session) {
@@ -68,6 +71,7 @@ public class CassandraFirstUnseenDAO {
         this.deleteAllStatement = prepareDeleteAllStatement(session);
         this.readStatement = prepareReadStatement(session);
         this.listStatement = prepareListStatement(session);
+        this.protocolVersion = session.getContext().getProtocolVersion();
     }
 
     private PreparedStatement prepareReadStatement(CqlSession session) {
@@ -172,14 +176,17 @@ public class CassandraFirstUnseenDAO {
         return cassandraAsyncExecutor.executeSingleRow(
                 readStatement.bind()
                     .setUuid(MAILBOX_ID, cassandraId.asUuid()))
-            .map(row -> MessageUid.of(row.getLong(UID)));
+            .map(this::asMessageUid);
     }
 
     public Flux<MessageUid> listUnseen(CassandraId cassandraId) {
         return cassandraAsyncExecutor.executeRows(
                 listStatement.bind()
                     .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.TIMEUUID))
-            .map(row -> MessageUid.of(row.getLong(0)));
+            .map(this::asMessageUid);
     }
 
+    private MessageUid asMessageUid(Row row) {
+        return MessageUid.of(TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(0), protocolVersion));
+    }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
index da5552eaa5..f30e4cd907 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxRecentsTable;
 
 import com.datastax.oss.driver.api.core.CqlSession;
+import com.datastax.oss.driver.api.core.ProtocolVersion;
 import com.datastax.oss.driver.api.core.cql.BatchStatement;
 import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.BatchType;
@@ -56,6 +57,7 @@ public class CassandraMailboxRecentsDAO {
     private final PreparedStatement deleteStatement;
     private final PreparedStatement deleteAllStatement;
     private final PreparedStatement addStatement;
+    private final ProtocolVersion protocolVersion;
 
     @Inject
     public CassandraMailboxRecentsDAO(CqlSession session) {
@@ -64,6 +66,7 @@ public class CassandraMailboxRecentsDAO {
         deleteStatement = createDeleteStatement(session);
         deleteAllStatement = createDeleteAllStatement(session);
         addStatement = createAddStatement(session);
+        protocolVersion = session.getContext().getProtocolVersion();
     }
 
     private PreparedStatement createReadStatement(CqlSession session) {
@@ -99,7 +102,7 @@ public class CassandraMailboxRecentsDAO {
 
     public Flux<MessageUid> getRecentMessageUidsInMailbox(CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeRows(bindWithMailbox(mailboxId, readStatement))
-            .map(row -> row.getLong(0))
+            .map(row -> TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(0), protocolVersion))
             .map(MessageUid::of);
     }
 
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 ebe0675bcc..a7bf3669c4 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
@@ -60,13 +60,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
-import org.apache.james.backends.cassandra.init.configuration.JamesExecutionProfiles;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
@@ -87,7 +85,6 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.CqlSession;
-import com.datastax.oss.driver.api.core.config.DriverExecutionProfile;
 import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
@@ -118,7 +115,6 @@ public class CassandraMessageDAOV3 {
     private final PreparedStatement select;
     private final PreparedStatement listBlobs;
     private final Cid.CidParser cidParser;
-    private final DriverExecutionProfile lwtProfile;
     private final UserDefinedType attachmentsType;
     private final TypeCodec<List<UdtValue>> attachmentCodec;
 
@@ -126,7 +122,6 @@ public class CassandraMessageDAOV3 {
     public CassandraMessageDAOV3(CqlSession session, CassandraTypesProvider typesProvider, BlobStore blobStore,
                                  BlobId.Factory blobIdFactory) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.lwtProfile = JamesExecutionProfiles.getLWTProfile(session);
         this.blobStore = blobStore;
         this.blobIdFactory = blobIdFactory;
 
@@ -207,9 +202,9 @@ public class CassandraMessageDAOV3 {
             .setString(CONTENT_MD5, message.getProperties().getContentMD5())
             .setString(CONTENT_TRANSFER_ENCODING, message.getProperties().getContentTransferEncoding())
             .setString(CONTENT_LOCATION, message.getProperties().getContentLocation())
-            .setList(CONTENT_LANGUAGE, message.getProperties().getContentLanguage(), String.class)
-            .setMap(CONTENT_DISPOSITION_PARAMETERS, message.getProperties().getContentDispositionParameters(), String.class, String.class)
-            .setMap(CONTENT_TYPE_PARAMETERS, message.getProperties().getContentTypeParameters(), String.class, String.class);
+            .set(CONTENT_LANGUAGE, message.getProperties().getContentLanguage(), LIST_OF_STRINGS_CODEC)
+            .set(CONTENT_DISPOSITION_PARAMETERS, message.getProperties().getContentDispositionParameters(), MAP_OF_STRINGS_CODEC)
+            .set(CONTENT_TYPE_PARAMETERS, message.getProperties().getContentTypeParameters(), MAP_OF_STRINGS_CODEC);
 
         if (message.getAttachments().isEmpty()) {
             return cassandraAsyncExecutor.executeVoid(boundStatement.unset(ATTACHMENTS).build());
@@ -266,9 +261,9 @@ public class CassandraMessageDAOV3 {
             .setString(CONTENT_MD5, message.getProperties().getContentMD5())
             .setString(CONTENT_TRANSFER_ENCODING, message.getProperties().getContentTransferEncoding())
             .setString(CONTENT_LOCATION, message.getProperties().getContentLocation())
-            .setList(CONTENT_LANGUAGE, message.getProperties().getContentLanguage(), String.class)
-            .setMap(CONTENT_DISPOSITION_PARAMETERS, message.getProperties().getContentDispositionParameters(), String.class, String.class)
-            .setMap(CONTENT_TYPE_PARAMETERS, message.getProperties().getContentTypeParameters(), String.class, String.class);
+            .set(CONTENT_LANGUAGE, message.getProperties().getContentLanguage(), LIST_OF_STRINGS_CODEC)
+            .set(CONTENT_DISPOSITION_PARAMETERS, message.getProperties().getContentDispositionParameters(), MAP_OF_STRINGS_CODEC)
+            .set(CONTENT_TYPE_PARAMETERS, message.getProperties().getContentTypeParameters(), MAP_OF_STRINGS_CODEC);
 
         if (message.getAttachments().isEmpty()) {
             return boundStatement.unset(ATTACHMENTS);
@@ -334,8 +329,7 @@ public class CassandraMessageDAOV3 {
     private Mono<Row> retrieveRow(CassandraMessageId messageId) {
         return cassandraAsyncExecutor.executeSingleRow(select
             .bind()
-            .setUuid(MESSAGE_ID, messageId.get())
-            .setExecutionProfile(lwtProfile));
+            .set(MESSAGE_ID, messageId.get(), TypeCodecs.TIMEUUID));
     }
 
     private Mono<MessageRepresentation> message(Row row, CassandraMessageId cassandraMessageId, FetchType fetchType) {
@@ -351,7 +345,7 @@ public class CassandraMessageDAOV3 {
                     row.getInt(BODY_START_OCTET),
                     content,
                     getProperties(row),
-                    getAttachments(row).collect(ImmutableList.toImmutableList()),
+                    getAttachments(row),
                     headerId,
                     bodyId));
     }
@@ -373,15 +367,16 @@ public class CassandraMessageDAOV3 {
         return property.build();
     }
 
-    private Stream<MessageAttachmentRepresentation> getAttachments(Row row) {
+    private List<MessageAttachmentRepresentation> getAttachments(Row row) {
         return Optional.ofNullable(row.get(ATTACHMENTS, attachmentCodec))
             .map(this::attachmentByIds)
-            .orElseGet(Stream::of);
+            .orElseGet(ImmutableList::of);
     }
 
-    private Stream<MessageAttachmentRepresentation> attachmentByIds(List<UdtValue> udtValues) {
+    private List<MessageAttachmentRepresentation> attachmentByIds(List<UdtValue> udtValues) {
         return udtValues.stream()
-            .map(this::messageAttachmentByIdFrom);
+            .map(this::messageAttachmentByIdFrom)
+            .collect(ImmutableList.toImmutableList());
     }
 
     private MessageAttachmentRepresentation messageAttachmentByIdFrom(UdtValue udtValue) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
index 9382e7a62a..4d4177811a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
@@ -50,6 +50,8 @@ import java.time.Duration;
 import java.util.Date;
 import java.util.Optional;
 import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
 
 import javax.inject.Inject;
 import javax.mail.Flags;
@@ -87,6 +89,20 @@ import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 
 public class CassandraMessageIdDAO {
+    private static class MemoizedSupplier<T> {
+        private final AtomicReference<T> value = new AtomicReference<>();
+
+        T get(Supplier<T> initializer) {
+            T result = value.get();
+            if (result == null) {
+                T initialValue = initializer.get();
+                value.set(initialValue);
+                return initialValue;
+            }
+            return result;
+        }
+    }
+
     private static final String IMAP_UID_GTE = IMAP_UID + "_GTE";
     private static final String IMAP_UID_LTE = IMAP_UID + "_LTE";
     public static final String LIMIT = "LIMIT_BIND_MARKER";
@@ -443,12 +459,17 @@ public class CassandraMessageIdDAO {
     }
 
     public Flux<MessageUid> listNotDeletedUids(CassandraId mailboxId, MessageRange range) {
+        MemoizedSupplier<Integer> deletedPosition = new MemoizedSupplier<>();
+        MemoizedSupplier<Integer> uidPosition = new MemoizedSupplier<>();
+
         return cassandraAsyncExecutor.executeRows(selectNotDeletedRange.bind()
                 .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID_GTE, range.getUidFrom().asLong())
                 .setLong(IMAP_UID_LTE, range.getUidTo().asLong()))
-            .filter(row -> !row.getBoolean(org.apache.james.mailbox.cassandra.table.Flag.DELETED))
-            .map(row -> MessageUid.of(row.getLong(IMAP_UID)));
+            .filter(row -> !TypeCodecs.BOOLEAN.decodePrimitive(
+                row.getBytesUnsafe(deletedPosition.get(() -> row.getColumnDefinitions().firstIndexOf(DELETED))), protocolVersion))
+            .map(row -> MessageUid.of(TypeCodecs.BIGINT.decodePrimitive(
+                row.getBytesUnsafe(uidPosition.get(() -> row.getColumnDefinitions().firstIndexOf(IMAP_UID))), protocolVersion)));
     }
 
     private Flux<MessageUid> doListUids(CassandraId mailboxId, MessageRange range) {
@@ -521,7 +542,7 @@ public class CassandraMessageIdDAO {
     }
 
     private Optional<CassandraMessageMetadata> fromRowToComposedMessageIdWithFlags(Row row) {
-        UUID rowAsUuid = row.getUuid(MESSAGE_ID);
+        UUID rowAsUuid = row.get(MESSAGE_ID, TypeCodecs.TIMEUUID);
         if (rowAsUuid == null) {
             // Out of order updates with concurrent deletes can result in the row being partially deleted
             // We filter out such records, and cleanup them.


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


[james-project] 10/15: [PERF] Fix tests that was timing out

Posted by bt...@apache.org.
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 10ffe707920f5850d3af3c734adefa85b5458a8e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Dec 3 11:26:06 2022 +0700

    [PERF] Fix tests that was timing out
---
 .../apache/james/mailbox/cassandra/mail/CassandraACLMapperV2Test.java | 4 ++--
 .../src/test/java/org/apache/james/CassandraCacheQueryTest.java       | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperV2Test.java
index f3e56ea0cf..16b6b2d33f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperV2Test.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperV2Test.java
@@ -85,7 +85,7 @@ class CassandraACLMapperV2Test extends CassandraACLMapperContract {
             .registerScenario(awaitOn(barrier)
                 .thenExecuteNormally()
                 .times(2)
-                .whenQueryStartsWith("SELECT * FROM eventstore WHERE aggregateid=:aggregateid"));
+                .whenQueryStartsWith("SELECT event FROM eventstore WHERE aggregateid=:aggregateid"));
 
         MailboxACL.EntryKey keyBob = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
@@ -113,7 +113,7 @@ class CassandraACLMapperV2Test extends CassandraACLMapperContract {
             .registerScenario(awaitOn(barrier)
                 .thenExecuteNormally()
                 .times(2)
-                .whenQueryStartsWith("SELECT * FROM eventstore WHERE aggregateid=:aggregateid"));
+                .whenQueryStartsWith("SELECT event FROM eventstore WHERE aggregateid=:aggregateid"));
 
         MailboxACL.EntryKey keyBob = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.EntryKey keyAlice = new MailboxACL.EntryKey("alice", MailboxACL.NameType.user, false);
diff --git a/server/apps/distributed-app/src/test/java/org/apache/james/CassandraCacheQueryTest.java b/server/apps/distributed-app/src/test/java/org/apache/james/CassandraCacheQueryTest.java
index 54ebcaae8e..f67644828f 100644
--- a/server/apps/distributed-app/src/test/java/org/apache/james/CassandraCacheQueryTest.java
+++ b/server/apps/distributed-app/src/test/java/org/apache/james/CassandraCacheQueryTest.java
@@ -141,7 +141,7 @@ class CassandraCacheQueryTest {
     @Test
     void cacheShouldBeRead() {
         assertThat(statementRecorder.listExecutedStatements(
-                StatementRecorder.Selector.preparedStatementStartingWith("SELECT * FROM blob_cache")))
+                StatementRecorder.Selector.preparedStatementStartingWith("SELECT data FROM blob_cache")))
             .isNotEmpty();
     }
 


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


[james-project] 11/15: [PERF] Improve Cassandra rows interpretation in mailbox/cassandra

Posted by bt...@apache.org.
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 63d865dda3819f3a608beeca87557a8686219ac9
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 2 12:54:47 2022 +0700

    [PERF] Improve Cassandra rows interpretation in mailbox/cassandra
---
 .../cassandra/mail/CassandraMessageIdDAO.java      | 23 +++++++++++++---------
 .../mailbox/cassandra/mail/FlagsExtractor.java     |  8 +++++++-
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
index 8e4d26823a..edb99eb80c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
@@ -70,6 +70,7 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.util.streams.Limit;
 
 import com.datastax.oss.driver.api.core.CqlSession;
+import com.datastax.oss.driver.api.core.ProtocolVersion;
 import com.datastax.oss.driver.api.core.cql.BoundStatement;
 import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
@@ -109,10 +110,13 @@ public class CassandraMessageIdDAO {
     private final PreparedStatement selectUidRangeLimited;
     private final PreparedStatement update;
     private final PreparedStatement listStatement;
+    private final ProtocolVersion protocolVersion;
 
     @Inject
     public CassandraMessageIdDAO(CqlSession session, BlobId.Factory blobIdFactory) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
+        this.protocolVersion = session.getContext().getProtocolVersion();
+
         this.blobIdFactory = blobIdFactory;
         this.delete = prepareDelete(session);
         this.insert = prepareInsert(session);
@@ -417,7 +421,7 @@ public class CassandraMessageIdDAO {
     public Flux<MessageUid> listUids(CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeRows(selectAllUids.bind()
                 .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID))
-            .map(row -> MessageUid.of(row.getLong(0)));
+            .map(row -> MessageUid.of(TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(0), protocolVersion)));
     }
 
     public Flux<ComposedMessageIdWithMetaData> listMessagesMetadata(CassandraId mailboxId, MessageRange range) {
@@ -426,21 +430,21 @@ public class CassandraMessageIdDAO {
                 .setLong(IMAP_UID_GTE, range.getUidFrom().asLong())
                 .setLong(IMAP_UID_LTE, range.getUidTo().asLong()))
             .map(row -> {
-                CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID));
+                CassandraMessageId messageId = CassandraMessageId.Factory.of(row.get(MESSAGE_ID, TypeCodecs.TIMEUUID));
                 return ComposedMessageIdWithMetaData.builder()
-                    .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
+                    .modSeq(ModSeq.of(TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(MOD_SEQ), protocolVersion)))
                     .threadId(getThreadIdFromRow(row, messageId))
                     .flags(FlagsExtractor.getFlags(row))
                     .composedMessageId(new ComposedMessageId(mailboxId,
                         messageId,
-                        MessageUid.of(row.getLong(IMAP_UID))))
+                        MessageUid.of(TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(IMAP_UID), protocolVersion))))
                     .build();
             });
     }
 
     public Flux<MessageUid> listNotDeletedUids(CassandraId mailboxId, MessageRange range) {
         return cassandraAsyncExecutor.executeRows(selectNotDeletedRange.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID_GTE, range.getUidFrom().asLong())
                 .setLong(IMAP_UID_LTE, range.getUidTo().asLong()))
             .filter(row -> !row.getBoolean(org.apache.james.mailbox.cassandra.table.Flag.DELETED))
@@ -449,10 +453,10 @@ public class CassandraMessageIdDAO {
 
     private Flux<MessageUid> doListUids(CassandraId mailboxId, MessageRange range) {
         return cassandraAsyncExecutor.executeRows(selectUidOnlyRange.bind()
-                .setUuid(MAILBOX_ID, mailboxId.asUuid())
+                .set(MAILBOX_ID, mailboxId.asUuid(), TypeCodecs.TIMEUUID)
                 .setLong(IMAP_UID_GTE, range.getUidFrom().asLong())
                 .setLong(IMAP_UID_LTE, range.getUidTo().asLong()))
-            .map(row -> MessageUid.of(row.getLong(IMAP_UID)));
+            .map(row -> MessageUid.of(TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(0), protocolVersion)));
     }
 
     public Flux<MessageUid> listUids(CassandraId mailboxId, MessageRange range) {
@@ -517,7 +521,8 @@ public class CassandraMessageIdDAO {
     }
 
     private Optional<CassandraMessageMetadata> fromRowToComposedMessageIdWithFlags(Row row) {
-        if (row.getUuid(MESSAGE_ID) == null) {
+        UUID rowAsUuid = row.getUuid(MESSAGE_ID);
+        if (rowAsUuid == null) {
             // Out of order updates with concurrent deletes can result in the row being partially deleted
             // We filter out such records, and cleanup them.
             delete(CassandraId.of(row.getUuid(MAILBOX_ID)),
@@ -526,7 +531,7 @@ public class CassandraMessageIdDAO {
                 .subscribe();
             return Optional.empty();
         }
-        final CassandraMessageId messageId = CassandraMessageId.Factory.of(row.getUuid(MESSAGE_ID));
+        CassandraMessageId messageId = CassandraMessageId.Factory.of(rowAsUuid);
         return Optional.of(CassandraMessageMetadata.builder()
             .ids(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(
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 e20871266e..10e04eb35a 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
@@ -28,17 +28,23 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.cassandra.table.Flag;
 
 import com.datastax.oss.driver.api.core.CqlIdentifier;
+import com.datastax.oss.driver.api.core.ProtocolVersion;
 import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
+import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
 
 public class FlagsExtractor {
     public static final TypeCodec<Set<String>> SET_OF_STRINGS_CODEC = CodecRegistry.DEFAULT.codecFor(setOf(TEXT));
 
     public static Flags getFlags(Row row) {
+        return getFlags(row, row.protocolVersion());
+    }
+
+    private static Flags getFlags(Row row, ProtocolVersion protocolVersion) {
         Flags flags = new Flags();
         for (CqlIdentifier cqlId : Flag.ALL_LOWERCASE) {
-            if (row.getBoolean(cqlId)) {
+            if (TypeCodecs.BOOLEAN.decodePrimitive(row.getBytesUnsafe(cqlId), protocolVersion)) {
                 flags.add(Flag.JAVAX_MAIL_FLAG.get(cqlId));
             }
         }


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


[james-project] 08/15: [PERF] Remove logger call in LockLessConcurrencyLimitingRequestThrottler

Posted by bt...@apache.org.
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 9389ca477fd5ffc901e7c5c4971b9ae6c88fc56f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 24 13:34:07 2022 +0700

    [PERF] Remove logger call in LockLessConcurrencyLimitingRequestThrottler
    
    ~10% CPU when submitting Cassandra requests, for a trace call reasonably not used in production.
---
 .../utils/LockLessConcurrencyLimitingRequestThrottler.java          | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/LockLessConcurrencyLimitingRequestThrottler.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/LockLessConcurrencyLimitingRequestThrottler.java
index 54f1b6d6c4..af3cc408e4 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/LockLessConcurrencyLimitingRequestThrottler.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/LockLessConcurrencyLimitingRequestThrottler.java
@@ -69,18 +69,14 @@ public class LockLessConcurrencyLimitingRequestThrottler implements RequestThrot
     public void register(Throttled request) {
         int requestNumber = concurrentRequests.incrementAndGet();
         if (closed) {
-            LOG.trace("[{}] Rejecting request after shutdown", logPrefix);
             fail(request, "The session is shutting down");
         } else if (requestNumber < maxConcurrentRequests) {
             // We have capacity for one more concurrent request
-            LOG.trace("[{}] Starting newly registered request", logPrefix);
             request.onThrottleReady(false);
         } else if (requestNumber < maxQueueSize + maxConcurrentRequests) {
-            LOG.trace("[{}] Enqueuing request", logPrefix);
             queue.add(request);
         } else {
             concurrentRequests.decrementAndGet();
-            LOG.trace("[{}] Rejecting request because of full queue", logPrefix);
             fail(
                 request,
                 String.format(
@@ -105,7 +101,6 @@ public class LockLessConcurrencyLimitingRequestThrottler implements RequestThrot
         if (!closed) {
             if (queue.remove(request)) { // The request timed out before it was active
                 concurrentRequests.decrementAndGet();
-                LOG.trace("[{}] Removing timed out request from the queue", logPrefix);
             } else {
                 onRequestDone();
             }
@@ -117,7 +112,6 @@ public class LockLessConcurrencyLimitingRequestThrottler implements RequestThrot
             concurrentRequests.decrementAndGet();
             Throttled throttled = queue.poll();
             if (throttled != null) {
-                LOG.trace("[{}] Starting dequeued request", logPrefix);
                 throttled.onThrottleReady(true);
                 // don't touch concurrentRequests since we finished one but started another
             }


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