/**
  * Returns an instance of class (singleton pattern implementation).
  *
  * @return NEWSFEED_BOL_ActionSetDao
  */
 public static function getInstance()
 {
     if (self::$classInstance === null) {
         self::$classInstance = new self();
     }
     return self::$classInstance;
 }
 private function __construct()
 {
     $this->actionDao = NEWSFEED_BOL_ActionDao::getInstance();
     $this->actionFeedDao = NEWSFEED_BOL_ActionFeedDao::getInstance();
     $this->followDao = NEWSFEED_BOL_FollowDao::getInstance();
     $this->likeDao = NEWSFEED_BOL_LikeDao::getInstance();
     $this->statusDao = NEWSFEED_BOL_StatusDao::getInstance();
     $this->activityDao = NEWSFEED_BOL_ActivityDao::getInstance();
     $this->cronCommandDao = NEWSFEED_BOL_CronCommandDao::getInstance();
     $this->actionSetDao = NEWSFEED_BOL_ActionSetDao::getInstance();
 }
    public function findCountByUser($userId, $startTime, $formats = null)
    {
        $cacheKey = md5('user_feed_count' . $userId);
        $cachedCount = OW::getCacheManager()->load($cacheKey);
        if ($cachedCount !== null) {
            return $cachedCount;
        }
        $followDao = NEWSFEED_BOL_FollowDao::getInstance();
        $actionFeedDao = NEWSFEED_BOL_ActionFeedDao::getInstance();
        $activityDao = NEWSFEED_BOL_ActivityDao::getInstance();
        $actionSetDao = NEWSFEED_BOL_ActionSetDao::getInstance();
        /*$actionSetDao->deleteActionSetUserId($userId);
          $actionSetDao->generateActionSet($userId, $startTime);*/
        $queryParts = BOL_UserDao::getInstance()->getUserQueryFilter("cactivity", "userId", array("method" => "NEWSFEED_BOL_ActionDao::findCountByUser"));
        if ($formats !== null) {
            $queryParts["where"] .= " AND action.format IN ( '" . implode("','", $formats) . "' )";
        }
        $query = 'SELECT COUNT(DISTINCT `id`) FROM ( SELECT action.`id` FROM ' . $this->getTableName() . ' action
            INNER JOIN ' . $activityDao->getTableName() . ' activity ON action.id = activity.actionId
            INNER JOIN `' . $actionSetDao->getTableName() . '` cactivity ON action.id = cactivity.actionId
            ' . $queryParts["join"] . '
            INNER JOIN ' . $actionFeedDao->getTableName() . ' action_feed ON activity.id=action_feed.activityId
            LEFT JOIN ' . $followDao->getTableName() . ' follow ON action_feed.feedId = follow.feedId AND action_feed.feedType = follow.feedType
            WHERE ' . $queryParts["where"] . ' AND cactivity.userId = :u AND activity.status=:s AND activity.timeStamp<:st AND (
                    ( follow.userId=:u AND activity.visibility & :vf ) )

        UNION

        SELECT action.`id` FROM ' . $this->getTableName() . ' action
            INNER JOIN ' . $activityDao->getTableName() . ' activity ON action.id = activity.actionId
            INNER JOIN `' . $actionSetDao->getTableName() . '` cactivity ON action.id = cactivity.actionId
            ' . $queryParts["join"] . '
            WHERE ' . $queryParts["where"] . ' AND cactivity.userId = :u AND activity.status=:s AND activity.timeStamp<:st AND (
                    ( activity.userId=:u AND activity.visibility & :va ) )

        UNION

        SELECT action.`id` FROM ' . $this->getTableName() . ' action
            INNER JOIN ' . $activityDao->getTableName() . ' activity ON action.id = activity.actionId
            INNER JOIN `' . $actionSetDao->getTableName() . '` cactivity ON action.id = cactivity.actionId
            ' . $queryParts["join"] . '
            INNER JOIN ' . $actionFeedDao->getTableName() . ' action_feed ON activity.id=action_feed.activityId
            WHERE ' . $queryParts["where"] . ' AND cactivity.userId = :u AND activity.status=:s AND activity.timeStamp<:st
            AND ( ( action_feed.feedId=:u AND action_feed.feedType="user" AND activity.visibility & :vfeed ) )

        UNION

        SELECT action.`id` FROM ' . $this->getTableName() . ' action
            INNER JOIN ' . $activityDao->getTableName() . ' activity ON action.id = activity.actionId
            INNER JOIN `' . $actionSetDao->getTableName() . '` cactivity ON action.id = cactivity.actionId
            ' . $queryParts["join"] . '
            INNER JOIN ' . $activityDao->getTableName() . ' subscribe ON activity.actionId=subscribe.actionId and subscribe.activityType=:as AND subscribe.userId=:u
            WHERE ' . $queryParts["where"] . ' AND cactivity.userId = :u AND activity.status=:s AND activity.timeStamp<:st ) a ';
        $count = $this->dbo->queryForColumn($query, array('u' => $userId, 'va' => NEWSFEED_BOL_Service::VISIBILITY_AUTHOR, 'vf' => NEWSFEED_BOL_Service::VISIBILITY_FOLLOW, 'vfeed' => NEWSFEED_BOL_Service::VISIBILITY_FEED, 's' => NEWSFEED_BOL_Service::ACTION_STATUS_ACTIVE, 'st' => empty($startTime) ? time() : $startTime, 'peb' => NEWSFEED_BOL_Service::PRIVACY_EVERYBODY, 'ac' => NEWSFEED_BOL_Service::SYSTEM_ACTIVITY_CREATE, 'as' => NEWSFEED_BOL_Service::SYSTEM_ACTIVITY_SUBSCRIBE));
        $cacheLifeTime = self::CACHE_LIFETIME;
        $cacheTags = array(self::CACHE_TAG_ALL, self::CACHE_TAG_USER, self::CACHE_TAG_USER_PREFIX . $userId);
        OW::getCacheManager()->save($count, $cacheKey, $cacheTags, $cacheLifeTime);
        return $count;
    }