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 933aba1047cbff6c173bc09819fae00b87a6894b
Author: Rene Cordier <rcord...@linagora.com>
AuthorDate: Tue Aug 29 11:22:13 2023 +0700

    JAMES-3926 fetch current mailbox quotas with only 1 cassandra request
---
 .../components/CassandraQuotaCurrentValueDao.java  | 17 +++++++++++++
 .../quota/CassandraQuotaCurrentValueDaoTest.java   | 28 ++++++++++++++++++----
 .../quota/CassandraCurrentQuotaManagerV2.java      | 27 +++++++++++++++++----
 3 files changed, 64 insertions(+), 8 deletions(-)

diff --git 
a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
 
b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
index 62f09ffb62..2c77929750 100644
--- 
a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
+++ 
b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
@@ -49,6 +49,7 @@ import com.datastax.oss.driver.api.querybuilder.select.Select;
 import com.datastax.oss.driver.api.querybuilder.update.Update;
 import com.google.common.base.MoreObjects;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 public class CassandraQuotaCurrentValueDao {
@@ -112,6 +113,7 @@ public class CassandraQuotaCurrentValueDao {
     private final PreparedStatement increaseStatement;
     private final PreparedStatement decreaseStatement;
     private final PreparedStatement getQuotaCurrentValueStatement;
+    private final PreparedStatement getQuotasByComponentStatement;
     private final PreparedStatement deleteQuotaCurrentValueStatement;
 
     @Inject
@@ -120,6 +122,7 @@ public class CassandraQuotaCurrentValueDao {
         this.increaseStatement = session.prepare(increaseStatement().build());
         this.decreaseStatement = session.prepare(decreaseStatement().build());
         this.getQuotaCurrentValueStatement = 
session.prepare(getQuotaCurrentValueStatement().build());
+        this.getQuotasByComponentStatement = 
session.prepare(getQuotasByComponentStatement().build());
         this.deleteQuotaCurrentValueStatement = 
session.prepare(deleteQuotaCurrentValueStatement().build());
     }
 
@@ -164,6 +167,13 @@ public class CassandraQuotaCurrentValueDao {
             .setString(QUOTA_TYPE, quotaKey.getQuotaType().getValue()));
     }
 
+    public Flux<QuotaCurrentValue> getQuotasByComponent(QuotaComponent 
quotaComponent, String identifier) {
+        return queryExecutor.executeRows(getQuotasByComponentStatement.bind()
+                .setString(QUOTA_COMPONENT, quotaComponent.getValue())
+                .setString(IDENTIFIER, identifier))
+            .map(row -> convertRowToModel(row));
+    }
+
     private Update increaseStatement() {
         return update(TABLE_NAME)
             .increment(CURRENT_VALUE, bindMarker(CURRENT_VALUE))
@@ -188,6 +198,13 @@ public class CassandraQuotaCurrentValueDao {
                 column(QUOTA_TYPE).isEqualTo(bindMarker(QUOTA_TYPE)));
     }
 
+    private Select getQuotasByComponentStatement() {
+        return selectFrom(TABLE_NAME)
+            .all()
+            .where(column(IDENTIFIER).isEqualTo(bindMarker(IDENTIFIER)),
+                
column(QUOTA_COMPONENT).isEqualTo(bindMarker(QUOTA_COMPONENT)));
+    }
+
     private Delete deleteQuotaCurrentValueStatement() {
         return deleteFrom(TABLE_NAME)
             .where(column(IDENTIFIER).isEqualTo(bindMarker(IDENTIFIER)),
diff --git 
a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
 
b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
index 139e8d5dfc..8460b11146 100644
--- 
a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
+++ 
b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
@@ -21,10 +21,13 @@ package org.apache.james.backends.cassandra.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.List;
+
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import 
org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
 import 
org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
+import 
org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao.QuotaKey;
 import org.apache.james.core.quota.QuotaComponent;
 import org.apache.james.core.quota.QuotaCurrentValue;
 import org.apache.james.core.quota.QuotaType;
@@ -33,14 +36,12 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 public class CassandraQuotaCurrentValueDaoTest {
-
-    private static final CassandraQuotaCurrentValueDao.QuotaKey QUOTA_KEY
-        = CassandraQuotaCurrentValueDao.QuotaKey.of(QuotaComponent.MAILBOX, 
"ja...@abc.com", QuotaType.SIZE);
+    private static final QuotaKey QUOTA_KEY = 
QuotaKey.of(QuotaComponent.MAILBOX, "ja...@abc.com", QuotaType.SIZE);
 
     private CassandraQuotaCurrentValueDao cassandraQuotaCurrentValueDao;
 
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new 
CassandraClusterExtension(CassandraModule.aggregateModules(CassandraMutualizedQuotaModule.MODULE));
+    static CassandraClusterExtension cassandraCluster = new 
CassandraClusterExtension(CassandraMutualizedQuotaModule.MODULE);
 
     @BeforeEach
     void setup() {
@@ -121,4 +122,23 @@ public class CassandraQuotaCurrentValueDaoTest {
         cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, 100l).block();
         cassandraCluster.unpause();
     }
+
+    @Test
+    void getQuotasByComponentShouldGetAllQuotaTypesSuccessfully() {
+        QuotaKey countQuotaKey = QuotaKey.of(QuotaComponent.MAILBOX, 
"ja...@abc.com", QuotaType.COUNT);
+
+        QuotaCurrentValue expectedQuotaSize = 
QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
+            
.identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(100l).build();
+        QuotaCurrentValue expectedQuotaCount = 
QuotaCurrentValue.builder().quotaComponent(countQuotaKey.getQuotaComponent())
+            
.identifier(countQuotaKey.getIdentifier()).quotaType(countQuotaKey.getQuotaType()).currentValue(56l).build();
+
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.increase(countQuotaKey, 56l).block();
+
+        List<QuotaCurrentValue> actual = 
cassandraQuotaCurrentValueDao.getQuotasByComponent(QUOTA_KEY.getQuotaComponent(),
 QUOTA_KEY.getIdentifier())
+            .collectList()
+            .block();
+
+        assertThat(actual).containsExactlyInAnyOrder(expectedQuotaSize, 
expectedQuotaCount);
+    }
 }
\ No newline at end of file
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
index 7eb85da2b0..15746cd2e6 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.quota;
 
+import java.util.List;
+import java.util.Optional;
 import java.util.function.Predicate;
 
 import javax.inject.Inject;
@@ -63,10 +65,27 @@ public class CassandraCurrentQuotaManagerV2 implements 
CurrentQuotaManager {
 
     @Override
     public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
-        return Mono.zip(
-                getCurrentMessageCount(quotaRoot),
-                getCurrentStorage(quotaRoot))
-            .map(tuple2 -> new CurrentQuotas(tuple2.getT1(), tuple2.getT2()));
+        return currentValueDao.getQuotasByComponent(QuotaComponent.MAILBOX, 
quotaRoot.asString())
+            .collectList()
+            .map(this::buildCurrentQuotas);
+    }
+
+    private CurrentQuotas buildCurrentQuotas(List<QuotaCurrentValue> 
quotaCurrentValues) {
+        QuotaCountUsage count = extractQuotaByType(quotaCurrentValues, 
QuotaType.COUNT)
+            .map(value -> QuotaCountUsage.count(value.getCurrentValue()))
+            .orElse(QuotaCountUsage.count(0L));
+
+        QuotaSizeUsage size = extractQuotaByType(quotaCurrentValues, 
QuotaType.SIZE)
+            .map(value -> QuotaSizeUsage.size(value.getCurrentValue()))
+            .orElse(QuotaSizeUsage.size(0L));
+
+        return new CurrentQuotas(count, size);
+    }
+
+    private Optional<QuotaCurrentValue> 
extractQuotaByType(List<QuotaCurrentValue> quotaCurrentValues, QuotaType 
quotaType) {
+        return quotaCurrentValues.stream()
+            .filter(quotaValue -> quotaValue.getQuotaType().equals(quotaType))
+            .findAny();
     }
 
     @Override


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

Reply via email to