You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2020/12/28 07:43:41 UTC

[james-project] 09/16: JAMES-3469 Purge changes for deleted records

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

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

commit ae03324c90e3d3e6d6c07f244be06fc3d60c6489
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 21 11:35:43 2020 +0700

    JAMES-3469 Purge changes for deleted records
    
    https://jmap.io/spec-core.html#changes
    
    ```
    If a record has been updated AND destroyed since the old state, the server SHOULD just return the id in the destroyed list but MAY return it in the updated list as well.
    ```
---
 .../apache/james/jmap/api/change/EmailChanges.java | 24 +++++++++++++++-------
 .../api/change/EmailChangeRepositoryContract.java  | 12 +++++------
 2 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChanges.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChanges.java
index 0c7e54c..c037f76 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChanges.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChanges.java
@@ -96,14 +96,24 @@ public class EmailChanges {
                 return this;
             }
 
-            Set<MessageId> createdTemp = new HashSet<>(created);
-            Set<MessageId> updatedTemp = new HashSet<>(updated);
             Set<MessageId> destroyedTemp = new HashSet<>(destroyed);
-            createdTemp.addAll(change.getCreated());
-            updatedTemp.addAll(
-                Sets.difference(ImmutableSet.copyOf(change.getUpdated()),
-                createdTemp));
-            destroyedTemp.addAll(change.getDestroyed());
+
+            Set<MessageId> createdTemp = Sets.difference(
+                ImmutableSet.<MessageId>builder()
+                    .addAll(created)
+                    .addAll(change.getCreated())
+                    .build(),
+                ImmutableSet.copyOf(change.getDestroyed()));
+            Set<MessageId> updatedTemp = Sets.difference(
+                ImmutableSet.<MessageId>builder()
+                    .addAll(updated)
+                    .addAll(Sets.difference(ImmutableSet.copyOf(change.getUpdated()),
+                        createdTemp))
+                    .build(),
+                ImmutableSet.copyOf(change.getDestroyed()));
+            destroyedTemp.addAll(Sets.difference(
+                ImmutableSet.copyOf(change.getDestroyed()),
+                created));
 
             if (createdTemp.size() + updatedTemp.size() + destroyedTemp.size() > limit.getValue()) {
                 hasMoreChanges = true;
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java
index bb5f60c..1dbb9ca 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java
@@ -498,7 +498,7 @@ public interface EmailChangeRepositoryContract {
             .state(STATE_0)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(TestMessageId.of(1), TestMessageId.of(9), TestMessageId.of(10))
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
@@ -513,8 +513,8 @@ public interface EmailChangeRepositoryContract {
             .date(DATE.minusHours(1))
             .isDelegated(false)
             .created(TestMessageId.of(6), TestMessageId.of(7))
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
-            .destroyed(TestMessageId.of(4))
+            .updated(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(10))
+            .destroyed(TestMessageId.of(4), TestMessageId.of(9))
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
@@ -523,7 +523,7 @@ public interface EmailChangeRepositoryContract {
             .isDelegated(false)
             .created(TestMessageId.of(8))
             .updated(TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(1))
-            .destroyed(TestMessageId.of(5))
+            .destroyed(TestMessageId.of(5), TestMessageId.of(10))
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
@@ -533,9 +533,9 @@ public interface EmailChangeRepositoryContract {
         EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(20))).block();
 
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(emailChanges.getCreated()).containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5), TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(8));
+            softly.assertThat(emailChanges.getCreated()).containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(8));
             softly.assertThat(emailChanges.getUpdated()).containsExactlyInAnyOrder(TestMessageId.of(1));
-            softly.assertThat(emailChanges.getDestroyed()).containsExactlyInAnyOrder(TestMessageId.of(4), TestMessageId.of(5));
+            softly.assertThat(emailChanges.getDestroyed()).containsExactlyInAnyOrder(TestMessageId.of(9), TestMessageId.of(10));
         });
     }
 


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