Вход Регистрация
Файл: plugins/photo/bol/photo_dao.php
Строк: 1261
<?php

class PHOTO_BOL_PhotoDao extends PEEP_BaseDao
{
    CONST 
PHOTO_PREFIX 'photo_';
    CONST 
PHOTO_PREVIEW_PREFIX 'photo_preview_';
    CONST 
PHOTO_ORIGINAL_PREFIX 'photo_original_';
    CONST 
PHOTO_SMALL_PREFIX 'photo_small_';
    CONST 
PHOTO_FULLSCREEN_PREFIX 'photo_fullscreen_';
    
    const 
CACHE_TAG_PHOTO_LIST 'photo.list';
    
    CONST 
PHOTO_ENTITY_TYPE 'photo';
    
    CONST 
PRIVACY 'privacy';
    CONST 
PRIVACY_EVERYBODY 'everybody';
    CONST 
PRIVACY_FRIENDS_ONLY 'friends_only';
    CONST 
PRIVACY_ONLY_FOR_ME 'only_for_me';

    CONST 
STATUS_APPROVAL 'approval';
    CONST 
STATUS_APPROVED 'approved';
    CONST 
STATUS_BLOCKED 'blocked';

    const 
ENTITY_TYPE_USER 'user';
    
    private 
$typeToPrefix;
    
    
/**
     * Singleton instance.
     *
     * @var PHOTO_BOL_PhotoDao
     */
    
private static $classInstance;

    
/**
     * Returns an instance of class.
     *
     * @return PHOTO_BOL_PhotoDao
     */
    
public static function getInstance()
    {
        if ( 
self::$classInstance === null )
        {
            
self::$classInstance = new self();
        }

        return 
self::$classInstance;
    }
    
    protected function 
__construct()
    {
        
parent::__construct();
        
        
$this->typeToPrefix = array(
            
PHOTO_BOL_PhotoService::TYPE_ORIGINAL => self::PHOTO_ORIGINAL_PREFIX,
            
PHOTO_BOL_PhotoService::TYPE_FULLSCREEN => self::PHOTO_FULLSCREEN_PREFIX,
            
PHOTO_BOL_PhotoService::TYPE_MAIN => self::PHOTO_PREFIX,
            
PHOTO_BOL_PhotoService::TYPE_PREVIEW => self::PHOTO_PREVIEW_PREFIX,
            
PHOTO_BOL_PhotoService::TYPE_SMALL => self::PHOTO_SMALL_PREFIX
        
);
    }

    
/**
     * @see PEEP_BaseDao::getDtoClassName()
     *
     */
    
public function getDtoClassName()
    {
        return 
'PHOTO_BOL_Photo';
    }

    
/**
     * @see PEEP_BaseDao::getTableName()
     *
     */
    
public function getTableName()
    {
        return 
PEEP_DB_PREFIX 'photo';
    }

    
/**
     * Get photo/preview URL
     *
     * @param int $id
     * @param string $type
     * @param boolean $preview
     * @return string
     */

    
public function getPhotoUrlByType$id$type$hash$dimension NULL )
    {
        if ( !isset(
$this->typeToPrefix[$type]) )
        {
            return 
NULL;
        }
        
        
$storage PEEP::getStorage();
        
$userfilesDir PEEP::getPluginManager()->getPlugin('photo')->getUserFilesDir();
        
$hashSlug = !empty($hash) ? '_' $hash '';
        
        if ( 
in_array($type, array(PHOTO_BOL_PhotoService::TYPE_FULLSCREENPHOTO_BOL_PhotoService::TYPE_PREVIEWPHOTO_BOL_PhotoService::TYPE_SMALL)) )
        {
            if ( 
$dimension === NULL )
            {
                
$photo $this->findById($id);
                
$dimension = !empty($photo->dimension) ? $photo->dimension NULL;
            }
            
            if ( empty(
$dimension) )
            {
                switch ( 
$type )
                {
                    case 
PHOTO_BOL_PhotoService::TYPE_FULLSCREEN:
                    case 
PHOTO_BOL_PhotoService::TYPE_PREVIEW:
                        return 
$storage->getFileUrl($userfilesDir self::PHOTO_PREFIX $id $hashSlug '.jpg');
                    case 
PHOTO_BOL_PhotoService::TYPE_SMALL:
                        return 
$storage->getFileUrl($userfilesDir self::PHOTO_PREVIEW_PREFIX $id $hashSlug '.jpg');
                }
            }
        }
        
        return 
$storage->getFileUrl($userfilesDir $this->typeToPrefix[$type] . $id $hashSlug '.jpg');
    }

    
/**
     * Get photo/preview URL
     *
     * @param int $id
     * @param $hash
     * @param boolean $preview
     * @return string
     */
    
public function getPhotoUrl$id$hash$preview false$dimension NULL )
    {
        
$storage PEEP::getStorage();
        
$userfilesDir PEEP::getPluginManager()->getPlugin('photo')->getUserFilesDir();
        
$hashSlug = !empty($hash) ? '_' $hash '';
        
        if ( 
$preview )
        {
            if ( 
$dimension === NULL )
            {
                
$photo $this->findById($id);
                
$dimension = !empty($photo->dimension) ? $photo->dimension NULL;
            }
            
            if ( empty(
$dimension) )
            {
                return 
$storage->getFileUrl($userfilesDir self::PHOTO_PREFIX $id $hashSlug '.jpg');
            }
            else
            {
                return 
$storage->getFileUrl($userfilesDir self::PHOTO_PREVIEW_PREFIX $id $hashSlug '.jpg');
            }
        }
        
        return 
$storage->getFileUrl($userfilesDir self::PHOTO_PREFIX $id $hashSlug '.jpg');
    }

    public function 
getPhotoFullsizeUrl$id$hash )
    {
        
$userfilesDir PEEP::getPluginManager()->getPlugin('photo')->getUserFilesDir();
        
$storage PEEP::getStorage();
        
$hashSlug = !empty($hash) ? '_' $hash '';

        return 
$storage->getFileUrl($userfilesDir self::PHOTO_ORIGINAL_PREFIX $id $hashSlug '.jpg');
    }

    
/**
     * Get directory where 'photo' plugin images are uploaded
     *
     * @return string
     */
    
public function getPhotoUploadDir()
    {
        return 
PEEP::getPluginManager()->getPlugin('photo')->getUserFilesDir();
    }

    
/**
     * Get path to photo in file system
     *
     * @param int $photoId
     * @param $hash
     * @param string $type
     * @return string
     */
    
public function getPhotoPath$photoId$hash$type '' )
    {
        
$hashSlug = !empty($hash) ? '_' $hash '';
        
$ext '.jpg';
        
        switch ( 
$type )
        {
            case 
PHOTO_BOL_PhotoService::TYPE_MAIN:
                return 
$this->getPhotoUploadDir() . self::PHOTO_PREFIX $photoId $hashSlug $ext;
            case 
PHOTO_BOL_PhotoService::TYPE_PREVIEW:
                return 
$this->getPhotoUploadDir() . self::PHOTO_PREVIEW_PREFIX $photoId $hashSlug $ext;
            case 
PHOTO_BOL_PhotoService::TYPE_ORIGINAL:
                return 
$this->getPhotoUploadDir() . self::PHOTO_ORIGINAL_PREFIX $photoId $hashSlug $ext;
            case 
PHOTO_BOL_PhotoService::TYPE_SMALL:
                return 
$this->getPhotoUploadDir() . self::PHOTO_SMALL_PREFIX $photoId $hashSlug $ext;
            case 
PHOTO_BOL_PhotoService::TYPE_FULLSCREEN:
                return 
$this->getPhotoUploadDir() . self::PHOTO_FULLSCREEN_PREFIX $photoId $hashSlug $ext;
            default:
                return 
$this->getPhotoUploadDir() . self::PHOTO_PREFIX $photoId $hashSlug $ext;
        }
    }

    public function 
getPhotoPluginFilesPath$photoId$type '' )
    {
        
$dir $this->getPhotoPluginFilesDir();

        switch ( 
$type )
        {
            case 
PHOTO_BOL_PhotoService::TYPE_MAIN:
                return 
$dir self::PHOTO_PREFIX $photoId '.jpg';
            case 
PHOTO_BOL_PhotoService::TYPE_PREVIEW:
                return 
$dir self::PHOTO_PREVIEW_PREFIX $photoId '.jpg';
            case 
PHOTO_BOL_PhotoService::TYPE_ORIGINAL:
                return 
$dir self::PHOTO_ORIGINAL_PREFIX $photoId '.jpg';
            case 
PHOTO_BOL_PhotoService::TYPE_SMALL:
                return 
$dir self::PHOTO_SMALL_PREFIX $photoId '.jpg';
            case 
PHOTO_BOL_PhotoService::TYPE_FULLSCREEN:
                return 
$dir self::PHOTO_FULLSCREEN_PREFIX $photoId '.jpg';
            default:
                return 
$dir self::PHOTO_PREFIX $photoId '.jpg';
        }
    }

    public function 
getPhotoPluginFilesDir()
    {
        return 
PEEP::getPluginManager()->getPlugin('photo')->getPluginFilesDir();
    }

    
/**
     * Find photo owner
     *
     * @param int $id
     * @return int
     */
    
public function findOwner$id )
    {
        if ( !
$id )
            return 
null;

        
$albumDao PHOTO_BOL_PhotoAlbumDao::getInstance();
        
$query "
            SELECT `a`.`userId`       
            FROM `" 
$this->getTableName() . "` AS `p`
            LEFT JOIN `" 
$albumDao->getTableName() . "` AS `a` ON ( `p`.`albumId` = `a`.`id` )
            WHERE `p`.`id` = :id
            LIMIT 1
        "
;

        
$qParams = array('id' => $id);

        
$owner $this->dbo->queryForColumn($query$qParams);

        return 
$owner;
    }

    
/**
     * Get photo list (featured|latest|toprated)
     *
     * @param string $listType
     * @param int $page
     * @param int $limit
     * @param bool $checkPrivacy
     * @param null $exclude
     * @return array
     */
    
public function getPhotoList$listType$first$limit$exclude NULL$checkPrivacy NULL )
    {
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition($listType,
            array(
                
'photo' => 'p',
                
'featured' => 'f',
                
'album' => 'a'
            
),
            array(
                
'listType' => $listType,
                
'first' => $first,
                
'limit' => $limit,
                
'exclude' => $exclude,
                
'checkPrivacy' => $checkPrivacy
            
));

        
$excludeCond $exclude ' AND `p`.`id` NOT IN (' $this->dbo->mergeInClause($exclude) . ')' '';

        switch ( 
$listType )
        {
            case 
'featured':
                
$photoFeaturedDao PHOTO_BOL_PhotoFeaturedDao::getInstance();

                
$query 'SELECT `p`.*, `a`.`userId`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON ( `p`.`albumId` = `a`.`id` )
                        INNER JOIN `' 
$photoFeaturedDao->getTableName() . '` AS `f` ON (`f`.`photoId`=`p`.`id`)
                        ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status ' 
$excludeCond ' AND `f`.`id` IS NOT NULL
                        AND `a`.`entityType` = :user ' 
.
                        (
$checkPrivacy !== NULL 
                            
$checkPrivacy ' AND (`p`.`' self::PRIVACY '` = :everybody OR `p`.`' self::PRIVACY '` = :friends)' 
                                            
' AND `p`.`' self::PRIVACY '` = :everybody' '') . ' AND
                        ' 
$condition['where'] . '
                    ORDER BY `p`.`id` DESC
                    LIMIT :first, :limit'
;
                break;
            case 
'latest':
            default:
                
$query 'SELECT `p`.*, `a`.`userId`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON (`p`.`albumId` = `a`.`id`)
                        ' 
$condition['join'] . '
                    WHERE `a`.`entityType` = :user AND `p`.`status` = :status'  
$excludeCond 
                        (
$checkPrivacy !== NULL 
                            
$checkPrivacy ' AND (`p`.`' self::PRIVACY '` = :everybody OR `p`.`' self::PRIVACY '` = :friends)' 
                                            
' AND `p`.`' self::PRIVACY '` = :everybody' '') . ' AND
                        ' 
$condition['where'] . '
                    ORDER BY `p`.`id` DESC
                    LIMIT :first, :limit'
;
                break;
        }
        
        
$params = array('user' => 'user''first' => (int)$first'limit' => (int)$limit'status' => 'approved');
        
        if ( 
$checkPrivacy !== NULL )
        {
            switch ( 
$checkPrivacy )
            {
                case 
TRUE:
                    
$params['friends'] = self::PRIVACY_FRIENDS_ONLY;
                case 
FALSE:
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
            }
        }
        
        return 
$this->dbo->queryForList($queryarray_merge($params$condition['params']));
    }

    public function 
findAlbumPhotoList$albumId$listType$offset$limit$privacy null )
    {
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition(sprintf('findAlbumPhotoList.%s'$listType),
            array(
                
'photo' => 'p',
                
'featured' => 'f',
                
'album' => 'a'
            
),
            array(
                
'albumId' => $albumId,
                
'listType' => $listType,
                
'offset' => $offset,
                
'limit' => $limit,
                
'privacy' => $privacy
            
));

        
$privacySql $privacy === null "1""`p`.`privacy`='{$privacy}'";
        
        switch ( 
$listType )
        {
            case 
'featured':
                
$query 'SELECT `p`.*
                    FROM `' 
$this->getTableName() . '` AS `p`
                    INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON ( `p`.`albumId` = `a`.`id` )
                    INNER JOIN `' 
PHOTO_BOL_PhotoFeaturedDao::getInstance()->getTableName() . '` AS `f` ON (`f`.`photoId`=`p`.`id`)
                    ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status AND `p`.`albumId` = :albumId AND ' 
$privacySql '
                    AND `f`.`id` IS NOT NULL AND ' 
$condition['where'] . '
                    ORDER BY `p`.`id` DESC
                    LIMIT :first, :limit'
;
                break;
            case 
'toprated':
                
$query 'SELECT `p`.*, `r`.`' BOL_RateDao::ENTITY_ID '`, COUNT(`r`.id) as `ratesCount`, AVG(`r`.`score`) as `avgScore`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON ( `p`.`albumId` = `a`.`id` )
                        INNER JOIN ' 
BOL_RateDao::getInstance()->getTableName() . ' AS `r` ON (`r`.`entityId`=`p`.`id`
                            AND `r`.`' 
BOL_RateDao::ENTITY_TYPE '` = "photo_rates" AND `r`.`' BOL_RateDao::ACTIVE '` = 1)
                        ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status AND `p`.`albumId` = :albumId AND ' 
$privacySql ' AND ' $condition['where'] . '
                    GROUP BY `p`.`id`
                    ORDER BY `avgScore` DESC, `ratesCount` DESC
                    LIMIT :first, :limit'
;
                break;
            case 
'latest':
            default:
                
$query 'SELECT `p`.*
                    FROM `' 
$this->getTableName() . '` AS `p`
                    INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON ( `p`.`albumId` = `a`.`id` )
                    ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status AND `p`.`albumId` = :albumId AND ' 
$privacySql ' AND ' $condition['where'] . '
                    ORDER BY `p`.`id` DESC
                    LIMIT :first, :limit'
;
                break;
        }

        return 
$this->dbo->queryForList($queryarray_merge(
            array(
                
'albumId' => $albumId,
                
'first' => $offset,
                
'limit' => $limit,
                
'status' => self::STATUS_APPROVED
            
),
            
$condition['params']
        ));
    }
    
    public function 
getAlbumPhotoList$albumId$offset$limit$checkPrivacy NULL, array $exclude = array() )
    {
        if ( empty(
$albumId) )
        {
            return array();
        }
        
        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON (`p`.`albumId` = `a`.`id`)
            WHERE `p`.`albumId` = :albumId AND `p`.`status` = :status' 

                (
$checkPrivacy !== NULL 
                    
$checkPrivacy ' AND (`p`.`' self::PRIVACY '` = :everybody OR `p`.`' self::PRIVACY '` = :friends)' 
                                    
' AND `p`.`' self::PRIVACY '` = :everybody' '') . 
                (
count($exclude) !== ' AND `p`.`id` NOT IN (' implode(','array_map('intval'array_unique($exclude))) . ')' '') . '
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit'
;

        
$params = array('albumId' => $albumId'first' => (int)$offset'limit' => (int)$limit'status' => 'approved');
        
        if ( 
$checkPrivacy !== NULL )
        {
            switch ( 
$checkPrivacy )
            {
                case 
TRUE:
                    
$params['friends'] = self::PRIVACY_FRIENDS_ONLY;
                case 
FALSE:
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
            }
        }
        
        return 
$this->dbo->queryForList($sql$params);
    }

    public function 
findPhotoInfoListByIdList$idList$listType null )
    {
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition($listType,
            array(
                
'photo' => 'p',
                
'album' => 'a'
            
),
            array(
                
'idList' => $idList,
                
'listType' => $listType
            
)
        );

        
$query 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON (`p`.`albumId` = `a`.`id`)
            ' 
$condition['join'] . '
            WHERE `p`.`id` IN (' 
$this->dbo->mergeInClause($idList) . ') AND `p`.`status` = :status AND ' $condition['where'] . '
            ORDER BY `id` DESC'
;

        return 
$this->dbo->queryForList($queryarray_merge(
            array(
'status' => self::STATUS_APPROVED),
            
$condition['params']
        ));
    }

    
/**
     * Count photos
     *
     * @param string $listType
     * @param boolean $checkPrivacy
     * @param null $exclude
     * @return int
     */
    
public function countPhotos$listType$checkPrivacy true$exclude null )
    {
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('countPhotos',
            array(
                
'photo' => 'p',
                
'album' => 'a',
                
'featured' => 'f'
            
),
            array(
                
'listType' => $listType,
                
'checkPrivacy' => $checkPrivacy,
                
'exclude' => $exclude
            
)
        );

        
$privacyCond $checkPrivacy " AND `p`.`privacy` = 'everybody' " "";
        
$excludeCond $exclude ' AND `p`.`id` NOT IN (' $this->dbo->mergeInClause($exclude) . ')' '';
        
$albumDao PHOTO_BOL_PhotoAlbumDao::getInstance();

        switch ( 
$listType )
        {
            case 
'featured':
                
$featuredDao PHOTO_BOL_PhotoFeaturedDao::getInstance();

                
$query 'SELECT COUNT(`p`.`id`)
                    FROM `' 
$this->getTableName() . '` AS `p`
                    INNER JOIN `' 
$albumDao->getTableName() . '` AS `a` ON ( `p`.`albumId` = `a`.`id` )
                    INNER JOIN `' 
$featuredDao->getTableName() . '` AS `f` ON ( `p`.`id` = `f`.`photoId` )
                    ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status ' 
$privacyCond $excludeCond ' AND `f`.`id` IS NOT NULL
                    AND `a`.`entityType` = :entityType AND ' 
$condition['where'];
                break;

            case 
'latest':
            default:
                
$query 'SELECT COUNT(`p`.`id`)
                    FROM `' 
$this->getTableName() . '` AS `p`
                    INNER JOIN `' 
$albumDao->getTableName() . '` AS `a` ON ( `p`.`albumId` = `a`.`id` )
                    ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status ' 
$privacyCond $excludeCond '
                    AND `a`.`entityType` = :entityType AND ' 
$condition['where'];
                break;
        }

        return 
$this->dbo->queryForColumn($queryarray_merge(
            array(
                
'status' => self::STATUS_APPROVED,
                
'entityType' => self::ENTITY_TYPE_USER
            
),
            
$condition['params']
        ));
    }

    public function 
countFullsizePhotos()
    {
        
$example = new PEEP_Example();
        
$example->andFieldEqual('hasFullsize'1);

        return 
$this->countByExample($example);
    }

    public function 
deleteFullsizePhotos()
    {
        
$photos $this->getFullsizePhotos();

        
$storage PEEP::getStorage();

        foreach ( 
$photos as $photo )
        {
            
$photo->hasFullsize 0;
            
$this->save($photo);

            
$path $this->getPhotoPath($photo->id$photo->hash'original');

            if ( 
$storage->fileExists($path) )
            {
                
$storage->removeFile($path);
            }
        }

        return 
true;
    }

    public function 
getFullsizePhotos()
    {
        
$example = new PEEP_Example();
        
$example->andFieldEqual('hasFullsize'1);

        return 
$this->findListByExample($example);
    }

    
/**
     * Counts album photos
     *
     * @param int $albumId
     * @param $exclude
     * @return int
     */
    
public function countAlbumPhotos$albumId$exclude )
    {
        if ( !
$albumId ) return false;

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('countAlbumPhotos',
            array(
                
'album' => 'a',
                
'photo' => 'p'
            
),
            array(
                
'albumId' => $albumId,
                
'exclude' => $exclude
            
)
        );

        
$sql 'SELECT COUNT(*)
            FROM `%s` AS `p`
                INNER JOIN `%s` AS `a` ON(`p`.`albumId` = `a`.`id`)
                %s
            WHERE `p`.`albumId` = :albumId AND `p`.`status` = :status AND
                %s AND
                %s'
;
        
$sql sprintf($sql,
            
$this->getTableName(),
            
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName(),
            
$condition['join'],
            
$condition['where'],
            !empty(
$exclude) ? '`p`.`id` NOT IN(' $this->dbo->mergeInClause($exclude) . ')' '1'
        
);

        return (int) 
$this->dbo->queryForColumn($sqlarray_merge(
            array(
                
'albumId' => $albumId,
                
'status' => self::STATUS_APPROVED
            
),
            
$condition['params']
        ));
    }
    
    public function 
countAlbumPhotosForList$albumIdList )
    {
        if ( !
$albumIdList )
        {
            return array();
        }
        
        
$sql "SELECT `albumId`, COUNT(*) AS `photoCount` FROM `".$this->getTableName()."` 
            WHERE `status` = 'approved' 
            AND `albumId` IN ("
.$this->dbo->mergeInClause($albumIdList).")
            GROUP BY `albumId`"
;
        
        return 
$this->dbo->queryForList($sql);
    }

    
/**
     * Counts photos uploaded by a user
     *
     * @param int $userId
     * @return int
     */
    
public function countUserPhotos$userId )
    {
        if ( !
$userId )
            return 
false;

        
$photoAlbumDao PHOTO_BOL_PhotoAlbumDao::getInstance();

        
$query "
            SELECT COUNT(`p`.`id`)
            FROM `" 
$this->getTableName() . "` AS `p`
            LEFT JOIN `" 
$photoAlbumDao->getTableName() . "` AS `a` ON ( `a`.`id` = `p`.`albumId` )
            WHERE `a`.`userId` = :user AND `a`.`entityType` = 'user'
        "
;

        return 
$this->dbo->queryForColumn($query, array('user' => $userId));
    }

    
/**
     * Returns photos in the album
     *
     * @param int $albumId
     * @param int $page
     * @param int $limit
     * @param $exclude
     * @return array of PHOTO_Bol_Photo
     */
    
public function getAlbumPhotos$albumId$page$limit$exclude$status PHOTO_BOL_PhotoDao::STATUS_APPROVED )
    {
        if ( !
$albumId )
        {
            return 
false;
        }

        
$first = ( $page ) * $limit;

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('getAlbumPhotos',
            array(
                
'album' => 'a',
                
'photo' => 'p'
            
),
            array(
                
'albumId' => $albumId,
                
'page' => $page,
                
'limit' => $limit,
                
'exclude' => $exclude,
                
'status' => $status
            
)
        );

        
$sql 'SELECT `p`.*
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`p`.`albumId` = `a`.`id`)
                ' 
$condition['join'] . '
            WHERE `p`.`albumId` = :albumId AND
                ' 
. (!empty($status) ? '`p`.`status` = :status' '1') . ' AND
                ' 
$condition['where'] . ' AND
                ' 
. (!empty($exclude) ? '`p`.`id` NOT IN(' $this->dbo->mergeInClause($exclude) . ')' '1') . '
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit'
;

        
$params = array(
            
'albumId' => $albumId,
            
'first' => $first,
            
'limit' => $limit
        
);

        if ( !empty(
$status) )
        {
            
$params['status'] = $status;
        }

        return 
$this->dbo->queryForObjectList($sql$this->getDtoClassName(), array_merge(
            
$params,
            
$condition['params']
        ));
    }

    
/**
     * Returns all photos in the album
     *
     * @param int $albumId
     * @return array of PHOTO_Bol_Photo
     */
    
public function getAlbumAllPhotos$albumId, array $exclude = array() )
    {
        if ( empty(
$albumId) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('getAlbumAllPhotos',
            array(
                
'album' => 'a',
                
'photo' => 'p'
            
),
            array(
                
'albumId' => $albumId,
                
'exclude' => $exclude,
            )
        );

        
$sql 'SELECT `p`.*
            FROM `%s` AS `p`
                INNER JOIN `%s` AS `a` ON(`p`.`albumId` = `a`.`id`)
                %s
            WHERE `p`.`albumId` = :albumId AND %s AND %s
            ORDER BY `p`.`id` DESC'
;
        
$sql sprintf($sql,
            
$this->getTableName(),
            
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName(),
            
$condition['join'],
            
count($exclude) !== '`p`.`id` NOT IN(' $this->dbo->mergeInClause($exclude) . ')' '1',
            
$condition['where']);

        return 
$this->dbo->queryForObjectList($sql$this->getDtoClassName(), array_merge(
            array(
'albumId' => $albumId),
            
$condition['params']
        ));
    }
    
    public function 
getLastPhotoForList$albumIdList )
    {
        if ( !
$albumIdList )
        {
            return array();
        }

        
$sql 'SELECT MIN(`b`.`id`)
            FROM `' 
$this->getTableName() . '` AS `b`
            WHERE `b`.`status` = :status AND `b`.`privacy` = :privacy
                    AND `b`.`albumId` IN (' 
implode(','array_unique(array_map('intval'$albumIdList))) . ')
            GROUP BY `b`.`albumId` '
;

        
$photoIdList $this->dbo->queryForColumnList($sql, array('status' => 'approved''privacy' => 'everybody'));

        if ( !
$photoIdList )
        {
            return array();
        }

        
$sql 'SELECT `a`.*
            FROM `' 
$this->getTableName() . '` AS `a`
            WHERE `a`.`id` IN (' 
implode(','array_unique($photoIdList)) . ')';
        
        return 
$this->dbo->queryForObjectList($sql$this->getDtoClassName());
    }

    public function 
getLastPhoto$albumId, array $exclude = array() )
    {
        if ( !
$albumId )
        {
            return 
false;
        }
        
        
$example = new PEEP_Example();
        
$example->andFieldEqual('albumId'$albumId);
        
$example->andFieldEqual('status''approved');
        
        if ( !empty(
$exclude) )
        {
            
$example->andFieldNotInArray('id'$exclude);
        }
        
        
$example->setOrder('`addDatetime`');
        
$example->setLimitClause(01);

        return 
$this->findObjectByExample($example);
    }
    
    public function 
getPreviousPhoto$albumId$id )
    {
        if ( !
$albumId || !$id )
            return 
false;

        
$example = new PEEP_Example();
        
$example->andFieldEqual('albumId'$albumId);
        
$example->andFieldEqual('status''approved');
        
$example->andFieldGreaterThan('id'$id);
        
$example->setOrder('`id` ASC');
        
$example->setLimitClause(01);

        return 
$this->findObjectByExample($example);
    }
    
    public function 
getNextPhoto$albumId$id )
    {
        if ( !
$id )
            return 
false;

        
$example = new PEEP_Example();
        
$example->andFieldEqual('albumId'$albumId);
        
$example->andFieldLessThan('id'$id);
        
$example->andFieldEqual('status''approved');
        
$example->setOrder('`id` DESC');
        
$example->setLimitClause(01);

        return 
$this->findObjectByExample($example);
    }
    
    public function 
getPrevPhotoIdList$listType$photoId$checkPrivacy NULL )
    {
        if ( empty(
$photoId) )
        {
            return array();
        }
        
        
$privacy $this->getPrivacyCondition($checkPrivacy);
        
$privaceQuery $privacy['query'];
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition($listType, array('photo' => 'p''album' => 'a''featured' => 'f'));
        
$params array_merge($condition['params'], array('status' => 'approved''limit' => PHOTO_BOL_PhotoService::ID_LIST_LIMIT), $privacy['params']);
        
        switch ( 
$listType )
        {
            case 
'latest':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                    ' 
$condition['join'] . '
                    WHERE `p`.`id` > :id AND `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                break;
            case 
'userPhotos':
                
$ownerId PHOTO_BOL_PhotoService::getInstance()->findPhotoOwner($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`id` > :id AND `p`.`status` = :status AND `a`.`userId` = :userId' 
$privaceQuery '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['userId'] = $ownerId;
                break;
            case 
'entityPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$album PHOTO_BOL_PhotoAlbumService::getInstance()->findAlbumById($photo->albumId);
                
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`id` > :id AND `p`.`status` = :status AND `a`.`entityId` = :entityId AND `a`.`entityType` = :entityType ' 
$privaceQuery '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['entityType'] = $album->entityType;
                
$params['entityId'] = $album->entityId;
                break;
            case 
'albumPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`id` > :id AND `p`.`status` = :status AND `p`.`albumId` = :albumId' 
$privaceQuery '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['albumId'] = $photo->albumId;
                break;
            case 
'featured':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                        INNER JOIN `' 
PHOTO_BOL_PhotoFeaturedDao::getInstance()->getTableName() . '` AS `f`
                            ON(`p`.`id` = `f`.`photoId`)
                    ' 
$condition['join'] . '
                    WHERE `f`.`photoId` > :id AND `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `f`.`photoId`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                break;
        }
        
        return 
$this->dbo->queryForColumnList($sql$params);
    }
    
    public function 
getNextPhotoIdList$listType$photoId$checkPrivacy NULL )
    {
        if ( empty(
$photoId) )
        {
            return array();
        }
        
        
$privacy $this->getPrivacyCondition($checkPrivacy);
        
$privaceQuery $privacy['query'];
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition($listType, array('photo' => 'p''album' => 'a''featured' => 'f'));
        
$params array_merge($condition['params'], array('status' => 'approved''limit' => PHOTO_BOL_PhotoService::ID_LIST_LIMIT), $privacy['params']);
        
        switch ( 
$listType )
        {
            case 
'latest':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                    ' 
$condition['join'] . '
                    WHERE `p`.`id` < :id AND `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                break;
            case 
'userPhotos':
                
$ownerId PHOTO_BOL_PhotoService::getInstance()->findPhotoOwner($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`id` < :id AND `p`.`status` = :status AND `a`.`userId` = :userId' 
$privaceQuery '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['userId'] = $ownerId;
                break;
            case 
'entityPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$album PHOTO_BOL_PhotoAlbumService::getInstance()->findAlbumById($photo->albumId);
                
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`id` < :id AND `p`.`status` = :status AND `a`.`entityId` = :entityId AND `a`.`entityType` = :entityType ' 
$privaceQuery '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['entityType'] = $album->entityType;
                
$params['entityId'] = $album->entityId;
                break;
            case 
'albumPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`id` < :id AND `p`.`status` = :status AND `p`.`albumId` = :albumId' 
$privaceQuery '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['albumId'] = $photo->albumId;
                break;
            case 
'featured':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                        INNER JOIN `' 
PHOTO_BOL_PhotoFeaturedDao::getInstance()->getTableName() . '` AS `f`
                            ON(`p`.`id` = `f`.`photoId`)
                    ' 
$condition['join'] . '
                    WHERE `f`.`photoId` < :id AND `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `f`.`photoId` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                break;
        }
        
        return 
$this->dbo->queryForColumnList($sql$params);
    }
    
    public function 
getFirstPhotoIdList$listType$checkPrivacy$photoId )
    {
        
$privacy $this->getPrivacyCondition($checkPrivacy);
        
$privaceQuery $privacy['query'];
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition($listType, array('photo' => 'p''album' => 'a''featured' => 'f'));
        
$params array_merge($condition['params'], array('status' => 'approved''limit' => PHOTO_BOL_PhotoService::ID_LIST_LIMIT), $privacy['params']);
        
        switch ( 
$listType )
        {
            case 
'latest':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                    ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                break;
            case 
'userPhotos':
                
$ownerId PHOTO_BOL_PhotoService::getInstance()->findPhotoOwner($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`status` = :status AND `a`.`userId` = :userId' 
$privaceQuery '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['userId'] = $ownerId;
                break;
            case 
'entityPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$album PHOTO_BOL_PhotoAlbumService::getInstance()->findAlbumById($photo->albumId);
                
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`status` = :status AND `a`.`entityId` = :entityId AND `a`.`entityType` = :entityType ' 
$privaceQuery '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['entityType'] = $album->entityType;
                
$params['entityId'] = $album->entityId;
                break;
            case 
'albumPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`status` = :status AND `p`.`albumId` = :albumId' 
$privaceQuery '
                    ORDER BY `p`.`id`
                    LIMIT :limit'
;
                
$params['albumId'] = $photo->albumId;
                break;
            case 
'featured':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                        INNER JOIN `' 
PHOTO_BOL_PhotoFeaturedDao::getInstance()->getTableName() . '` AS `f`
                            ON(`p`.`id` = `f`.`photoId`)
                    ' 
$condition['join'] . '
                    WHERE `f`.`photoId` < :id AND `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `f`.`photoId`
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                break;
        }
        
        return 
$this->dbo->queryForColumnList($sql$params);
    }
    
    public function 
getLastPhotoIdList$listType$checkPrivacy$photoId )
    {
        
$privacy $this->getPrivacyCondition($checkPrivacy);
        
$privaceQuery $privacy['query'];
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition($listType, array('photo' => 'p''album' => 'a''featured' => 'f'));
        
$params array_merge($condition['params'], array('status' => 'approved''limit' => PHOTO_BOL_PhotoService::ID_LIST_LIMIT), $privacy['params']);
        
        switch ( 
$listType )
        {
            case 
'latest':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`a`.`id` = `p`.`albumId`)
                    ' 
$condition['join'] . '
                    WHERE `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                break;
            case 
'userPhotos':
                
$ownerId PHOTO_BOL_PhotoService::getInstance()->findPhotoOwner($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`status` = :status AND `a`.`userId` = :userId' 
$privaceQuery '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['userId'] = $ownerId;
                break;
            case 
'entityPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$album PHOTO_BOL_PhotoAlbumService::getInstance()->findAlbumById($photo->albumId);
                
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`status` = :status AND `a`.`entityId` = :entityId AND `a`.`entityType` = :entityType ' 
$privaceQuery '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                
$params['entityType'] = $album->entityType;
                
$params['entityId'] = $album->entityId;
                break;
            case 
'albumPhotos':
                
$photo PHOTO_BOL_PhotoService::getInstance()->findPhotoById($photoId);
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
                    WHERE `p`.`status` = :status AND  `p`.`albumId` = :albumId' 
$privaceQuery '
                    ORDER BY `p`.`id` DESC
                    LIMIT :limit'
;
                
$params['albumId'] = $photo->albumId;
                break;
            case 
'featured':
                
$sql 'SELECT `p`.`id`
                    FROM `' 
$this->getTableName() . '` AS `p`
                        INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                            ON(`p`.`albumId` = `a`.`id`)
                        INNER JOIN `' 
PHOTO_BOL_PhotoFeaturedDao::getInstance()->getTableName() . '` AS `f`
                            ON(`p`.`id` = `f`.`photoId`)
                    ' 
$condition['join'] . '
                    WHERE `f`.`photoId` < :id AND `p`.`status` = :status' 
$privaceQuery ' AND
                    ' 
$condition['where'] . '
                    ORDER BY `f`.`photoId` DESC
                    LIMIT :limit'
;
                
$params['id'] = $photoId;
                break;
        }
        
        return 
$this->dbo->queryForColumnList($sql$params);
    }
    
    public function 
getPrivacyCondition$checkPrivacy NULL )
    {
        
$params = array();
        
        if ( 
$checkPrivacy !== NULL )
        {
            switch ( 
$checkPrivacy )
            {
                case 
TRUE:
                    
$query ' AND (`p`.`' self::PRIVACY '` = :everybody OR `p`.`' self::PRIVACY '` = :friends)';
                    
$params['friends'] = self::PRIVACY_FRIENDS_ONLY;
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
                    break;
                case 
FALSE:
                    
$query ' AND `p`.`' self::PRIVACY '` = :everybody';
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
                    break;
            }
        }
        else
        {
            
$query '';
        }
        
        return array(
'query' => $query'params' => $params);
    }

    
/**
     * Returns currently viewed photo index
     *
     * @param int $albumId
     * @param int $id
     * @return int
     */
    
public function getPhotoIndex$albumId$id )
    {
        if ( !
$albumId || !$id )
            return 
false;

        
$example = new PEEP_Example();
        
$example->andFieldEqual('albumId'$albumId);
        
$example->andFieldEqual('status''approved');
        
$example->andFieldGreaterThenOrEqual('id'$id);

        return 
$this->countByExample($example);
    }

    
/**
     * Removes photo file
     *
     * @param int $id
     * @param $hash
     * @param string $type
     */
    
public function removePhotoFile$id$hash$type )
    {
        
$path $this->getPhotoPath($id$hash$type);

        
$storage PEEP::getStorage();

        if ( 
$storage->fileExists($path) )
        {
            
$storage->removeFile($path);
        }
    }
    
    public function 
updatePrivacyByAlbumIdList$albumIdList$privacy )
    {
        
$albums implode(','$albumIdList);

        
$sql "UPDATE `".$this->getTableName()."` SET `privacy` = :privacy 
            WHERE `albumId` IN ("
.$albums.")";
        
        
$this->dbo->query($sql, array('privacy' => $privacy));
    }
    
    
// Entity photos methods
    
    
public function findEntityPhotoList$entityType$entityId$first$count$status "approved"$privacy null )
    {
        
$limit = (int) $count;
        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('findEntityPhotoList',
            array(
                
'photo' => 'p',
                
'album' => 'a'
            
),
            array(
                
'entityType' => $entityType,
                
'entityId' => $entityId,
                
'first' => $first,
                
'count' => $count,
                
'status' => $status,
                
'privacy' => $privacy
            
)
        );

        
$statusSql $status === null "1" "`p`.`status` = '{$status}'";
        
$privacySql $privacy === null "1""`p`.`privacy`='{$privacy}'";
        
        
$albumDao PHOTO_BOL_PhotoAlbumDao::getInstance();
        
$query "
            SELECT `p`.*
            FROM `" 
$this->getTableName() . "` AS `p`
            LEFT JOIN `" 
$albumDao->getTableName() . "` AS `a` ON ( `p`.`albumId` = `a`.`id` )
            " 
$condition['join'] . "
            WHERE 
$statusSql AND $privacySql
            AND `a`.`entityType` = :entityType
            AND `a`.`entityId` = :entityId
            AND " 
$condition['where'] . "
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit"
;

        
$qParams = array(
            
'first' => $first,
            
'limit' => $limit,
            
"entityType" => $entityType,
            
"entityId" => $entityId
        
);

        
$cacheLifeTime $first == 24 3600 null;
        
$cacheTags $first == ? array(self::CACHE_TAG_PHOTO_LIST) : null;

        return 
$this->dbo->queryForObjectList($query$this->getDtoClassName(), array_merge($qParams$condition['params']), $cacheLifeTime$cacheTags);
    }
    
    public function 
countEntityPhotos$entityType$entityId$status "approved"$privacy null )
    {
        
$photoAlbumDao PHOTO_BOL_PhotoAlbumDao::getInstance();
        
        
$statusSql $status === null "1" "`p`.`status` = '{$status}'";
        
$privacySql $privacy === null "1""`p`.`privacy`='{$privacy}'";

        
$query "
            SELECT COUNT(`p`.`id`)
            FROM `" 
$this->getTableName() . "` AS `p`
            LEFT JOIN `" 
$photoAlbumDao->getTableName() . "` AS `a` ON ( `a`.`id` = `p`.`albumId` )
            WHERE 
$statusSql AND $privacySql AND `a`.`entityType` = :entityType AND `a`.`entityId`=:entityId
        "
;

        return 
$this->dbo->queryForColumn($query, array(
            
"entityType" => $entityType,
            
"entityId" => $entityId
        
));
    }

    public function 
findPhotoListByUploadKey$uploadKey$exclude$status null )
    {
        
$example = new PEEP_Example();
        
$example->andFieldEqual('uploadKey'$uploadKey);

        if ( 
$status !== null )
        {
            
$example->andFieldEqual('status'$status);
        }

        if ( 
$exclude && is_array($exclude) )
        {
            
$example->andFieldNotInArray('id'$exclude);
        }

        
$example->setOrder('`id` DESC');

        return 
$this->findListByExample($example);
    }
    
    public function 
findPhotoIdListByUploadKey$uploadKey, array $exclude = array() )
    {
        if ( empty(
$uploadKey) )
        {
            return array();
        }
        
        
$sql 'SELECT `id`
            FROM `' 
$this->getTableName() . '`
            WHERE `uploadKey` = :key AND `status` = :status'
;
        
        if ( !empty(
$exclude) )
        {
            
$sql .= ' AND `id` NOT IN(' implode(','array_unique(array_map('intval'$exclude))) . ')';
        }
        
        return 
$this->dbo->queryForColumnList($sql, array('key' => $uploadKey'status' => 'approved'));
    }

    public function 
movePhotosToAlbum$photoIdList$albumId$newAlbum FALSE )
    {
        if ( empty(
$photoIdList) || empty($albumId) )
        {
            return 
FALSE;
        }
        
        
$photoIdList implode(','array_map('intval'array_unique($photoIdList)));
        
$key PHOTO_BOL_PhotoService::getInstance()->getPhotoUploadKey($albumId);
        
        
$sql 'UPDATE `' $this->getTableName() . '`
            SET `albumId` = :albumId
            WHERE `id` IN (' 
$photoIdList ')';
        
        if ( (
$result $this->dbo->query($sql, array('albumId' => $albumId))) )
        {   
            if ( 
$newAlbum )
            {
                return 
$result;
            }
            
            
$sql 'UPDATE `' $this->getTableName() . '`
                SET `uploadKey` = :key
                WHERE `id` IN(' 
$photoIdList ')';
            
$this->dbo->query($sql, array('key' => $key));
            
            return 
TRUE;
        }
        
        return 
FALSE;
    }
    
    public function 
getSearchResultListByTag$tag$limit PHOTO_BOL_PhotoService::SEARCH_LIMIT )
    {
        if ( empty(
$tag) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByHashtag', array('photo' => 'photo''album' => 'album''tag' => 'tag''entityTag' => 'entity'));
        
        
$sql 'SELECT `tag`.`label`, COUNT(`entity`.`entityId`) AS `count`, `tag`.`id` AS `id`, GROUP_CONCAT(`entity`.`entityId`) AS `ids`
            FROM `' 
BOL_TagDao::getInstance()->getTableName() . '` AS `tag`
                INNER JOIN `' 
BOL_EntityTagDao::getInstance()->getTableName() . '` AS `entity` ON(`entity`.`tagId` = `tag`.`id`)
                INNER JOIN `' 
$this->getTableName() . '` AS `photo` ON(`photo`.`id` = `entity`.`entityId`)
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() .'` AS `album`
                    ON(`photo`.`albumId` = `album`.`id`)
                ' 
$condition['join'] . '
            WHERE `tag`.`label` LIKE :label AND `entity`.`entityType` = :type AND `photo`.`status` = :status AND `photo`.`privacy` = :everybody AND
            ' 
$condition['where'] . '
            GROUP BY 1
            ORDER BY `tag`.`label`
            LIMIT :limit'
;
        
        return 
$this->dbo->queryForList($sqlarray_merge($condition['params'], array('label' => '%' ltrim($tag'#') . '%''type' => self::PHOTO_ENTITY_TYPE'limit' => (int)$limit'status' => 'approved''everybody' => self::PRIVACY_EVERYBODY)));
    }
    
    public function 
getSearchResultAllListByTag$tag )
    {
        if ( empty(
$tag) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByHashtag', array('photo' => 'photo''album' => 'album''tag' => 'tag''entityTag' => 'entity'));
        
        
$sql 'SELECT DISTINCT `tag`.`id`
            FROM `' 
BOL_TagDao::getInstance()->getTableName() . '` AS `tag`
                INNER JOIN `' 
BOL_EntityTagDao::getInstance()->getTableName() . '` AS `entity` ON(`entity`.`tagId` = `tag`.`id`)
                INNER JOIN `' 
$this->getTableName() . '` AS `photo` ON(`photo`.`id` = `entity`.`entityId`)
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() .'` AS `album` ON(`photo`.`albumId` = `album`.`id`)
                ' 
$condition['join'] . '
            WHERE `entity`.`entityType` = :entityType AND
            `tag`.`label` LIKE :label AND
            ' 
$condition['where'] . '
            ORDER BY `tag`.`label`'
;
        
        return 
$this->dbo->queryForColumnList($sqlarray_merge($condition['params'], array('entityType' => self::PHOTO_ENTITY_TYPE'label' => '%' ltrim($tag'#') . '%')));
    }

    public function 
getPhotoIdListByTagIdList$tagIdList )
    {
        if ( empty(
$tagIdList) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByHashtag', array('photo' => 'p''album' => 'album''tag' => 'tag''entityTag' => 'entity'));

        
$sql 'SELECT `p`.`id`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
BOL_EntityTagDao::getInstance()->getTableName() . '` AS `entity` ON(`entity`.`entityId` = `p`.`id`)
                INNER JOIN `' 
BOL_TagDao::getInstance()->getTableName() . '` AS `tag` ON(`tag`.`id` = `entity`.`tagId`)
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() .'` AS `album`
                    ON(`p`.`albumId` = `album`.`id`)
                ' 
$condition['join'] . '
            WHERE `entity`.`entityType` = :entityType AND
            `tag`.`id` IN(' 
implode(','array_map('intval'$tagIdList)) . ') AND
            ' 
$condition['where'] . '
            ORDER BY 1 DESC'
;

        return 
$this->dbo->queryForColumnList($sqlarray_merge($condition['params'], array('entityType' => self::PHOTO_ENTITY_TYPE)));
    }
    
    public function 
getSearchResultListByUserIdList$idList$limit PHOTO_BOL_PhotoService::SEARCH_LIMIT )
    {
        if ( 
count($idList) === )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByUser', array('photo' => 'p''album' => 'a'));

        
$sql 'SELECT `a`.`userId` AS `id`, COUNT(`p`.`albumId`) AS `count`, GROUP_CONCAT(DISTINCT `p`.`id`) AS `ids`
            FROM `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                INNER JOIN `' 
$this->getTableName() . '` AS `p` ON(`a`.`id` = `p`.`albumId`)
            ' 
$condition['join'] . '
            WHERE `a`.`userId` IN (' 
implode(','array_map('intval'$idList)) . ') AND `p`.`status` = :status AND `p`.`privacy` = :everybody AND
            ' 
$condition['where'] . '
            GROUP BY 1
            LIMIT :limit'
;
        
        return 
$this->dbo->queryForList($sqlarray_merge($condition['params'], array('limit' => (int)$limit'status' => 'approved''everybody' => self::PRIVACY_EVERYBODY)));
    }
        
    public function 
getSearchResultListByDescription$description$limit PHOTO_BOL_PhotoService::SEARCH_LIMIT )
    {
        if ( empty(
$description) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByDesc', array('photo' => 'p''album' => 'a'));

        
$sql 'SELECT `p`.`description` AS `label`, COUNT(`p`.`id`) AS `count`, GROUP_CONCAT(DISTINCT `p`.`id`) AS `ids`, `p`.`id`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                    ON(`a`.`id` = `p`.`albumId`)
            ' 
$condition['join'] . '
            WHERE `p`.`description` LIKE :desc AND `p`.`status` = :status AND `p`.`privacy` = :everybody AND
            ' 
$condition['where'] . '
            GROUP BY 1
            LIMIT :limit'
;
        
        return 
$this->dbo->queryForList($sqlarray_merge($condition['params'], array('desc' => '%' $description '%''limit' => $limit'status' => 'approved''everybody' => self::PRIVACY_EVERYBODY)));
    }
    
    public function 
getSearchResultAllListByDescription$description )
    {
        if ( empty(
$description) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByDesc', array('photo' => 'p''album' => 'a'));

        
$sql 'SELECT `p`.`id`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`p`.`albumId` = `a`.`id`)
            ' 
$condition['join'] . '
            WHERE `p`.`description` LIKE :desc AND `p`.`privacy` = :everybody AND `p`.`status` = :status AND
            ' 
$condition['where'] . '
            ORDER BY `p`.`description`'
;
        
        return 
$this->dbo->queryForColumnList($sqlarray_merge($condition['params'], array('desc' => '%' $description '%''everybody' => self::PRIVACY_EVERYBODY'status' => 'approved')));
    }
    
    public function 
findTaggedPhotosByTagId$tagId$first$limit$checkPrivacy NULL )
    {
        if ( empty(
$tagId) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByHashtag', array('photo' => 'p''album' => 'a'));

        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`p`.`albumId` = `a`.`id`)
                INNER JOIN `' 
BOL_EntityTagDao::getInstance()->getTableName() . '` AS `e` ON(`e`.`entityId` = `p`.`id`)
            ' 
$condition['join'] . '
            WHERE `e`.`tagId` = :tagId AND `p`.`status` = :status AND ' 
$condition['where'] .
                (
$checkPrivacy !== NULL 
                    
$checkPrivacy ' AND (`p`.`' self::PRIVACY '` = :everybody OR `p`.`' self::PRIVACY '` = :friends)' 
                                    
' AND `p`.`' self::PRIVACY '` = :everybody' '') . '
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit'
;
       
        if ( 
$checkPrivacy !== NULL )
        {
            switch ( 
$checkPrivacy )
            {
                case 
TRUE:
                    
$params['friends'] = self::PRIVACY_FRIENDS_ONLY;
                case 
FALSE:
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
            }
        }
        
        return 
$this->dbo->queryForList($sqlarray_merge($condition['params'], array('tagId' => $tagId'first' => (int)$first'limit' => (int)$limit'everybody' => PHOTO_BOL_PhotoDao::PRIVACY_EVERYBODY'status' => 'approved')));
    }
    
    public function 
findPhotoListByUserId$userId$first$limit$checkPrivacy NULL, array $exclude = array(), $status PHOTO_BOL_PhotoDao::STATUS_APPROVED )
    {
        if ( empty(
$userId) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('findPhotoListByUserId',
            array(
                
'photo' => 'p',
                
'album' => 'a'
            
),
            array(
                
'userId' => $userId,
                
'first' => $first,
                
'limit' => $limit,
                
'checkPrivacy' => $checkPrivacy,
                
'exclude' => $exclude,
                
'status' => $status
            
)
        );

        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`p`.`albumId` = `a`.`id`)
                ' 
$condition['join'] . '
            WHERE `a`.`userId` = :userId AND
                ' 
. (!empty($status) ? '`p`.`status` = :status' '1') . ' AND
                ' 
. ($checkPrivacy !== null ?
                        (
$checkPrivacy ?
                                
'(`p`.`privacy` = :everybody OR `p`.`privacy` = :friends)' :
                                
'`p`.`privacy` = :everybody') :
                        
'1') . ' AND
                ' 
. (!empty($exclude) ? '`p`.`id` NOT IN (' $this->dbo->mergeInClause($exclude) . ')' '1') . ' AND
                ' 
$condition['where'] . '
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit'
;

        
$params = array(
            
'userId' => $userId,
            
'first' => (int) $first,
            
'limit' => (int) $limit
        
);

        if ( 
$checkPrivacy !== NULL )
        {
            switch ( 
$checkPrivacy )
            {
                case 
TRUE:
                    
$params['friends'] = self::PRIVACY_FRIENDS_ONLY;
                case 
FALSE:
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
            }
        }

        if ( !empty(
$status) )
        {
            
$params['status'] = $status;
        }
        
        return 
$this->dbo->queryForList($sqlarray_merge($params$condition['params']));
    }
    
    public function 
findPhotoListByUserIdList( array $userIdList$first$limit$checkPrivacy NULL )
    {
        if ( 
count($userIdList) === )
        {
            return array();
        }
        
        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON (`p`.`albumId` = `a`.`id`)
                INNER JOIN `' 
BOL_UserDao::getInstance()->getTableName() . '` AS `u` ON (`u`.`id` = `a`.`userId`)
            WHERE `a`.`userId` IN(' 
implode(','array_map('intval'array_unique($userIdList))) . ') AND `p`.`status` = :status' .
                (
$checkPrivacy !== NULL 
                    
$checkPrivacy ' AND (`p`.`' self::PRIVACY '` = :everybody OR `p`.`' self::PRIVACY '` = :friends)' 
                                    
' AND `p`.`' self::PRIVACY '` = :everybody' '') . '
            ORDER BY `u`.`username`
            LIMIT :first, :limit'
;
        
        
$params = array('first' => (int)$first'limit' => (int)$limit'status' => 'approved');
        
        if ( 
$checkPrivacy !== NULL )
        {
            switch ( 
$checkPrivacy )
            {
                case 
TRUE:
                    
$params['friends'] = self::PRIVACY_FRIENDS_ONLY;
                case 
FALSE:
                    
$params['everybody'] = self::PRIVACY_EVERYBODY;
            }
        }
        
        return 
$this->dbo->queryForList($sql$params);
    }
    
    public function 
findPhotoListByDescription$desc$id$first$limit )
    {
        if ( empty(
$desc) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByDesc', array('photo' => 'p''album' => 'a'));
        
        
$sqlIDs 'SELECT `a1`.`ids`
            FROM (SELECT `p`.`description`, COUNT(*), GROUP_CONCAT(`p`.`id`) AS `ids`, `p`.`id`
                FROM `' 
$this->getTableName() . '` AS `p`
                    INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                        ON(`a`.`id` = `p`.`albumId`)
                ' 
$condition['join'] . '
                WHERE `p`.`description` LIKE :desc AND
                ' 
$condition['where'] . '
                GROUP BY 1
                HAVING `p`.`id` = :id) AS `a1`'
;
        
        
$ids $this->dbo->queryForColumn($sqlIDsarray_merge($condition['params'], array('desc' => '%' $desc '%''id' => $id)));
        
        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`a`.`id` = `p`.`albumId`)
            WHERE `p`.`id` IN (' 
$ids ') AND `p`.`privacy` = :everybody AND `p`.`status` = :status
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit'
;
        
        return 
$this->dbo->queryForList($sql, array('first' => (int)$first'limit' => (int)$limit'everybody' => self::PRIVACY_EVERYBODY'status' => 'approved'));
    }
    
    public function 
findPhotoListByIdList( array $idList$first$limit$status PHOTO_BOL_PhotoDao::STATUS_APPROVED )
    {
        if ( 
count($idList) === )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByHashtag', array('photo' => 'p''album' => 'a'));
        
        
$params array_merge($condition['params'], array('first' => $first'limit' => $limit));
        
$statusSql "1";
        
        if ( !empty(
$status) )
        {
            
$params["status"] = $status;
            
$statusSql "`p`.`status` = :status";
        }
        
        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`p`.`albumId` = `a`.`id`)
            ' 
$condition['join'] . '
            WHERE `p`.`id` IN (' 
implode(','array_map('intval'array_unique($idList))) . ') AND ' $statusSql ' AND ' $condition['where'] . '
            ORDER BY `p`.`id` DESC
            LIMIT :first, :limit'
;
        
        return 
$this->dbo->queryForList($sql$params);
    }
    
    public function 
findPhotoList$type$page$limit$checkPrivacy true$exclude null)
    {
        if ( 
$type == 'toprated' )
        {
            
$first = ( $page ) * $limit;
            
$topRatedList BOL_RateService::getInstance()->findMostRatedEntityList('photo_rates'$first$limit$exclude);

            if ( !
$topRatedList )
            {
                return array();
            }
            
            
$photoArr $this->findPhotoInfoListByIdList(array_keys($topRatedList));

            
$photos = array();

            foreach ( 
$photoArr as $key => $photo )
            {
                
$photos[$key] = $photo;
                
$photos[$key]['score'] = $topRatedList[$photo['id']]['avgScore'];
                
$photos[$key]['rates'] = $topRatedList[$photo['id']]['ratesCount'];
            }

            
usort($photos, array('PHOTO_BOL_PhotoService''sortArrayItemByDesc'));
        }
        else
        {
            
$photos $this->getPhotoList($type$page$limit$checkPrivacy,$exclude);
        }
        
        if ( 
$photos )
        {
            foreach ( 
$photos as $key => $photo )
            {
                
$photos[$key]['url'] = $this->getPhotoUrl($photo['id'], $photo['hash'], FALSE);
            }
        }

        return 
$photos;
    }

    public function 
findPhotosInAlbum$albumId, array $photoIds null )
    {
        if ( empty(
$albumId) )
        {
            return array();
        }

        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a`
                    ON(`p`.`albumId` = `a`.`id`)
            WHERE `p`.`albumId` = :albumId'
;

        if ( 
count($photoIds) !== )
        {
            
$sql .= ' AND `p`.`id` IN(' $this->dbo->mergeInClause($photoIds) . ')';
        }

        return 
$this->dbo->queryForList($sql, array('albumId' => $albumId));
    }

    public function 
countPhotosInAlbumByPhotoIdList$albumId, array $photoIdList )
    {
        if ( empty(
$albumId) )
        {
            return 
0;
        }
        
        
$sql 'SELECT COUNT(*)
            FROM `' 
$this->getTableName() . '`
            WHERE `albumId` = :albumId AND 
                `id` IN (' 
implode(','array_map('intval'array_unique($photoIdList))) . ') AND
                `status` = :status'
;
        
        return (int)
$this->dbo->queryForColumn($sql, array('albumId' => $albumId'status' => 'approved'));
    }
    
    public function 
countPhotosByUploadKey$uploadKey )
    {
        if ( empty(
$uploadKey) )
        {
            return 
0;
        }
        
        
$sql 'SELECT COUNT(*)
            FROM `' 
$this->getTableName() . '`
            WHERE `uploadKey` = :key AND `status` = :status'
;
        
        return (int)
$this->dbo->queryForColumn($sql, array('key' => $uploadKey'status' => 'approved'));
    }
    
    public function 
updateUploadKeyByPhotoIdList( array $photoIdList$key )
    {
        if ( 
count($photoIdList) === )
        {
            return 
0;
        }
        
        
$sql 'UPDATE `' $this->getTableName() . '`
            SET `uploadKey` = :key
            WHERE `id` IN (' 
implode(','array_map('intval'array_unique($photoIdList))) . ')';
        
        return 
$this->dbo->query($sql, array('key' => $key));
    }
    
    public function 
findDistinctPhotoUploadKeyByAlbumId$albumId )
    {
        if ( empty(
$albumId) )
        {
            return array();
        }
        
        
$sql 'SELECT *
            FROM `' 
$this->getTableName() . '`
            WHERE `albumId` = :albumId'
;
        
        return 
$this->dbo->queryForObjectList($sql$this->getDtoClassName(), array('albumId' => $albumId));
    }
    
    public function 
findPhotoIdListByAlbumId$albumId, array $exclude = array() )
    {
        if ( empty(
$albumId) )
        {
            return array();
        }
        
        
$sql ' SELECT `id`
            FROM `' 
$this->getTableName() . '`
            WHERE `albumId` = :albumId'
;
        
        if ( 
count($exclude) !== )
        {
            
$sql .= ' AND `id` NOT IN (' implode(','array_map('intval'array_unique($exclude))) . ')';
        }
        
        return 
$this->dbo->queryForColumnList($sql, array('albumId' => $albumId));
    }
    
    public function 
findPhotoIdListByUserIdList( array $idList )
    {
        if ( empty(
$idList) )
        {
            return array();
        }

        
$condition PHOTO_BOL_PhotoService::getInstance()->getQueryCondition('searchByUsername', array('photo' => 'p''album' => 'a'));
        
        
$sql ' SELECT `p`.`id`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN ' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . ' AS `a` ON(`p`.`albumId` = `a`.`id`)
            ' 
$condition['join'] . '
            WHERE `a`.`userId` IN(' 
$this->dbo->mergeInClause($idList) . ') AND ' $condition['where'];
        
        return 
$this->dbo->queryForColumnList($sql$condition['params']);
    }

    
// Content provider
    
public function getPhotoListByIdList( array $idList )
    {
        if ( empty(
$idList) )
        {
            return array();
        }

        
$sql 'SELECT `p`.*, `a`.`userId`
            FROM `' 
$this->getTableName() . '` AS `p`
                INNER JOIN `' 
PHOTO_BOL_PhotoAlbumDao::getInstance()->getTableName() . '` AS `a` ON(`p`.`albumId` = `a`.`id`)
            WHERE `p`.`id` IN(' 
$this->dbo->mergeInClause($idList) . ')';

        return 
$this->dbo->queryForList($sql);
    }
}
Онлайн: 0
Реклама