Skip to content

Commit

Permalink
Revert "Rubicon: Update segtax logic (#3915)"
Browse files Browse the repository at this point in the history
This reverts commit 6e3a0d5.
  • Loading branch information
bsardo committed Jan 17, 2025
1 parent 42b4cfe commit cd04a0c
Show file tree
Hide file tree
Showing 15 changed files with 1,842 additions and 631 deletions.
127 changes: 26 additions & 101 deletions adapters/rubicon/rubicon.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import (
"strconv"
"strings"

"github.com/golang-collections/collections/stack"

"github.com/prebid/prebid-server/v3/version"

"github.com/prebid/prebid-server/v3/adapters"
Expand Down Expand Up @@ -404,7 +402,7 @@ func (a *RubiconAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *ada
siteExtRP := rubiconSiteExt{RP: rubiconSiteExtRP{SiteID: int(siteId)}}
if siteCopy.Content != nil {
siteTarget := make(map[string]interface{})
updateExtWithIabAndSegtaxAttribute(siteTarget, siteCopy.Content.Data, []int{1, 2, 5, 6})
updateExtWithIabAttribute(siteTarget, siteCopy.Content.Data, []int{1, 2, 5, 6})
if len(siteTarget) > 0 {
updatedSiteTarget, err := json.Marshal(siteTarget)
if err != nil {
Expand Down Expand Up @@ -753,7 +751,7 @@ func updateUserRpTargetWithFpdAttributes(visitor json.RawMessage, user openrtb2.
if err != nil {
return nil, err
}
updateExtWithIabAndSegtaxAttribute(target, user.Data, []int{4})
updateExtWithIabAttribute(target, user.Data, []int{4})

updatedTarget, err := json.Marshal(target)
if err != nil {
Expand All @@ -762,106 +760,13 @@ func updateUserRpTargetWithFpdAttributes(visitor json.RawMessage, user openrtb2.
return updatedTarget, nil
}

func updateExtWithIabAndSegtaxAttribute(target map[string]interface{}, data []openrtb2.Data, segTaxes []int) {
taxonomyIdToSegments := getTaxonomyIdToSegments(data)
if len(taxonomyIdToSegments) == 0 {
func updateExtWithIabAttribute(target map[string]interface{}, data []openrtb2.Data, segTaxes []int) {
var segmentIdsToCopy = getSegmentIdsToCopy(data, segTaxes)
if len(segmentIdsToCopy) == 0 {
return
}

relevantSegments := pickRelevantSegments(taxonomyIdToSegments)
groupedSegments := groupSegments(relevantSegments, segTaxes)

for key, value := range groupedSegments {
target[key] = value
}
}

func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*stack.Stack {
var taxonomyIdToSegments = make(map[int]*stack.Stack)
for _, dataRecord := range data {
if dataRecord.Ext == nil {
continue
}

var dataRecordExt rubiconDataExt
err := json.Unmarshal(dataRecord.Ext, &dataRecordExt)
if err != nil {
continue
}

taxonomyId := dataRecordExt.SegTax
originalSegments := dataRecord.Segment
if len(originalSegments) == 0 {
continue
}

segments, exists := taxonomyIdToSegments[taxonomyId]
if !exists {
segments = stack.New()
taxonomyIdToSegments[taxonomyId] = segments
}

for _, originalSegment := range originalSegments {
if originalSegment.ID != "" {
segments.Push(originalSegment)
}
}

if segments.Len() == 0 {
delete(taxonomyIdToSegments, taxonomyId)
}
}

return taxonomyIdToSegments
}

func pickRelevantSegments(taxonomyIdToSegments map[int]*stack.Stack) map[int][]string {
var relevantSegments = make(map[int][]string)
taxonomyIds := make([]int, 0)

for taxonomyId := range taxonomyIdToSegments {
taxonomyIds = append(taxonomyIds, taxonomyId)
}

i := 0
consumedSegmentsCount := 0
for consumedSegmentsCount < 100 && len(taxonomyIds) > 0 {
taxonomyIdIndex := i % len(taxonomyIds)
taxonomyId := taxonomyIds[taxonomyIdIndex]
currentSegments := taxonomyIdToSegments[taxonomyId]
lastSegment := currentSegments.Pop().(openrtb2.Segment)

if _, exists := relevantSegments[taxonomyId]; !exists {
relevantSegments[taxonomyId] = make([]string, 0)
}
relevantSegments[taxonomyId] = append(relevantSegments[taxonomyId], lastSegment.ID)
consumedSegmentsCount++

if currentSegments.Len() == 0 {
taxonomyIds = append(taxonomyIds[:taxonomyIdIndex], taxonomyIds[taxonomyIdIndex+1:]...)
i--
}
i++
}

return relevantSegments
}

func groupSegments(taxonomyIdToSegmentsIds map[int][]string, segTaxes []int) map[string][]string {
var groupedSegments = make(map[string][]string)
for taxonomyId, segmentsIds := range taxonomyIdToSegmentsIds {
segmentName := "iab"
if !contains(segTaxes, taxonomyId) {
segmentName = "tax" + strconv.Itoa(taxonomyId)
}

if _, exists := groupedSegments[segmentName]; !exists {
groupedSegments[segmentName] = make([]string, 0)
}
groupedSegments[segmentName] = append(groupedSegments[segmentName], segmentsIds...)
}

return groupedSegments
target["iab"] = segmentIdsToCopy
}

func populateFirstPartyDataAttributes(source json.RawMessage, target map[string]interface{}) error {
Expand Down Expand Up @@ -940,6 +845,26 @@ func mapFromRawJSON(message json.RawMessage) (map[string]interface{}, error) {
return targetAsMap, nil
}

func getSegmentIdsToCopy(data []openrtb2.Data, segTaxValues []int) []string {
var segmentIdsToCopy = make([]string, 0, len(data))

for _, dataRecord := range data {
if dataRecord.Ext != nil {
var dataExtObject rubiconDataExt
err := jsonutil.Unmarshal(dataRecord.Ext, &dataExtObject)
if err != nil {
continue
}
if contains(segTaxValues, dataExtObject.SegTax) {
for _, segment := range dataRecord.Segment {
segmentIdsToCopy = append(segmentIdsToCopy, segment.ID)
}
}
}
}
return segmentIdsToCopy
}

func contains(s []int, e int) bool {
for _, a := range s {
if a == e {
Expand Down
Loading

0 comments on commit cd04a0c

Please sign in to comment.