]> git.mxchange.org Git - friendica.git/blobdiff - src/BaseRepository.php
Merge pull request #10179 from nupplaphil/fix/transifex_script
[friendica.git] / src / BaseRepository.php
index a66914e88b5b6a131a23a9ee7cec83beb46ed73c..1294be88ca053d94d7270c0057a062f5bf7355fe 100644 (file)
@@ -1,4 +1,23 @@
 <?php
+/**
+ * @copyright Copyright (C) 2010-2021, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
 
 namespace Friendica;
 
@@ -63,15 +82,13 @@ abstract class BaseRepository extends BaseFactory
         * Chainable.
         *
         * @param array $condition
-        * @param array $order An optional array with order information
-        * @param int|array $limit Optional limit information
-        *
+        * @param array $params
         * @return BaseCollection
         * @throws \Exception
         */
-       public function select(array $condition = [], array $order = [], $limit = null)
+       public function select(array $condition = [], array $params = [])
        {
-               $models = $this->selectModels($condition, $order, $limit);
+               $models = $this->selectModels($condition, $params);
 
                return new static::$collection_class($models);
        }
@@ -80,36 +97,52 @@ abstract class BaseRepository extends BaseFactory
         * Populates the collection according to the condition. Retrieves a limited subset of models depending on the boundaries
         * and the limit. The total count of rows matching the condition is stored in the collection.
         *
+        * max_id and min_id are susceptible to the query order:
+        * - min_id alone only reliably works with ASC order
+        * - max_id alone only reliably works with DESC order
+        * If the wrong order is detected in either case, we inverse the query order and we reverse the model array after the query
+        *
         * Chainable.
         *
         * @param array $condition
-        * @param array $order
-        * @param int?  $max_id
-        * @param int?  $since_id
+        * @param array $params
+        * @param int?  $min_id Retrieve models with an id no fewer than this, as close to it as possible
+        * @param int?  $max_id Retrieve models with an id no greater than this, as close to it as possible
         * @param int   $limit
-        *
         * @return BaseCollection
         * @throws \Exception
         */
-       public function selectByBoundaries(array $condition = [], array $order = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT)
+       public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT)
        {
-               $condition = DBA::collapseCondition($condition);
+               $totalCount = DBA::count(static::$table_name, $condition);
 
                $boundCondition = $condition;
 
-               if (isset($max_id)) {
-                       $boundCondition[0] .= " AND `id` < ?";
-                       $boundCondition[] = $max_id;
+               $reverseModels = false;
+
+               if (isset($min_id)) {
+                       $boundCondition = DBA::mergeConditions($boundCondition, ['`id` > ?', $min_id]);
+                       if (!isset($max_id) && isset($params['order']['id']) && ($params['order']['id'] === true || $params['order']['id'] === 'DESC')) {
+                               $reverseModels = true;
+                               $params['order']['id'] = 'ASC';
+                       }
                }
 
-               if (isset($since_id)) {
-                       $boundCondition[0] .= " AND `id` > ?";
-                       $boundCondition[] = $since_id;
+               if (isset($max_id)) {
+                       $boundCondition = DBA::mergeConditions($boundCondition, ['`id` < ?', $max_id]);
+                       if (!isset($min_id) && (!isset($params['order']['id']) || $params['order']['id'] === false || $params['order']['id'] === 'ASC')) {
+                               $reverseModels = true;
+                               $params['order']['id'] = 'DESC';
+                       }
                }
 
-               $models = $this->selectModels($boundCondition, $order, $limit);
+               $params['limit'] = $limit;
 
-               $totalCount = DBA::count(static::$table_name, $condition);
+               $models = $this->selectModels($boundCondition, $params);
+
+               if ($reverseModels) {
+                       $models = array_reverse($models);
+               }
 
                return new static::$collection_class($models, $totalCount);
        }
@@ -123,7 +156,12 @@ abstract class BaseRepository extends BaseFactory
         */
        public function update(BaseModel $model)
        {
-               return $this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], $model->getOriginalData());
+               if ($this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], $model->getOriginalData())) {
+                       $model->resetOriginalData();
+                       return true;
+               }
+
+               return false;
        }
 
        /**
@@ -176,24 +214,12 @@ abstract class BaseRepository extends BaseFactory
 
        /**
         * @param array $condition Query condition
-        * @param array $order An optional array with order information
-        * @param int|array $limit Optional limit information
-        *
+        * @param array $params    Additional query parameters
         * @return BaseModel[]
         * @throws \Exception
         */
-       protected function selectModels(array $condition, array $order = [], $limit = null)
+       protected function selectModels(array $condition, array $params = [])
        {
-               $params = [];
-
-               if (!empty($order)) {
-                       $params['order'] = $order;
-               }
-
-               if (!empty($limit)) {
-                       $params['limit'] = $limit;
-               }
-
                $result = $this->dba->select(static::$table_name, [], $condition, $params);
 
                /** @var BaseModel $prototype */
@@ -210,6 +236,8 @@ abstract class BaseRepository extends BaseFactory
                        }
                }
 
+               $this->dba->close($result);
+
                return $models;
        }