From 59392e460020447720089976b83139ad59d275fe Mon Sep 17 00:00:00 2001 From: Thomas Lange Date: Thu, 22 Jul 2021 14:00:12 +0200 Subject: Rename: Append "Repository" to repository classes Rename the repository classes and append the name with "Repository" to prevent naming confusions with the entity classes. --- core/application.php | 8 +- core/namespace/Application.php | 4 +- core/namespace/ORM/Repositories/Category.php | 137 --------------------- .../ORM/Repositories/CategoryRepository.php | 137 +++++++++++++++++++++ core/namespace/ORM/Repositories/Page.php | 9 -- core/namespace/ORM/Repositories/PageRepository.php | 8 ++ core/namespace/ORM/Repositories/Post.php | 10 -- core/namespace/ORM/Repositories/PostRepository.php | 8 ++ core/namespace/ORM/Repositories/User.php | 35 ------ core/namespace/ORM/Repositories/UserRepository.php | 35 ++++++ 10 files changed, 194 insertions(+), 197 deletions(-) delete mode 100644 core/namespace/ORM/Repositories/Category.php create mode 100644 core/namespace/ORM/Repositories/CategoryRepository.php delete mode 100644 core/namespace/ORM/Repositories/Page.php create mode 100644 core/namespace/ORM/Repositories/PageRepository.php delete mode 100644 core/namespace/ORM/Repositories/Post.php create mode 100644 core/namespace/ORM/Repositories/PostRepository.php delete mode 100644 core/namespace/ORM/Repositories/User.php create mode 100644 core/namespace/ORM/Repositories/UserRepository.php diff --git a/core/application.php b/core/application.php index f44bb27..e32779a 100644 --- a/core/application.php +++ b/core/application.php @@ -169,10 +169,10 @@ if(Application::get('CORE.SEND_304') AND !defined('ADMINISTRATION')) { $query = '(SELECT time_update FROM %s ORDER BY time_update DESC LIMIT 1) AS %s'; foreach([ - ORM\Repositories\Category::getTableName(), - ORM\Repositories\Page::getTableName(), - ORM\Repositories\Post::getTableName(), - ORM\Repositories\User::getTableName() + ORM\Repositories\CategoryRepository::getTableName(), + ORM\Repositories\PageRepository::getTableName(), + ORM\Repositories\PostRepository::getTableName(), + ORM\Repositories\UserRepository::getTableName() ] as $table) { $parts[] = sprintf($query, $table, $table); } diff --git a/core/namespace/Application.php b/core/namespace/Application.php index 140baac..93361dd 100644 --- a/core/namespace/Application.php +++ b/core/namespace/Application.php @@ -102,10 +102,10 @@ class Application { #=============================================================================== public static function getRepository(string $entity): ORM\Repository { $identifier = strtolower($entity); - $repository = "ORM\Repositories\\$entity"; if(!isset(self::$repositories[$identifier])) { - $Repository = new $repository(self::getDatabase()); + $className = sprintf('ORM\Repositories\%sRepository', $entity); + $Repository = new $className(self::getDatabase()); self::$repositories[$identifier] = $Repository; } diff --git a/core/namespace/ORM/Repositories/Category.php b/core/namespace/ORM/Repositories/Category.php deleted file mode 100644 index df32f69..0000000 --- a/core/namespace/ORM/Repositories/Category.php +++ /dev/null @@ -1,137 +0,0 @@ -Database->prepare($query); - $Statement->execute([$Category->getID()]); - - return $Statement->fetchColumn(); - } - - #=============================================================================== - # Find category with parents based on primary key - #=============================================================================== - public function findWithParents($id): array { - return $this->findWithParentsBy('id', $id); - } - - #=============================================================================== - # Find category with parents based on specific field comparison - #=============================================================================== - public function findWithParentsBy(string $field, $value): array { - $query = 'WITH RECURSIVE tree AS ( - SELECT *, 0 AS _depth FROM %s WHERE %s %s UNION - SELECT c.*, _depth+1 FROM %s c, tree WHERE tree.parent = c.id - ) SELECT * FROM tree ORDER BY _depth DESC'; - - $table = static::getTableName(); - $check = is_null($value) ? 'IS NULL': '= ?'; - $query = sprintf($query, $table, $field, $check, $table); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$value]); - - # TODO: Virtual column _depth shall not be fetched into the entity class - return $this->fetchEntities($Statement); - } - - #=============================================================================== - # Get paginated category tree list - #=============================================================================== - public function getPaginatedTree(int $limit, int $offset = 0): array { - $query = 'WITH RECURSIVE tree AS ( - SELECT *, name AS _depth FROM %s WHERE parent IS NULL UNION - SELECT c.*, CONCAT(_depth, "/", c.name) AS _depth FROM %s c INNER JOIN tree ON tree.id = c.parent - ) SELECT * FROM tree ORDER BY _depth %s'; - - $_limit = "LIMIT $limit"; - - if($offset) { - $_limit = "LIMIT $offset,$limit"; - } - - $table = static::getTableName(); - $query = sprintf($query, $table, $table, $_limit); - - $Statement = $this->Database->prepare($query); - $Statement->execute(); - - return $this->fetchEntities($Statement); - } - - #=============================================================================== - # Get number of children categories assigned to $Category - #=============================================================================== - public function getNumberOfChildren(CategoryEntity $Category): int { - $query = 'WITH RECURSIVE tree AS ( - SELECT * FROM %s WHERE id = ? UNION - SELECT c.* FROM %s c, tree WHERE tree.id = c.parent - ) SELECT COUNT(id) FROM tree WHERE id != ?'; - - $query = sprintf($query, - static::getTableName(), - static::getTableName() - ); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$Category->getID(), $Category->getID()]); - - return $Statement->fetchColumn(); - } - - #=============================================================================== - # Update category (and check for parent/child circular loops) - #=============================================================================== - public function update(EntityInterface $Entity): bool { - # Entity parent might have changed *in memory*, so we re-fetch the original - # parent of the entity from the database and save it in a variable. - # TODO: Repository/Entity class should have a mechanism to detect changes! - $query = 'SELECT parent FROM %s WHERE id = ?'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$Entity->getID()]); - - $parent = $Statement->fetchColumn(); - - # If parent is unchanged, circular loop check is not needed. - if($parent === $Entity->get('parent')) { - return parent::update($Entity); - } - - $_parent = $Entity->get('parent'); - - # Fetch the parent of the *new* parent category and let the while loop run through - # the tree until either a parent of "NULL" was found or if the new parent category - # is a *child* of the *current* category which would cause a circular loop. - while($Statement->execute([$_parent]) && $_parent = $Statement->fetchColumn()) { - if($_parent == $Entity->get('id')) { - # Set parent of the *new* parent category to the *original* parent category - # of the *current* category (one level up) to prevent a circular loop. - $query = 'UPDATE %s SET parent = ? WHERE id = ?'; - $query = sprintf($query, static::getTableName()); - - $UpdateStatement = $this->Database->prepare($query); - $UpdateStatement->execute([$parent, $Entity->get('parent')]); - break; - } else if($_parent === NULL) { - break; - } - } - - return parent::update($Entity); - } -} diff --git a/core/namespace/ORM/Repositories/CategoryRepository.php b/core/namespace/ORM/Repositories/CategoryRepository.php new file mode 100644 index 0000000..b62485a --- /dev/null +++ b/core/namespace/ORM/Repositories/CategoryRepository.php @@ -0,0 +1,137 @@ +Database->prepare($query); + $Statement->execute([$Category->getID()]); + + return $Statement->fetchColumn(); + } + + #=============================================================================== + # Find category with parents based on primary key + #=============================================================================== + public function findWithParents($id): array { + return $this->findWithParentsBy('id', $id); + } + + #=============================================================================== + # Find category with parents based on specific field comparison + #=============================================================================== + public function findWithParentsBy(string $field, $value): array { + $query = 'WITH RECURSIVE tree AS ( + SELECT *, 0 AS _depth FROM %s WHERE %s %s UNION + SELECT c.*, _depth+1 FROM %s c, tree WHERE tree.parent = c.id + ) SELECT * FROM tree ORDER BY _depth DESC'; + + $table = static::getTableName(); + $check = is_null($value) ? 'IS NULL': '= ?'; + $query = sprintf($query, $table, $field, $check, $table); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$value]); + + # TODO: Virtual column _depth shall not be fetched into the entity class + return $this->fetchEntities($Statement); + } + + #=============================================================================== + # Get paginated category tree list + #=============================================================================== + public function getPaginatedTree(int $limit, int $offset = 0): array { + $query = 'WITH RECURSIVE tree AS ( + SELECT *, name AS _depth FROM %s WHERE parent IS NULL UNION + SELECT c.*, CONCAT(_depth, "/", c.name) AS _depth FROM %s c INNER JOIN tree ON tree.id = c.parent + ) SELECT * FROM tree ORDER BY _depth %s'; + + $_limit = "LIMIT $limit"; + + if($offset) { + $_limit = "LIMIT $offset,$limit"; + } + + $table = static::getTableName(); + $query = sprintf($query, $table, $table, $_limit); + + $Statement = $this->Database->prepare($query); + $Statement->execute(); + + return $this->fetchEntities($Statement); + } + + #=============================================================================== + # Get number of children categories assigned to $Category + #=============================================================================== + public function getNumberOfChildren(Category $Category): int { + $query = 'WITH RECURSIVE tree AS ( + SELECT * FROM %s WHERE id = ? UNION + SELECT c.* FROM %s c, tree WHERE tree.id = c.parent + ) SELECT COUNT(id) FROM tree WHERE id != ?'; + + $query = sprintf($query, + static::getTableName(), + static::getTableName() + ); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$Category->getID(), $Category->getID()]); + + return $Statement->fetchColumn(); + } + + #=============================================================================== + # Update category (and check for parent/child circular loops) + #=============================================================================== + public function update(EntityInterface $Entity): bool { + # Entity parent might have changed *in memory*, so we re-fetch the original + # parent of the entity from the database and save it in a variable. + # TODO: Repository/Entity class should have a mechanism to detect changes! + $query = 'SELECT parent FROM %s WHERE id = ?'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$Entity->getID()]); + + $parent = $Statement->fetchColumn(); + + # If parent is unchanged, circular loop check is not needed. + if($parent === $Entity->get('parent')) { + return parent::update($Entity); + } + + $_parent = $Entity->get('parent'); + + # Fetch the parent of the *new* parent category and let the while loop run through + # the tree until either a parent of "NULL" was found or if the new parent category + # is a *child* of the *current* category which would cause a circular loop. + while($Statement->execute([$_parent]) && $_parent = $Statement->fetchColumn()) { + if($_parent == $Entity->get('id')) { + # Set parent of the *new* parent category to the *original* parent category + # of the *current* category (one level up) to prevent a circular loop. + $query = 'UPDATE %s SET parent = ? WHERE id = ?'; + $query = sprintf($query, static::getTableName()); + + $UpdateStatement = $this->Database->prepare($query); + $UpdateStatement->execute([$parent, $Entity->get('parent')]); + break; + } else if($_parent === NULL) { + break; + } + } + + return parent::update($Entity); + } +} diff --git a/core/namespace/ORM/Repositories/Page.php b/core/namespace/ORM/Repositories/Page.php deleted file mode 100644 index 714605e..0000000 --- a/core/namespace/ORM/Repositories/Page.php +++ /dev/null @@ -1,9 +0,0 @@ -Database->prepare($query); - $Statement->execute([$User->getID()]); - - return $Statement->fetchColumn(); - } - - #=============================================================================== - # Get number of *posts* assigned to $User - #=============================================================================== - public function getNumberOfPosts(UserEntity $User): int { - $query = 'SELECT COUNT(id) FROM %s WHERE user = ?'; - $query = sprintf($query, Post::getTableName()); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$User->getID()]); - - return $Statement->fetchColumn(); - } -} diff --git a/core/namespace/ORM/Repositories/UserRepository.php b/core/namespace/ORM/Repositories/UserRepository.php new file mode 100644 index 0000000..a0e58c6 --- /dev/null +++ b/core/namespace/ORM/Repositories/UserRepository.php @@ -0,0 +1,35 @@ +Database->prepare($query); + $Statement->execute([$User->getID()]); + + return $Statement->fetchColumn(); + } + + #=============================================================================== + # Get number of *posts* assigned to $User + #=============================================================================== + public function getNumberOfPosts(User $User): int { + $query = 'SELECT COUNT(id) FROM %s WHERE user = ?'; + $query = sprintf($query, PostRepository::getTableName()); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$User->getID()]); + + return $Statement->fetchColumn(); + } +} -- cgit v1.2.3