1ba7f5789SAnna Dabrowska<?php 2ba7f5789SAnna Dabrowska 3ba7f5789SAnna Dabrowskanamespace dokuwiki\plugin\struct\meta; 4ba7f5789SAnna Dabrowska 5ba7f5789SAnna Dabrowska/** 6ba7f5789SAnna Dabrowska * Class SearchResult 7ba7f5789SAnna Dabrowska * 8ba7f5789SAnna Dabrowska * Search is executed only once per request. 9ba7f5789SAnna Dabrowska */ 10ba7f5789SAnna Dabrowskaclass SearchResult 11ba7f5789SAnna Dabrowska{ 12ba7f5789SAnna Dabrowska /** @var Value[][] */ 13ba7f5789SAnna Dabrowska protected $rows = []; 14ba7f5789SAnna Dabrowska /** @var array */ 15ba7f5789SAnna Dabrowska protected $pids = []; 16ba7f5789SAnna Dabrowska protected $rids = []; 17ba7f5789SAnna Dabrowska /** @var array */ 18ba7f5789SAnna Dabrowska protected $revs = []; 19ba7f5789SAnna Dabrowska /** @var int */ 20ba7f5789SAnna Dabrowska protected $count = -1; 21ba7f5789SAnna Dabrowska 22ba7f5789SAnna Dabrowska /** 23*04c3c31fSAnna Dabrowska * Construct SearchResult 24ba7f5789SAnna Dabrowska * 25*04c3c31fSAnna Dabrowska * @param \PDOStatemen $res 26*04c3c31fSAnna Dabrowska * @param int $rangeBegin 27*04c3c31fSAnna Dabrowska * @param int $rangeEnd 28*04c3c31fSAnna Dabrowska * @param array $columns 29*04c3c31fSAnna Dabrowska * @param bool $pageidAndRevOnly 30ba7f5789SAnna Dabrowska */ 31*04c3c31fSAnna Dabrowska public function __construct($res, $rangeBegin, $rangeEnd, $columns, $pageidAndRevOnly) 32ba7f5789SAnna Dabrowska { 33*04c3c31fSAnna Dabrowska while ($row = $res->fetch(\PDO::FETCH_ASSOC)) { 34*04c3c31fSAnna Dabrowska $this->increaseCount(); 35*04c3c31fSAnna Dabrowska if ($this->getCount() < $rangeBegin) continue; 36*04c3c31fSAnna Dabrowska if ($rangeEnd && $this->getCount() >= $rangeEnd) continue; 37*04c3c31fSAnna Dabrowska 38*04c3c31fSAnna Dabrowska $C = 0; 39*04c3c31fSAnna Dabrowska $resrow = []; 40*04c3c31fSAnna Dabrowska $isempty = true; 41*04c3c31fSAnna Dabrowska foreach ($columns as $col) { 42*04c3c31fSAnna Dabrowska $val = $row["C$C"]; 43*04c3c31fSAnna Dabrowska if ($col->isMulti()) { 44*04c3c31fSAnna Dabrowska $val = explode(Search::CONCAT_SEPARATOR, $val); 45ba7f5789SAnna Dabrowska } 46*04c3c31fSAnna Dabrowska $value = new Value($col, $val); 47*04c3c31fSAnna Dabrowska $isempty &= $this->isEmptyValue($value); 48*04c3c31fSAnna Dabrowska $resrow[] = $value; 49*04c3c31fSAnna Dabrowska $C++; 50*04c3c31fSAnna Dabrowska } 51*04c3c31fSAnna Dabrowska 52*04c3c31fSAnna Dabrowska // skip empty rows 53*04c3c31fSAnna Dabrowska if ($isempty && !$pageidAndRevOnly) { 54*04c3c31fSAnna Dabrowska $this->decreaseCount(); 55*04c3c31fSAnna Dabrowska continue; 56*04c3c31fSAnna Dabrowska } 57*04c3c31fSAnna Dabrowska 58*04c3c31fSAnna Dabrowska $this->addPid($row['PID']); 59*04c3c31fSAnna Dabrowska $this->addRid($row['rid']); 60*04c3c31fSAnna Dabrowska $this->addRev($row['rev']); 61*04c3c31fSAnna Dabrowska $this->addRow($resrow); 62*04c3c31fSAnna Dabrowska } 63*04c3c31fSAnna Dabrowska 64*04c3c31fSAnna Dabrowska $res->closeCursor(); 65*04c3c31fSAnna Dabrowska $this->increaseCount(); 66ba7f5789SAnna Dabrowska } 67ba7f5789SAnna Dabrowska 68ba7f5789SAnna Dabrowska /** 69ba7f5789SAnna Dabrowska * @return array 70ba7f5789SAnna Dabrowska */ 71ba7f5789SAnna Dabrowska public function getPids(): array 72ba7f5789SAnna Dabrowska { 73ba7f5789SAnna Dabrowska return $this->pids; 74ba7f5789SAnna Dabrowska } 75ba7f5789SAnna Dabrowska 76ba7f5789SAnna Dabrowska /** 77ba7f5789SAnna Dabrowska * @return Value[][] 78ba7f5789SAnna Dabrowska */ 79ba7f5789SAnna Dabrowska public function getRows() 80ba7f5789SAnna Dabrowska { 81ba7f5789SAnna Dabrowska return $this->rows; 82ba7f5789SAnna Dabrowska } 83ba7f5789SAnna Dabrowska 84ba7f5789SAnna Dabrowska /** 85ba7f5789SAnna Dabrowska * @return array 86ba7f5789SAnna Dabrowska */ 87ba7f5789SAnna Dabrowska public function getRids(): array 88ba7f5789SAnna Dabrowska { 89ba7f5789SAnna Dabrowska return $this->rids; 90ba7f5789SAnna Dabrowska } 91ba7f5789SAnna Dabrowska 92ba7f5789SAnna Dabrowska /** 93ba7f5789SAnna Dabrowska * @return int 94ba7f5789SAnna Dabrowska */ 95ba7f5789SAnna Dabrowska public function getCount(): int 96ba7f5789SAnna Dabrowska { 97ba7f5789SAnna Dabrowska return $this->count; 98ba7f5789SAnna Dabrowska } 99ba7f5789SAnna Dabrowska 100ba7f5789SAnna Dabrowska /** 101ba7f5789SAnna Dabrowska * @return array 102ba7f5789SAnna Dabrowska */ 103ba7f5789SAnna Dabrowska public function getRevs(): array 104ba7f5789SAnna Dabrowska { 105ba7f5789SAnna Dabrowska return $this->revs; 106ba7f5789SAnna Dabrowska } 107ba7f5789SAnna Dabrowska 108ba7f5789SAnna Dabrowska /** 109ba7f5789SAnna Dabrowska * @param string $pid 110ba7f5789SAnna Dabrowska * @return void 111ba7f5789SAnna Dabrowska */ 112ba7f5789SAnna Dabrowska public function addPid($pid) 113ba7f5789SAnna Dabrowska { 114ba7f5789SAnna Dabrowska $this->pids[] = $pid; 115ba7f5789SAnna Dabrowska } 116ba7f5789SAnna Dabrowska 117ba7f5789SAnna Dabrowska /** 118ba7f5789SAnna Dabrowska * @param int $rid 119ba7f5789SAnna Dabrowska * @return void 120ba7f5789SAnna Dabrowska */ 121ba7f5789SAnna Dabrowska public function addRid($rid) 122ba7f5789SAnna Dabrowska { 123ba7f5789SAnna Dabrowska $this->rids[] = $rid; 124ba7f5789SAnna Dabrowska } 125ba7f5789SAnna Dabrowska 126ba7f5789SAnna Dabrowska /** 127ba7f5789SAnna Dabrowska * @param int $rev 128ba7f5789SAnna Dabrowska * @return void 129ba7f5789SAnna Dabrowska */ 130ba7f5789SAnna Dabrowska public function addRev($rev) 131ba7f5789SAnna Dabrowska { 132ba7f5789SAnna Dabrowska $this->revs[] = $rev; 133ba7f5789SAnna Dabrowska } 134ba7f5789SAnna Dabrowska 135ba7f5789SAnna Dabrowska /** 136ba7f5789SAnna Dabrowska * @param array $result 137ba7f5789SAnna Dabrowska * @return void 138ba7f5789SAnna Dabrowska */ 139ba7f5789SAnna Dabrowska public function addRow($row) 140ba7f5789SAnna Dabrowska { 141ba7f5789SAnna Dabrowska $this->rows[] = $row; 142ba7f5789SAnna Dabrowska } 143ba7f5789SAnna Dabrowska 144ba7f5789SAnna Dabrowska /** 145ba7f5789SAnna Dabrowska * @return void 146ba7f5789SAnna Dabrowska */ 147ba7f5789SAnna Dabrowska public function increaseCount() 148ba7f5789SAnna Dabrowska { 149ba7f5789SAnna Dabrowska $this->count++; 150ba7f5789SAnna Dabrowska } 151ba7f5789SAnna Dabrowska/** 152ba7f5789SAnna Dabrowska * @return void 153ba7f5789SAnna Dabrowska */ 154ba7f5789SAnna Dabrowska public function decreaseCount() 155ba7f5789SAnna Dabrowska { 156ba7f5789SAnna Dabrowska $this->count--; 157ba7f5789SAnna Dabrowska } 158*04c3c31fSAnna Dabrowska 159*04c3c31fSAnna Dabrowska /** 160*04c3c31fSAnna Dabrowska * Check if the given row is empty or references our own row 161*04c3c31fSAnna Dabrowska * 162*04c3c31fSAnna Dabrowska * @param Value $value 163*04c3c31fSAnna Dabrowska * @return bool 164*04c3c31fSAnna Dabrowska */ 165*04c3c31fSAnna Dabrowska protected function isEmptyValue(Value $value) 166*04c3c31fSAnna Dabrowska { 167*04c3c31fSAnna Dabrowska if ($value->isEmpty()) return true; 168*04c3c31fSAnna Dabrowska if ($value->getColumn()->getTid() == 0) return true; 169*04c3c31fSAnna Dabrowska return false; 170*04c3c31fSAnna Dabrowska } 171ba7f5789SAnna Dabrowska} 172