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