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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org