Faster special:liked/disliked computing
This commit is contained in:
parent
e43881e03f
commit
e725f8d554
2 changed files with 25 additions and 25 deletions
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue