コード例 #1
0
ファイル: alocal.php プロジェクト: villos/tree_admin
function _adSelectCommon($aAds, $context, $source, $richMedia)
{
    // Are there any ads linked?
    if (!empty($aAds['count_active'])) {
        // Get an ad from the any exclusive campaigns first...
        $aLinkedAd = _adSelect($aAds, $context, $source, $richMedia, 'xAds');
        // If no ad selected, and a previous ad on the page has set that companion ads should be selected...
        if (!is_array($aLinkedAd) && isset($aAds['zone_companion']) && is_array($aAds['zone_companion']) && !empty($context)) {
            // The companion paid ads are now grouped by campaign-priority so we need to iterate over the
            for ($i = 10; $i > 0; $i--) {
                if (!empty($aAds['cAds'][$i])) {
                    $aLinkedAd = _adSelect($aAds, $context, $source, $richMedia, 'cAds', $i);
                    // Did we pick an ad from this campaign-priority level?
                    if (is_array($aLinkedAd)) {
                        break;
                    }
                }
            }
            // If still no ad selected...
            if (!is_array($aLinkedAd)) {
                // Select one of the low-priority companion ads
                $aLinkedAd = _adSelect($aAds, $context, $source, $richMedia, 'clAds');
            }
        }
        // If still no ad selected...
        if (!is_array($aLinkedAd)) {
            // Select one of the normal ads
            // The normal ads are now grouped by campaign-priority so we need to iterate over the
            for ($i = 10; $i > 0; $i--) {
                if (!empty($aAds['ads'][$i])) {
                    $aLinkedAd = _adSelect($aAds, $context, $source, $richMedia, 'ads', $i);
                    // Did we pick an ad from this campaign-priority level?
                    if (is_array($aLinkedAd)) {
                        break;
                    }
                }
            }
        }
        // If still no ad selected...
        if (!is_array($aLinkedAd)) {
            // Select one of the low-priority ads
            $aLinkedAd = _adSelect($aAds, $context, $source, $richMedia, 'lAds');
        }
        if (!is_array($aLinkedAd)) {
            // Select one of the low-priority ads
            $aLinkedAd = _adSelect($aAds, $context, $source, $richMedia, 'eAds', -2);
        }
        if (is_array($aLinkedAd)) {
            return $aLinkedAd;
        }
    }
    return false;
}
コード例 #2
0
 /**
  * @todo Fix this test to not rely on apd:override_function
  *
  */
 function test_adSelect2()
 {
     $this->sendMessage('test_adSelect2');
     require_once MAX_PATH . '/lib/max/Delivery/common.php';
     require MAX_PATH . '/lib/max/Delivery/tests/data/test_adSelectZone.php';
     // set up a small test data set
     $context = array();
     $test_ads = $aLinked_ads;
     $test_ads['ads'][4][1122] = $test_ads['ads'][5][1022];
     $test_ads['ads'][4][1124] = $test_ads['ads'][5][1024];
     $test_ads['ads'][5] = array();
     $test_ads['ads'][5][1022] = $test_ads['ads'][4][1122];
     $test_ads['ads'][5][1024] = $test_ads['ads'][4][1124];
     $test_ads['ads'][4][1122]['ad_id'] = '1122';
     $test_ads['ads'][4][1124]['ad_id'] = '1124';
     // case 1: cp5, 2 ads both 0.7
     $ads_copy = $test_ads;
     $ads_copy['ads'][5][1022]['priority'] = 0.7;
     $ads_copy['ads'][5][1024]['priority'] = 0.7;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][5];
     // this should pick the first one
     $GLOBALS['rand_val'] = 0.49;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][5]));
     $this->assertTrue($ads_copy['priority_used']['ads'][5] >= 1);
     // case 2: cp5, 2 ads both 0.7
     $prev_return = $return;
     $ads_copy = $test_ads;
     $ads_copy['ads'][5][1022]['priority'] = 0.7;
     $ads_copy['ads'][5][1024]['priority'] = 0.7;
     // this should pick the second one
     $GLOBALS['rand_val'] = 0.51;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][5]));
     $this->assertNotEqual($return['ad_id'], $prev_return['ad_id']);
     // case 3: cp5, 2 ads both 0.4, cp4, 2 ads both 0.3
     $ads_copy = $test_ads;
     $ads_copy['ads'][5][1022]['priority'] = 0.4;
     $ads_copy['ads'][5][1024]['priority'] = 0.4;
     $ads_copy['ads'][4][1122]['priority'] = 0.3;
     $ads_copy['ads'][4][1124]['priority'] = 0.3;
     // this should not pick a cp5 ad
     $GLOBALS['rand_val'] = 0.8100000000000001;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertNull($return);
     // this should choose the first ad
     $GLOBALS['rand_val'] = 0.49;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][4];
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 4);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][4]));
     $this->assertEqual($ads_copy['priority_used']['ads'][5], 0.8);
     $this->assertEqual($ads_copy['priority_used']['ads'][4], 0.6);
     // case 4: cp5, 2 ads both 0.4, cp4, 2 ads both 0.3
     $ads_copy = $test_ads;
     $prev_return = $return;
     $ads_copy['ads'][5][1022]['priority'] = 0.4;
     $ads_copy['ads'][5][1024]['priority'] = 0.4;
     $ads_copy['ads'][4][1122]['priority'] = 0.3;
     $ads_copy['ads'][4][1124]['priority'] = 0.3;
     // this should not pick a cp5 ad
     $GLOBALS['rand_val'] = 0.8100000000000001;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertNull($return);
     // this should choose the second ad
     $GLOBALS['rand_val'] = 0.51;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][4];
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 4);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][4]));
     $this->assertEqual($ads_copy['priority_used']['ads'][5], 0.8);
     $this->assertEqual($ads_copy['priority_used']['ads'][4], 0.6);
     // make sure it's not the same ad
     $this->assertNotEqual($return['ad_id'], $prev_return['ad_id']);
     // case 5: cp5, 2 ads both 0.2, cp4, 2 ads both 0.2
     $ads_copy = $test_ads;
     $prev_return = $return;
     $ads_copy['ads'][5][1022]['priority'] = 0.2;
     $ads_copy['ads'][5][1024]['priority'] = 0.2;
     $ads_copy['ads'][4][1122]['priority'] = 0.2;
     $ads_copy['ads'][4][1124]['priority'] = 0.2;
     // this will not pick from cp5 or cp4
     $GLOBALS['rand_val'] = 0.41;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertNull($return);
     $GLOBALS['rand_val'] = 0.67;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 4);
     $this->assertNull($return);
     $this->assertEqual($ads_copy['priority_used']['ads'][5], 0.4);
     $this->assertEqual($ads_copy['priority_used']['ads'][4], 0.4);
     // case 6: cp5, 2 ads both 0.5, cp4, 2 ads both 0.2
     // one of the cp5 ads will be filtered out
     $ads_copy = $test_ads;
     $ads_copy['ads'][5][1022]['priority'] = 0.5;
     $ads_copy['ads'][5][1024]['priority'] = 0.5;
     $ads_copy['ads'][4][1122]['priority'] = 0.2;
     $ads_copy['ads'][4][1124]['priority'] = 0.2;
     $context = array(array('!=' => 'bannerid:1024'));
     // this will not pick from cp5 due to the ad exclusion
     $GLOBALS['rand_val'] = 0.51;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertNull($return);
     $GLOBALS['rand_val'] = 0.79;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 4);
     $this->assertNotNull($return);
     $this->assertEqual($ads_copy['priority_used']['ads'][5], 0.5);
     $this->assertEqual($ads_copy['priority_used']['ads'][4], 0.4);
     // case 7: all ads get filtered out
     $ads_copy = $test_ads;
     unset($ads_copy['ads'][5][1022]);
     $ads_copy['ads'][5][1024]['priority'] = 0.5;
     $context = array(array('!=' => 'bannerid:1024'));
     // just expect null response
     $GLOBALS['rand_val'] = 0.51;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertNull($return);
     $this->assertTrue(!isset($ads_copy['priority_used']['ads'][5]));
     $context = "";
     // case 8: priority_used limit reached
     $ads_copy = $test_ads;
     $ads_copy['priority_used']['ads'][9] = 0.5;
     $ads_copy['priority_used']['ads'][8] = 0.3;
     $ads_copy['priority_used']['ads'][6] = 0.3;
     // this will return -1, since we've already used the entire priority space
     $GLOBALS['rand_val'] = 0.51;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertEqual($return, $GLOBALS['OX_adSelect_SkipOtherPriorityLevels']);
     $this->assertTrue(!isset($ads_copy['priority_used']['ads'][5]));
     // case 9: cp5, 2 ads both 0.5, cp4, 2 ads both 0.2
     // one of the cp5 ads will be filtered out
     $ads_copy = $test_ads;
     $ads_copy['ads'][5][1022]['priority'] = 0;
     $ads_copy['ads'][5][1024]['priority'] = 0;
     // this will not pick from cp5 due to the ad exclusion
     $GLOBALS['rand_val'] = 0.51;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 5);
     $this->assertNull($return);
     $this->assertEqual($ads_copy['priority_used']['ads'][5], 0);
     // case 10: cp5, 2 ads both 0.7, cp4, 2 ads both 0.2
     // cp5 ad will win, but confirm that the cp4 ads will be filtered
     $ads_copy = $test_ads;
     $ads_copy['ads'][5][1022]['priority'] = 0.7;
     $ads_copy['ads'][5][1024]['priority'] = 0.7;
     $ads_copy['ads'][4][1122]['priority'] = 0.2;
     $ads_copy['ads'][4][1124]['priority'] = 0.2;
     $context = array(array('!=' => 'bannerid:1124'));
     $GLOBALS['_MAX']['considered_ads'] = array();
     // this will not pick from cp5 due to the ad exclusion
     $GLOBALS['rand_val'] = 0.51;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][5];
     $return = _adSelectCommon($ads_copy, $context, $source, $richMedia);
     $this->assertNotNull($return);
     $ads_ret =& $GLOBALS['_MAX']['considered_ads'][0];
     $this->assertEqual($ads_ret['priority_used']['ads'][5], (double) 1.4);
     $this->assertFalse(isset($ads_ret['ads'][4][1124]));
     $this->assertTrue(isset($ads_ret['ads'][4][1122]));
     // case 11: cp5, 2 ads both 0.7, ecpm enabled
     $GLOBALS['_MAX']['CONF']['delivery']['ecpmSelectionRate'] = 1;
     $ads_copy = $test_ads;
     $ads_copy['ads'][6] = $ads_copy['ads'][5];
     $ads_copy['ads'][6][1022]['priority'] = 0.7;
     $ads_copy['ads'][6][1022]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1022]['ecpm'] = 2.0;
     $ads_copy['ads'][6][1024]['priority'] = 0.7;
     $ads_copy['ads'][6][1024]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1024]['ecpm'] = 0.5;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][6];
     $context = '';
     // after ecpm optimization, the priorities should be
     //   [1022] = 0.7 => 0.7
     //   [1024] = 0.7 => 0.3
     //
     // this should pick the first one
     $GLOBALS['rand_val'] = 0.49;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 6);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][6]));
     $this->assertEqual($return['ad_id'], 1022);
     $this->assertTrue($ads_copy['priority_used']['ads'][6] >= 1);
     $ads_copy = $test_ads;
     $ads_copy['ads'][6] = $ads_copy['ads'][5];
     $ads_copy['ads'][6][1022]['priority'] = 0.7;
     $ads_copy['ads'][6][1022]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1022]['ecpm'] = 2.0;
     $ads_copy['ads'][6][1024]['priority'] = 0.7;
     $ads_copy['ads'][6][1024]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1024]['ecpm'] = 0.5;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][6];
     // this should pick the second one
     $GLOBALS['rand_val'] = 0.71;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 6);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][6]));
     $this->assertEqual($return['ad_id'], 1024);
     $this->assertTrue($ads_copy['priority_used']['ads'][6] >= 1);
     // case 12: cp5, 2 ads both 0.7, ecpm enabled
     $GLOBALS['_MAX']['CONF']['delivery']['ecpmSelectionRate'] = 1;
     $ads_copy = $test_ads;
     $ads_copy['ads'][6] = $ads_copy['ads'][5];
     $ads_copy['ads'][6][1122] = $ads_copy['ads'][5][1022];
     $ads_copy['ads'][6][1124] = $ads_copy['ads'][5][1024];
     $ads_copy['ads'][6][1222] = $ads_copy['ads'][5][1222];
     $ads_copy['ads'][6][1022]['priority'] = 0.2;
     $ads_copy['ads'][6][1022]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1022]['ecpm'] = 2.0;
     $ads_copy['ads'][6][1024]['priority'] = 0.5;
     $ads_copy['ads'][6][1024]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1024]['ecpm'] = 0.5;
     $ads_copy['ads'][6][1122]['ad_id'] = 1122;
     $ads_copy['ads'][6][1122]['priority'] = 0.7;
     $ads_copy['ads'][6][1122]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1122]['ecpm'] = 2.0;
     $ads_copy['ads'][6][1124]['ad_id'] = 1124;
     $ads_copy['ads'][6][1124]['priority'] = 0.7;
     $ads_copy['ads'][6][1124]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1124]['ecpm'] = 0.5;
     $ads_copy['ads'][6][1222]['ad_id'] = 1222;
     $ads_copy['ads'][6][1222]['priority'] = 0.7;
     $ads_copy['ads'][6][1222]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1222]['ecpm'] = 0.4;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][6];
     // this should result in the following
     // [1022] = 0.2
     // [1024] = 0.5 * (1-(0.2+0.7)) / (0.5+0.7) = 0.0417
     // [1122] = 0.7
     // [1124] = 0.7 * (1-(0.2+0.7)) / (0.5+0.7) = 0.0583
     // [1222] = 0.0
     // this should pick 1024
     $GLOBALS['rand_val'] = 0.22;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 6);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][6]));
     $this->assertEqual($return['ad_id'], 1024);
     $this->assertTrue($ads_copy['priority_used']['ads'][6] >= 1);
     $this->assertEqual($ads_copy['ads'][6][1022]['priority'], 0.2);
     //unchanged
     $this->assertNotEqual($ads_copy['ads'][6][1024]['priority'], 0.5);
     //scaled
     $this->assertEqual($ads_copy['ads'][6][1222]['priority'], 0);
     //zeroed
     $this->assertEqual($ads_copy['ads'][6][1022]['priority'] + $ads_copy['ads'][6][1024]['priority'] + $ads_copy['ads'][6][1122]['priority'] + $ads_copy['ads'][6][1124]['priority'], 1);
     $ads_copy = $test_ads;
     $ads_copy['eAds'][-2] = $ads_copy['ads'][5];
     $ads_copy['eAds'][-2][1022]['priority'] = 0.2;
     $ads_copy['eAds'][-2][1022]['ecpm_enabled'] = 1;
     $ads_copy['eAds'][-2][1022]['ecpm'] = 2.0;
     $ads_copy['eAds'][-2][1024]['priority'] = 0.1;
     $ads_copy['eAds'][-2][1024]['ecpm_enabled'] = 1;
     $ads_copy['eAds'][-2][1024]['ecpm'] = 2.0;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['eAds'][-2];
     // this should pick the second one
     $GLOBALS['rand_val'] = 0.51;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'eAds', -2);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['eAds'][-2]));
     $this->assertEqual($return['ad_id'], 1024);
     $ads_copy = $test_ads;
     $ads_copy['eAds'][-2] = $ads_copy['ads'][5];
     $ads_copy['eAds'][-2][1022]['priority'] = 0.7;
     $ads_copy['eAds'][-2][1022]['ecpm_enabled'] = 1;
     $ads_copy['eAds'][-2][1022]['ecpm'] = 1.0;
     $ads_copy['eAds'][-2][1024]['priority'] = 0.1;
     $ads_copy['eAds'][-2][1024]['ecpm_enabled'] = 1;
     $ads_copy['eAds'][-2][1024]['ecpm'] = 2.0;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['eAds'][-2];
     // this should pick the second one
     $GLOBALS['rand_val'] = 0.01;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'eAds', -2);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['eAds'][-2]));
     $this->assertEqual($return['ad_id'], 1024);
     // case 13: cp6, 4 ads 2 0.7, 2 0.9, ecpm enabled
     $GLOBALS['_MAX']['CONF']['delivery']['ecpmSelectionRate'] = 0.001;
     $GLOBALS['_MAX']['CONF']['delivery']['enableControlOnPureCPM'] = 0;
     $ads_copy = $test_ads;
     $ads_copy['ads'][6] = $ads_copy['ads'][5];
     $ads_copy['ads'][6][1122] = $ads_copy['ads'][5][1022];
     $ads_copy['ads'][6][1124] = $ads_copy['ads'][5][1024];
     $ads_copy['ads'][6][1122]['ad_id'] = 1122;
     $ads_copy['ads'][6][1124]['ad_id'] = 1124;
     $ads_copy['ads'][6][1022]['priority'] = 0.7;
     $ads_copy['ads'][6][1022]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1022]['ecpm'] = 2.0;
     $ads_copy['ads'][6][1022]['revenue_type'] = 1;
     $ads_copy['ads'][6][1024]['priority'] = 0.9;
     $ads_copy['ads'][6][1024]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1024]['ecpm'] = 0.5;
     $ads_copy['ads'][6][1024]['revenue_type'] = 1;
     $ads_copy['ads'][6][1122]['priority'] = 0.7;
     $ads_copy['ads'][6][1122]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1122]['ecpm'] = 2.0;
     $ads_copy['ads'][6][1122]['revenue_type'] = 1;
     $ads_copy['ads'][6][1124]['priority'] = 0.9;
     $ads_copy['ads'][6][1124]['ecpm_enabled'] = 1;
     $ads_copy['ads'][6][1124]['ecpm'] = 0.5;
     $ads_copy['ads'][6][1124]['revenue_type'] = 1;
     $GLOBALS['test_MAX_cacheGetAd_val'] = $ads_copy['ads'][6];
     $context = '';
     // if control were enabled, 1124 would be picked.
     // this should pick the 1122 after ecpm optimization
     $GLOBALS['rand_val'] = 0.99;
     $return = _adSelect($ads_copy, $context, $source, $richMedia, false, 'ads', 6);
     $this->assertTrue(array_key_exists($return['ad_id'], $ads_copy['ads'][6]));
     $this->assertEqual($return['ad_id'], 1122);
     $this->assertTrue($ads_copy['priority_used']['ads'][6] >= 1);
     $this->assertEqual(_controlTrafficEnabled($ads_copy['ads'][6]), false);
     $GLOBALS['_MAX']['CONF']['delivery']['enableControlOnPureCPM'] = 1;
     $this->assertEqual(_controlTrafficEnabled($ads_copy['ads'][6]), true);
     $ads_copy['ads'][6][1124]['revenue_type'] = 0;
     $this->assertEqual(_controlTrafficEnabled($ads_copy['ads'][6]), true);
 }