From a86bdc6b5bab78b4026f44161413f4e482df42e4 Mon Sep 17 00:00:00 2001 From: Thomas Lange Date: Fri, 25 Jun 2021 22:13:59 +0200 Subject: Reorganize namespaces --- core/namespace/Application.php | 14 +- core/namespace/Entity.php | 47 ----- core/namespace/EntityInterface.php | 8 - core/namespace/ORM/Entities/Page.php | 14 ++ core/namespace/ORM/Entities/Post.php | 14 ++ core/namespace/ORM/Entities/User.php | 16 ++ core/namespace/ORM/Entity.php | 49 +++++ core/namespace/ORM/EntityInterface.php | 10 + core/namespace/ORM/Repositories/Page.php | 19 ++ core/namespace/ORM/Repositories/Post.php | 19 ++ core/namespace/ORM/Repositories/User.php | 8 + core/namespace/ORM/Repository.php | 326 +++++++++++++++++++++++++++++++ core/namespace/Page/Entity.php | 13 -- core/namespace/Page/Repository.php | 17 -- core/namespace/Post/Entity.php | 13 -- core/namespace/Post/Repository.php | 17 -- core/namespace/Repository.php | 323 ------------------------------ core/namespace/User/Entity.php | 15 -- core/namespace/User/Repository.php | 7 - 19 files changed, 483 insertions(+), 466 deletions(-) delete mode 100644 core/namespace/Entity.php delete mode 100644 core/namespace/EntityInterface.php create mode 100644 core/namespace/ORM/Entities/Page.php create mode 100644 core/namespace/ORM/Entities/Post.php create mode 100644 core/namespace/ORM/Entities/User.php create mode 100644 core/namespace/ORM/Entity.php create mode 100644 core/namespace/ORM/EntityInterface.php create mode 100644 core/namespace/ORM/Repositories/Page.php create mode 100644 core/namespace/ORM/Repositories/Post.php create mode 100644 core/namespace/ORM/Repositories/User.php create mode 100644 core/namespace/ORM/Repository.php delete mode 100644 core/namespace/Page/Entity.php delete mode 100644 core/namespace/Page/Repository.php delete mode 100644 core/namespace/Post/Entity.php delete mode 100644 core/namespace/Post/Repository.php delete mode 100644 core/namespace/Repository.php delete mode 100644 core/namespace/User/Entity.php delete mode 100644 core/namespace/User/Repository.php (limited to 'core/namespace') diff --git a/core/namespace/Application.php b/core/namespace/Application.php index 0d6d30e..2329253 100644 --- a/core/namespace/Application.php +++ b/core/namespace/Application.php @@ -1,4 +1,6 @@ get($attr).'/'); - case 'Post\Entity': + case 'ORM\Entities\Post': $attr = self::get('POST.SLUG_URLS') ? 'slug' : 'id'; return self::getPostURL($Entity->get($attr).'/'); - case 'User\Entity': + case 'ORM\Entities\User': $attr = self::get('USER.SLUG_URLS') ? 'slug' : 'id'; return self::getUserURL($Entity->get($attr).'/'); default: diff --git a/core/namespace/Entity.php b/core/namespace/Entity.php deleted file mode 100644 index 4bedd37..0000000 --- a/core/namespace/Entity.php +++ /dev/null @@ -1,47 +0,0 @@ -{$attribute} ?? NULL; - } - - #=============================================================================== - # Set attribute - #=============================================================================== - public function set(string $attribute, $value) { - return $this->{$attribute} = $value; - } - - #=============================================================================== - # Return ID - #=============================================================================== - final public function getID(): int { - return $this->id; - } - - #=============================================================================== - # Get all attributes - #=============================================================================== - public function getAll(array $exclude = []): array { - $attributes = get_object_vars($this); - - return array_filter($attributes, function($attribute) use($exclude) { - return !in_array($attribute, $exclude); - }, ARRAY_FILTER_USE_KEY); - } - - #=============================================================================== - # Get array with all non-false attributes - #=============================================================================== - public function getFilteredAttributes(): array { - return array_filter(get_object_vars($this), function($value) { - return $value !== FALSE; - }); - } -} diff --git a/core/namespace/EntityInterface.php b/core/namespace/EntityInterface.php deleted file mode 100644 index 8eaa089..0000000 --- a/core/namespace/EntityInterface.php +++ /dev/null @@ -1,8 +0,0 @@ -{$attribute} ?? NULL; + } + + #=============================================================================== + # Set attribute + #=============================================================================== + public function set(string $attribute, $value) { + return $this->{$attribute} = $value; + } + + #=============================================================================== + # Return ID + #=============================================================================== + final public function getID(): int { + return $this->id; + } + + #=============================================================================== + # Get all attributes + #=============================================================================== + public function getAll(array $exclude = []): array { + $attributes = get_object_vars($this); + + return array_filter($attributes, function($attribute) use($exclude) { + return !in_array($attribute, $exclude); + }, ARRAY_FILTER_USE_KEY); + } + + #=============================================================================== + # Get array with all non-false attributes + #=============================================================================== + public function getFilteredAttributes(): array { + return array_filter(get_object_vars($this), function($value) { + return $value !== FALSE; + }); + } +} diff --git a/core/namespace/ORM/EntityInterface.php b/core/namespace/ORM/EntityInterface.php new file mode 100644 index 0000000..68c9588 --- /dev/null +++ b/core/namespace/ORM/EntityInterface.php @@ -0,0 +1,10 @@ +Database->prepare($query); + $Statement->execute([$User->getID()]); + + return $Statement->fetchColumn(); + } +} diff --git a/core/namespace/ORM/Repositories/Post.php b/core/namespace/ORM/Repositories/Post.php new file mode 100644 index 0000000..8eac12f --- /dev/null +++ b/core/namespace/ORM/Repositories/Post.php @@ -0,0 +1,19 @@ +Database->prepare($query); + $Statement->execute([$User->getID()]); + + return $Statement->fetchColumn(); + } +} diff --git a/core/namespace/ORM/Repositories/User.php b/core/namespace/ORM/Repositories/User.php new file mode 100644 index 0000000..629d9c1 --- /dev/null +++ b/core/namespace/ORM/Repositories/User.php @@ -0,0 +1,8 @@ +Database = $Database; + } + + #=============================================================================== + # Adds an entity to the runtime cache + #=============================================================================== + protected function storeInstance(int $identifier, EntityInterface $Entity) { + return $this->entities[$identifier] = $Entity; + } + + #=============================================================================== + # Adds an array of entities to the runtime cache + #=============================================================================== + protected function storeMultipleInstances(array $entities) { + foreach($entities as $Entity) { + $this->storeInstance($Entity->getID(), $Entity); + } + + return $entities; + } + + #=============================================================================== + # Gets an entity from the runtime cache + #=============================================================================== + protected function fetchInstance(int $identifier) { + return $this->entities[$identifier] ?? FALSE; + } + + #=============================================================================== + # Removes an entity from the runtime cache + #=============================================================================== + protected function removeInstance(int $identifier) { + if(isset($this->cache[$identifier])) { + unset($this->cache[$identifier]); + } + } + + #=========================================================================== + # Insert entity + #=========================================================================== + public function insert(EntityInterface $Entity): bool { + $attributes = $Entity->getFilteredAttributes(); + + foreach($attributes as $field => $value) { + $fields[] = $field; + $values[] = '?'; + } + + $fields = implode(', ', $fields ?? []); + $values = implode(', ', $values ?? []); + + $query = 'INSERT INTO %s (%s) VALUES(%s)'; + $query = sprintf($query, static::getTableName(), $fields, $values); + + $Statement = $this->Database->prepare($query); + return $Statement->execute(array_values($attributes)); + } + + #=========================================================================== + # Update entity + #=========================================================================== + public function update(EntityInterface $Entity): bool { + $attributes = $Entity->getFilteredAttributes(); + + foreach($attributes as $field => $value) { + $params[] = "$field = ?"; + } + + $params = implode(', ', $params ?? []); + + $query = 'UPDATE %s SET %s WHERE id = '.intval($Entity->getID()); + $query = sprintf($query, static::getTableName(), $params); + + $Statement = $this->Database->prepare($query); + return $Statement->execute(array_values($attributes)); + } + + #=========================================================================== + # Delete entity + #=========================================================================== + public function delete(EntityInterface $Entity): bool { + $query = 'DELETE FROM %s WHERE id = ?'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->prepare($query); + return $Statement->execute([$Entity->getID()]); + } + + #=========================================================================== + # Find entity based on primary key + #=========================================================================== + public function find(int $id): ?EntityInterface { + if($Entity = $this->fetchInstance($id)) { + return $Entity; + } + + return $this->findBy('id', $id); + } + + #=============================================================================== + # Find entity based on specific field comparison + #=============================================================================== + public function findBy(string $field, $value): ?EntityInterface { + $query = 'SELECT * FROM %s WHERE %s = ?'; + $query = sprintf($query, static::getTableName(), $field); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$value]); + + if($Entity = $Statement->fetchObject(static::getClassName())) { + $this->storeInstance($Entity->getID(), $Entity); + return $Entity; + } + + return NULL; + } + + #=============================================================================== + # Find previous entity + #=============================================================================== + public function findPrev(EntityInterface $Entity): ?EntityInterface { + $query = 'SELECT * FROM %s WHERE time_insert < ? ORDER BY time_insert DESC LIMIT 1'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$Entity->get('time_insert')]); + + if($Entity = $Statement->fetchObject(static::getClassName())) { + $this->storeInstance($Entity->getID(), $Entity); + return $Entity; + } + + return NULL; + } + + #=============================================================================== + # Find next entity + #=============================================================================== + public function findNext(EntityInterface $Entity): ?EntityInterface { + $query = 'SELECT * FROM %s WHERE time_insert > ? ORDER BY time_insert ASC LIMIT 1'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->prepare($query); + $Statement->execute([$Entity->get('time_insert')]); + + if($Entity = $Statement->fetchObject(static::getClassName())) { + $this->storeInstance($Entity->getID(), $Entity); + return $Entity; + } + + return NULL; + } + + #=========================================================================== + # Find last (which means the newest) entity + #=========================================================================== + public function getLast(): ?EntityInterface { + $query = 'SELECT * FROM %s ORDER BY time_insert DESC LIMIT 1'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->query($query); + + if($Entity = $Statement->fetchObject(static::getClassName())) { + $this->storeInstance($Entity->getID(), $Entity); + return $Entity; + } + + return NULL; + } + + #=========================================================================== + # Get entity count + #=========================================================================== + public function getCount(): int { + $query = 'SELECT COUNT(id) FROM %s'; + $query = sprintf($query, static::getTableName()); + + return $this->Database->query($query)->fetchColumn(); + } + + #=========================================================================== + # Get paginated entity list + #=========================================================================== + public function getPaginated(string $order, int $limit, int $offset = 0): array { + return $this->getAll([], $order, "$offset,$limit"); + } + + #=========================================================================== + # Get all entities + #=========================================================================== + public function getAll(array $filter = [], string $order = null, string $limit = null): array { + $select = 'SELECT * FROM '.static::getTableName(); + $wheres = []; + $params = []; + + if(!empty($filter)) { + foreach($filter as $column => $value) { + $wheres[] = "$column = ?"; + $params[] = $value; + } + + $where = 'WHERE '.implode(' AND ', $wheres); + } + + if($order) { + $order = "ORDER BY $order"; + } + + if($limit) { + $limit = "LIMIT $limit"; + } + + $query = "$select %s %s %s"; + $query = sprintf($query, $where ?? '', $order ?? '', $limit ?? ''); + + $Statement = $this->Database->prepare($query); + $Statement->execute($params); + + if($entities = $Statement->fetchAll($this->Database::FETCH_CLASS, static::getClassName())) { + $this->storeMultipleInstances($entities); + return $entities; + } + + return []; + } + + #=============================================================================== + # Get entities based on search query + #=============================================================================== + public function search(string $search, array $filter = []): array { + if($search === '*') { + return $this->getAll([], NULL, 20); + } + + if(strlen($filter['year'] ?? '') !== 0) { + $extend[] = 'YEAR(time_insert) = ? AND'; + $params[] = $filter['year']; + } + + if(strlen($filter['month'] ?? '') !== 0) { + $extend[] = 'MONTH(time_insert) = ? AND'; + $params[] = $filter['month']; + } + + if(strlen($filter['day'] ?? '') !== 0) { + $extend[] = 'DAY(time_insert) = ? AND'; + $params[] = $filter['day']; + } + + $dateparts = implode(' ', $extend ?? []); + + $query = 'SELECT * FROM %s WHERE %s MATCH(name, body) + AGAINST(? IN BOOLEAN MODE) LIMIT 20'; + $query = sprintf($query, static::getTableName(), $dateparts); + + $Statement = $this->Database->prepare($query); + $Statement->execute(array_merge($params ?? [], [$search])); + + if($entities = $Statement->fetchAll($this->Database::FETCH_CLASS, static::getClassName())) { + $this->storeMultipleInstances($entities); + return $entities; + } + + return []; + } + + #=============================================================================== + # Get a list of distinct days + #=============================================================================== + public function getDistinctDays(): array { + $query = 'SELECT DISTINCT DAY(time_insert) AS d FROM %s ORDER BY d'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->query($query); + + if($result = $Statement->fetchAll($this->Database::FETCH_COLUMN)) { + return $result; + } + + return []; + } + + #=============================================================================== + # Get a list of distinct months + #=============================================================================== + public function getDistinctMonths(): array { + $query = 'SELECT DISTINCT MONTH(time_insert) AS m FROM %s ORDER BY m'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->query($query); + + if($result = $Statement->fetchAll($this->Database::FETCH_COLUMN)) { + return $result; + } + + return []; + } + + #=============================================================================== + # Get a list of distinct years + #=============================================================================== + public function getDistinctYears(): array { + $query = 'SELECT DISTINCT YEAR(time_insert) AS y FROM %s ORDER BY y'; + $query = sprintf($query, static::getTableName()); + + $Statement = $this->Database->query($query); + + if($result = $Statement->fetchAll($this->Database::FETCH_COLUMN)) { + return $result; + } + + return []; + } +} diff --git a/core/namespace/Page/Entity.php b/core/namespace/Page/Entity.php deleted file mode 100644 index 6ca5979..0000000 --- a/core/namespace/Page/Entity.php +++ /dev/null @@ -1,13 +0,0 @@ -Database->prepare($query); - $Statement->execute([$User->getID()]); - - return $Statement->fetchColumn(); - } -} diff --git a/core/namespace/Post/Entity.php b/core/namespace/Post/Entity.php deleted file mode 100644 index 399f5bb..0000000 --- a/core/namespace/Post/Entity.php +++ /dev/null @@ -1,13 +0,0 @@ -Database->prepare($query); - $Statement->execute([$User->getID()]); - - return $Statement->fetchColumn(); - } -} diff --git a/core/namespace/Repository.php b/core/namespace/Repository.php deleted file mode 100644 index e2b42a7..0000000 --- a/core/namespace/Repository.php +++ /dev/null @@ -1,323 +0,0 @@ -Database = $Database; - } - - #=============================================================================== - # Adds an entity to the runtime cache - #=============================================================================== - protected function storeInstance(int $identifier, EntityInterface $Entity) { - return $this->entities[$identifier] = $Entity; - } - - #=============================================================================== - # Adds an array of entities to the runtime cache - #=============================================================================== - protected function storeMultipleInstances(array $entities) { - foreach($entities as $Entity) { - $this->storeInstance($Entity->getID(), $Entity); - } - - return $entities; - } - - #=============================================================================== - # Gets an entity from the runtime cache - #=============================================================================== - protected function fetchInstance(int $identifier) { - return $this->entities[$identifier] ?? FALSE; - } - - #=============================================================================== - # Removes an entity from the runtime cache - #=============================================================================== - protected function removeInstance(int $identifier) { - if(isset($this->cache[$identifier])) { - unset($this->cache[$identifier]); - } - } - - #=========================================================================== - # Insert entity - #=========================================================================== - public function insert(EntityInterface $Entity): bool { - $attributes = $Entity->getFilteredAttributes(); - - foreach($attributes as $field => $value) { - $fields[] = $field; - $values[] = '?'; - } - - $fields = implode(', ', $fields ?? []); - $values = implode(', ', $values ?? []); - - $query = 'INSERT INTO %s (%s) VALUES(%s)'; - $query = sprintf($query, static::getTableName(), $fields, $values); - - $Statement = $this->Database->prepare($query); - return $Statement->execute(array_values($attributes)); - } - - #=========================================================================== - # Update entity - #=========================================================================== - public function update(EntityInterface $Entity): bool { - $attributes = $Entity->getFilteredAttributes(); - - foreach($attributes as $field => $value) { - $params[] = "$field = ?"; - } - - $params = implode(', ', $params ?? []); - - $query = 'UPDATE %s SET %s WHERE id = '.intval($Entity->getID()); - $query = sprintf($query, static::getTableName(), $params); - - $Statement = $this->Database->prepare($query); - return $Statement->execute(array_values($attributes)); - } - - #=========================================================================== - # Delete entity - #=========================================================================== - public function delete(EntityInterface $Entity): bool { - $query = 'DELETE FROM %s WHERE id = ?'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->prepare($query); - return $Statement->execute([$Entity->getID()]); - } - - #=========================================================================== - # Find entity based on primary key - #=========================================================================== - public function find(int $id): ?EntityInterface { - if($Entity = $this->fetchInstance($id)) { - return $Entity; - } - - return $this->findBy('id', $id); - } - - #=============================================================================== - # Find entity based on specific field comparison - #=============================================================================== - public function findBy(string $field, $value): ?EntityInterface { - $query = 'SELECT * FROM %s WHERE %s = ?'; - $query = sprintf($query, static::getTableName(), $field); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$value]); - - if($Entity = $Statement->fetchObject(static::getClassName())) { - $this->storeInstance($Entity->getID(), $Entity); - return $Entity; - } - - return NULL; - } - - #=============================================================================== - # Find previous entity - #=============================================================================== - public function findPrev(EntityInterface $Entity): ?EntityInterface { - $query = 'SELECT * FROM %s WHERE time_insert < ? ORDER BY time_insert DESC LIMIT 1'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$Entity->get('time_insert')]); - - if($Entity = $Statement->fetchObject(static::getClassName())) { - $this->storeInstance($Entity->getID(), $Entity); - return $Entity; - } - - return NULL; - } - - #=============================================================================== - # Find next entity - #=============================================================================== - public function findNext(EntityInterface $Entity): ?EntityInterface { - $query = 'SELECT * FROM %s WHERE time_insert > ? ORDER BY time_insert ASC LIMIT 1'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->prepare($query); - $Statement->execute([$Entity->get('time_insert')]); - - if($Entity = $Statement->fetchObject(static::getClassName())) { - $this->storeInstance($Entity->getID(), $Entity); - return $Entity; - } - - return NULL; - } - - #=========================================================================== - # Find last (which means the newest) entity - #=========================================================================== - public function getLast(): ?EntityInterface { - $query = 'SELECT * FROM %s ORDER BY time_insert DESC LIMIT 1'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->query($query); - - if($Entity = $Statement->fetchObject(static::getClassName())) { - $this->storeInstance($Entity->getID(), $Entity); - return $Entity; - } - - return NULL; - } - - #=========================================================================== - # Get entity count - #=========================================================================== - public function getCount(): int { - $query = 'SELECT COUNT(id) FROM %s'; - $query = sprintf($query, static::getTableName()); - - return $this->Database->query($query)->fetchColumn(); - } - - #=========================================================================== - # Get paginated entity list - #=========================================================================== - public function getPaginated(string $order, int $limit, int $offset = 0): array { - return $this->getAll([], $order, "$offset,$limit"); - } - - #=========================================================================== - # Get all entities - #=========================================================================== - public function getAll(array $filter = [], string $order = null, string $limit = null): array { - $select = 'SELECT * FROM '.static::getTableName(); - $wheres = []; - $params = []; - - if(!empty($filter)) { - foreach($filter as $column => $value) { - $wheres[] = "$column = ?"; - $params[] = $value; - } - - $where = 'WHERE '.implode(' AND ', $wheres); - } - - if($order) { - $order = "ORDER BY $order"; - } - - if($limit) { - $limit = "LIMIT $limit"; - } - - $query = "$select %s %s %s"; - $query = sprintf($query, $where ?? '', $order ?? '', $limit ?? ''); - - $Statement = $this->Database->prepare($query); - $Statement->execute($params); - - if($entities = $Statement->fetchAll($this->Database::FETCH_CLASS, static::getClassName())) { - $this->storeMultipleInstances($entities); - return $entities; - } - - return []; - } - - #=============================================================================== - # Get entities based on search query - #=============================================================================== - public function search(string $search, array $filter = []): array { - if($search === '*') { - return $this->getAll([], NULL, 20); - } - - if(strlen($filter['year'] ?? '') !== 0) { - $extend[] = 'YEAR(time_insert) = ? AND'; - $params[] = $filter['year']; - } - - if(strlen($filter['month'] ?? '') !== 0) { - $extend[] = 'MONTH(time_insert) = ? AND'; - $params[] = $filter['month']; - } - - if(strlen($filter['day'] ?? '') !== 0) { - $extend[] = 'DAY(time_insert) = ? AND'; - $params[] = $filter['day']; - } - - $dateparts = implode(' ', $extend ?? []); - - $query = 'SELECT * FROM %s WHERE %s MATCH(name, body) - AGAINST(? IN BOOLEAN MODE) LIMIT 20'; - $query = sprintf($query, static::getTableName(), $dateparts); - - $Statement = $this->Database->prepare($query); - $Statement->execute(array_merge($params ?? [], [$search])); - - if($entities = $Statement->fetchAll($this->Database::FETCH_CLASS, static::getClassName())) { - $this->storeMultipleInstances($entities); - return $entities; - } - - return []; - } - - #=============================================================================== - # Get a list of distinct days - #=============================================================================== - public function getDistinctDays(): array { - $query = 'SELECT DISTINCT DAY(time_insert) AS d FROM %s ORDER BY d'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->query($query); - - if($result = $Statement->fetchAll($this->Database::FETCH_COLUMN)) { - return $result; - } - - return []; - } - - #=============================================================================== - # Get a list of distinct months - #=============================================================================== - public function getDistinctMonths(): array { - $query = 'SELECT DISTINCT MONTH(time_insert) AS m FROM %s ORDER BY m'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->query($query); - - if($result = $Statement->fetchAll($this->Database::FETCH_COLUMN)) { - return $result; - } - - return []; - } - - #=============================================================================== - # Get a list of distinct years - #=============================================================================== - public function getDistinctYears(): array { - $query = 'SELECT DISTINCT YEAR(time_insert) AS y FROM %s ORDER BY y'; - $query = sprintf($query, static::getTableName()); - - $Statement = $this->Database->query($query); - - if($result = $Statement->fetchAll($this->Database::FETCH_COLUMN)) { - return $result; - } - - return []; - } -} diff --git a/core/namespace/User/Entity.php b/core/namespace/User/Entity.php deleted file mode 100644 index fdfaf9e..0000000 --- a/core/namespace/User/Entity.php +++ /dev/null @@ -1,15 +0,0 @@ -