From 31ccb9a2815d215b39872192d70a71aa1fdfb59c Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 30 Nov 2013 14:23:13 +0100 Subject: [PATCH] Optimalization: changed entity retrieval --- src/Models/AbstractModel.php | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Models/AbstractModel.php b/src/Models/AbstractModel.php index bb6cb416..6ee00fb6 100644 --- a/src/Models/AbstractModel.php +++ b/src/Models/AbstractModel.php @@ -72,8 +72,37 @@ abstract class AbstractModel extends RedBean_SimpleModel public static function getEntitiesWithCount($query, $perPage = null, $page = 1) { - $entities = self::getEntities($query, $perPage, $page, true); - $count = self::getEntityCount($query); + $table = static::getTableName(); + $tempTable = $table . '_temp'; + + R::begin(); + R::exec('CREATE TEMPORARY TABLE ' . $tempTable . '(id INTEGER)'); + R::exec('CREATE INDEX idx_fk_' . $tempTable . '_id ON ' . $tempTable . '(id)'); + + $dbQuery = R::$f->getNew()->begin(); + $dbQuery->insertInto($tempTable . '(id)'); + $dbQuery->select($table . '.id'); + $builder = static::getQueryBuilder(); + if ($builder) + $builder::build($dbQuery, $query); + else + $dbQuery->from($table); + $dbQuery->get(); + + $count = intval(R::getCell('SELECT COUNT(*) FROM ' . $tempTable)); + $rows = R::$f->getNew() + ->begin() + ->select($table . '.*') + ->from($tempTable) + ->innerJoin($table) + ->on($table . '.id = ' . $tempTable . '.id') + ->limit('?')->put($perPage) + ->offset('?')->put(($page - 1) * $perPage) + ->get(); + + R::rollback(); + + $entities = self::convertRows($rows, $table, true); return [$entities, $count]; }