Fix order:random not working on SQlite
This commit is contained in:
parent
5c4b7c1284
commit
b3eb5e7b03
2 changed files with 21 additions and 4 deletions
|
@ -439,4 +439,19 @@ class Database
|
||||||
$this->execute("ALTER TABLE $table RENAME COLUMN {$column}_b TO $column");
|
$this->execute("ALTER TABLE $table RENAME COLUMN {$column}_b TO $column");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a deterministic pseudorandom order based on a seed and a column ID
|
||||||
|
*/
|
||||||
|
public function seeded_random(int $seed, string $id_column): string
|
||||||
|
{
|
||||||
|
$d = $this->get_driver_id();
|
||||||
|
if ($d == DatabaseDriverID::MYSQL) {
|
||||||
|
// MySQL supports RAND(n), where n is a random seed. Use that.
|
||||||
|
return "RAND($seed)";
|
||||||
|
}
|
||||||
|
|
||||||
|
// As fallback, use MD5 as a DRBG.
|
||||||
|
return "MD5(CONCAT($seed, CONCAT('+', $id_column)))";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,6 +155,8 @@ class Index extends Extension
|
||||||
|
|
||||||
public function onSearchTermParse(SearchTermParseEvent $event): void
|
public function onSearchTermParse(SearchTermParseEvent $event): void
|
||||||
{
|
{
|
||||||
|
global $database;
|
||||||
|
|
||||||
if (is_null($event->term)) {
|
if (is_null($event->term)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -235,14 +237,14 @@ class Index extends Extension
|
||||||
} elseif (preg_match("/^order[=|:]random[_]([0-9]{1,4})$/i", $event->term, $matches)) {
|
} elseif (preg_match("/^order[=|:]random[_]([0-9]{1,4})$/i", $event->term, $matches)) {
|
||||||
// requires a seed to avoid duplicates
|
// requires a seed to avoid duplicates
|
||||||
// since the tag can't be changed during the parseevent, we instead generate the seed during submit using js
|
// since the tag can't be changed during the parseevent, we instead generate the seed during submit using js
|
||||||
$seed = $matches[1];
|
$seed = (int)$matches[1];
|
||||||
$event->order = "RAND($seed)";
|
$event->order = $database->seeded_random($seed, "images.id");
|
||||||
} elseif (preg_match("/^order[=|:]dailyshuffle$/i", $event->term, $matches)) {
|
} elseif (preg_match("/^order[=|:]dailyshuffle$/i", $event->term, $matches)) {
|
||||||
// will use today's date as seed, thus allowing for a dynamic randomized list without outside intervention.
|
// will use today's date as seed, thus allowing for a dynamic randomized list without outside intervention.
|
||||||
// This way the list will change every day, giving a more dynamic feel to the imageboard.
|
// This way the list will change every day, giving a more dynamic feel to the imageboard.
|
||||||
// recommended to change homepage to "post/list/order:dailyshuffle/1"
|
// recommended to change homepage to "post/list/order:dailyshuffle/1"
|
||||||
$seed = date("Ymd");
|
$seed = (int)date("Ymd");
|
||||||
$event->order = "RAND($seed)";
|
$event->order = $database->seeded_random($seed, "images.id");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we've reached this far, and nobody else has done anything with this term, then treat it as a tag
|
// If we've reached this far, and nobody else has done anything with this term, then treat it as a tag
|
||||||
|
|
Reference in a new issue