Faster special:liked/disliked computing

This commit is contained in:
Marcin Kurczewski 2014-02-24 16:21:52 +01:00
parent e43881e03f
commit e725f8d554
2 changed files with 25 additions and 25 deletions

View file

@ -32,7 +32,7 @@ class PostSearchParser extends AbstractSearchParser
$innerStmt = new SqlSelectStatement(); $innerStmt = new SqlSelectStatement();
$innerStmt->setTable('post_tag'); $innerStmt->setTable('post_tag');
$innerStmt->setCriterion((new SqlConjunction) $innerStmt->setCriterion((new SqlConjunction)
->add(new SqlEqualsOperator('post_id', 'post.id')) ->add(new SqlEqualsOperator('post_tag.post_id', 'post.id'))
->add(new SqlEqualsOperator('post_tag.tag_id', new SqlBinding($tag->id)))); ->add(new SqlEqualsOperator('post_tag.tag_id', new SqlBinding($tag->id))));
$operator = new SqlExistsOperator($innerStmt); $operator = new SqlExistsOperator($innerStmt);
if ($neg) if ($neg)
@ -52,7 +52,7 @@ class PostSearchParser extends AbstractSearchParser
return true; return true;
} }
protected static function getCriterionForComplexToken($key, $value) protected function prepareCriterionForComplexToken($key, $value)
{ {
if (in_array($key, ['id', 'ids'])) if (in_array($key, ['id', 'ids']))
{ {
@ -67,7 +67,7 @@ class PostSearchParser extends AbstractSearchParser
$innerStmt = (new SqlSelectStatement) $innerStmt = (new SqlSelectStatement)
->setTable('favoritee') ->setTable('favoritee')
->setCriterion((new SqlConjunction) ->setCriterion((new SqlConjunction)
->add(new SqlEqualsOperator('post_id', 'post.id')) ->add(new SqlEqualsOperator('favoritee.post_id', 'post.id'))
->add(new SqlEqualsOperator('favoritee.user_id', new SqlBinding($user->id)))); ->add(new SqlEqualsOperator('favoritee.user_id', new SqlBinding($user->id))));
return new SqlExistsOperator($innerStmt); return new SqlExistsOperator($innerStmt);
} }
@ -78,8 +78,8 @@ class PostSearchParser extends AbstractSearchParser
$innerStmt = (new SqlSelectStatement) $innerStmt = (new SqlSelectStatement)
->setTable('comment') ->setTable('comment')
->setCriterion((new SqlConjunction) ->setCriterion((new SqlConjunction)
->add(new SqlEqualsOperator('post_id', 'post.id')) ->add(new SqlEqualsOperator('comment.post_id', 'post.id'))
->add(new SqlEqualsOperator('commenter_id', new SqlBinding($user->id)))); ->add(new SqlEqualsOperator('comment.commenter_id', new SqlBinding($user->id))));
return new SqlExistsOperator($innerStmt); return new SqlExistsOperator($innerStmt);
} }
@ -90,10 +90,10 @@ class PostSearchParser extends AbstractSearchParser
} }
elseif (in_array($key, ['idmin', 'id_min'])) elseif (in_array($key, ['idmin', 'id_min']))
return new SqlEqualsOrGreaterOperator('id', new SqlBinding(intval($value))); return new SqlEqualsOrGreaterOperator('post.id', new SqlBinding(intval($value)));
elseif (in_array($key, ['idmax', 'id_max'])) elseif (in_array($key, ['idmax', 'id_max']))
return new SqlEqualsOrLesserOperator('id', new SqlBinding(intval($value))); return new SqlEqualsOrLesserOperator('post.id', new SqlBinding(intval($value)));
elseif (in_array($key, ['scoremin', 'score_min'])) elseif (in_array($key, ['scoremin', 'score_min']))
return new SqlEqualsOrGreaterOperator('score', new SqlBinding(intval($value))); return new SqlEqualsOrGreaterOperator('score', new SqlBinding(intval($value)));
@ -145,24 +145,24 @@ class PostSearchParser extends AbstractSearchParser
$value = strtolower($value); $value = strtolower($value);
if (in_array($value, ['liked', 'likes'])) if (in_array($value, ['liked', 'likes']))
{ {
$innerStmt = new SqlSelectStatement(); if (!$this->statement->isTableJoined('post_score'))
$innerStmt->setTable('post_score'); {
$innerStmt->setCriterion((new SqlConjunction) $this->statement->addLeftOuterJoin('post_score', (new SqlConjunction)
->add(new SqlGreaterOperator('score', '0')) ->add(new SqlEqualsOperator('post_score.post_id', 'post.id'))
->add(new SqlEqualsOperator('post_id', 'post.id')) ->add(new SqlEqualsOperator('post_score.user_id', new SqlBinding($context->user->id))));
->add(new SqlEqualsOperator('user_id', new SqlBinding($context->user->id)))); }
return new SqlExistsOperator($innerStmt); return new SqlEqualsOperator(new SqlIfNullOperator('post_score.score', '0'), '1');
} }
elseif (in_array($value, ['disliked', 'dislikes'])) elseif (in_array($value, ['disliked', 'dislikes']))
{ {
$innerStmt = new SqlSelectStatement(); if (!$this->statement->isTableJoined('post_score'))
$innerStmt->setTable('post_score'); {
$innerStmt->setCriterion((new SqlConjunction) $this->statement->addLeftOuterJoin('post_score', (new SqlConjunction)
->add(new SqlLesserOperator('score', '0')) ->add(new SqlEqualsOperator('post_score.post_id', 'post.id'))
->add(new SqlEqualsOperator('post_id', 'post.id')) ->add(new SqlEqualsOperator('post_score.user_id', new SqlBinding($context->user->id))));
->add(new SqlEqualsOperator('user_id', new SqlBinding($context->user->id)))); }
return new SqlExistsOperator($innerStmt); return new SqlEqualsOperator(new SqlIfNullOperator('post_score.score', '0'), '-1');
} }
elseif ($value == 'hidden') elseif ($value == 'hidden')
@ -192,7 +192,7 @@ class PostSearchParser extends AbstractSearchParser
protected function processComplexToken($key, $value, $neg) protected function processComplexToken($key, $value, $neg)
{ {
$criterion = self::getCriterionForComplexToken($key, $value); $criterion = $this->prepareCriterionForComplexToken($key, $value);
if (!$criterion) if (!$criterion)
return false; return false;
@ -208,7 +208,7 @@ class PostSearchParser extends AbstractSearchParser
$randomReset = true; $randomReset = true;
if (in_array($orderByString, ['id'])) if (in_array($orderByString, ['id']))
$orderColumn = 'id'; $orderColumn = 'post.id';
elseif (in_array($orderByString, ['date'])) elseif (in_array($orderByString, ['date']))
$orderColumn = 'upload_date'; $orderColumn = 'upload_date';
@ -239,7 +239,7 @@ class PostSearchParser extends AbstractSearchParser
if (!isset($_SESSION['browsing-seed'])) if (!isset($_SESSION['browsing-seed']))
$_SESSION['browsing-seed'] = mt_rand(); $_SESSION['browsing-seed'] = mt_rand();
$seed = $_SESSION['browsing-seed']; $seed = $_SESSION['browsing-seed'];
$orderColumn = 'SUBSTR(id * ' . $seed .', LENGTH(id) + 2)'; $orderColumn = 'SUBSTR(post.id * ' . $seed .', LENGTH(post.id) + 2)';
} }
else else

View file

@ -13,7 +13,7 @@ class PostSearchService extends AbstractSearchService
Database::exec($stmt); Database::exec($stmt);
$innerStmt = new SqlSelectStatement($searchQuery); $innerStmt = new SqlSelectStatement($searchQuery);
$innerStmt->setColumn('id'); $innerStmt->setColumn('post.id');
$innerStmt->setTable('post'); $innerStmt->setTable('post');
self::decorateParser($innerStmt, $searchQuery); self::decorateParser($innerStmt, $searchQuery);
$stmt = new SqlInsertStatement(); $stmt = new SqlInsertStatement();