xref: /plugin/struct/meta/SearchCloud.php (revision 7923cdacab81de55732b2931695bdc6734571b7e)
10699ff47SMichael Grosse<?php
20699ff47SMichael Grosse
30699ff47SMichael Grossenamespace dokuwiki\plugin\struct\meta;
40699ff47SMichael Grosse
50699ff47SMichael Grosse/**
60699ff47SMichael Grosse * Class SearchCloud
70699ff47SMichael Grosse *
80699ff47SMichael Grosse * The same as @see SearchConfig, but executed a search that is not pid-focused
90699ff47SMichael Grosse *
100699ff47SMichael Grosse * @package dokuwiki\plugin\struct\meta
110699ff47SMichael Grosse */
12d6d97f60SAnna Dabrowskaclass SearchCloud extends SearchConfig
13d6d97f60SAnna Dabrowska{
143ec19891SMichael Grosse    protected $limit = '';
153ec19891SMichael Grosse
160699ff47SMichael Grosse    /**
17*7923cdacSAndreas Gohr     * We do not have pagination in clouds, so we can work with a limit within SQL
180699ff47SMichael Grosse     *
19*7923cdacSAndreas Gohr     * @param int $limit
200699ff47SMichael Grosse     */
21*7923cdacSAndreas Gohr    public function setLimit($limit)
22d6d97f60SAnna Dabrowska    {
23*7923cdacSAndreas Gohr        $this->limit = " LIMIT $limit";
24*7923cdacSAndreas Gohr    }
250699ff47SMichael Grosse
26*7923cdacSAndreas Gohr    /**
27*7923cdacSAndreas Gohr     * @inheritdoc
28*7923cdacSAndreas Gohr     */
29*7923cdacSAndreas Gohr    protected function runSQLBuilder()
30*7923cdacSAndreas Gohr    {
31*7923cdacSAndreas Gohr        $sqlBuilder = new SearchSQLBuilder();
32*7923cdacSAndreas Gohr        $sqlBuilder->setSelectLatest($this->selectLatest);
33*7923cdacSAndreas Gohr        $sqlBuilder->addSchemas($this->schemas, false);
34*7923cdacSAndreas Gohr        $this->addTagSelector($sqlBuilder);
35*7923cdacSAndreas Gohr        $sqlBuilder->getQueryBuilder()->addGroupByStatement('tag');
36*7923cdacSAndreas Gohr        $sqlBuilder->getQueryBuilder()->addOrderBy('count DESC');
37*7923cdacSAndreas Gohr        $sqlBuilder->addFilters($this->filter);
38*7923cdacSAndreas Gohr        return $sqlBuilder;
39*7923cdacSAndreas Gohr    }
40dea51657SAnna Dabrowska
41*7923cdacSAndreas Gohr    /**
42*7923cdacSAndreas Gohr     * Add the tag selector to the SQLBuilder
43*7923cdacSAndreas Gohr     */
44*7923cdacSAndreas Gohr    protected function addTagSelector(SearchSQLBuilder $builder)
45*7923cdacSAndreas Gohr    {
46*7923cdacSAndreas Gohr        $QB = $builder->getQueryBuilder();
470699ff47SMichael Grosse
480699ff47SMichael Grosse        $col = $this->columns[0];
49*7923cdacSAndreas Gohr        $datatable = "data_{$col->getTable()}";
50*7923cdacSAndreas Gohr
510699ff47SMichael Grosse        if ($col->isMulti()) {
520699ff47SMichael Grosse            $multitable = "multi_{$col->getTable()}";
5387feee46SMichael Grosse            $MN = $QB->generateTableAlias('M');
540699ff47SMichael Grosse
550699ff47SMichael Grosse            $QB->addLeftJoin(
560699ff47SMichael Grosse                $datatable,
570699ff47SMichael Grosse                $multitable,
580699ff47SMichael Grosse                $MN,
5915df5922SAnna Dabrowska                "$datatable.pid = $MN.pid AND
6015df5922SAnna Dabrowska                     $datatable.rid = $MN.rid AND
610699ff47SMichael Grosse                     $datatable.rev = $MN.rev AND
620699ff47SMichael Grosse                     $MN.colref = {$col->getColref()}"
630699ff47SMichael Grosse            );
640699ff47SMichael Grosse
650699ff47SMichael Grosse            $col->getType()->select($QB, $MN, 'value', 'tag');
665f11f83eSMichael Grosse            $colname = $MN . '.value';
670699ff47SMichael Grosse        } else {
680699ff47SMichael Grosse            $col->getType()->select($QB, $datatable, $col->getColName(), 'tag');
690699ff47SMichael Grosse            $colname = $datatable . '.' . $col->getColName();
700699ff47SMichael Grosse        }
710699ff47SMichael Grosse        $QB->addSelectStatement("COUNT($colname)", 'count');
720699ff47SMichael Grosse    }
730699ff47SMichael Grosse
743ec19891SMichael Grosse
753ec19891SMichael Grosse    /**
760699ff47SMichael Grosse     * Execute this search and return the result
770699ff47SMichael Grosse     *
78f83ea577SAnna Dabrowska     * Because the cloud uses a different search, we omit calling
79f83ea577SAnna Dabrowska     * getResult() und run() methods of the parent class, and return the result array directly.
800699ff47SMichael Grosse     *
810699ff47SMichael Grosse     * @return Value[][]
820699ff47SMichael Grosse     */
83f83ea577SAnna Dabrowska    public function getRows()
84d6d97f60SAnna Dabrowska    {
857234bfb1Ssplitbrain        [$sql, $opts] = $this->getSQL();
860699ff47SMichael Grosse
870699ff47SMichael Grosse        /** @var \PDOStatement $res */
880699ff47SMichael Grosse        $res = $this->sqlite->query($sql, $opts);
890699ff47SMichael Grosse        if ($res === false) throw new StructException("SQL execution failed for\n\n$sql");
900699ff47SMichael Grosse
913ec19891SMichael Grosse        $result = [];
9279b29326SAnna Dabrowska        $rows = $res->fetchAll(\PDO::FETCH_ASSOC);
93ae457e47SMichael Grosse
943ec19891SMichael Grosse        foreach ($rows as $row) {
95ae457e47SMichael Grosse            if (!empty($this->config['min']) && $this->config['min'] > $row['count']) {
96ae457e47SMichael Grosse                break;
97ae457e47SMichael Grosse            }
980699ff47SMichael Grosse
990699ff47SMichael Grosse            $row['tag'] = new Value($this->columns[0], $row['tag']);
1000699ff47SMichael Grosse            $result[] = $row;
1010699ff47SMichael Grosse        }
1020699ff47SMichael Grosse
10379b29326SAnna Dabrowska        $res->closeCursor();
1040699ff47SMichael Grosse        return $result;
1050699ff47SMichael Grosse    }
1060699ff47SMichael Grosse}
107