<commit_before><?php
/**
 * Содержит класс TagCloud
 *
 * @package energine
 * @subpackage apps
 * @author andrii.a
 * @copyright Energine 2012
 * @version $Id$
 */

/**
 * Содержит класс, позволяющий вывести облако тегов на страницу
 *
 * @package energine
 * @subpackage apps
 * @author andrii.a
 */
class TagCloud extends DBDataSet {

    /**
     * Компонент, к которому привязывается
     * TagCloud
     *
     * @var Pager
     */
    private $bindedBlock;

    /**
     * Массив, содержащий ИД тагов
     * и информацию о их "весе"
     *
     * @var array
     */
    private $tagsInfo;

    /**
     * Конструктор класса
     *
     * @param string $name
     * @param string $module
     * @param array $params
     * @access public
     */
    public function __construct($name, $module, array $params = null) {
        parent::__construct($name, $module, $params);
        $this->setType(self::COMPONENT_TYPE_LIST);
        $this->setTableName('share_tags');
        $this->bindedBlock = $this->document->componentManager->getBlockByName($this->getParam('bind'));
        if (!$this->bindedBlock) {
            throw new SystemException('ERR_TAGCLOUD_NOT_BINDED', SystemException::ERR_DEVELOPER);
        }
        $this->tagsInfo = $this->getTagsInfo();
        $this->addFilterCondition(array('tag_id' => simplifyDBResult($this->tagsInfo, 'tag_id')));
    }

    /**
     * Добавлен
     * параметр bind
     *
     * @return array
     * @access protected
     */
    protected function defineParams() {
        return array_merge(
            parent::defineParams(),
            array(
                'recordsPerPage' => 50,
                'bind' => ''
            )
        );
    }

    /**
     * Добавлена проперти с частотой появления
     * тега.
     *
     * @return Data
     * @access protected
     */
    protected function createData() {
        $result = parent::createData();
        if (is_array($this->tagsInfo)) {
            $tagsFrq = array();
            foreach ($this->tagsInfo as $tag) {
                $tagsFrq[$tag['tag_id']] = $tag['frq'];
            }
            $f = $result->getFieldByName('tag_id');
            for ($i = 0; $i < $result->getRowCount(); $i++) {
                $f->setRowProperty($i, 'frequency', $tagsFrq[$f->getRowData($i)]);
            }
        }
        return $result;
    }

    /**
     * Возвращает информацию о ИД тегов
     * и частоте их появления.
     *
     * @return array
     * @access private
     */
    private function getTagsInfo() {
        $result = $this->dbh->select('SELECT COUNT(ctl.' . $this->bindedBlock->getPK() . ') as frq,ctl.tag_id FROM '
                . $this->bindedBlock->getTableName()
                . '_tags ctl INNER JOIN ' . $this->bindedBlock->getTableName() . ' ct '
                . 'WHERE ct.smap_id = ' . $this->document->getID() . ' '
                . 'AND ctl.' . $this->bindedBlock->getPK() . ' = ct.'
                . $this->bindedBlock->getPK() . ' GROUP BY tag_id');
        return $result;
    }
}<commit_msg>Добавлен параметр id=parent для вывода тегов из списка родительского раздела<commit_after><?php
/**
 * Содержит класс TagCloud
 *
 * @package energine
 * @subpackage apps
 * @author andrii.a
 * @copyright Energine 2012
 * @version $Id$
 */

/**
 * Содержит класс, позволяющий вывести облако тегов на страницу
 *
 * @package energine
 * @subpackage apps
 * @author andrii.a
 */
class TagCloud extends DBDataSet {

    /**
     * Вывод тегов для родительского раздела
     */
    const ID_PARENT_FILTER = 'parent';

    /**
     * Ид раздела, с которого
     * будут выводиться теги
     *
     * @var int
     */
    private $filterId;

    /**
     * Компонент, к которому привязывается
     * TagCloud
     *
     * @var Component
     */
    private $bindedBlock;

    /**
     * Массив, содержащий ИД тагов
     * и информацию о их "весе"
     *
     * @var array
     */
    private $tagsInfo;

    /**
     * Конструктор класса
     *
     * @param string $name
     * @param string $module
     * @param array $params
     * @access public
     */
    public function __construct($name, $module, array $params = null) {
        parent::__construct($name, $module, $params);
        $this->setType(self::COMPONENT_TYPE_LIST);
        $this->setTableName('share_tags');
        $this->bindedBlock = $this->document->componentManager->getBlockByName($this->getParam('bind'));
        if (!$this->bindedBlock) {
            throw new SystemException('ERR_TAGCLOUD_NOT_BINDED', SystemException::ERR_DEVELOPER);
        }
        if ($filerId = intval($this->getParam('id'))) {
            $this->filterId = $filerId;
        }
        else if($this->getParam('id') == self::ID_PARENT_FILTER) {
            $this->filterId = E()->getMap()->getParent($this->document->getID());
        }
        else {
            $this->filterId = $this->document->getID();
        }
        $this->tagsInfo = $this->getTagsInfo();
        $this->addFilterCondition(array('tag_id' => simplifyDBResult($this->tagsInfo, 'tag_id')));
    }

    /**
     * Добавлен
     * параметр bind
     *
     * @return array
     * @access protected
     */
    protected function defineParams() {
        return array_merge(
            parent::defineParams(),
            array(
                'id' => false,
                'recordsPerPage' => 50,
                'bind' => ''
            )
        );
    }

    /**
     * Добавлена проперти с частотой появления
     * тега.
     *
     * @return Data
     * @access protected
     */
    protected function createData() {
        $result = parent::createData();
        if (is_array($this->tagsInfo)) {
            $tagsFrq = array();
            foreach ($this->tagsInfo as $tag) {
                $tagsFrq[$tag['tag_id']] = $tag['frq'];
            }
            $f = $result->getFieldByName('tag_id');
            for ($i = 0; $i < $result->getRowCount(); $i++) {
                $f->setRowProperty($i, 'frequency', $tagsFrq[$f->getRowData($i)]);
            }
        }
        return $result;
    }

    /**
     * Возвращает информацию о ИД тегов
     * и частоте их появления.
     *
     * @return array
     * @access private
     */
    private function getTagsInfo() {
        $result = $this->dbh->select('SELECT COUNT(ctl.' . $this->bindedBlock->getPK() . ') as frq,ctl.tag_id FROM '
                . $this->bindedBlock->getTableName()
                . '_tags ctl INNER JOIN ' . $this->bindedBlock->getTableName() . ' ct '
                . 'WHERE ct.smap_id = ' . $this->filterId . ' '
                . 'AND ctl.' . $this->bindedBlock->getPK() . ' = ct.'
                . $this->bindedBlock->getPK() . ' GROUP BY tag_id');
        return $result;
    }
}
{'fraction_non_alphanumeric': 0.14851632047477745, 'fraction_numerical': 0.0020771513353115725, 'mean_word_length': 1.9398168338421282, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 84, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4884299', 'n_tokens_mistral': 2203, 'n_tokens_neox': 2247, 'n_words': 425}