xref: /plugin/struct/meta/SearchResult.php (revision 1c9d444931d2005ca556e141c7b819991f698707)
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