From 9303dd65629438ca9fc72ee54a63123610df455a Mon Sep 17 00:00:00 2001 From: Alma Armas Date: Sat, 1 Aug 2020 14:27:10 +0000 Subject: [PATCH] Modify search to use EntityStream --- Web/Models/Repositories/Users.php | 7 +-- Web/Models/Repositories/Util/EntityStream.php | 48 +++++++++++++++++++ Web/Presenters/SearchPresenter.php | 4 +- 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 Web/Models/Repositories/Util/EntityStream.php diff --git a/Web/Models/Repositories/Users.php b/Web/Models/Repositories/Users.php index 82434a18..d7ca6a97 100644 --- a/Web/Models/Repositories/Users.php +++ b/Web/Models/Repositories/Users.php @@ -36,12 +36,13 @@ class Users return $this->toUser($this->users->where("user", $user->getId())->fetch()); } - function find(string $query, int $page = 1, ?int $perPage = NULL): \Traversable + function find(string $query): \Traversable { $query = "%$query%"; $perPage = $perPage ?? OPENVK_DEFAULT_PER_PAGE; - foreach($this->users->where("CONCAT_WS(' ', first_name, last_name) LIKE ?", $query)->page($page, $perPage) as $result) - yield new User($result); + $result = $this->users->where("CONCAT_WS(' ', first_name, last_name) LIKE ?", $query); + + return new Util\EntityStream("User", $result); } function getFoundCount(string $query): int diff --git a/Web/Models/Repositories/Util/EntityStream.php b/Web/Models/Repositories/Util/EntityStream.php new file mode 100644 index 00000000..46e5ff1f --- /dev/null +++ b/Web/Models/Repositories/Util/EntityStream.php @@ -0,0 +1,48 @@ +dbStream = $dbStream; + $this->entityClass = "openvk\\Web\\Models\\Entities\\$class"; + } + + private function getEntity(ActiveRow $result) + { + return new $this->entityClass($result); + } + + private function stream(\Traversable $iterator): \Traversable + { + foreach($iterator as $result) + yield $this->getEntity($result); + } + + function getIterator(): \Traversable + { + trigger_error("Trying to use EntityStream as iterator directly. Are you sure this is what you want?", E_USER_WARNING); + + return $this->stream($this->dbStream); + } + + function page(int $page, ?int $perPage = NULL): \Traversable + { + return $this->stream($this->dbStream->page($page, $perPage ?? OPENVK_DEFAULT_PER_PAGE)); + } + + function offsetLimit(int $offset = 0, ?int $limit = NULL): \Traversable + { + return $this->stream($this->dbStream->limit($limit ?? OPENVK_DEFAULT_PER_PAGE, $offset)); + } + + function size(): int + { + return sizeof(clone $this->dbStream); + } +} diff --git a/Web/Presenters/SearchPresenter.php b/Web/Presenters/SearchPresenter.php index 779b5e4f..58f98bd4 100644 --- a/Web/Presenters/SearchPresenter.php +++ b/Web/Presenters/SearchPresenter.php @@ -33,8 +33,8 @@ final class SearchPresenter extends OpenVKPresenter $count = $this->clubs->getFoundCount($query); break; case "users": - $iterator = $this->users->find($query, $page); - $count = $this->users->getFoundCount($query); + $iterator = $this->users->find($query)->page($page); + $count = $this->users->find($query)->size(); break; }