From 919017e571e025274acc974078bb043b8e8219c1 Mon Sep 17 00:00:00 2001 From: UITTD Date: Thu, 14 Nov 2019 13:21:58 +0100 Subject: [PATCH] categories added to response, freq cap banner level added, publisher_id macro added --- .../dsp/rtb/bidder/CampaignProcessor.java | 9 ++-- .../dsp/rtb/bidder/CampaignSelector.java | 8 +++- src/com/jacamars/dsp/rtb/common/Creative.java | 43 +++++++++++++------ .../jacamars/dsp/rtb/pojo/BidResponse.java | 14 +++++- src/com/jacamars/dsp/rtb/probe/Probe.java | 1 + .../dsp/rtb/redisson/RedissonClient.java | 4 +- .../dsp/rtb/tools/MacroProcessing.java | 41 +++++++++++++++--- src/test/java/TestCampaignProcessor.java | 4 +- 8 files changed, 96 insertions(+), 28 deletions(-) diff --git a/src/com/jacamars/dsp/rtb/bidder/CampaignProcessor.java b/src/com/jacamars/dsp/rtb/bidder/CampaignProcessor.java index da3d357..25397b1 100644 --- a/src/com/jacamars/dsp/rtb/bidder/CampaignProcessor.java +++ b/src/com/jacamars/dsp/rtb/bidder/CampaignProcessor.java @@ -71,6 +71,9 @@ public class CampaignProcessor implements Runnable { /** The logging object */ static final Logger logger = LoggerFactory.getLogger(CampaignProcessor.class); + /** Map to check creative caps */ + Map capSpecs; + /** * Constructor. * @@ -79,12 +82,12 @@ public class CampaignProcessor implements Runnable { * @param br * . BidRequest. The bid request to apply to this campaign. */ - public CampaignProcessor(Campaign camp, BidRequest br, CountDownLatch flag, - AbortableCountDownLatch latch) { + public CampaignProcessor(Campaign camp, BidRequest br, Map capSpecs, CountDownLatch flag, AbortableCountDownLatch latch) { this.camp = camp; this.br = br; this.latch = latch; this.flag = flag; + this.capSpecs = capSpecs; if (latch != null) start(); @@ -181,7 +184,7 @@ public void run() { for (int i=0; i capSpecs) throws Exception { /** * Fixed nodes do not access deals or the br impressions @@ -544,7 +537,7 @@ public SelectedCreative process(BidRequest br, String adId, StringBuilder errorS for (int i=0; i capSpecs) throws Exception { //List newDeals = null; String dealId = null; double xprice = price; @@ -616,6 +609,15 @@ public SelectedCreative xproc(BidRequest br, String adId, Impression imp, String } } + // Creative frequency cap check + if (isCapped(br, capSpecs,adId)) { + if (errorString != null) { + errorString.append("Creative capped by frequency cap "); + } + probe.process(br.getExchange(), adId, impid, Probe.FREQUENCY_CAPPED_CREATIVE); + return null; + } + return new SelectedCreative(this, dealId, xprice, impid); } @@ -697,4 +699,17 @@ public Node findAttribute(String hierarchy) { } return null; } + + /** + * Is this creative capped on the item in this bid request? + * @param br BidRequest. The bid request to query. + * @param capSpecs Map. The current cap spec. + * @return boolean. Returns true if the item is capped, else false. + */ + public boolean isCapped(BidRequest br, Map capSpecs, String adId) { + if (frequencyCap == null) + return false; + return frequencyCap.isCapped(br,capSpecs,adId.concat("B").concat(impid).concat("_")); + } + } diff --git a/src/com/jacamars/dsp/rtb/pojo/BidResponse.java b/src/com/jacamars/dsp/rtb/pojo/BidResponse.java index 60a804f..aed227b 100644 --- a/src/com/jacamars/dsp/rtb/pojo/BidResponse.java +++ b/src/com/jacamars/dsp/rtb/pojo/BidResponse.java @@ -718,8 +718,20 @@ public void makeResponse(double price) throws Exception { } else { response.append(getTemplate()); } + response.append('"'); + + // Categories + if (creat.categories != null && creat.categories.size() > 0) { + response.append(",\"cat\":["); + for (int i=0;i list, BidRequest br, Creative creat, Imp replaceAll(sb, item, value); break; + case "{publisher_id}": + case "{publisher_id_enc}": + case "%7Bpublisher_id%7D": + o = br.interrogate("site.publisher.id"); + if (o == null) + o = br.interrogate("app.publisher.id"); + if (o != null) + value = BidRequest.getStringFrom(o); + else + value = ""; + value = encodeIfRequested(item, value); + replaceAll(sb, item, value); + break; + + case "{publisher_name}": + case "{publisher_name_enc}": + case "%7Bpublisher_name%7D": + o = br.interrogate("site.publisher.name"); + if (o == null) + o = br.interrogate("app.publisher.name"); + if (o != null) + value = BidRequest.getStringFrom(o); + else + value = ""; + value = encodeIfRequested(item, value); + replaceAll(sb, item, value); + break; + case "{adsize}": case "{adsize_enc}": case "%7Badsize%7D": diff --git a/src/test/java/TestCampaignProcessor.java b/src/test/java/TestCampaignProcessor.java index 9ba941a..c3f119d 100644 --- a/src/test/java/TestCampaignProcessor.java +++ b/src/test/java/TestCampaignProcessor.java @@ -66,7 +66,7 @@ public void testNoCampaigns() throws Exception { AbortableCountDownLatch latch = new AbortableCountDownLatch(1,1); CountDownLatch flag = new CountDownLatch(1); - CampaignProcessor proc = new CampaignProcessor(null,request,flag,latch); + CampaignProcessor proc = new CampaignProcessor(null,request, null,flag,latch); flag.countDown(); proc.run(); List resp = proc.getSelectedCreative(); @@ -95,7 +95,7 @@ public void testOneMatching() throws Exception { AbortableCountDownLatch latch = new AbortableCountDownLatch(1,1); CountDownLatch flag = new CountDownLatch(1); - CampaignProcessor proc = new CampaignProcessor(c,request, flag, latch); + CampaignProcessor proc = new CampaignProcessor(c,request, null, flag, latch); flag.countDown(); latch.await(); List resp = proc.getSelectedCreative();