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