This is an automated email from the ASF dual-hosted git repository.
hqtran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 6405128478 JAMES-4176 Retire email_query_view_sent_at
6405128478 is described below
commit 64051284789cddf59bd38229feaeeb6e123750a8
Author: Quan Tran <[email protected]>
AuthorDate: Mon Mar 2 17:21:05 2026 +0700
JAMES-4176 Retire email_query_view_sent_at
---
.../projections/CassandraEmailQueryView.java | 112 ++--------
.../CassandraEmailQueryViewDataDefinition.java | 17 +-
.../table/CassandraEmailQueryViewTable.java | 2 -
.../projections/PostgresEmailQueryView.java | 14 +-
.../projections/PostgresEmailQueryViewDAO.java | 25 +--
.../PostgresEmailQueryViewDataDefinition.java | 7 -
.../PostgresEmailQueryViewManagerRLSTest.java | 5 +-
.../james/jmap/api/projections/EmailQueryView.java | 51 +----
.../memory/projections/MemoryEmailQueryView.java | 29 +--
.../api/projections/EmailQueryViewContract.java | 244 +++------------------
.../jmap/event/PopulateEmailQueryViewListener.java | 28 +--
.../james/jmap/method/EmailQueryMethod.scala | 17 --
.../event/PopulateEmailQueryViewListenerTest.java | 14 +-
.../data/jmap/EmailQueryViewPopulator.java | 20 +-
.../PopulateEmailQueryViewRequestToTaskTest.java | 6 +-
15 files changed, 73 insertions(+), 518 deletions(-)
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 58bd2b3178..614ccc2748 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
@@ -28,9 +28,7 @@ import static
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQu
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.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 static
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.THREAD_ID;
import java.time.Instant;
@@ -66,19 +64,14 @@ public class CassandraEmailQueryView implements
EmailQueryView {
private static final String LIMIT_MARKER = "LIMIT_BIND_MARKER";
private final CassandraAsyncExecutor executor;
- private final PreparedStatement listMailboxContentBySentAt;
private final PreparedStatement listMailboxContentByReceivedAt;
- private final PreparedStatement listMailboxContentSinceSentAt;
private final PreparedStatement listMailboxContentSinceReceivedAt;
private final PreparedStatement listMailboxContentBeforeReceivedAt;
private final PreparedStatement insertInLookupTable;
private final PreparedStatement insertReceivedAt;
- private final PreparedStatement insertSentAt;
private final PreparedStatement deleteLookupRecord;
- private final PreparedStatement deleteSentAt;
private final PreparedStatement deleteReceivedAt;
private final PreparedStatement deleteAllLookupRecords;
- private final PreparedStatement deleteAllSentAt;
private final PreparedStatement deleteAllReceivedAt;
private final PreparedStatement lookupDate;
@@ -86,13 +79,6 @@ public class CassandraEmailQueryView implements
EmailQueryView {
public CassandraEmailQueryView(CqlSession session) {
this.executor = new CassandraAsyncExecutor(session);
- listMailboxContentBySentAt =
session.prepare(selectFrom(TABLE_NAME_SENT_AT)
- .columns(MESSAGE_ID, SENT_AT, THREAD_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)
.columns(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
.whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
@@ -100,16 +86,8 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.limit(bindMarker(LIMIT_MARKER))
.build());
- listMailboxContentSinceSentAt =
session.prepare(selectFrom(TABLE_NAME_SENT_AT)
- .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
- .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
- .whereColumn(SENT_AT).isGreaterThanOrEqualTo(bindMarker(SENT_AT))
- .orderBy(SENT_AT, DESC)
- .limit(bindMarker(LIMIT_MARKER))
- .build());
-
listMailboxContentSinceReceivedAt =
session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
- .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
+ .columns(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
.whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
.whereColumn(RECEIVED_AT).isGreaterThanOrEqualTo(bindMarker(RECEIVED_AT))
.orderBy(RECEIVED_AT, DESC)
@@ -117,7 +95,7 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.build());
listMailboxContentBeforeReceivedAt =
session.prepare(selectFrom(TABLE_NAME_RECEIVED_AT)
- .columns(MESSAGE_ID, SENT_AT, THREAD_ID)
+ .columns(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
.whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
.whereColumn(RECEIVED_AT).isLessThanOrEqualTo(bindMarker(RECEIVED_AT))
.orderBy(RECEIVED_AT, DESC)
@@ -127,22 +105,13 @@ public class CassandraEmailQueryView implements
EmailQueryView {
insertInLookupTable = session.prepare(insertInto(DATE_LOOKUP_TABLE)
.value(MAILBOX_ID, bindMarker(MAILBOX_ID))
.value(MESSAGE_ID, bindMarker(MESSAGE_ID))
- .value(SENT_AT, bindMarker(SENT_AT))
.value(RECEIVED_AT, bindMarker(RECEIVED_AT))
.build());
- insertSentAt = session.prepare(insertInto(TABLE_NAME_SENT_AT)
- .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
- .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
- .value(SENT_AT, bindMarker(SENT_AT))
- .value(THREAD_ID, bindMarker(THREAD_ID))
- .build());
-
insertReceivedAt = session.prepare(insertInto(TABLE_NAME_RECEIVED_AT)
.value(MAILBOX_ID, bindMarker(MAILBOX_ID))
.value(MESSAGE_ID, bindMarker(MESSAGE_ID))
.value(RECEIVED_AT, bindMarker(RECEIVED_AT))
- .value(SENT_AT, bindMarker(SENT_AT))
.value(THREAD_ID, bindMarker(THREAD_ID))
.build());
@@ -151,12 +120,6 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
.build());
- deleteSentAt = session.prepare(deleteFrom(TABLE_NAME_SENT_AT)
- .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
- .whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
- .whereColumn(SENT_AT).isEqualTo(bindMarker(SENT_AT))
- .build());
-
deleteReceivedAt =
session.prepare(QueryBuilder.deleteFrom(TABLE_NAME_RECEIVED_AT)
.whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
.whereColumn(MESSAGE_ID).isEqualTo(bindMarker(MESSAGE_ID))
@@ -167,10 +130,6 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
.build());
- deleteAllSentAt =
session.prepare(QueryBuilder.deleteFrom(TABLE_NAME_SENT_AT)
- .whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
- .build());
-
deleteAllReceivedAt =
session.prepare(QueryBuilder.deleteFrom(TABLE_NAME_RECEIVED_AT)
.whereColumn(MAILBOX_ID).isEqualTo(bindMarker(MAILBOX_ID))
.build());
@@ -182,17 +141,6 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.build());
}
- @Override
- public Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
- CassandraId cassandraId = (CassandraId) mailboxId;
-
- return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
- .resolve(backendFetchLimit ->
executor.executeRows(listMailboxContentBySentAt.bind()
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
- .setInt(LIMIT_MARKER, backendFetchLimit.getLimit().get()))
- .map(asEmailEntry(SENT_AT)));
- }
-
@Override
public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
CassandraId cassandraId = (CassandraId) mailboxId;
@@ -213,7 +161,7 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
.setInstant(RECEIVED_AT, since.toInstant())
.setInt(LIMIT_MARKER, backendFetchLimit.getLimit().get()))
- .map(asEmailEntry(SENT_AT)));
+ .map(asEmailEntry(RECEIVED_AT)));
}
@Override
@@ -225,19 +173,7 @@ public class CassandraEmailQueryView implements
EmailQueryView {
.set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
.setInstant(RECEIVED_AT, since.toInstant())
.setInt(LIMIT_MARKER,
backendFetchLimit.getLimit().get()))
- .map(asEmailEntry(SENT_AT)));
- }
-
- @Override
- public Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId,
ZonedDateTime since, Limit limit, boolean collapseThreads) {
- CassandraId cassandraId = (CassandraId) mailboxId;
-
- return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
- .resolve(backendFetchLimit ->
executor.executeRows(listMailboxContentSinceSentAt.bind()
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
- .setInstant(SENT_AT, since.toInstant())
- .setInt(LIMIT_MARKER, backendFetchLimit.getLimit().get()))
- .map(asEmailEntry(SENT_AT)));
+ .map(asEmailEntry(RECEIVED_AT)));
}
private Function<Row, EmailEntry> asEmailEntry(CqlIdentifier dateField) {
@@ -264,17 +200,11 @@ public class CassandraEmailQueryView implements
EmailQueryView {
public Mono<? extends Void> doDelete(CassandraMessageId
cassandraMessageId, CassandraId cassandraId, Row row) {
Instant receivedAt = row.getInstant(RECEIVED_AT);
- Instant sentAt = row.getInstant(SENT_AT);
- return Flux.concat(
- executor.executeVoid(deleteSentAt.bind()
+ return executor.executeVoid(deleteReceivedAt.bind()
.set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
.setUuid(MESSAGE_ID, cassandraMessageId.get())
- .setInstant(SENT_AT, sentAt)),
- executor.executeVoid(deleteReceivedAt.bind()
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
- .setUuid(MESSAGE_ID, cassandraMessageId.get())
- .setInstant(RECEIVED_AT, receivedAt)))
+ .setInstant(RECEIVED_AT, receivedAt))
.then(executor.executeVoid(deleteLookupRecord.bind()
.set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
.setUuid(MESSAGE_ID, cassandraMessageId.get())));
@@ -284,37 +214,25 @@ public class CassandraEmailQueryView implements
EmailQueryView {
public Mono<Void> delete(MailboxId mailboxId) {
CassandraId cassandraId = (CassandraId) mailboxId;
- return Flux.concat(
- executor.executeVoid(deleteAllSentAt.bind()
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)),
- executor.executeVoid(deleteAllReceivedAt.bind()
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)))
+ return executor.executeVoid(deleteAllReceivedAt.bind()
+ .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID))
.then(executor.executeVoid(deleteAllLookupRecords.bind()
.setUuid(MAILBOX_ID, ((CassandraId) mailboxId).asUuid())));
}
@Override
- public Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt,
ZonedDateTime receivedAt, MessageId messageId, ThreadId threadId) {
+ public Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt,
MessageId messageId, ThreadId threadId) {
CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId;
CassandraId cassandraId = (CassandraId) mailboxId;
return executor.executeVoid(insertInLookupTable.bind()
.setUuid(MESSAGE_ID, cassandraMessageId.get())
.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())
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
- .setInstant(SENT_AT, sentAt.toInstant())
- .setUuid(THREAD_ID, ((CassandraMessageId)
threadId.getBaseMessageId()).get())),
- executor.executeVoid(insertReceivedAt.bind()
- .setUuid(MESSAGE_ID, cassandraMessageId.get())
- .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
- .setInstant(RECEIVED_AT, receivedAt.toInstant())
- .setInstant(SENT_AT, sentAt.toInstant())
- .setUuid(THREAD_ID, ((CassandraMessageId)
threadId.getBaseMessageId()).get())))
- .then());
+ .setInstant(RECEIVED_AT, receivedAt.toInstant()))
+ .then(executor.executeVoid(insertReceivedAt.bind()
+ .setUuid(MESSAGE_ID, cassandraMessageId.get())
+ .set(MAILBOX_ID, cassandraId.asUuid(), TypeCodecs.UUID)
+ .setInstant(RECEIVED_AT, receivedAt.toInstant())
+ .setUuid(THREAD_ID, ((CassandraMessageId)
threadId.getBaseMessageId()).get())));
}
}
diff --git
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
index 195f775eb2..56fed840fd 100644
---
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
+++
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewDataDefinition.java
@@ -26,9 +26,7 @@ import static
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQu
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.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 static
org.apache.james.jmap.cassandra.projections.table.CassandraEmailQueryViewTable.THREAD_ID;
import org.apache.james.backends.cassandra.components.CassandraDataDefinition;
@@ -36,18 +34,7 @@ import
org.apache.james.backends.cassandra.components.CassandraDataDefinition;
import com.datastax.oss.driver.api.core.type.DataTypes;
public interface CassandraEmailQueryViewDataDefinition {
- CassandraDataDefinition MODULE =
CassandraDataDefinition.table(TABLE_NAME_SENT_AT)
- .comment("Storing the JMAP projections for list of emails within a
mailbox to not rely on OpenSearch for basic Email/query (sorts sentAt).")
- .options(options -> options
- .withClusteringOrder(SENT_AT, DESC)
- .withCaching(true, rows(DEFAULT_CACHED_ROW_PER_PARTITION)))
- .statement(statement -> types -> statement
- .withPartitionKey(MAILBOX_ID, DataTypes.UUID)
- .withClusteringColumn(SENT_AT, DataTypes.TIMESTAMP)
- .withClusteringColumn(MESSAGE_ID, DataTypes.UUID)
- .withColumn(THREAD_ID, DataTypes.UUID))
-
- .table(TABLE_NAME_RECEIVED_AT)
+ CassandraDataDefinition MODULE =
CassandraDataDefinition.table(TABLE_NAME_RECEIVED_AT)
.comment("Storing the JMAP projections for list of emails within a
mailbox to not rely on OpenSearch for basic Email/query (sorts and filter on
receivedAt).")
.options(options -> options
.withClusteringOrder(RECEIVED_AT, DESC)
@@ -56,7 +43,6 @@ public interface CassandraEmailQueryViewDataDefinition {
.withPartitionKey(MAILBOX_ID, DataTypes.UUID)
.withClusteringColumn(RECEIVED_AT, DataTypes.TIMESTAMP)
.withClusteringColumn(MESSAGE_ID, DataTypes.UUID)
- .withColumn(SENT_AT, DataTypes.TIMESTAMP)
.withColumn(THREAD_ID, DataTypes.UUID))
.table(DATE_LOOKUP_TABLE)
@@ -66,7 +52,6 @@ public interface CassandraEmailQueryViewDataDefinition {
.statement(statement -> types -> statement
.withPartitionKey(MAILBOX_ID, DataTypes.UUID)
.withClusteringColumn(MESSAGE_ID, DataTypes.UUID)
- .withColumn(SENT_AT, DataTypes.TIMESTAMP)
.withColumn(RECEIVED_AT, DataTypes.TIMESTAMP))
.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 a7ccea8f1b..3629752f2d 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
@@ -22,13 +22,11 @@ package org.apache.james.jmap.cassandra.projections.table;
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";
CqlIdentifier MAILBOX_ID = CqlIdentifier.fromCql("mailboxId");
CqlIdentifier MESSAGE_ID = CqlIdentifier.fromCql("messageId");
CqlIdentifier RECEIVED_AT = CqlIdentifier.fromCql("receivedAt");
- CqlIdentifier SENT_AT = CqlIdentifier.fromCql("sentAt");
CqlIdentifier THREAD_ID = CqlIdentifier.fromCql("thread_id");
}
diff --git
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
index 503b2418f8..585a4baba8 100644
---
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
+++
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java
@@ -42,11 +42,6 @@ public class PostgresEmailQueryView implements
EmailQueryView {
this.emailQueryViewDAO = emailQueryViewDAO;
}
- @Override
- public Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
- return
emailQueryViewDAO.listMailboxContentSortedBySentAt(PostgresMailboxId.class.cast(mailboxId),
limit, collapseThreads);
- }
-
@Override
public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
return
emailQueryViewDAO.listMailboxContentSortedByReceivedAt(PostgresMailboxId.class.cast(mailboxId),
limit, collapseThreads);
@@ -62,11 +57,6 @@ public class PostgresEmailQueryView implements
EmailQueryView {
return
emailQueryViewDAO.listMailboxContentBeforeSortedByReceivedAt(PostgresMailboxId.class.cast(mailboxId),
since, limit, collapseThreads);
}
- @Override
- public Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId,
ZonedDateTime since, Limit limit, boolean collapseThreads) {
- return
emailQueryViewDAO.listMailboxContentSinceSentAt(PostgresMailboxId.class.cast(mailboxId),
since, limit, collapseThreads);
- }
-
@Override
public Mono<Void> delete(MailboxId mailboxId, MessageId messageId) {
return
emailQueryViewDAO.delete(PostgresMailboxId.class.cast(mailboxId),
PostgresMessageId.class.cast(messageId));
@@ -78,7 +68,7 @@ public class PostgresEmailQueryView implements EmailQueryView
{
}
@Override
- public Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt,
ZonedDateTime receivedAt, MessageId messageId, ThreadId threadId) {
- return emailQueryViewDAO.save(PostgresMailboxId.class.cast(mailboxId),
sentAt, receivedAt, PostgresMessageId.class.cast(messageId), threadId);
+ public Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt,
MessageId messageId, ThreadId threadId) {
+ return emailQueryViewDAO.save(PostgresMailboxId.class.cast(mailboxId),
receivedAt, PostgresMessageId.class.cast(messageId), threadId);
}
}
diff --git
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
index aa49bfd174..032d00c41e 100644
---
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
+++
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java
@@ -23,7 +23,6 @@ import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewD
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MESSAGE_ID;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.PK_CONSTRAINT_NAME;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.RECEIVED_AT;
-import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.SENT_AT;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.TABLE_NAME;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.THREAD_ID;
@@ -58,16 +57,6 @@ public class PostgresEmailQueryViewDAO {
this.postgresExecutor = postgresExecutor;
}
- public Flux<MessageId> listMailboxContentSortedBySentAt(PostgresMailboxId
mailboxId, Limit limit, boolean collapseThreads) {
- return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
- .resolve(backendFetchLimit ->
postgresExecutor.executeRows(dslContext ->
Flux.from(dslContext.select(MESSAGE_ID, SENT_AT, THREAD_ID)
- .from(TABLE_NAME)
- .where(MAILBOX_ID.eq(mailboxId.asUuid()))
- .orderBy(SENT_AT.desc())
- .limit(backendFetchLimit.getLimit().get())))
- .map(asEmailEntry(SENT_AT)));
- }
-
public Flux<MessageId>
listMailboxContentSortedByReceivedAt(PostgresMailboxId mailboxId, Limit limit,
boolean collapseThreads) {
return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
.resolve(backendFetchLimit ->
postgresExecutor.executeRows(dslContext ->
Flux.from(dslContext.select(MESSAGE_ID, RECEIVED_AT, THREAD_ID)
@@ -100,17 +89,6 @@ public class PostgresEmailQueryViewDAO {
.map(asEmailEntry(RECEIVED_AT)));
}
- public Flux<MessageId> listMailboxContentSinceSentAt(PostgresMailboxId
mailboxId, ZonedDateTime since, Limit limit, boolean collapseThreads) {
- return EmailQueryViewUtils.QueryViewExtender.of(limit, collapseThreads)
- .resolve(backendFetchLimit ->
postgresExecutor.executeRows(dslContext ->
Flux.from(dslContext.select(MESSAGE_ID, SENT_AT, THREAD_ID)
- .from(TABLE_NAME)
- .where(MAILBOX_ID.eq(mailboxId.asUuid()))
- .and(SENT_AT.greaterOrEqual(since.toOffsetDateTime()))
- .orderBy(SENT_AT.desc())
- .limit(backendFetchLimit.getLimit().get())))
- .map(asEmailEntry(SENT_AT)));
- }
-
private Function<Record, EmailEntry> asEmailEntry(Field<OffsetDateTime>
dateField) {
return (Record record) -> {
PostgresMessageId messageId =
PostgresMessageId.Factory.of(record.get(MESSAGE_ID));
@@ -133,11 +111,10 @@ public class PostgresEmailQueryViewDAO {
.where(MAILBOX_ID.eq(mailboxId.asUuid()))));
}
- public Mono<Void> save(PostgresMailboxId mailboxId, ZonedDateTime sentAt,
ZonedDateTime receivedAt, PostgresMessageId messageId, ThreadId threadId) {
+ public Mono<Void> save(PostgresMailboxId mailboxId, ZonedDateTime
receivedAt, PostgresMessageId messageId, ThreadId threadId) {
return postgresExecutor.executeVoid(dslContext ->
Mono.from(dslContext.insertInto(TABLE_NAME)
.set(MAILBOX_ID, mailboxId.asUuid())
.set(MESSAGE_ID, messageId.asUuid())
- .set(SENT_AT, sentAt.toOffsetDateTime())
.set(RECEIVED_AT, receivedAt.toOffsetDateTime())
.set(THREAD_ID, ((PostgresMessageId)
threadId.getBaseMessageId()).asUuid())
.onConflictOnConstraint(PK_CONSTRAINT_NAME)
diff --git
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
index d023576f51..689c499154 100644
---
a/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
+++
b/server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDataDefinition.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.postgres.projections;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MAILBOX_ID_INDEX;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MAILBOX_ID_RECEIVED_AT_INDEX;
-import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.MAILBOX_ID_SENT_AT_INDEX;
import static
org.apache.james.jmap.postgres.projections.PostgresEmailQueryViewDataDefinition.PostgresEmailQueryViewTable.TABLE;
import java.time.OffsetDateTime;
@@ -45,7 +44,6 @@ public interface PostgresEmailQueryViewDataDefinition {
Field<UUID> MAILBOX_ID = DSL.field("mailbox_id",
SQLDataType.UUID.notNull());
Field<UUID> MESSAGE_ID = PostgresMessageDataDefinition.MESSAGE_ID;
Field<OffsetDateTime> RECEIVED_AT = DSL.field("received_at",
SQLDataType.TIMESTAMPWITHTIMEZONE.notNull());
- Field<OffsetDateTime> SENT_AT = DSL.field("sent_at",
SQLDataType.TIMESTAMPWITHTIMEZONE.notNull());
Field<UUID> THREAD_ID =
PostgresMessageDataDefinition.MessageToMailboxTable.THREAD_ID;
Name PK_CONSTRAINT_NAME = DSL.name("email_query_view_pkey");
@@ -55,7 +53,6 @@ public interface PostgresEmailQueryViewDataDefinition {
.column(MAILBOX_ID)
.column(MESSAGE_ID)
.column(RECEIVED_AT)
- .column(SENT_AT)
.column(THREAD_ID)
.constraint(DSL.constraint(PK_CONSTRAINT_NAME).primaryKey(MAILBOX_ID,
MESSAGE_ID))))
.supportsRowLevelSecurity()
@@ -69,15 +66,11 @@ public interface PostgresEmailQueryViewDataDefinition {
.createIndexStep((dslContext, indexName) ->
dslContext.createIndexIfNotExists(indexName)
.on(TABLE_NAME, MAILBOX_ID, RECEIVED_AT));
- PostgresIndex MAILBOX_ID_SENT_AT_INDEX =
PostgresIndex.name("email_query_view_mailbox_id_sent_at_index")
- .createIndexStep((dslContext, indexName) ->
dslContext.createIndexIfNotExists(indexName)
- .on(TABLE_NAME, MAILBOX_ID, SENT_AT));
}
PostgresDataDefinition MODULE = PostgresDataDefinition.builder()
.addTable(TABLE)
.addIndex(MAILBOX_ID_INDEX)
.addIndex(MAILBOX_ID_RECEIVED_AT_INDEX)
- .addIndex(MAILBOX_ID_SENT_AT_INDEX)
.build();
}
\ No newline at end of file
diff --git
a/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
b/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
index 695bc78a92..8d83367b6b 100644
---
a/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
+++
b/server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java
@@ -39,7 +39,6 @@ public class PostgresEmailQueryViewManagerRLSTest {
public static final PostgresMessageId.Factory MESSAGE_ID_FACTORY = new
PostgresMessageId.Factory();
public static final PostgresMessageId MESSAGE_ID_1 =
MESSAGE_ID_FACTORY.generate();
public static final ThreadId THREAD_ID_1 =
ThreadId.fromBaseMessageId(MESSAGE_ID_FACTORY.generate());
- private static final ZonedDateTime DATE_1 =
ZonedDateTime.parse("2010-10-30T15:12:00Z");
private static final ZonedDateTime DATE_2 =
ZonedDateTime.parse("2010-10-30T16:12:00Z");
private static final boolean NO_COLLAPSE_THREAD = false;
@@ -57,7 +56,7 @@ public class PostgresEmailQueryViewManagerRLSTest {
void emailQueryViewCanBeAccessedAtTheDataLevelByMembersOfTheSameDomain() {
Username username = Username.of("alice@domain1");
- emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1,
DATE_1, DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
+ emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1,
DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
assertThat(emailQueryViewManager.getEmailQueryView(username).listMailboxContentSortedByReceivedAt(MAILBOX_ID_1,
Limit.limit(1), NO_COLLAPSE_THREAD).collectList().block())
.isNotEmpty();
@@ -68,7 +67,7 @@ public class PostgresEmailQueryViewManagerRLSTest {
Username username = Username.of("alice@domain1");
Username username2 = Username.of("bob@domain2");
- emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1,
DATE_1, DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
+ emailQueryViewManager.getEmailQueryView(username).save(MAILBOX_ID_1,
DATE_2, MESSAGE_ID_1, THREAD_ID_1).block();
assertThat(emailQueryViewManager.getEmailQueryView(username2).listMailboxContentSortedByReceivedAt(MAILBOX_ID_1,
Limit.limit(1), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
diff --git
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
index a561b25ed3..d0a1720181 100644
---
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
+++
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java
@@ -34,14 +34,12 @@ public interface EmailQueryView {
class Entry {
private final MailboxId mailboxId;
private final MessageId messageId;
- private final ZonedDateTime sentAt;
private final ZonedDateTime receivedAt;
private final ThreadId threadId;
- public Entry(MailboxId mailboxId, MessageId messageId, ZonedDateTime
sentAt, ZonedDateTime receivedAt, ThreadId threadId) {
+ public Entry(MailboxId mailboxId, MessageId messageId, ZonedDateTime
receivedAt, ThreadId threadId) {
this.mailboxId = mailboxId;
this.messageId = messageId;
- this.sentAt = sentAt;
this.receivedAt = receivedAt;
this.threadId = threadId;
}
@@ -54,10 +52,6 @@ public interface EmailQueryView {
return messageId;
}
- public ZonedDateTime getSentAt() {
- return sentAt;
- }
-
public ZonedDateTime getReceivedAt() {
return receivedAt;
}
@@ -73,7 +67,6 @@ public interface EmailQueryView {
return Objects.equals(this.mailboxId, entry.mailboxId)
&& Objects.equals(this.messageId, entry.messageId)
- && Objects.equals(this.sentAt, entry.sentAt)
&& Objects.equals(this.receivedAt, entry.receivedAt)
&& Objects.equals(this.threadId, entry.threadId);
}
@@ -82,37 +75,10 @@ public interface EmailQueryView {
@Override
public final int hashCode() {
- return Objects.hash(mailboxId, messageId, sentAt, receivedAt,
threadId);
+ return Objects.hash(mailboxId, messageId, receivedAt, threadId);
}
}
- /**
- *
- * Sample JMAP requests:
- *
- * - RFC-8621:
- *
- * ["Email/query",
- * {
- * "accountId":
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
- * "filter: {
- * "inMailbox":"abcd"
- * }
- * "sort": [{
- * "property":"sentAt",
- * "isAscending": false
- * }]
- * },
- * "c1"]
- *
- * - Draft
- *
- * [["getMessageList", {"filter":{"inMailboxes": ["abcd"]}, "sort":
["date desc"]}, "#0"]]
- *
- * @return messageIds of the messages in this mailbox, sorted by sentAt.
- */
- Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId mailboxId,
Limit limit, boolean collapseThreads);
-
/**
*
* Sample JMAP requests:
@@ -182,20 +148,9 @@ public interface EmailQueryView {
*/
Flux<MessageId> listMailboxContentBeforeSortedByReceivedAt(MailboxId
mailboxId, ZonedDateTime since, Limit limit, boolean collapseThreads);
- /**
- * Sample JMAP requests:
- *
- * - Draft
- *
- * [["getMessageList", {"filter":{"after":"aDate", "inMailboxes":
["abcd"]}, "sort": ["date desc"]}, "#0"]]
- *
- * @return messageIds of the messages in this mailbox, sorted by sentAt,
since being sentAt
- */
- Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId,
ZonedDateTime since, Limit limit, boolean collapseThreads);
-
Mono<Void> delete(MailboxId mailboxId, MessageId messageId);
Mono<Void> delete(MailboxId mailboxId);
- Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt, ZonedDateTime
receivedAt, MessageId messageId, ThreadId threadId);
+ Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt, MessageId
messageId, ThreadId threadId);
}
diff --git
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
index 88cfdbd002..dd649a4345 100644
---
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
+++
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java
@@ -48,32 +48,9 @@ public class MemoryEmailQueryView implements EmailQueryView {
}
@Override
- public Flux<MessageId> listMailboxContentSortedBySentAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
- Preconditions.checkArgument(!limit.isUnlimited(), "Limit should be
defined");
-
- Flux<Entry> baseEntries =
Flux.fromIterable(entries.row(mailboxId).values());
-
- return maybeCollapseThreads(Entry::getSentAt,
collapseThreads).apply(baseEntries)
- .sort(Comparator.comparing(Entry::getSentAt).reversed())
- .map(Entry::getMessageId)
- .take(limit.getLimit().get());
- }
-
- @Override
- public Flux<MessageId> listMailboxContentSinceSentAt(MailboxId mailboxId,
ZonedDateTime since, Limit limit, boolean collapseThreads) {
+ public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
Preconditions.checkArgument(!limit.isUnlimited(), "Limit should be
defined");
- Flux<Entry> baseEntries =
Flux.fromIterable(entries.row(mailboxId).values())
- .filter(e -> e.getSentAt().isAfter(since) ||
e.getSentAt().isEqual(since));
-
- return maybeCollapseThreads(Entry::getSentAt,
collapseThreads).apply(baseEntries)
- .sort(Comparator.comparing(Entry::getSentAt).reversed())
- .map(Entry::getMessageId)
- .take(limit.getLimit().get());
- }
-
- @Override
- public Flux<MessageId> listMailboxContentSortedByReceivedAt(MailboxId
mailboxId, Limit limit, boolean collapseThreads) {
Flux<Entry> baseEntries =
Flux.fromIterable(entries.row(mailboxId).values());
return maybeCollapseThreads(Entry::getReceivedAt,
collapseThreads).apply(baseEntries)
@@ -126,7 +103,7 @@ public class MemoryEmailQueryView implements EmailQueryView
{
}
@Override
- public Mono<Void> save(MailboxId mailboxId, ZonedDateTime sentAt,
ZonedDateTime receivedAt, MessageId messageId, ThreadId threadId) {
- return Mono.fromRunnable(() -> entries.put(mailboxId, messageId, new
Entry(mailboxId, messageId, sentAt, receivedAt, threadId)));
+ public Mono<Void> save(MailboxId mailboxId, ZonedDateTime receivedAt,
MessageId messageId, ThreadId threadId) {
+ return Mono.fromRunnable(() -> entries.put(mailboxId, messageId, new
Entry(mailboxId, messageId, receivedAt, threadId)));
}
}
diff --git
a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
index ab62b44170..d7d799daaa 100644
---
a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
+++
b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.api.projections;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.time.ZonedDateTime;
@@ -33,13 +32,11 @@ import org.junit.jupiter.api.Test;
public interface EmailQueryViewContract {
boolean COLLAPSE_THREAD = true;
- ZonedDateTime DATE_1 = ZonedDateTime.parse("2010-10-30T15:12:00Z");
ZonedDateTime DATE_2 = ZonedDateTime.parse("2010-10-30T16:12:00Z");
ZonedDateTime DATE_3 = ZonedDateTime.parse("2010-10-30T17:12:00Z");
ZonedDateTime DATE_4 = ZonedDateTime.parse("2010-10-30T18:12:00Z");
ZonedDateTime DATE_5 = ZonedDateTime.parse("2010-10-30T19:12:00Z");
ZonedDateTime DATE_6 = ZonedDateTime.parse("2010-10-30T20:12:00Z");
- ZonedDateTime DATE_7 = ZonedDateTime.parse("2010-10-30T21:12:00Z");
EmailQueryView testee();
@@ -54,138 +51,16 @@ public interface EmailQueryViewContract {
MessageId messageId4();
ThreadId threadId1();
-
- ThreadId threadId2();
-
- ThreadId threadId3();
-
- @Test
- default void listMailboxContentShouldReturnEmptyByDefault() {
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .isEmpty();
- }
-
- @Test
- default void listMailboxContentShouldBeOrderedBySentAt() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId2(), messageId3(), messageId1());
- }
-
- @Test
- default void listMailboxContentShouldApplyLimit() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(2), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId2(), messageId3());
- }
-
- @Test
- default void listMailboxContentSinceSentdAtShouldExcludeTooOldItems() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_2, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId3(), messageId2());
- }
-
- @Test
- default void listMailboxContentSinceSentAtAtShouldApplyLimit() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_1, Limit.limit(2), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId3(), messageId2());
- }
-
- @Test
- default void listMailboxContentSinceSentAtShouldReturnEmptyWhenNoneMatch()
{
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_7, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .isEmpty();
- }
-
- @Test
- default void listMailboxContentShouldNotReturnClearedContent() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(),
threadId1()).block();
-
- testee().delete(mailboxId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .isEmpty();
- }
-
- @Test
- default void listMailboxContentShouldNotReturnDeletedContent() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(),
threadId1()).block();
-
- testee().delete(mailboxId1(), messageId2()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId3(), messageId1());
- }
-
- @Test
- default void listMailboxContentSinceSentAtShouldNotReturnClearedContent() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
-
- testee().delete(mailboxId1()).block();
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_4, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .isEmpty();
- }
-
- @Test
- default void saveShouldBeIdempotent() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId1());
- }
-
- @Test
- default void datesCanBeDuplicated() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId2(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .containsExactlyInAnyOrder(messageId1(), messageId2());
- }
-
- @Test
- default void listMailboxContentSinceSentAtShouldNotReturnDeletedContent() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
-
- testee().delete(mailboxId1(), messageId2()).block();
+ ThreadId threadId2();
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_3, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId3());
- }
+ ThreadId threadId3();
@Test
default void
listMailboxContentSortedByReceivedAtShouldBeSortedByReceivedAt() {
- testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
assertThat(testee().listMailboxContentSortedByReceivedAt(mailboxId1(),
Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId3(), messageId1(), messageId2());
@@ -193,9 +68,9 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentSinceSortedByReceivedAtShouldBeSortedByReceivedAt() {
- testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
assertThat(testee().listMailboxContentSinceAfterSortedByReceivedAt(mailboxId1(),
DATE_4, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId3(), messageId1());
@@ -203,9 +78,9 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentBeforeSortedByReceivedAtShouldBeSortedByReceivedAt() {
- testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
assertThat(testee().listMailboxContentBeforeSortedByReceivedAt(mailboxId1(),
DATE_4, Limit.limit(12), !COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId1(), messageId2());
@@ -221,66 +96,11 @@ public interface EmailQueryViewContract {
assertThatCode(() -> testee().delete(mailboxId1(),
messageId4()).block()).doesNotThrowAnyException();
}
- @Test
- default void listMailboxContentShouldThrowOnUndefinedLimit() {
- assertThatThrownBy(() ->
testee().listMailboxContentSortedBySentAt(mailboxId1(), Limit.unlimited(),
!COLLAPSE_THREAD).blockLast())
- .isInstanceOf(IllegalArgumentException.class);
- }
-
- @Test
- default void listMailboxContentSinceSentAtShouldThrowOnUndefinedLimit() {
- assertThatThrownBy(() ->
testee().listMailboxContentSinceSentAt(mailboxId1(), DATE_3, Limit.unlimited(),
!COLLAPSE_THREAD).blockLast())
- .isInstanceOf(IllegalArgumentException.class);
- }
-
-
- @Test
- default void
listMailboxContentSortedBySentAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
{
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(12), COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId2());
- }
-
- @Test
- default void
listMailboxContentSortedBySentAtShouldApplyLimitWithCollapseThreads() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId2()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_6, messageId3(),
threadId3()).block();
- testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSortedBySentAt(mailboxId1(),
Limit.limit(2), COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId4(), messageId3());
- }
-
- @Test
- default void
listMailboxContentSinceSentdAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
{
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_2, Limit.limit(12), COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId3());
- }
-
- @Test
- default void
listMailboxContentSinceSentAtShouldApplyLimitWithCollapseThreads() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId2()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId3()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(),
threadId1()).block();
-
- assertThat(testee().listMailboxContentSinceSentAt(mailboxId1(),
DATE_1, Limit.limit(2), COLLAPSE_THREAD).collectList().block())
- .containsExactly(messageId3(), messageId2());
- }
-
@Test
default void
listMailboxContentSortedByReceivedAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
{
- testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
assertThat(testee().listMailboxContentSortedByReceivedAt(mailboxId1(),
Limit.limit(12), COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId3());
@@ -288,10 +108,10 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentSortedByReceivedAtShouldApplyLimitWithCollapseThreads() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId2()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId3()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_2, messageId1(), threadId2()).block();
+ testee().save(mailboxId1(), DATE_4, messageId2(), threadId3()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_5, messageId4(), threadId1()).block();
assertThat(testee().listMailboxContentSortedByReceivedAt(mailboxId1(),
Limit.limit(2), COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId3(), messageId2());
@@ -299,9 +119,9 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentSinceSortedByReceivedAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
{
- testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
assertThat(testee().listMailboxContentSinceAfterSortedByReceivedAt(mailboxId1(),
DATE_4, Limit.limit(12), COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId3());
@@ -309,10 +129,10 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentSinceSortedByReceivedAtShouldApplyLimitWithCollapseThreads() {
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId2()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId3()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_2, messageId1(), threadId2()).block();
+ testee().save(mailboxId1(), DATE_4, messageId2(), threadId3()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_5, messageId4(), threadId1()).block();
assertThat(testee().listMailboxContentSinceAfterSortedByReceivedAt(mailboxId1(),
DATE_4, Limit.limit(2), COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId3(), messageId2());
@@ -320,9 +140,9 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentBeforeSortedByReceivedAtShouldReturnLatestMessageOfThreadWhenCollapseThreads()
{
- testee().save(mailboxId1(), DATE_1, DATE_4, messageId1(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_2, DATE_3, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_4, messageId1(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_3, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId1()).block();
assertThat(testee().listMailboxContentBeforeSortedByReceivedAt(mailboxId1(),
DATE_4, Limit.limit(12), COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId1());
@@ -330,10 +150,10 @@ public interface EmailQueryViewContract {
@Test
default void
listMailboxContentBeforeSortedByReceivedAtShouldApplyLimitWithCollapseThreads()
{
- testee().save(mailboxId1(), DATE_1, DATE_2, messageId1(),
threadId2()).block();
- testee().save(mailboxId1(), DATE_3, DATE_4, messageId2(),
threadId1()).block();
- testee().save(mailboxId1(), DATE_5, DATE_6, messageId3(),
threadId3()).block();
- testee().save(mailboxId1(), DATE_4, DATE_5, messageId4(),
threadId1()).block();
+ testee().save(mailboxId1(), DATE_2, messageId1(), threadId2()).block();
+ testee().save(mailboxId1(), DATE_4, messageId2(), threadId1()).block();
+ testee().save(mailboxId1(), DATE_6, messageId3(), threadId3()).block();
+ testee().save(mailboxId1(), DATE_5, messageId4(), threadId1()).block();
assertThat(testee().listMailboxContentBeforeSortedByReceivedAt(mailboxId1(),
DATE_5, Limit.limit(2), COLLAPSE_THREAD).collectList().block())
.containsExactly(messageId4(), messageId1());
diff --git
a/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
b/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
index 253b954440..31fa0629a6 100644
---
a/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
+++
b/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
@@ -22,10 +22,8 @@ package org.apache.james.jmap.event;
import static jakarta.mail.Flags.Flag.DELETED;
import static org.apache.james.util.ReactorUtils.publishIfPresent;
-import java.io.IOException;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
-import java.util.Date;
import java.util.Optional;
import jakarta.inject.Inject;
@@ -43,19 +41,12 @@ import org.apache.james.mailbox.events.MailboxEvents.Added;
import org.apache.james.mailbox.events.MailboxEvents.Expunged;
import org.apache.james.mailbox.events.MailboxEvents.FlagsUpdated;
import org.apache.james.mailbox.events.MailboxEvents.MailboxDeletion;
-import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.FetchGroup;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.MessageMetaData;
import org.apache.james.mailbox.model.MessageResult;
import org.apache.james.mailbox.model.UpdatedFlags;
-import org.apache.james.mime4j.codec.DecodeMonitor;
-import org.apache.james.mime4j.dom.Header;
-import org.apache.james.mime4j.dom.field.DateTimeField;
-import org.apache.james.mime4j.field.DateTimeFieldLenientImpl;
-import org.apache.james.mime4j.message.DefaultMessageBuilder;
-import org.apache.james.mime4j.stream.MimeConfig;
import org.apache.james.util.FunctionalUtils;
import org.reactivestreams.Publisher;
@@ -181,23 +172,8 @@ public class PopulateEmailQueryViewListener implements
ReactiveGroupEventListene
public Mono<Void> handleAdded(MailboxId mailboxId, MessageResult
messageResult, Username username) {
ZonedDateTime receivedAt =
ZonedDateTime.ofInstant(messageResult.getInternalDate().toInstant(),
ZoneOffset.UTC);
-
- return Mono.fromCallable(() -> parseMessage(messageResult))
- .map(header ->
date(header).orElse(messageResult.getInternalDate()))
- .map(date -> ZonedDateTime.ofInstant(date.toInstant(),
ZoneOffset.UTC))
- .flatMap(sentAt ->
viewManager.getEmailQueryView(username).save(mailboxId, sentAt, receivedAt,
messageResult.getMessageId(), messageResult.getThreadId()))
+ return viewManager.getEmailQueryView(username)
+ .save(mailboxId, receivedAt, messageResult.getMessageId(),
messageResult.getThreadId())
.then();
}
-
- private Header parseMessage(MessageResult messageResult) throws
IOException, MailboxException {
- DefaultMessageBuilder defaultMessageBuilder = new
DefaultMessageBuilder();
- defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
- return
defaultMessageBuilder.parseHeader(messageResult.getFullContent().getInputStream());
- }
-
- private Optional<Date> date(Header header) {
- return Optional.ofNullable(header.getField("Date"))
- .map(field -> DateTimeFieldLenientImpl.PARSER.parse(field,
DecodeMonitor.SILENT))
- .map(DateTimeField::getDate);
- }
}
diff --git
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
index 3b18389198..467e29c72e 100644
---
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
+++
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
@@ -93,8 +93,6 @@ class EmailQueryMethod @Inject() (serializer:
EmailQuerySerializer,
private def executeQuery(session: MailboxSession, request:
EmailQueryRequest, searchQuery: MultimailboxesSearchQuery, position: Position,
limit: Limit): SMono[EmailQueryResponse] = {
val ids: SMono[Seq[MessageId]] = request match {
- case request: EmailQueryRequest if
matchesInMailboxSortedBySentAt(request) =>
- queryViewForListingSortedBySentAt(session, position, limit, request,
searchQuery.getNamespace)
case request: EmailQueryRequest if
matchesInMailboxSortedByReceivedAt(request) =>
queryViewForListingSortedByReceivedAt(session, position, limit,
request, searchQuery.getNamespace)
case request: EmailQueryRequest if
matchesInMailboxAfterSortedByReceivedAt(request) =>
@@ -132,16 +130,6 @@ class EmailQueryMethod @Inject() (serializer:
EmailQuerySerializer,
fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession,
position, limitToUse, namespace)
}
- private def queryViewForListingSortedBySentAt(mailboxSession:
MailboxSession, position: Position, limitToUse: Limit, request:
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
- val mailboxId: MailboxId =
request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
- val collapseThreads: Boolean = getCollapseThreads(request)
-
- val queryViewEntries: SFlux[MessageId] =
SFlux.fromPublisher(emailQueryViewManager.getEmailQueryView(mailboxSession.getUser)
- .listMailboxContentSortedBySentAt(mailboxId,
JavaLimit.from(limitToUse.value + position.value), collapseThreads))
-
- fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession,
position, limitToUse, namespace)
- }
-
private def queryViewForListingSortedByReceivedAt(mailboxSession:
MailboxSession, position: Position, limitToUse: Limit, request:
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
val mailboxId: MailboxId =
request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
val collapseThreads: Boolean = getCollapseThreads(request)
@@ -165,11 +153,6 @@ class EmailQueryMethod @Inject() (serializer:
EmailQuerySerializer,
case e => SMono.error[Seq[MessageId]](e)
})
- private def matchesInMailboxSortedBySentAt(request: EmailQueryRequest):
Boolean =
- configuration.isEmailQueryViewEnabled &&
- request.filter.exists(_.inMailboxFilterOnly) &&
- request.sort.contains(Set(Comparator.SENT_AT_DESC))
-
private def matchesInMailboxSortedByReceivedAt(request: EmailQueryRequest):
Boolean =
configuration.isEmailQueryViewEnabled &&
request.filter.exists(_.inMailboxFilterOnly) &&
diff --git
a/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
b/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
index bbe44d03c4..0469938a8c 100644
---
a/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
+++
b/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java
@@ -138,7 +138,7 @@ class PopulateEmailQueryViewListenerTest {
.build(emptyMessage(Date.from(ZonedDateTime.parse("2014-10-30T14:12:00Z").toInstant()))),
mailboxSession).getId();
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.containsOnly(composedId.getMessageId());
}
@@ -151,7 +151,7 @@ class PopulateEmailQueryViewListenerTest {
.build(emptyMessage(Date.from(ZonedDateTime.parse("2014-10-30T14:12:00Z").toInstant()))),
mailboxSession).getId();
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
}
@@ -190,7 +190,7 @@ class PopulateEmailQueryViewListenerTest {
Mono.from(queryViewListener.reactiveEvent(addedOutDatedEvent)).block();
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(outboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(outboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
}
@@ -206,7 +206,7 @@ class PopulateEmailQueryViewListenerTest {
inboxMessageManager.setFlags(new Flags(),
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), mailboxSession);
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.containsOnly(composedId.getMessageId());
}
@@ -220,7 +220,7 @@ class PopulateEmailQueryViewListenerTest {
inboxMessageManager.setFlags(new Flags(DELETED),
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), mailboxSession);
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
}
@@ -234,7 +234,7 @@ class PopulateEmailQueryViewListenerTest {
mailboxManager.deleteMailbox(inboxId, mailboxSession);
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
}
@@ -248,7 +248,7 @@ class PopulateEmailQueryViewListenerTest {
inboxMessageManager.delete(ImmutableList.of(composedMessageId.getUid()),
mailboxSession);
-
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedBySentAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(viewManager.getEmailQueryView(mailboxSession.getUser()).listMailboxContentSortedByReceivedAt(inboxId,
Limit.limit(12), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
}
diff --git
a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
index 144ca3e362..d8ac749cb0 100644
---
a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
+++
b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
@@ -22,12 +22,9 @@ package org.apache.james.webadmin.data.jmap;
import static jakarta.mail.Flags.Flag.DELETED;
import static
org.apache.james.mailbox.MailboxManager.MailboxSearchFetchType.Minimal;
-import java.io.IOException;
import java.time.Duration;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
-import java.util.Date;
-import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;
import jakarta.inject.Inject;
@@ -45,9 +42,6 @@ import org.apache.james.mailbox.model.MessageRange;
import org.apache.james.mailbox.model.MessageResult;
import org.apache.james.mailbox.model.ThreadId;
import org.apache.james.mailbox.model.search.MailboxQuery;
-import org.apache.james.mime4j.dom.Message;
-import org.apache.james.mime4j.message.DefaultMessageBuilder;
-import org.apache.james.mime4j.stream.MimeConfig;
import org.apache.james.task.Task;
import org.apache.james.task.Task.Result;
import org.apache.james.user.api.UsersRepository;
@@ -155,14 +149,9 @@ public class EmailQueryViewPopulator {
MessageId messageId = messageResult.getMessageId();
ThreadId threadId = messageResult.getThreadId();
ZonedDateTime receivedAt =
ZonedDateTime.ofInstant(messageResult.getInternalDate().toInstant(),
ZoneOffset.UTC);
- Message mime4JMessage = parseMessage(messageResult);
- Date sentAtDate =
Optional.ofNullable(mime4JMessage.getDate()).orElse(messageResult.getInternalDate());
- ZonedDateTime sentAt =
ZonedDateTime.ofInstant(sentAtDate.toInstant(), ZoneOffset.UTC);
- mime4JMessage.dispose();
-
- return new EmailQueryView.Entry(mailboxId, messageId, sentAt,
receivedAt, threadId);
+ return new EmailQueryView.Entry(mailboxId, messageId, receivedAt,
threadId);
})
- .flatMap(entry -> emailQueryView.save(entry.getMailboxId(),
entry.getSentAt(), entry.getReceivedAt(), entry.getMessageId(),
entry.getThreadId()))
+ .flatMap(entry -> emailQueryView.save(entry.getMailboxId(),
entry.getReceivedAt(), entry.getMessageId(), entry.getThreadId()))
.thenReturn(Result.COMPLETED)
.doOnSuccess(any -> progress.incrementProcessedMessageCount())
.onErrorResume(e -> {
@@ -196,9 +185,4 @@ public class EmailQueryViewPopulator {
return
Flux.from(messageManager.getMessagesReactive(MessageRange.all(),
FetchGroup.HEADERS, session));
}
- private Message parseMessage(MessageResult messageResult) throws
IOException, MailboxException {
- DefaultMessageBuilder defaultMessageBuilder = new
DefaultMessageBuilder();
- defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
- return
defaultMessageBuilder.parseMessage(messageResult.getFullContent().getInputStream());
- }
}
diff --git
a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
index 476e16d152..25e4046410 100644
---
a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
+++
b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java
@@ -267,7 +267,7 @@ class PopulateEmailQueryViewRequestToTaskTest {
.basePath(TasksRoutes.BASE)
.get(taskId + "/await");
-
assertThat(view.listMailboxContentSortedBySentAt(messageId.getMailboxId(),
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(view.listMailboxContentSortedByReceivedAt(messageId.getMailboxId(),
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
.containsOnly(messageId.getMessageId());
}
@@ -289,7 +289,7 @@ class PopulateEmailQueryViewRequestToTaskTest {
.basePath(TasksRoutes.BASE)
.get(taskId + "/await");
-
assertThat(view.listMailboxContentSortedBySentAt(messageId.getMailboxId(),
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(view.listMailboxContentSortedByReceivedAt(messageId.getMailboxId(),
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
.isEmpty();
}
@@ -317,7 +317,7 @@ class PopulateEmailQueryViewRequestToTaskTest {
.basePath(TasksRoutes.BASE)
.get(taskId2 + "/await");
-
assertThat(view.listMailboxContentSortedBySentAt(messageId.getMailboxId(),
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
+
assertThat(view.listMailboxContentSortedByReceivedAt(messageId.getMailboxId(),
Limit.from(12), NO_COLLAPSE_THREAD).collectList().block())
.containsOnly(messageId.getMessageId());
}
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]