Skip to content

Commit d1fc10a

Browse files
committed
Small fix
1 parent d5089fc commit d1fc10a

1 file changed

Lines changed: 29 additions & 22 deletions

File tree

src/main/java/org/prebid/server/auction/adpodding/AdPoddingBidDeduplicationService.java

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@
2727
import java.math.BigDecimal;
2828
import java.math.RoundingMode;
2929
import java.util.ArrayList;
30+
import java.util.HashSet;
3031
import java.util.List;
3132
import java.util.Map;
3233
import java.util.Objects;
3334
import java.util.Optional;
35+
import java.util.Set;
3436
import java.util.function.Predicate;
3537
import java.util.stream.Collectors;
3638

@@ -95,32 +97,37 @@ private void deduplicateBids(List<Imp> imps,
9597
.filter(impFilter)
9698
.toList();
9799

98-
final Map<String, List<BidderBid>> impIdToBids = bids.stream()
100+
final Map<String, Map<Set<String>, List<BidderBid>>> impIdToBids = bids.stream()
99101
.filter(bidFilter)
100-
.collect(Collectors.groupingBy(bid -> correspondingImp(bid.getBid().getImpid(), filteredImps).getId()));
101-
102-
for (List<BidderBid> filteredBids : impIdToBids.values()) {
103-
BigDecimal highestCpmPerSecond = BigDecimal.ZERO;
104-
BidderBid winnerBid = null;
105-
for (BidderBid bidderBid : filteredBids) {
106-
final Bid bid = bidderBid.getBid();
107-
final Integer duration = ObjectUtils.firstNonNull(bid.getDur(), getBidMetaDuration(bid));
108-
final BigDecimal cpmPerSecond = bid.getPrice()
109-
.divide(BigDecimal.valueOf(duration), 4, RoundingMode.HALF_EVEN);
110-
111-
if (cpmPerSecond.compareTo(highestCpmPerSecond) > 0) {
112-
highestCpmPerSecond = cpmPerSecond;
113-
if (winnerBid != null) {
114-
bidRejectionTracker.rejectBid(winnerBid, BidRejectionReason.RESPONSE_REJECTED_DUPLICATE);
102+
.collect(Collectors.groupingBy(
103+
bid -> correspondingImp(bid.getBid().getImpid(), filteredImps).getId(),
104+
//todo: what if adomain is absent
105+
Collectors.groupingBy(bid -> new HashSet<>(bid.getBid().getAdomain()))));
106+
107+
for (Map<Set<String>, List<BidderBid>> adomainToBids : impIdToBids.values()) {
108+
for (List<BidderBid> filteredBids : adomainToBids.values()) {
109+
BigDecimal highestCpmPerSecond = BigDecimal.ZERO;
110+
BidderBid winnerBid = null;
111+
for (BidderBid bidderBid : filteredBids) {
112+
final Bid bid = bidderBid.getBid();
113+
final Integer duration = ObjectUtils.firstNonNull(bid.getDur(), getBidMetaDuration(bid));
114+
final BigDecimal cpmPerSecond = bid.getPrice()
115+
.divide(BigDecimal.valueOf(duration), 4, RoundingMode.HALF_EVEN);
116+
117+
if (cpmPerSecond.compareTo(highestCpmPerSecond) > 0) {
118+
highestCpmPerSecond = cpmPerSecond;
119+
if (winnerBid != null) {
120+
bidRejectionTracker.rejectBid(winnerBid, BidRejectionReason.RESPONSE_REJECTED_DUPLICATE);
121+
}
122+
winnerBid = bidderBid;
123+
} else {
124+
bidRejectionTracker.rejectBid(bidderBid, BidRejectionReason.RESPONSE_REJECTED_DUPLICATE);
115125
}
116-
winnerBid = bidderBid;
117-
} else {
118-
bidRejectionTracker.rejectBid(bidderBid, BidRejectionReason.RESPONSE_REJECTED_DUPLICATE);
119126
}
120-
}
121127

122-
if (winnerBid != null) {
123-
winningBids.add(winnerBid);
128+
if (winnerBid != null) {
129+
winningBids.add(winnerBid);
130+
}
124131
}
125132
}
126133
}

0 commit comments

Comments
 (0)