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 /** 2304c3c31fSAnna Dabrowska * Construct SearchResult 24ba7f5789SAnna Dabrowska * 25*1c9d4449SAnna Dabrowska * @param \PDOStatement $res PDO statement containing the search result 26*1c9d4449SAnna Dabrowska * @param int $rangeBegin Begin of requested result range 27*1c9d4449SAnna Dabrowska * @param int $rangeEnd End of requested result range 28*1c9d4449SAnna Dabrowska * @param Column[] $columns Search columns 2904c3c31fSAnna Dabrowska * @param bool $pageidAndRevOnly 30ba7f5789SAnna Dabrowska */ 3104c3c31fSAnna Dabrowska public function __construct($res, $rangeBegin, $rangeEnd, $columns, $pageidAndRevOnly) 32ba7f5789SAnna Dabrowska { 3304c3c31fSAnna Dabrowska while ($row = $res->fetch(\PDO::FETCH_ASSOC)) { 3404c3c31fSAnna Dabrowska $this->increaseCount(); 3504c3c31fSAnna Dabrowska if ($this->getCount() < $rangeBegin) continue; 3604c3c31fSAnna Dabrowska if ($rangeEnd && $this->getCount() >= $rangeEnd) continue; 3704c3c31fSAnna Dabrowska 3804c3c31fSAnna Dabrowska $C = 0; 3904c3c31fSAnna Dabrowska $resrow = []; 4004c3c31fSAnna Dabrowska $isempty = true; 4104c3c31fSAnna Dabrowska foreach ($columns as $col) { 4204c3c31fSAnna Dabrowska $val = $row["C$C"]; 4304c3c31fSAnna Dabrowska if ($col->isMulti()) { 4404c3c31fSAnna Dabrowska $val = explode(Search::CONCAT_SEPARATOR, $val); 45ba7f5789SAnna Dabrowska } 4604c3c31fSAnna Dabrowska $value = new Value($col, $val); 4704c3c31fSAnna Dabrowska $isempty &= $this->isEmptyValue($value); 4804c3c31fSAnna Dabrowska $resrow[] = $value; 4904c3c31fSAnna Dabrowska $C++; 5004c3c31fSAnna Dabrowska } 5104c3c31fSAnna Dabrowska 5204c3c31fSAnna Dabrowska // skip empty rows 5304c3c31fSAnna Dabrowska if ($isempty && !$pageidAndRevOnly) { 5404c3c31fSAnna Dabrowska $this->decreaseCount(); 5504c3c31fSAnna Dabrowska continue; 5604c3c31fSAnna Dabrowska } 5704c3c31fSAnna Dabrowska 58*1c9d4449SAnna Dabrowska $this->pids[] = $row['PID']; 59*1c9d4449SAnna Dabrowska $this->rids[] = $row['rid']; 60*1c9d4449SAnna Dabrowska $this->revs[] = $row['rev']; 61*1c9d4449SAnna Dabrowska $this->rows[] = $resrow; 6204c3c31fSAnna Dabrowska } 6304c3c31fSAnna Dabrowska 6404c3c31fSAnna Dabrowska $this->increaseCount(); 65ba7f5789SAnna Dabrowska } 66ba7f5789SAnna Dabrowska 67ba7f5789SAnna Dabrowska /** 68ba7f5789SAnna Dabrowska * @return array 69ba7f5789SAnna Dabrowska */ 70ba7f5789SAnna Dabrowska public function getPids(): array 71ba7f5789SAnna Dabrowska { 72ba7f5789SAnna Dabrowska return $this->pids; 73ba7f5789SAnna Dabrowska } 74ba7f5789SAnna Dabrowska 75ba7f5789SAnna Dabrowska /** 76ba7f5789SAnna Dabrowska * @return Value[][] 77ba7f5789SAnna Dabrowska */ 78ba7f5789SAnna Dabrowska public function getRows() 79ba7f5789SAnna Dabrowska { 80ba7f5789SAnna Dabrowska return $this->rows; 81ba7f5789SAnna Dabrowska } 82ba7f5789SAnna Dabrowska 83ba7f5789SAnna Dabrowska /** 84ba7f5789SAnna Dabrowska * @return array 85ba7f5789SAnna Dabrowska */ 86ba7f5789SAnna Dabrowska public function getRids(): array 87ba7f5789SAnna Dabrowska { 88ba7f5789SAnna Dabrowska return $this->rids; 89ba7f5789SAnna Dabrowska } 90ba7f5789SAnna Dabrowska 91ba7f5789SAnna Dabrowska /** 92ba7f5789SAnna Dabrowska * @return int 93ba7f5789SAnna Dabrowska */ 94ba7f5789SAnna Dabrowska public function getCount(): int 95ba7f5789SAnna Dabrowska { 96ba7f5789SAnna Dabrowska return $this->count; 97ba7f5789SAnna Dabrowska } 98ba7f5789SAnna Dabrowska 99ba7f5789SAnna Dabrowska /** 100ba7f5789SAnna Dabrowska * @return array 101ba7f5789SAnna Dabrowska */ 102ba7f5789SAnna Dabrowska public function getRevs(): array 103ba7f5789SAnna Dabrowska { 104ba7f5789SAnna Dabrowska return $this->revs; 105ba7f5789SAnna Dabrowska } 106ba7f5789SAnna Dabrowska 107ba7f5789SAnna Dabrowska /** 108ba7f5789SAnna Dabrowska * @return void 109ba7f5789SAnna Dabrowska */ 110ba7f5789SAnna Dabrowska public function increaseCount() 111ba7f5789SAnna Dabrowska { 112ba7f5789SAnna Dabrowska $this->count++; 113ba7f5789SAnna Dabrowska } 114ba7f5789SAnna Dabrowska/** 115ba7f5789SAnna Dabrowska * @return void 116ba7f5789SAnna Dabrowska */ 117ba7f5789SAnna Dabrowska public function decreaseCount() 118ba7f5789SAnna Dabrowska { 119ba7f5789SAnna Dabrowska $this->count--; 120ba7f5789SAnna Dabrowska } 12104c3c31fSAnna Dabrowska 12204c3c31fSAnna Dabrowska /** 12304c3c31fSAnna Dabrowska * Check if the given row is empty or references our own row 12404c3c31fSAnna Dabrowska * 12504c3c31fSAnna Dabrowska * @param Value $value 12604c3c31fSAnna Dabrowska * @return bool 12704c3c31fSAnna Dabrowska */ 12804c3c31fSAnna Dabrowska protected function isEmptyValue(Value $value) 12904c3c31fSAnna Dabrowska { 13004c3c31fSAnna Dabrowska if ($value->isEmpty()) return true; 13104c3c31fSAnna Dabrowska if ($value->getColumn()->getTid() == 0) return true; 13204c3c31fSAnna Dabrowska return false; 13304c3c31fSAnna Dabrowska } 134ba7f5789SAnna Dabrowska} 135