|
27 | 27 | import java.math.BigDecimal; |
28 | 28 | import java.math.RoundingMode; |
29 | 29 | import java.util.ArrayList; |
| 30 | +import java.util.HashSet; |
30 | 31 | import java.util.List; |
31 | 32 | import java.util.Map; |
32 | 33 | import java.util.Objects; |
33 | 34 | import java.util.Optional; |
| 35 | +import java.util.Set; |
34 | 36 | import java.util.function.Predicate; |
35 | 37 | import java.util.stream.Collectors; |
36 | 38 |
|
@@ -95,32 +97,37 @@ private void deduplicateBids(List<Imp> imps, |
95 | 97 | .filter(impFilter) |
96 | 98 | .toList(); |
97 | 99 |
|
98 | | - final Map<String, List<BidderBid>> impIdToBids = bids.stream() |
| 100 | + final Map<String, Map<Set<String>, List<BidderBid>>> impIdToBids = bids.stream() |
99 | 101 | .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); |
115 | 125 | } |
116 | | - winnerBid = bidderBid; |
117 | | - } else { |
118 | | - bidRejectionTracker.rejectBid(bidderBid, BidRejectionReason.RESPONSE_REJECTED_DUPLICATE); |
119 | 126 | } |
120 | | - } |
121 | 127 |
|
122 | | - if (winnerBid != null) { |
123 | | - winningBids.add(winnerBid); |
| 128 | + if (winnerBid != null) { |
| 129 | + winningBids.add(winnerBid); |
| 130 | + } |
124 | 131 | } |
125 | 132 | } |
126 | 133 | } |
|
0 commit comments