Arsnael commented on a change in pull request #578:
URL: https://github.com/apache/james-project/pull/578#discussion_r684122982



##########
File path: 
mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
##########
@@ -290,29 +296,70 @@ private PreparedStatement prepareSelect(Session session) {
                 .setString(HEADER_CONTENT, 
metadata.getHeaderContent().get().asString()));
     }
 
-    public Mono<Boolean> updateMetadata(ComposedMessageIdWithMetaData 
composedMessageIdWithMetaData, ModSeq oldModSeq) {
-        ComposedMessageId composedMessageId = 
composedMessageIdWithMetaData.getComposedMessageId();
-        Flags flags = composedMessageIdWithMetaData.getFlags();
-        return 
cassandraAsyncExecutor.executeReturnApplied(updateBoundStatement(composedMessageIdWithMetaData,
 composedMessageId, flags, oldModSeq));
+    public Mono<Boolean> updateMetadata(ComposedMessageId id, UpdatedFlags 
updatedFlags, ModSeq previousModeq) {
+        return 
cassandraAsyncExecutor.executeReturnApplied(updateBoundStatement(id, 
updatedFlags, previousModeq));
     }
 
-    private BoundStatement updateBoundStatement(ComposedMessageIdWithMetaData 
composedMessageIdWithMetaData, ComposedMessageId composedMessageId, Flags flags,
-                                                ModSeq oldModSeq) {
+    private BoundStatement updateBoundStatement(ComposedMessageId id, 
UpdatedFlags updatedFlags, ModSeq previousModeq) {
         final BoundStatement boundStatement = update.bind()
-            .setLong(MOD_SEQ, 
composedMessageIdWithMetaData.getModSeq().asLong())
-            .setBool(ANSWERED, flags.contains(Flag.ANSWERED))
-            .setBool(DELETED, flags.contains(Flag.DELETED))
-            .setBool(DRAFT, flags.contains(Flag.DRAFT))
-            .setBool(FLAGGED, flags.contains(Flag.FLAGGED))
-            .setBool(RECENT, flags.contains(Flag.RECENT))
-            .setBool(SEEN, flags.contains(Flag.SEEN))
-            .setBool(USER, flags.contains(Flag.USER))
-            .setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags()))
-            .setUUID(MESSAGE_ID, ((CassandraMessageId) 
composedMessageId.getMessageId()).get())
-            .setUUID(MAILBOX_ID, ((CassandraId) 
composedMessageId.getMailboxId()).asUuid())
-            .setLong(IMAP_UID, composedMessageId.getUid().asLong());
+            .setLong(MOD_SEQ, updatedFlags.getModSeq().asLong())
+            .setUUID(MESSAGE_ID, ((CassandraMessageId) 
id.getMessageId()).get())
+            .setUUID(MAILBOX_ID, ((CassandraId) id.getMailboxId()).asUuid())
+            .setLong(IMAP_UID, id.getUid().asLong());
+
+        if (updatedFlags.isChanged(Flag.ANSWERED)) {
+            boundStatement.setBool(ANSWERED, 
updatedFlags.isModifiedToSet(Flag.ANSWERED));
+        } else {
+            boundStatement.unset(ANSWERED);
+        }
+        if (updatedFlags.isChanged(Flag.DRAFT)) {
+            boundStatement.setBool(DRAFT, 
updatedFlags.isModifiedToSet(Flag.DRAFT));
+        } else {
+            boundStatement.unset(DRAFT);
+        }
+        if (updatedFlags.isChanged(Flag.FLAGGED)) {
+            boundStatement.setBool(FLAGGED, 
updatedFlags.isModifiedToSet(Flag.FLAGGED));
+        } else {
+            boundStatement.unset(FLAGGED);
+        }
+        if (updatedFlags.isChanged(Flag.DELETED)) {
+            boundStatement.setBool(DELETED, 
updatedFlags.isModifiedToSet(Flag.DELETED));
+        } else {
+            boundStatement.unset(DELETED);
+        }
+        if (updatedFlags.isChanged(Flag.RECENT)) {
+            boundStatement.setBool(RECENT, 
updatedFlags.getNewFlags().contains(Flag.RECENT));
+        } else {
+            boundStatement.unset(RECENT);
+        }
+        if (updatedFlags.isChanged(Flag.SEEN)) {
+            boundStatement.setBool(SEEN, 
updatedFlags.isModifiedToSet(Flag.SEEN));
+        } else {
+            boundStatement.unset(SEEN);
+        }
+        if (updatedFlags.isChanged(Flag.USER)) {
+            boundStatement.setBool(USER, 
updatedFlags.isModifiedToSet(Flag.USER));
+        } else {
+            boundStatement.unset(USER);
+        }
+        Sets.SetView<String> removedFlags = Sets.difference(
+            ImmutableSet.copyOf(updatedFlags.getOldFlags().getUserFlags()),
+            ImmutableSet.copyOf(updatedFlags.getNewFlags().getUserFlags()));
+        Sets.SetView<String> addedFlags = Sets.difference(
+            ImmutableSet.copyOf(updatedFlags.getNewFlags().getUserFlags()),
+            ImmutableSet.copyOf(updatedFlags.getOldFlags().getUserFlags()));
+        if (addedFlags.isEmpty()) {
+            boundStatement.unset(ADDED_USERS_FLAGS);
+        } else {
+            boundStatement.setSet(ADDED_USERS_FLAGS, addedFlags);
+        }
+        if (removedFlags.isEmpty()) {
+            boundStatement.unset(REMOVED_USERS_FLAGS);
+        } else {
+            boundStatement.setSet(REMOVED_USERS_FLAGS, removedFlags);
+        }
         if (cassandraConfiguration.isMessageWriteStrongConsistency()) {
-            return boundStatement.setLong(MOD_SEQ_CONDITION, 
oldModSeq.asLong());
+            return boundStatement.setLong(MOD_SEQ_CONDITION, 
previousModeq.asLong());
         }
         return boundStatement;
     }

Review comment:
       Comment description is wrong here, we do an update on `imapUidTable` and 
not `messageIdTable` (which is done in last commit)




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to