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