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