diff --git a/src/Controllers/CommentController.php b/src/Controllers/CommentController.php index 4cf688b9..f1ab6267 100644 --- a/src/Controllers/CommentController.php +++ b/src/Controllers/CommentController.php @@ -40,7 +40,7 @@ class CommentController $comments = $searchDbQuery->get(); $comments = R::convertToBeans('comment', $comments); - R::preload($comments, ['commenter' => 'user']); + R::preload($comments, ['commenter' => 'user', 'post', 'post.uploader' => 'user']); $this->context->postGroups = true; $this->context->transport->paginator = new StdClass; $this->context->transport->paginator->page = $page; diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index c66465c6..1e20021d 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -84,8 +84,34 @@ class PostController $buildDbQuery = function($dbQuery, $query) { - $dbQuery->from('post'); + $dbQuery + ->addSql(', ') + ->open() + ->select('COUNT(1)') + ->from('comment') + ->where('comment.post_id = post.id') + ->close() + ->as('comment_count'); + $dbQuery + ->addSql(', ') + ->open() + ->select('COUNT(1)') + ->from('favoritee') + ->where('favoritee.post_id = post.id') + ->close() + ->as('fav_count'); + + $dbQuery + ->addSql(', ') + ->open() + ->select('COUNT(1)') + ->from('post_tag') + ->where('post_tag.post_id = post.id') + ->close() + ->as('tag_count'); + + $dbQuery->from('post'); /* safety */ $allowedSafety = array_filter(PostSafety::getAll(), function($safety) @@ -121,12 +147,14 @@ class PostController $page = max(1, min($pageCount, $page)); $searchDbQuery = R::$f->begin(); - $searchDbQuery->select('*'); + $searchDbQuery->select('post.*'); $buildDbQuery($searchDbQuery, $query); $searchDbQuery->limit('?')->put($postsPerPage); $searchDbQuery->offset('?')->put(($page - 1) * $postsPerPage); $posts = $searchDbQuery->get(); + $posts = R::convertToBeans('post', $posts); + R::preload($posts, ['uploader' => 'user']); $this->context->transport->paginator = new StdClass; $this->context->transport->paginator->page = $page; $this->context->transport->paginator->pageCount = $pageCount; @@ -593,7 +621,7 @@ class PostController private function decorateSearchQuery($dbQuery, $tokens) { - $orderColumn = 'id'; + $orderColumn = 'post.id'; $orderDir = 1; $randomReset = true; @@ -601,13 +629,13 @@ class PostController { if ($token{0} == '-') { - $dbQuery->andNot(); + $andFunc = 'andNot'; $token = substr($token, 1); $neg = true; } else { - $dbQuery->and(); + $andFunc = 'and'; $neg = false; } @@ -616,6 +644,7 @@ class PostController { $val = $token; $dbQuery + ->$andFunc() ->exists() ->open() ->select('1') @@ -637,12 +666,7 @@ class PostController case 'favmax': $operator = $key == 'favmin' ? '>=' : '<='; $dbQuery - ->open() - ->select('COUNT(1)') - ->from('favoritee') - ->where('post_id = post.id') - ->close() - ->addSql($operator . ' ?')->put(intval($val)); + ->$andFunc('fav_count ' . $operator . ' ?')->put(intval($val)); break; case 'type': @@ -658,7 +682,7 @@ class PostController throw new SimpleException('Unknown type "' . $val . '"'); } $dbQuery - ->addSql('type = ?') + ->$andFunc('type = ?') ->put($type); break; @@ -679,7 +703,7 @@ class PostController if ($key == 'date') { $dbQuery - ->addSql('upload_date >= ?') + ->$andFunc('upload_date >= ?') ->and('upload_date <= ?') ->put($timeMin) ->put($timeMax); @@ -687,13 +711,13 @@ class PostController elseif ($key == 'datemin') { $dbQuery - ->addSql('upload_date >= ?') + ->$andFunc('upload_date >= ?') ->put($timeMin); } elseif ($key == 'datemax') { $dbQuery - ->addSql('upload_date <= ?') + ->$andFunc('upload_date <= ?') ->put($timeMax); } else @@ -708,6 +732,7 @@ class PostController case 'favoritee': case 'favoriter': $dbQuery + ->$andFunc() ->exists() ->open() ->select('1') @@ -724,7 +749,7 @@ class PostController case 'uploader': case 'uploaded': $dbQuery - ->addSql('uploader_id = ') + ->$andFunc('uploader_id = ') ->open() ->select('user.id') ->from('user') @@ -751,35 +776,30 @@ class PostController if ($neg) { $orderDir *= -1; - $dbQuery->addSql('0'); - } - else - { - $dbQuery->addSql('1'); } switch ($val) { case 'id': - $orderColumn = 'id'; + $orderColumn = 'post.id'; break; case 'date': - $orderColumn = 'upload_date'; + $orderColumn = 'post.upload_date'; break; case 'comment': case 'comments': case 'commentcount': - $orderColumn = '(SELECT COUNT(1) FROM comment WHERE post_id = post.id)'; + $orderColumn = 'comment_count'; break; case 'fav': case 'favs': case 'favcount': - $orderColumn = '(SELECT COUNT(1) FROM favoritee WHERE post_id = post.id)'; + $orderColumn = 'fav_count'; break; case 'tag': case 'tags': case 'tagcount': - $orderColumn = '(SELECT COUNT(1) FROM post_tag WHERE post_id = post.id)'; + $orderColumn = 'tag_count'; break; case 'random': //seeding works like this: if you visit anything @@ -805,6 +825,11 @@ class PostController if ($randomReset) unset($_SESSION['browsing-seed']); - $dbQuery->orderBy($orderColumn . ' ' . ($orderDir == 1? 'DESC' : 'ASC')); + + $dbQuery->orderBy($orderColumn); + if ($orderDir == 1) + $dbQuery->desc(); + else + $dbQuery->asc(); } } diff --git a/src/Controllers/UserController.php b/src/Controllers/UserController.php index 397260ed..461cd361 100644 --- a/src/Controllers/UserController.php +++ b/src/Controllers/UserController.php @@ -189,6 +189,16 @@ class UserController if ($suppliedPasswordHash != $user->pass_hash) throw new SimpleException('Must supply valid password'); } + foreach ($user->alias('commenter')->ownComment as $comment) + { + $comment->commenter = null; + R::store($comment); + } + foreach ($user->alias('uploader')->ownPost as $post) + { + $post->uploader = null; + R::store($post); + } $user->ownFavoritee = []; R::store($user); R::trash($user); @@ -375,6 +385,8 @@ class UserController ->put(($page - 1) * $postsPerPage); $posts = $searchDbQuery->get(); + $posts = R::convertToBeans('post', $posts); + R::preload($posts, ['uploader' => 'user']); $this->context->transport->user = $user; $this->context->transport->tab = $tab; $this->context->transport->paginator = new StdClass; diff --git a/src/Helpers/PrivilegesHelper.php b/src/Helpers/PrivilegesHelper.php index 5c1a9e1e..33e15cf0 100644 --- a/src/Helpers/PrivilegesHelper.php +++ b/src/Helpers/PrivilegesHelper.php @@ -52,6 +52,8 @@ class PrivilegesHelper public static function getIdentitySubPrivilege($user) { + if (!$user) + return false; $userFromContext = \Chibi\Registry::getContext()->user; return $user->id == $userFromContext->id ? 'own' : 'all'; } diff --git a/src/Views/post-small.phtml b/src/Views/post-small.phtml index ed75bec1..62947279 100644 --- a/src/Views/post-small.phtml +++ b/src/Views/post-small.phtml @@ -1,3 +1,3 @@ - - @<?php echo $this->context->post['id'] ?> + + @<?php echo $this->context->post->id ?> diff --git a/src/Views/post-view.phtml b/src/Views/post-view.phtml index f04c866a..c028d210 100644 --- a/src/Views/post-view.phtml +++ b/src/Views/post-view.phtml @@ -53,7 +53,7 @@
Uploader: - context->transport->post->uploader->id): ?> + context->transport->post->uploader): ?>