blob: 3dfd3f127e5e6f092fb594e20c3a79668fd4dd59 [file] [log] [blame]
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02001<?php
2
3namespace LdapRecord\Query\Pagination;
4
5use LdapRecord\LdapInterface;
6use LdapRecord\Query\Builder;
7
8abstract class AbstractPaginator
9{
10 /**
11 * The query builder instance.
12 *
13 * @var Builder
14 */
15 protected $query;
16
17 /**
18 * The filter to execute.
19 *
20 * @var string
21 */
22 protected $filter;
23
24 /**
25 * The amount of objects to fetch per page.
26 *
27 * @var int
28 */
29 protected $perPage;
30
31 /**
32 * Whether the operation is critical.
33 *
34 * @var bool
35 */
36 protected $isCritical;
37
38 /**
39 * Constructor.
40 *
41 * @param Builder $query
42 */
43 public function __construct(Builder $query, $filter, $perPage, $isCritical)
44 {
45 $this->query = $query;
46 $this->filter = $filter;
47 $this->perPage = $perPage;
48 $this->isCritical = $isCritical;
49 }
50
51 /**
52 * Execute the pagination request.
53 *
54 * @param LdapInterface $ldap
55 *
56 * @return array
57 */
58 public function execute(LdapInterface $ldap)
59 {
60 $pages = [];
61
62 $this->prepareServerControls();
63
64 do {
65 $this->applyServerControls($ldap);
66
67 if (! $resource = $this->query->run($this->filter)) {
68 break;
69 }
70
71 $this->updateServerControls($ldap, $resource);
72
73 $pages[] = $this->query->parse($resource);
74 } while (! empty($this->fetchCookie()));
75
76 $this->resetServerControls($ldap);
77
78 return $pages;
79 }
80
81 /**
82 * Fetch the pagination cookie.
83 *
84 * @return string
85 */
86 abstract protected function fetchCookie();
87
88 /**
89 * Prepare the server controls before executing the pagination request.
90 *
91 * @return void
92 */
93 abstract protected function prepareServerControls();
94
95 /**
96 * Apply the server controls.
97 *
98 * @param LdapInterface $ldap
99 *
100 * @return void
101 */
102 abstract protected function applyServerControls(LdapInterface $ldap);
103
104 /**
105 * Reset the server controls.
106 *
107 * @param LdapInterface $ldap
108 *
109 * @return mixed
110 */
111 abstract protected function resetServerControls(LdapInterface $ldap);
112
113 /**
114 * Update the server controls.
115 *
116 * @param LdapInterface $ldap
117 * @param resource $resource
118 *
119 * @return void
120 */
121 abstract protected function updateServerControls(LdapInterface $ldap, $resource);
122}