Skip to content

Commit

Permalink
Stored bid response (#1174)
Browse files Browse the repository at this point in the history
  • Loading branch information
BraslavskiyAndrey authored and nickluck8 committed Aug 10, 2021
1 parent 8e63dc1 commit eb63d95
Show file tree
Hide file tree
Showing 26 changed files with 895 additions and 669 deletions.
43 changes: 26 additions & 17 deletions src/main/java/org/prebid/server/auction/ExchangeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,16 +149,16 @@ public Future<BidResponse> holdAuction(AuctionContext context) {
final Account account = context.getAccount();
final List<String> debugWarnings = context.getDebugWarnings();

final List<SeatBid> storedResponse = new ArrayList<>();
final List<SeatBid> storedAuctionResponses = new ArrayList<>();
final BidderAliases aliases = aliases(bidRequest);
final String publisherId = account.getId();
final BidRequestCacheInfo cacheInfo = bidRequestCacheInfo(bidRequest);
final boolean debugEnabled = isDebugEnabled(bidRequest);
final Map<String, MultiBidConfig> bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings);

return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), aliases, timeout)
.map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedResponse))
.compose(impsRequiredRequest -> extractBidderRequests(context, impsRequiredRequest, aliases))
return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), timeout)
.map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedAuctionResponses))
.compose(storedResponseResult -> extractBidderRequests(context, storedResponseResult, aliases))
.map(bidderRequests -> updateRequestMetric(
bidderRequests, uidsCookie, aliases, publisherId, context.getRequestTypeMetric()))
.compose(bidderRequests -> CompositeFuture.join(
Expand All @@ -172,7 +172,7 @@ public Future<BidResponse> holdAuction(AuctionContext context) {
// send all the requests to the bidders and gathers results
.map(CompositeFuture::<BidderResponse>list)
.map(bidderResponses -> storedResponseProcessor.mergeWithBidderResponses(
bidderResponses, storedResponse, bidRequest.getImp()))
bidderResponses, storedAuctionResponses, bidRequest.getImp()))
.map(bidderResponses -> validateAndAdjustBids(bidderResponses, context, aliases))
.map(bidderResponses -> updateMetricsFromResponses(bidderResponses, publisherId, aliases))
// produce response from bidder results
Expand Down Expand Up @@ -327,10 +327,10 @@ private static MultiBidConfig toMultiBid(String bidder, Integer maxBids, String
* Populates storedResponse parameter with stored {@link List<SeatBid>} and returns {@link List<Imp>} for which
* request to bidders should be performed.
*/
private static List<Imp> populateStoredResponse(StoredResponseResult storedResponseResult,
List<SeatBid> storedResponse) {
storedResponse.addAll(storedResponseResult.getStoredResponse());
return storedResponseResult.getRequiredRequestImps();
private static StoredResponseResult populateStoredResponse(StoredResponseResult storedResponseResult,
List<SeatBid> storedResponse) {
storedResponse.addAll(storedResponseResult.getAuctionStoredResponse());
return storedResponseResult;
}

/**
Expand Down Expand Up @@ -362,21 +362,20 @@ private static List<Imp> populateStoredResponse(StoredResponseResult storedRespo
* {@link Imp}, and are known to {@link BidderCatalog} or aliases from bidRequest.ext.prebid.aliases.
*/
private Future<List<BidderRequest>> extractBidderRequests(AuctionContext context,
List<Imp> requestedImps,
StoredResponseResult storedResponseResult,
BidderAliases aliases) {

final List<Imp> imps = requestedImps.stream()
final List<Imp> imps = storedResponseResult.getRequiredRequestImps().stream()
.filter(imp -> bidderParamsFromImpExt(imp.getExt()) != null)
.collect(Collectors.toList());

// identify valid bidders and aliases out of imps
final List<String> bidders = imps.stream()
.flatMap(imp -> StreamUtil.asStream(bidderParamsFromImpExt(imp.getExt()).fieldNames())
.filter(bidder -> isValidBidder(bidder, aliases)))
.distinct()
.collect(Collectors.toList());

return makeBidderRequests(bidders, context, aliases, imps);
return makeBidderRequests(bidders, context, aliases, storedResponseResult.getImpBidderToStoredBidResponse(),
imps);
}

private static JsonNode bidderParamsFromImpExt(ObjectNode ext) {
Expand Down Expand Up @@ -408,6 +407,7 @@ private boolean isValidBidder(String bidder, BidderAliases aliases) {
private Future<List<BidderRequest>> makeBidderRequests(List<String> bidders,
AuctionContext context,
BidderAliases aliases,
Map<String, Map<String, String>> impBidderToStoredResponse,
List<Imp> imps) {

final BidRequest bidRequest = context.getBidRequest();
Expand All @@ -424,7 +424,8 @@ private Future<List<BidderRequest>> makeBidderRequests(List<String> bidders,
return privacyEnforcementService
.mask(context, bidderToUser, bidders, aliases)
.map(bidderToPrivacyResult ->
getBidderRequests(bidderToPrivacyResult, bidRequest, imps, biddersToConfigs));
getBidderRequests(bidderToPrivacyResult, bidRequest, impBidderToStoredResponse, imps,
biddersToConfigs));
}

private Map<String, ExtBidderConfigOrtb> getBiddersToConfigs(ExtRequest requestExt) {
Expand Down Expand Up @@ -576,6 +577,7 @@ private String resolveCookieFamilyName(String bidder) {
*/
private List<BidderRequest> getBidderRequests(List<BidderPrivacyResult> bidderPrivacyResults,
BidRequest bidRequest,
Map<String, Map<String, String>> impBidderToStoredBidResponse,
List<Imp> imps,
Map<String, ExtBidderConfigOrtb> biddersToConfigs) {

Expand All @@ -588,6 +590,7 @@ private List<BidderRequest> getBidderRequests(List<BidderPrivacyResult> bidderPr
.map(bidderPrivacyResult -> createBidderRequest(
bidderPrivacyResult,
bidRequest,
impBidderToStoredBidResponse,
imps,
biddersToConfigs,
bidderToPrebidBidders))
Expand Down Expand Up @@ -624,6 +627,7 @@ private static Map<String, JsonNode> bidderToPrebidBidders(BidRequest bidRequest
*/
private BidderRequest createBidderRequest(BidderPrivacyResult bidderPrivacyResult,
BidRequest bidRequest,
Map<String, Map<String, String>> impBidderToStoredBidResponse,
List<Imp> imps,
Map<String, ExtBidderConfigOrtb> biddersToConfigs,
Map<String, JsonNode> bidderToPrebidBidders) {
Expand All @@ -650,7 +654,12 @@ private BidderRequest createBidderRequest(BidderPrivacyResult bidderPrivacyResul
return null;
}

return BidderRequest.of(bidder, bidRequest.toBuilder()
// stored bid response supported only for single imp requests
final String storedBidResponse = impBidderToStoredBidResponse.size() == 1
? impBidderToStoredBidResponse.get(imps.get(0).getId()).get(bidder)
: null;

return BidderRequest.of(bidder, storedBidResponse, bidRequest.toBuilder()
// User was already prepared above
.user(bidderPrivacyResult.getUser())
.device(bidderPrivacyResult.getDevice())
Expand Down Expand Up @@ -889,7 +898,7 @@ private Future<BidderResponse> requestBids(BidderRequest bidderRequest,
final Bidder<?> bidder = bidderCatalog.bidderByName(aliases.resolveBidder(bidderName));
final long startTime = clock.millis();

return httpBidderRequester.requestBids(bidder, bidderRequest.getBidRequest(), timeout, debugEnabled)
return httpBidderRequester.requestBids(bidder, bidderRequest, timeout, debugEnabled)
.map(seatBid -> BidderResponse.of(bidderName, seatBid, responseTime(startTime)));
}

Expand Down
Loading

0 comments on commit eb63d95

Please sign in to comment.