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



##########
File path: 
mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
##########
@@ -339,7 +340,17 @@ private boolean 
identicalFlags(ComposedMessageIdWithMetaData oldComposedId, Flag
     }
 
     private Mono<Pair<Flags, ComposedMessageIdWithMetaData>> 
updateFlags(ComposedMessageIdWithMetaData oldComposedId, 
ComposedMessageIdWithMetaData newComposedId) {
-        return imapUidDAO.updateMetadata(newComposedId, 
oldComposedId.getModSeq())
+        ComposedMessageId composedMessageId = 
oldComposedId.getComposedMessageId();

Review comment:
       Should it take the composedMessageId from `newComposedId` here instead 
of the old one?

##########
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` (done in last commit)

##########
File path: 
mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
##########
@@ -339,7 +340,17 @@ private boolean 
identicalFlags(ComposedMessageIdWithMetaData oldComposedId, Flag
     }
 
     private Mono<Pair<Flags, ComposedMessageIdWithMetaData>> 
updateFlags(ComposedMessageIdWithMetaData oldComposedId, 
ComposedMessageIdWithMetaData newComposedId) {
-        return imapUidDAO.updateMetadata(newComposedId, 
oldComposedId.getModSeq())
+        ComposedMessageId composedMessageId = 
oldComposedId.getComposedMessageId();

Review comment:
       Shouldn't it take the composedMessageId from `newComposedId` here 
instead of the old one?




-- 
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