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:54 UTC

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

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