Exemple #1
0
 /**
  * Generate a cache key for the first pass of getSearchResults. Build key based on:
  * usergroupids, infractiongroupids, search json, search sort order, search sort by,
  * moderated channels
  *
  * @param vB_Search_Criteria
  *
  * @staticvar array	$hashResult	Array to build hash from
  * @return string
  */
 public static function getTwoPassCacheKey(vB_Search_Criteria $criteria)
 {
     $cacheTTL = vB_Api_Search::getCacheTTL();
     if ($cacheTTL < 1) {
         return false;
     }
     $channelAccess = vB::getUserContext()->getAllChannelAccess();
     $currentUserId = vB::getCurrentSession()->get('userid');
     // Don't use cache if we have a GIT record
     if (!empty($channelAccess['member'])) {
         return false;
     }
     // Not 100% set on this but it seems adding further nodes to the result set
     // could introduce nodes that were grabbed based on nodes that might
     // end up removed on the second pass
     if ($criteria->get_post_processors()) {
         return false;
     }
     $json = $criteria->getJSON();
     //$json['disable_two_pass'] = true;
     if (!empty($json['disable_two_pass']) or !empty($json['my_following']) and !empty($currentUserId) or !empty($json[vB_Api_Search::FILTER_FOLLOW]) or !empty($json['private_messages_only']) or !empty($json['include_private_messages']) or !empty($json['date']) and $json['date'] == vB_Api_Search::FILTER_LASTVISIT or !empty($json['unread_only']) or !empty($json['author']) and !empty($json['exactname']) and ($json['author'] == 'myFriends' or $json['author'] == 'iFollow')) {
         return false;
     }
     // Don't cache for globally ignored users
     if (!empty($currentUserId)) {
         $globalignore = trim(vB::getDatastore()->getOption('globalignore'));
         if (!empty($globalignore)) {
             $blocked = preg_split('#\\s+#s', $globalignore, -1, PREG_SPLIT_NO_EMPTY);
             $bbuserkey = array_search($currentUserId, $blocked);
             if ($bbuserkey !== FALSE and $bbuserkey !== NULL) {
                 return false;
             }
         }
     }
     if (isset($json['ignored_words'])) {
         unset($json['ignored_words']);
     }
     if (isset($json['original_keywords'])) {
         unset($json['original_keywords']);
     }
     // Make sure ugids and ifids are in a consistent order
     $ugids = $ifids = $mod = '';
     $userinfo = vB_User::fetchUserinfo();
     if (!empty($userinfo['membergroupids']) and trim($userinfo['membergroupids']) != '' and $ugids = explode(',', str_replace(' ', '', $userinfo['membergroupids']))) {
         $ugids[] = $userinfo['usergroupid'];
         sort($ugids, SORT_NUMERIC);
         $ugids = array_unique($ugids, SORT_NUMERIC);
         $ugids = implode(',', $ugids);
     } else {
         $ugids = $userinfo['usergroupid'];
     }
     $ifid = !empty($userinfo['infractiongroupid']) ? intval($userinfo['infractiongroupid']) : 0;
     if (!empty($userinfo['infractiongroupids']) and trim($userinfo['infractiongroupids']) != '' and $ifids = explode(',', str_replace(' ', '', $userinfo['infractiongroupids']))) {
         if ($ifid) {
             $ifids[] = $ifid;
         }
         sort($ifids, SORT_NUMERIC);
         $ifids = array_unique($ifids, SORT_NUMERIC);
         $ifids = implode(',', $ifids);
     } else {
         if ($ifid) {
             $ifids = $ifid;
         }
     }
     if (!empty($channelAccess['canmoderate'])) {
         $mod = $channelAccess['canmoderate'];
         sort($mod, SORT_NUMERIC);
         $mod = array_unique($mod, SORT_NUMERIC);
         $mod = implode(',', $mod);
     }
     $hashResult = array('json' => $json, 'so' => $criteria->get_sort_field(), 'sb' => $criteria->get_sort_direction(), 'ul' => vB::getUserContext()->getUserLevel(), 'ug' => $ugids);
     if (!empty($ifids)) {
         $hashResult['if'] = $ifids;
     }
     if (!empty($mod)) {
         $hashResult['mod'] = $mod;
     }
     return 'getSearchResults_' . md5(serialize($hashResult));
 }