diff --git a/src/main/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQuery.java b/src/main/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQuery.java index 68744c58..3a5a5afc 100644 --- a/src/main/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQuery.java +++ b/src/main/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQuery.java @@ -9,7 +9,9 @@ public class AnalyticsQuery { public static final String BLOCKED_FRAUD_PAYMENTS_COUNT = """ SELECT - countIf(status = 'failed' AND errorCode='no_route_found:risk_score_is_too_high') AS count + uniqExactIf(id, + status = 'failed' + AND errorCode = 'no_route_found:risk_score_is_too_high') AS count FROM fraud.payment WHERE timestamp >= toDate(:from) @@ -19,12 +21,15 @@ AND toDateTime(eventTime) <= toDateTime(:to) AND currency = :currency AND like(shopId, :shopId) AND like(partyId, :partyId) + AND shopId != 'TEST' """; public static final String BLOCKED_FRAUD_PAYMENTS_COUNT_RATIO = """ SELECT - countIf(status = 'failed' AND errorCode='no_route_found:risk_score_is_too_high') / count() AS ratio + uniqExactIf(id, + status = 'failed' + AND errorCode = 'no_route_found:risk_score_is_too_high') / uniqExact(id) AS ratio FROM fraud.payment WHERE timestamp >= toDate(:from) @@ -34,6 +39,7 @@ AND toDateTime(eventTime) <= toDateTime(:to) AND currency = :currency AND like(shopId, :shopId) AND like(partyId, :partyId) + AND shopId != 'TEST' """; public static final String BLOCKED_FRAUD_PAYMENTS_SUM = @@ -51,12 +57,13 @@ AND toDateTime(eventTime) <= toDateTime(:to) AND currency = :currency AND like(shopId, :shopId) AND like(partyId, :partyId) + AND shopId != 'TEST' """; public static final String FRAUD_PAYMENTS_COUNT = """ SELECT - count(*) AS count + uniqExact(id) AS count FROM fraud.payment WHERE timestamp >= toDate(:from) @@ -66,6 +73,7 @@ AND toDateTime(eventTime) <= toDateTime(:to) AND currency = :currency AND like(shopId, :shopId) AND like(partyId, :partyId) + AND shopId != 'TEST' """; public static final String FRAUD_PAYMENTS_RESULTS_SUMMARY = diff --git a/src/test/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQueryTest.java b/src/test/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQueryTest.java new file mode 100644 index 00000000..8955a01d --- /dev/null +++ b/src/test/java/dev/vality/fraudbusters/management/service/clickhouse/AnalyticsQueryTest.java @@ -0,0 +1,27 @@ +package dev.vality.fraudbusters.management.service.clickhouse; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class AnalyticsQueryTest { + + @Test + void shouldCountUniqueAttemptedPayments() { + assertThat(AnalyticsQuery.FRAUD_PAYMENTS_COUNT) + .contains("uniqExact(id) AS count") + .contains("shopId != 'TEST'") + .doesNotContain("count(*) AS count"); + } + + @Test + void shouldCalculateBlockedMetricsUsingUniquePayments() { + assertThat(AnalyticsQuery.BLOCKED_FRAUD_PAYMENTS_COUNT) + .contains("uniqExactIf(id,") + .contains("shopId != 'TEST'"); + assertThat(AnalyticsQuery.BLOCKED_FRAUD_PAYMENTS_COUNT_RATIO) + .contains("uniqExactIf(id,") + .contains("/ uniqExact(id) AS ratio") + .contains("shopId != 'TEST'"); + } +}