You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/04/22 15:09:51 UTC

[james-project] 01/05: JAMES-3777 EventSourcingFilteringManagement avoid read after writes

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 199221edfcdd76a4ece98ee6db2b3e23f6dc287b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Apr 14 13:38:59 2023 +0700

    JAMES-3777 EventSourcingFilteringManagement avoid read after writes
    
    Version can be deduced from the events generated by the writes without conducting
    further reads.
---
 .../main/java/org/apache/james/jmap/api/filtering/Version.java   | 9 +++++++++
 .../api/filtering/impl/EventSourcingFilteringManagement.java     | 8 ++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Version.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Version.java
index 780ef3da2b..8e87cd2de6 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Version.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Version.java
@@ -20,12 +20,21 @@
 package org.apache.james.jmap.api.filtering;
 
 import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.james.eventsourcing.EventId;
 
 import com.google.common.base.MoreObjects;
 
 public class Version {
     public static final Version INITIAL = new Version(-1);
 
+    public static Version from(Optional<EventId> eventId) {
+        return eventId.map(EventId::value)
+            .map(Version::new)
+            .orElse(Version.INITIAL);
+    }
+
     private final int version;
 
     public Version(int version) {
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java
index 27cd52c377..8dfda3d241 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java
@@ -60,10 +60,10 @@ public class EventSourcingFilteringManagement implements FilteringManagement {
     @Override
     public Publisher<Version> defineRulesForUser(Username username, List<Rule> rules, Optional<Version> ifInState) {
         return Mono.from(eventSourcingSystem.dispatch(new DefineRulesCommand(username, rules, ifInState)))
-            .then(Mono.from(eventStore.getEventsOfAggregate(new FilteringAggregateId(username)))
-                .map(History::getVersionAsJava)
-                .map(eventIdOptional -> eventIdOptional.map(eventId -> new Version(eventId.value()))
-                    .orElse(Version.INITIAL)));
+            .map(events -> Version.from(events.stream()
+                .map(Event::eventId)
+                .sorted(Comparator.reverseOrder())
+                .findFirst()));
     }
 
     @Override


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