From e8c671a4b410f08bcbb85a9828a65c7449019004 Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Wed, 5 Feb 2025 18:19:39 +0100 Subject: [PATCH 1/8] Greenbids: Populate AppliedTo in Analytics Tag --- ...alTimeDataProcessedAuctionRequestHook.java | 38 ++++++++++++------- ...meDataProcessedAuctionRequestHookTest.java | 3 +- .../greenbids/GreenbidsAnalyticsReporter.java | 35 ++++++++--------- .../GreenbidsAnalyticsReporterTest.java | 8 +++- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java index 5188b756ddc..5144877cf47 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java @@ -189,22 +189,34 @@ private Tags toAnalyticsTags(List analyticsResults) { private List toResults(List analyticsResults) { return analyticsResults.stream() - .map(this::toResult) + .flatMap(analyticsResult -> { + Map values = analyticsResult.getValues(); + + if (values == null || values.isEmpty()) { + return java.util.stream.Stream.empty(); + } + + return values.entrySet().stream().map(entry -> { + String impId = entry.getKey(); + Ortb2ImpExtResult ortb2ImpExtResult = entry.getValue(); + ObjectNode objectNode = toObjectNode(impId, ortb2ImpExtResult); + + return (Result) ResultImpl.of( + analyticsResult.getStatus(), + objectNode, + AppliedToImpl.builder() + .impIds(Collections.singletonList(impId)) + .build()); + }); + }) .toList(); } - private Result toResult(AnalyticsResult analyticsResult) { - return ResultImpl.of( - analyticsResult.getStatus(), - toObjectNode(analyticsResult.getValues()), - AppliedToImpl.builder() - .bidders(Collections.singletonList(analyticsResult.getBidder())) - .impIds(Collections.singletonList(analyticsResult.getImpId())) - .build()); - } - - private ObjectNode toObjectNode(Map values) { - return values != null ? mapper.valueToTree(values) : null; + private ObjectNode toObjectNode(String key, Ortb2ImpExtResult value) { + ObjectNode root = mapper.createObjectNode(); + JsonNode node = value != null ? mapper.valueToTree(value) : null; + root.set(key, node); + return root; } @Override diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java index 07f13d519f4..85f03fb9e15 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java @@ -507,8 +507,7 @@ private Result toResult(AnalyticsResult analyticsResult) { analyticsResult.getStatus(), toObjectNode(analyticsResult.getValues()), AppliedToImpl.builder() - .bidders(Collections.singletonList(analyticsResult.getBidder())) - .impIds(Collections.singletonList(analyticsResult.getImpId())) + .impIds(Collections.singletonList("adunitcodevalue")) .build()); } diff --git a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java index d4b0a4f8711..e9f13ab97b7 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java +++ b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.Streams; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; @@ -228,9 +229,7 @@ private Map extractAnalyticsResultFromAnalyticsTag(Au .map(Tags::activities) .flatMap(Collection::stream) .filter(activity -> "greenbids-filter".equals(activity.name())) - .map(Activity::results) - .map(List::getFirst) - .map(Result::values) + .flatMap(activity -> activity.results().stream()) .map(this::parseAnalyticsResult) .flatMap(map -> map.entrySet().stream()) .collect(Collectors.toMap( @@ -239,21 +238,23 @@ private Map extractAnalyticsResultFromAnalyticsTag(Au (existing, replacement) -> existing)); } - private Map parseAnalyticsResult(ObjectNode analyticsResult) { + private Map parseAnalyticsResult(Result result) { + final ObjectNode valuesNode = result.values(); + + if (valuesNode == null || !valuesNode.fieldNames().hasNext()) { + return Collections.emptyMap(); + } + + return Streams.stream(valuesNode.fields()) + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> parseOrtb2ImpExtResult(entry.getValue()), + (existing, replacement) -> existing)); + } + + private Ortb2ImpExtResult parseOrtb2ImpExtResult(JsonNode node) { try { - final Map parsedAnalyticsResult = new HashMap<>(); - final Iterator> fields = analyticsResult.fields(); - - while (fields.hasNext()) { - final Map.Entry field = fields.next(); - final String impId = field.getKey(); - final JsonNode explorationResultNode = field.getValue(); - final Ortb2ImpExtResult ortb2ImpExtResult = jacksonMapper.mapper() - .treeToValue(explorationResultNode, Ortb2ImpExtResult.class); - parsedAnalyticsResult.put(impId, ortb2ImpExtResult); - } - - return parsedAnalyticsResult; + return jacksonMapper.mapper().treeToValue(node, Ortb2ImpExtResult.class); } catch (JsonProcessingException e) { throw new PreBidException("Analytics result parsing error", e); } diff --git a/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java b/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java index 82cae87406e..ee32be844f4 100644 --- a/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java +++ b/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java @@ -47,8 +47,10 @@ import org.prebid.server.hooks.execution.model.Stage; import org.prebid.server.hooks.execution.model.StageExecutionOutcome; import org.prebid.server.hooks.execution.v1.analytics.ActivityImpl; +import org.prebid.server.hooks.execution.v1.analytics.AppliedToImpl; import org.prebid.server.hooks.execution.v1.analytics.ResultImpl; import org.prebid.server.hooks.execution.v1.analytics.TagsImpl; +import org.prebid.server.hooks.v1.analytics.AppliedTo; import org.prebid.server.json.EncodeException; import org.prebid.server.json.JacksonMapper; import org.prebid.server.model.HttpRequestContext; @@ -733,11 +735,15 @@ private static HookExecutionContext givenHookExecutionContextWithAnalyticsTag() "adunitcodevalue", createAnalyticsResultNode())); + final AppliedTo appliedTo = AppliedToImpl.builder() + .impIds(Collections.singletonList("adunitcodevalue")) + .build(); + final ActivityImpl activity = ActivityImpl.of( "greenbids-filter", "success", Collections.singletonList( - ResultImpl.of("success", analyticsResultNode, null))); + ResultImpl.of("success", analyticsResultNode, appliedTo))); final TagsImpl tags = TagsImpl.of(Collections.singletonList(activity)); From 3e356bfd58d2249ee49d88d9b188fb375cc0c570 Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Wed, 5 Feb 2025 18:53:44 +0100 Subject: [PATCH 2/8] refactor --- ...alTimeDataProcessedAuctionRequestHook.java | 41 +++++++++---------- .../greenbids/GreenbidsAnalyticsReporter.java | 23 ++++------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java index 5144877cf47..ddc9c4e7e2b 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java @@ -189,34 +189,31 @@ private Tags toAnalyticsTags(List analyticsResults) { private List toResults(List analyticsResults) { return analyticsResults.stream() - .flatMap(analyticsResult -> { - Map values = analyticsResult.getValues(); - - if (values == null || values.isEmpty()) { - return java.util.stream.Stream.empty(); - } - - return values.entrySet().stream().map(entry -> { - String impId = entry.getKey(); - Ortb2ImpExtResult ortb2ImpExtResult = entry.getValue(); - ObjectNode objectNode = toObjectNode(impId, ortb2ImpExtResult); - - return (Result) ResultImpl.of( - analyticsResult.getStatus(), - objectNode, - AppliedToImpl.builder() - .impIds(Collections.singletonList(impId)) - .build()); - }); + .flatMap(analyticsResult -> toResult(analyticsResult).stream()) + .toList(); + } + + private List toResult(AnalyticsResult analyticsResult) { + return analyticsResult.getValues().entrySet().stream() + .map(entry -> { + final String impId = entry.getKey(); + final Ortb2ImpExtResult ortb2ImpExtResult = entry.getValue(); + final ObjectNode objectNode = toObjectNode(impId, ortb2ImpExtResult); + return (Result) ResultImpl.of( + analyticsResult.getStatus(), + objectNode, + AppliedToImpl.builder() + .impIds(Collections.singletonList(impId)) + .build()); }) .toList(); } private ObjectNode toObjectNode(String key, Ortb2ImpExtResult value) { - ObjectNode root = mapper.createObjectNode(); + ObjectNode objectNode = mapper.createObjectNode(); JsonNode node = value != null ? mapper.valueToTree(value) : null; - root.set(key, node); - return root; + objectNode.set(key, node); + return objectNode; } @Override diff --git a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java index e9f13ab97b7..200d09edd6a 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java +++ b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java @@ -43,7 +43,6 @@ import org.prebid.server.hooks.execution.model.HookExecutionOutcome; import org.prebid.server.hooks.execution.model.Stage; import org.prebid.server.hooks.execution.model.StageExecutionOutcome; -import org.prebid.server.hooks.v1.analytics.Activity; import org.prebid.server.hooks.v1.analytics.Result; import org.prebid.server.hooks.v1.analytics.Tags; import org.prebid.server.json.EncodeException; @@ -66,8 +65,6 @@ import java.time.Clock; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -239,17 +236,15 @@ private Map extractAnalyticsResultFromAnalyticsTag(Au } private Map parseAnalyticsResult(Result result) { - final ObjectNode valuesNode = result.values(); - - if (valuesNode == null || !valuesNode.fieldNames().hasNext()) { - return Collections.emptyMap(); - } - - return Streams.stream(valuesNode.fields()) - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> parseOrtb2ImpExtResult(entry.getValue()), - (existing, replacement) -> existing)); + return Optional.ofNullable(result) + .map(Result::values) + .filter(valuesNode -> valuesNode.fieldNames().hasNext()) + .map(valuesNode -> Streams.stream(valuesNode.fields()) + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> parseOrtb2ImpExtResult(entry.getValue()), + (existing, replacement) -> existing))) + .orElseGet(Collections::emptyMap); } private Ortb2ImpExtResult parseOrtb2ImpExtResult(JsonNode node) { From 1e23162c7a68b701e7b0028ecd22a4747c848e6c Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Thu, 6 Feb 2025 17:08:47 +0100 Subject: [PATCH 3/8] fix review --- .../data/core/GreenbidsInvocationService.java | 15 +-------------- ...alTimeDataProcessedAuctionRequestHook.java | 19 +++++++++++++------ .../core/GreenbidsInvocationServiceTest.java | 4 ++-- ...meDataProcessedAuctionRequestHookTest.java | 7 +++---- .../GreenbidsAnalyticsReporterTest.java | 1 + 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java index 47da698c627..4a84fd032dc 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java @@ -40,11 +40,8 @@ public GreenbidsInvocationResult createGreenbidsInvocationResult( final InvocationAction invocationAction = isExploration ? InvocationAction.no_action : InvocationAction.update; - final Map> impsBiddersFilterMapToAnalyticsTag = isExploration - ? keepAllBiddersForAnalyticsResult(impsBiddersFilterMap) - : impsBiddersFilterMap; final Map ort2ImpExtResultMap = createOrtb2ImpExtForImps( - bidRequest, impsBiddersFilterMapToAnalyticsTag, greenbidsId, isExploration); + bidRequest, impsBiddersFilterMap, greenbidsId, isExploration); final AnalyticsResult analyticsResult = AnalyticsResult.of( "success", ort2ImpExtResultMap, null, null); @@ -83,16 +80,6 @@ private ObjectNode updateImpExt(ObjectNode impExt, Map bidderFi return updatedExt; } - private Map> keepAllBiddersForAnalyticsResult( - Map> impsBiddersFilterMap) { - - return impsBiddersFilterMap.entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> true)))); - } - private Map createOrtb2ImpExtForImps( BidRequest bidRequest, Map> impsBiddersFilterMap, diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java index ddc9c4e7e2b..af0feeab83f 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java @@ -7,6 +7,7 @@ import com.iab.openrtb.request.BidRequest; import io.vertx.core.Future; import org.apache.commons.collections4.CollectionUtils; +import org.prebid.server.analytics.reporter.greenbids.model.ExplorationResult; import org.prebid.server.analytics.reporter.greenbids.model.Ortb2ImpExtResult; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.exception.PreBidException; @@ -198,22 +199,28 @@ private List toResult(AnalyticsResult analyticsResult) { .map(entry -> { final String impId = entry.getKey(); final Ortb2ImpExtResult ortb2ImpExtResult = entry.getValue(); - final ObjectNode objectNode = toObjectNode(impId, ortb2ImpExtResult); + + final List bidders = Optional.ofNullable(ortb2ImpExtResult) + .map(Ortb2ImpExtResult::getGreenbids) + .map(ExplorationResult::getKeptInAuction) + .orElse(Collections.emptyMap()) + .keySet().stream().toList(); + + final ObjectNode objectNode = toObjectNode(entry); + return (Result) ResultImpl.of( analyticsResult.getStatus(), objectNode, AppliedToImpl.builder() .impIds(Collections.singletonList(impId)) + .bidders(bidders) .build()); }) .toList(); } - private ObjectNode toObjectNode(String key, Ortb2ImpExtResult value) { - ObjectNode objectNode = mapper.createObjectNode(); - JsonNode node = value != null ? mapper.valueToTree(value) : null; - objectNode.set(key, node); - return objectNode; + private ObjectNode toObjectNode(Map.Entry values) { + return values != null ? mapper.valueToTree(values) : null; } @Override diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java index 8af8b6e2a03..c46d46c6b50 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java @@ -104,8 +104,8 @@ public void createGreenbidsInvocationResultShouldReturnNoActionWhenExploration() assertThat(ortb2ImpExtResult.getGreenbids().getIsExploration()).isTrue(); assertThat(ortb2ImpExtResult.getGreenbids().getFingerprint()).isNotNull(); assertThat(keptInAuction.get("rubicon")).isTrue(); - assertThat(keptInAuction.get("appnexus")).isTrue(); - assertThat(keptInAuction.get("pubmatic")).isTrue(); + assertThat(keptInAuction.get("appnexus")).isFalse(); + assertThat(keptInAuction.get("pubmatic")).isFalse(); } private Map> givenImpsBiddersFilterMap() { diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java index 85f03fb9e15..6118960837a 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java @@ -52,8 +52,6 @@ import org.prebid.server.hooks.v1.auction.AuctionInvocationContext; import org.prebid.server.hooks.v1.auction.AuctionRequestPayload; import org.prebid.server.model.HttpRequestContext; -import org.prebid.server.settings.model.Account; -import org.prebid.server.settings.model.AccountHooksConfiguration; import java.io.IOException; import java.net.InetAddress; @@ -216,7 +214,7 @@ public void callShouldFilterBiddersWhenPartnerActivatedInBidRequest() } @Test - public void callShouldNotFilterBiddersAndReturnAnalyticsTagWhenExploration() throws OrtException, IOException { + public void callShouldFilterBiddersAndReturnAnalyticsTagWhenExploration() throws OrtException, IOException { // given final Banner banner = givenBanner(); @@ -238,7 +236,7 @@ public void callShouldNotFilterBiddersAndReturnAnalyticsTagWhenExploration() thr when(thresholdsCacheWithExpiration.getIfPresent("throttlingThresholds_test-pbuid")) .thenReturn(givenThrottlingThresholds()); - final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, true); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, false); // when final Future> future = target @@ -508,6 +506,7 @@ private Result toResult(AnalyticsResult analyticsResult) { toObjectNode(analyticsResult.getValues()), AppliedToImpl.builder() .impIds(Collections.singletonList("adunitcodevalue")) + .bidders(List.of("appnexus", "pubmatic", "rubicon")) .build()); } diff --git a/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java b/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java index ee32be844f4..4683dc5370e 100644 --- a/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java +++ b/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java @@ -737,6 +737,7 @@ private static HookExecutionContext givenHookExecutionContextWithAnalyticsTag() final AppliedTo appliedTo = AppliedToImpl.builder() .impIds(Collections.singletonList("adunitcodevalue")) + .bidders(Collections.singletonList("seat1")) .build(); final ActivityImpl activity = ActivityImpl.of( From 9d6642ae1b46a936ae56fe7396cd3aabe436812d Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Fri, 7 Feb 2025 11:51:07 +0100 Subject: [PATCH 4/8] fix review --- ...alTimeDataProcessedAuctionRequestHook.java | 48 +++++++++++-------- .../greenbids/GreenbidsAnalyticsReporter.java | 19 ++++---- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java index af0feeab83f..52195c2890c 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java @@ -7,6 +7,7 @@ import com.iab.openrtb.request.BidRequest; import io.vertx.core.Future; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; import org.prebid.server.analytics.reporter.greenbids.model.ExplorationResult; import org.prebid.server.analytics.reporter.greenbids.model.Ortb2ImpExtResult; import org.prebid.server.auction.model.AuctionContext; @@ -39,6 +40,7 @@ import org.prebid.server.settings.model.Account; import org.prebid.server.settings.model.AccountHooksConfiguration; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -190,35 +192,39 @@ private Tags toAnalyticsTags(List analyticsResults) { private List toResults(List analyticsResults) { return analyticsResults.stream() - .flatMap(analyticsResult -> toResult(analyticsResult).stream()) + .map(this::toResult) + .flatMap(Collection::stream) .toList(); } private List toResult(AnalyticsResult analyticsResult) { return analyticsResult.getValues().entrySet().stream() - .map(entry -> { - final String impId = entry.getKey(); - final Ortb2ImpExtResult ortb2ImpExtResult = entry.getValue(); - - final List bidders = Optional.ofNullable(ortb2ImpExtResult) - .map(Ortb2ImpExtResult::getGreenbids) - .map(ExplorationResult::getKeptInAuction) - .orElse(Collections.emptyMap()) - .keySet().stream().toList(); - - final ObjectNode objectNode = toObjectNode(entry); - - return (Result) ResultImpl.of( - analyticsResult.getStatus(), - objectNode, - AppliedToImpl.builder() - .impIds(Collections.singletonList(impId)) - .bidders(bidders) - .build()); - }) + .map(entry -> toResult(analyticsResult.getStatus(), entry)) .toList(); } + private Result toResult(String status, Map.Entry entry) { + final String impId = entry.getKey(); + final Ortb2ImpExtResult ortb2ImpExtResult = entry.getValue(); + final List removedBidders = Optional.ofNullable(ortb2ImpExtResult) + .map(Ortb2ImpExtResult::getGreenbids) + .map(ExplorationResult::getKeptInAuction) + .map(Map::entrySet) + .stream() + .flatMap(Collection::stream) + .filter(e -> BooleanUtils.isNotTrue(e.getValue())) + .map(Map.Entry::getKey) + .toList(); + + return ResultImpl.of( + status, + toObjectNode(entry), + AppliedToImpl.builder() + .impIds(Collections.singletonList(impId)) + .bidders(removedBidders.isEmpty() ? null: removedBidders) + .build()); + } + private ObjectNode toObjectNode(Map.Entry values) { return values != null ? mapper.valueToTree(values) : null; } diff --git a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java index 200d09edd6a..f8326efb81f 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java +++ b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.common.collect.Streams; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; @@ -43,6 +42,7 @@ import org.prebid.server.hooks.execution.model.HookExecutionOutcome; import org.prebid.server.hooks.execution.model.Stage; import org.prebid.server.hooks.execution.model.StageExecutionOutcome; +import org.prebid.server.hooks.v1.analytics.Activity; import org.prebid.server.hooks.v1.analytics.Result; import org.prebid.server.hooks.v1.analytics.Tags; import org.prebid.server.json.EncodeException; @@ -58,6 +58,7 @@ import org.prebid.server.settings.model.Account; import org.prebid.server.settings.model.AccountAnalyticsConfig; import org.prebid.server.util.HttpUtil; +import org.prebid.server.util.StreamUtil; import org.prebid.server.version.PrebidVersionProvider; import org.prebid.server.vertx.httpclient.HttpClient; import org.prebid.server.vertx.httpclient.model.HttpClientResponse; @@ -226,7 +227,8 @@ private Map extractAnalyticsResultFromAnalyticsTag(Au .map(Tags::activities) .flatMap(Collection::stream) .filter(activity -> "greenbids-filter".equals(activity.name())) - .flatMap(activity -> activity.results().stream()) + .map(Activity::results) + .flatMap(Collection::stream) .map(this::parseAnalyticsResult) .flatMap(map -> map.entrySet().stream()) .collect(Collectors.toMap( @@ -238,13 +240,12 @@ private Map extractAnalyticsResultFromAnalyticsTag(Au private Map parseAnalyticsResult(Result result) { return Optional.ofNullable(result) .map(Result::values) - .filter(valuesNode -> valuesNode.fieldNames().hasNext()) - .map(valuesNode -> Streams.stream(valuesNode.fields()) - .collect(Collectors.toMap( - Map.Entry::getKey, - entry -> parseOrtb2ImpExtResult(entry.getValue()), - (existing, replacement) -> existing))) - .orElseGet(Collections::emptyMap); + .stream() + .flatMap(valuesNode -> StreamUtil.asStream(valuesNode.fields())) + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> parseOrtb2ImpExtResult(entry.getValue()), + (existing, replacement) -> existing)); } private Ortb2ImpExtResult parseOrtb2ImpExtResult(JsonNode node) { From da98965f46721b231866ad4951a801aded5b9cfe Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Fri, 7 Feb 2025 15:44:50 +0100 Subject: [PATCH 5/8] fix review --- .../data/core/GreenbidsInvocationService.java | 2 +- .../data/model/result/AnalyticsResult.java | 4 ---- ...alTimeDataProcessedAuctionRequestHook.java | 23 +++++-------------- ...meDataProcessedAuctionRequestHookTest.java | 4 +--- 4 files changed, 8 insertions(+), 25 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java index 4a84fd032dc..f7a067c731d 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java @@ -43,7 +43,7 @@ public GreenbidsInvocationResult createGreenbidsInvocationResult( final Map ort2ImpExtResultMap = createOrtb2ImpExtForImps( bidRequest, impsBiddersFilterMap, greenbidsId, isExploration); final AnalyticsResult analyticsResult = AnalyticsResult.of( - "success", ort2ImpExtResultMap, null, null); + "success", ort2ImpExtResultMap); return GreenbidsInvocationResult.of(updatedBidRequest, invocationAction, analyticsResult); } diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/result/AnalyticsResult.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/result/AnalyticsResult.java index 9d175b5b4b3..f324ac195db 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/result/AnalyticsResult.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/result/AnalyticsResult.java @@ -11,8 +11,4 @@ public class AnalyticsResult { String status; Map values; - - String bidder; - - String impId; } diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java index 52195c2890c..3ad8106e141 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java @@ -158,29 +158,25 @@ private InvocationResult toInvocationResult( AnalyticsResult analyticsResult, InvocationAction action) { - final List analyticsResults = analyticsResult != null - ? Collections.singletonList(analyticsResult) - : Collections.emptyList(); - return switch (action) { case InvocationAction.update -> InvocationResultImpl .builder() .status(InvocationStatus.success) .action(action) .payloadUpdate(payload -> AuctionRequestPayloadImpl.of(bidRequest)) - .analyticsTags(toAnalyticsTags(analyticsResults)) + .analyticsTags(toAnalyticsTags(analyticsResult)) .build(); default -> InvocationResultImpl .builder() .status(InvocationStatus.success) .action(action) - .analyticsTags(toAnalyticsTags(analyticsResults)) + .analyticsTags(toAnalyticsTags(analyticsResult)) .build(); }; } - private Tags toAnalyticsTags(List analyticsResults) { - if (CollectionUtils.isEmpty(analyticsResults)) { + private Tags toAnalyticsTags(AnalyticsResult analyticsResults) { + if (analyticsResults == null) { return null; } @@ -190,14 +186,7 @@ private Tags toAnalyticsTags(List analyticsResults) { toResults(analyticsResults)))); } - private List toResults(List analyticsResults) { - return analyticsResults.stream() - .map(this::toResult) - .flatMap(Collection::stream) - .toList(); - } - - private List toResult(AnalyticsResult analyticsResult) { + private List toResults(AnalyticsResult analyticsResult) { return analyticsResult.getValues().entrySet().stream() .map(entry -> toResult(analyticsResult.getStatus(), entry)) .toList(); @@ -212,7 +201,7 @@ private Result toResult(String status, Map.Entry entr .map(Map::entrySet) .stream() .flatMap(Collection::stream) - .filter(e -> BooleanUtils.isNotTrue(e.getValue())) + .filter(e -> BooleanUtils.isFalse(e.getValue())) .map(Map.Entry::getKey) .toList(); diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java index 6118960837a..36e9300d83e 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java @@ -469,9 +469,7 @@ private BidRequest expectedUpdatedBidRequest( private AnalyticsResult expectedAnalyticsResult(Boolean isExploration, Boolean isKeptInAuction) { return AnalyticsResult.of( "success", - Map.of("adunitcodevalue", expectedOrtb2ImpExtResult(isExploration, isKeptInAuction)), - null, - null); + Map.of("adunitcodevalue", expectedOrtb2ImpExtResult(isExploration, isKeptInAuction))); } private Ortb2ImpExtResult expectedOrtb2ImpExtResult(Boolean isExploration, Boolean isKeptInAuction) { From ad4a9453413c9a493512dbb92c1ee0b78e6f1e8a Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Mon, 17 Feb 2025 16:50:32 +0100 Subject: [PATCH 6/8] cover cases all bidders filterd/ all imps filtered --- .../data/core/GreenbidsInvocationService.java | 15 ++- .../core/GreenbidsInvocationServiceTest.java | 109 +++++++++++++++++- .../data/util/TestBidRequestProvider.java | 17 +++ ...meDataProcessedAuctionRequestHookTest.java | 27 ++++- 4 files changed, 159 insertions(+), 9 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java index f7a067c731d..c5d2350ebe8 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java @@ -32,14 +32,19 @@ public GreenbidsInvocationResult createGreenbidsInvocationResult( final String greenbidsId = UUID.randomUUID().toString(); final boolean isExploration = isExploration(greenbidsConfig, greenbidsId); - final BidRequest updatedBidRequest = isExploration + boolean allImpsRejected = impsBiddersFilterMap.values().stream() + .allMatch(biddersMapp -> biddersMapp.values().stream().noneMatch(isKept -> isKept)); + + BidRequest updatedBidRequest = (isExploration || allImpsRejected) ? bidRequest : bidRequest.toBuilder() .imp(updateImps(bidRequest, impsBiddersFilterMap)) .build(); - final InvocationAction invocationAction = isExploration + InvocationAction invocationAction = isExploration ? InvocationAction.no_action : InvocationAction.update; + invocationAction = allImpsRejected ? InvocationAction.reject : invocationAction; + final Map ort2ImpExtResultMap = createOrtb2ImpExtForImps( bidRequest, impsBiddersFilterMap, greenbidsId, isExploration); final AnalyticsResult analyticsResult = AnalyticsResult.of( @@ -58,10 +63,16 @@ private Boolean isExploration(GreenbidsConfig greenbidsConfig, String greenbidsI private List updateImps(BidRequest bidRequest, Map> impsBiddersFilterMap) { return bidRequest.getImp().stream() + .filter(imp -> isImpKept(imp, impsBiddersFilterMap)) .map(imp -> updateImp(imp, impsBiddersFilterMap.get(imp.getId()))) .toList(); } + private boolean isImpKept(Imp imp, Map> impsBiddersFilterMap) { + Map biddersMap = impsBiddersFilterMap.get(imp.getId()); + return biddersMap != null && biddersMap.values().stream().anyMatch(isKept -> isKept); + } + private Imp updateImp(Imp imp, Map bidderFilterMap) { return imp.toBuilder() .ext(updateImpExt(imp.getExt(), bidderFilterMap)) diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java index c46d46c6b50..0c137ffa403 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationServiceTest.java @@ -24,6 +24,7 @@ import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenBidRequest; import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenDevice; import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenImpExt; +import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenImpExtToFilterAllBidders; @ExtendWith(MockitoExtension.class) public class GreenbidsInvocationServiceTest { @@ -69,7 +70,6 @@ public void createGreenbidsInvocationResultShouldReturnUpdateBidRequestWhenNotEx assertThat(keptInAuction.get("rubicon")).isTrue(); assertThat(keptInAuction.get("appnexus")).isFalse(); assertThat(keptInAuction.get("pubmatic")).isFalse(); - } @Test @@ -108,6 +108,85 @@ public void createGreenbidsInvocationResultShouldReturnNoActionWhenExploration() assertThat(keptInAuction.get("pubmatic")).isFalse(); } + @Test + public void createGreenbidsInvocationResultShouldReturnRejectWhenAllImpsFiltered() { + // given + final Banner banner = givenBanner(); + final Imp imp = Imp.builder() + .id("adunitcodevalue") + .ext(givenImpExt()) + .banner(banner) + .build(); + final Device device = givenDevice(identity()); + final BidRequest bidRequest = givenBidRequest(request -> request, List.of(imp), device); + final Map> impsBiddersFilterMap = givenFilterMapWithAllFilteredImps(); + final GreenbidsConfig greenbidsConfig = givenPartner(1.0); + + // when + final GreenbidsInvocationResult result = target.createGreenbidsInvocationResult( + greenbidsConfig, bidRequest, impsBiddersFilterMap); + + // then + final JsonNode updatedBidRequestExtPrebidBidders = result.getUpdatedBidRequest().getImp().getFirst().getExt() + .get("prebid").get("bidder"); + final Ortb2ImpExtResult ortb2ImpExtResult = result.getAnalyticsResult().getValues().get("adunitcodevalue"); + final Map keptInAuction = ortb2ImpExtResult.getGreenbids().getKeptInAuction(); + + assertThat(result.getInvocationAction()).isEqualTo(InvocationAction.reject); + assertThat(updatedBidRequestExtPrebidBidders.has("rubicon")).isTrue(); + assertThat(updatedBidRequestExtPrebidBidders.has("appnexus")).isTrue(); + assertThat(updatedBidRequestExtPrebidBidders.has("pubmatic")).isTrue(); + assertThat(ortb2ImpExtResult).isNotNull(); + assertThat(ortb2ImpExtResult.getGreenbids().getIsExploration()).isTrue(); + assertThat(ortb2ImpExtResult.getGreenbids().getFingerprint()).isNotNull(); + assertThat(keptInAuction.get("rubicon")).isFalse(); + assertThat(keptInAuction.get("appnexus")).isFalse(); + assertThat(keptInAuction.get("pubmatic")).isFalse(); + } + + @Test + public void createGreenbidsInvocationResultShouldRemoveImpFromUpdateBidRequestWhenAllBiddersFiltered() { + // given + final Banner banner = givenBanner(); + final Imp imp1 = Imp.builder() + .id("adunitcodevalue1") + .ext(givenImpExt()) + .banner(banner) + .build(); + final Imp imp2 = Imp.builder() + .id("adunitcodevalue2") + .ext(givenImpExtToFilterAllBidders()) + .banner(banner) + .build(); + final Device device = givenDevice(identity()); + final BidRequest bidRequest = givenBidRequest(request -> request, List.of(imp1, imp2), device); + final Map> impsBiddersFilterMap = givenFilterMapWithAllFilteredBiddersInImp(); + final GreenbidsConfig greenbidsConfig = givenPartner(0.0); + + // when + final GreenbidsInvocationResult result = target.createGreenbidsInvocationResult( + greenbidsConfig, bidRequest, impsBiddersFilterMap); + + // then + final JsonNode updatedBidRequestExtPrebidBidders = result.getUpdatedBidRequest().getImp().getFirst().getExt() + .get("prebid").get("bidder"); + final Ortb2ImpExtResult ortb2ImpExtResult = result.getAnalyticsResult().getValues().get("adunitcodevalue1"); + final Map keptInAuction = ortb2ImpExtResult.getGreenbids().getKeptInAuction(); + + assertThat(result.getInvocationAction()).isEqualTo(InvocationAction.update); + assertThat(result.getUpdatedBidRequest().getImp()).hasSize(1); + assertThat(updatedBidRequestExtPrebidBidders.has("rubicon")).isTrue(); + assertThat(updatedBidRequestExtPrebidBidders.has("appnexus")).isFalse(); + assertThat(updatedBidRequestExtPrebidBidders.has("pubmatic")).isFalse(); + assertThat(ortb2ImpExtResult).isNotNull(); + assertThat(ortb2ImpExtResult.getGreenbids().getIsExploration()).isFalse(); + assertThat(ortb2ImpExtResult.getGreenbids().getFingerprint()).isNotNull(); + assertThat(keptInAuction.get("rubicon")).isTrue(); + assertThat(keptInAuction.get("appnexus")).isFalse(); + assertThat(keptInAuction.get("pubmatic")).isFalse(); + + } + private Map> givenImpsBiddersFilterMap() { final Map biddersFitlerMap = new HashMap<>(); biddersFitlerMap.put("rubicon", true); @@ -120,6 +199,34 @@ private Map> givenImpsBiddersFilterMap() { return impsBiddersFilterMap; } + private Map> givenFilterMapWithAllFilteredImps() { + final Map biddersFitlerMap = new HashMap<>(); + biddersFitlerMap.put("rubicon", false); + biddersFitlerMap.put("appnexus", false); + biddersFitlerMap.put("pubmatic", false); + + final Map> impsBiddersFilterMap = new HashMap<>(); + impsBiddersFilterMap.put("adunitcodevalue", biddersFitlerMap); + + return impsBiddersFilterMap; + } + + private Map> givenFilterMapWithAllFilteredBiddersInImp() { + final Map biddersFitlerMapForKeptImp = new HashMap<>(); + biddersFitlerMapForKeptImp.put("rubicon", true); + biddersFitlerMapForKeptImp.put("appnexus", false); + biddersFitlerMapForKeptImp.put("pubmatic", false); + + final Map biddersFitlerMapForRemovedImp = new HashMap<>(); + biddersFitlerMapForRemovedImp.put("appnexus", false); + + final Map> impsBiddersFilterMap = new HashMap<>(); + impsBiddersFilterMap.put("adunitcodevalue1", biddersFitlerMapForKeptImp); + impsBiddersFilterMap.put("adunitcodevalue2", biddersFitlerMapForRemovedImp); + + return impsBiddersFilterMap; + } + private GreenbidsConfig givenPartner(Double explorationRate) { return GreenbidsConfig.of("test-pbuid", 0.60, explorationRate); } diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/util/TestBidRequestProvider.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/util/TestBidRequestProvider.java index 7cb8e902dff..5e07f350869 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/util/TestBidRequestProvider.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/util/TestBidRequestProvider.java @@ -96,6 +96,23 @@ public static ObjectNode givenImpExt() { return extNode; } + public static ObjectNode givenImpExtToFilterAllBidders() { + final ObjectNode bidderNode = MAPPER.createObjectNode(); + + final ObjectNode appnexusNode = MAPPER.createObjectNode(); + appnexusNode.put("placementId", 789); + bidderNode.set("appnexus", appnexusNode); + + final ObjectNode prebidNode = MAPPER.createObjectNode(); + prebidNode.set("bidder", bidderNode); + + final ObjectNode extNode = MAPPER.createObjectNode(); + extNode.set("prebid", prebidNode); + extNode.set("tid", TextNode.valueOf("af65045c-2774-44c2-a949-4f42d5c9e179")); + + return extNode; + } + public static Device givenDevice(UnaryOperator deviceCustomizer, String countryAlpha3) { final String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36" + " (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java index 36e9300d83e..26b4fe37a31 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java @@ -176,7 +176,7 @@ public void callShouldFilterBiddersWhenPartnerActivatedInBidRequest() final BidRequest expectedBidRequest = expectedUpdatedBidRequest( request -> request, device, true); - final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, true); // when final Future> future = target @@ -236,7 +236,7 @@ public void callShouldFilterBiddersAndReturnAnalyticsTagWhenExploration() throws when(thresholdsCacheWithExpiration.getIfPresent("throttlingThresholds_test-pbuid")) .thenReturn(givenThrottlingThresholds()); - final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, false); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, true); // when final Future> future = target @@ -292,7 +292,7 @@ public void callShouldFilterBiddersBasedOnModelWhenAnyFeatureNotAvailable() thro final BidRequest expectedBidRequest = expectedUpdatedBidRequest( request -> request, device, false); - final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, true); // when final Future> future = target @@ -353,7 +353,7 @@ public void callShouldFilterBiddersBasedOnModelResults() throws OrtException, IO final BidRequest expectedBidRequest = expectedUpdatedBidRequest( request -> request, device, false); - final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, true); // when final Future> future = target @@ -413,7 +413,7 @@ private ObjectNode givenAccountConfig(Double explorationRate) { final ObjectNode greenbidsNode = TestBidRequestProvider.MAPPER.createObjectNode(); greenbidsNode.put("enabled", true); greenbidsNode.put("pbuid", "test-pbuid"); - greenbidsNode.put("target-tpr", 0.60); + greenbidsNode.put("target-tpr", 0.99); greenbidsNode.put("exploration-rate", explorationRate); return greenbidsNode; } @@ -440,6 +440,22 @@ private BidRequest expectedUpdatedBidRequest( final Banner banner = givenBanner(); final ObjectNode bidderNode = TestBidRequestProvider.MAPPER.createObjectNode(); + + final ObjectNode rubiconNode = TestBidRequestProvider.MAPPER.createObjectNode(); + rubiconNode.put("accountId", 1001); + rubiconNode.put("siteId", 267318); + rubiconNode.put("zoneId", 1861698); + bidderNode.set("rubicon", rubiconNode); + + final ObjectNode appnexusNode = TestBidRequestProvider.MAPPER.createObjectNode(); + appnexusNode.put("placementId", 123456); + bidderNode.set("appnexus", appnexusNode); + + final ObjectNode pubmaticNode = TestBidRequestProvider.MAPPER.createObjectNode(); + pubmaticNode.put("publisherId", "156209"); + pubmaticNode.put("adSlot", "slot1@300x250"); + bidderNode.set("pubmatic", pubmaticNode); + final ObjectNode prebidNode = TestBidRequestProvider.MAPPER.createObjectNode(); prebidNode.set("bidder", bidderNode); @@ -504,7 +520,6 @@ private Result toResult(AnalyticsResult analyticsResult) { toObjectNode(analyticsResult.getValues()), AppliedToImpl.builder() .impIds(Collections.singletonList("adunitcodevalue")) - .bidders(List.of("appnexus", "pubmatic", "rubicon")) .build()); } From 0f6a7c2153c04cdb7372d44f751954d22db526c0 Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Tue, 18 Feb 2025 11:38:23 +0100 Subject: [PATCH 7/8] fixes --- .../time/data/core/GreenbidsInvocationService.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java index c5d2350ebe8..16cf38ee1be 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java @@ -32,18 +32,17 @@ public GreenbidsInvocationResult createGreenbidsInvocationResult( final String greenbidsId = UUID.randomUUID().toString(); final boolean isExploration = isExploration(greenbidsConfig, greenbidsId); - boolean allImpsRejected = impsBiddersFilterMap.values().stream() - .allMatch(biddersMapp -> biddersMapp.values().stream().noneMatch(isKept -> isKept)); + final List updatedImps = updateImps(bidRequest, impsBiddersFilterMap); - BidRequest updatedBidRequest = (isExploration || allImpsRejected) + BidRequest updatedBidRequest = (isExploration || updatedImps.isEmpty()) ? bidRequest : bidRequest.toBuilder() - .imp(updateImps(bidRequest, impsBiddersFilterMap)) + .imp(updatedImps) .build(); InvocationAction invocationAction = isExploration ? InvocationAction.no_action : InvocationAction.update; - invocationAction = allImpsRejected ? InvocationAction.reject : invocationAction; + invocationAction = updatedImps.isEmpty() ? InvocationAction.reject : invocationAction; final Map ort2ImpExtResultMap = createOrtb2ImpExtForImps( bidRequest, impsBiddersFilterMap, greenbidsId, isExploration); @@ -69,8 +68,8 @@ private List updateImps(BidRequest bidRequest, Map> impsBiddersFilterMap) { - Map biddersMap = impsBiddersFilterMap.get(imp.getId()); - return biddersMap != null && biddersMap.values().stream().anyMatch(isKept -> isKept); + final Map biddersMap = impsBiddersFilterMap.get(imp.getId()); + return biddersMap.values().stream().anyMatch(isKept -> isKept); } private Imp updateImp(Imp imp, Map bidderFilterMap) { From cbadfaa046b64748ee74a30aae962276cb11a01c Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Tue, 18 Feb 2025 15:18:55 +0100 Subject: [PATCH 8/8] fixes --- .../data/core/GreenbidsInvocationService.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java index 16cf38ee1be..889945874fc 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/GreenbidsInvocationService.java @@ -34,15 +34,17 @@ public GreenbidsInvocationResult createGreenbidsInvocationResult( final List updatedImps = updateImps(bidRequest, impsBiddersFilterMap); - BidRequest updatedBidRequest = (isExploration || updatedImps.isEmpty()) + final BidRequest updatedBidRequest = (isExploration || updatedImps.isEmpty()) ? bidRequest : bidRequest.toBuilder() .imp(updatedImps) .build(); - InvocationAction invocationAction = isExploration - ? InvocationAction.no_action - : InvocationAction.update; - invocationAction = updatedImps.isEmpty() ? InvocationAction.reject : invocationAction; + + final InvocationAction invocationAction = updatedImps.isEmpty() + ? InvocationAction.reject + : isExploration + ? InvocationAction.no_action + : InvocationAction.update; final Map ort2ImpExtResultMap = createOrtb2ImpExtForImps( bidRequest, impsBiddersFilterMap, greenbidsId, isExploration); @@ -68,8 +70,7 @@ private List updateImps(BidRequest bidRequest, Map> impsBiddersFilterMap) { - final Map biddersMap = impsBiddersFilterMap.get(imp.getId()); - return biddersMap.values().stream().anyMatch(isKept -> isKept); + return impsBiddersFilterMap.get(imp.getId()).values().stream().anyMatch(isKept -> isKept); } private Imp updateImp(Imp imp, Map bidderFilterMap) {