This repository has been archived on 2025-02-26. You can view files and clone it, but cannot push or open issues or pull requests.
szurubooru/src/Models/SearchServices/PostSearchService.php
Marcin Kurczewski 50e4b40721 Upgraded to newest chibi
- Separate non-static router class
- Moved some setup code to new method, Core::init
- Persistent database connection between tests
2014-05-23 23:34:50 +02:00

52 lines
1.8 KiB
PHP

<?php
use \Chibi\Sql as Sql;
class PostSearchService extends AbstractSearchService
{
public static function getPostIdsAround($searchQuery, $postId)
{
return Core::getDatabase()->transaction(function() use ($searchQuery, $postId)
{
if (Core::getDatabase()->getDriver() == 'sqlite')
$stmt = Sql\Statements::raw('CREATE TEMPORARY TABLE IF NOT EXISTS post_search(id INTEGER PRIMARY KEY AUTOINCREMENT, post_id INTEGER)');
else
$stmt = Sql\Statements::raw('CREATE TEMPORARY TABLE IF NOT EXISTS post_search(id INTEGER PRIMARY KEY AUTO_INCREMENT, post_id INTEGER)');
Core::getDatabase()->execute($stmt);
$stmt = Sql\Statements::delete();
$stmt->setTable('post_search');
Core::getDatabase()->execute($stmt);
$innerStmt = Sql\Statements::select($searchQuery);
$innerStmt->setColumn('post.id');
$innerStmt->setTable('post');
self::decorateParser($innerStmt, $searchQuery);
$stmt = Sql\Statements::insert();
$stmt->setTable('post_search');
$stmt->setSource(['post_id'], $innerStmt);
Core::getDatabase()->execute($stmt);
$stmt = Sql\Statements::select();
$stmt->setTable('post_search');
$stmt->setColumn('id');
$stmt->setCriterion(Sql\Functors::equals('post_id', new Sql\Binding($postId)));
$rowId = Core::getDatabase()->fetchOne($stmt)['id'];
//it's possible that given post won't show in search results:
//it can be hidden, it can have prohibited safety etc.
if (!$rowId)
return [null, null];
$rowId = intval($rowId);
$stmt->setColumn('post_id');
$stmt->setCriterion(Sql\Functors::equals('id', new Sql\Binding($rowId - 1)));
$nextPostId = Core::getDatabase()->fetchOne($stmt)['post_id'];
$stmt->setCriterion(Sql\Functors::equals('id', new Sql\Binding($rowId + 1)));
$prevPostId = Core::getDatabase()->fetchOne($stmt)['post_id'];
return [$prevPostId, $nextPostId];
});
}
}