From 6d4a4f11d1557a2d2b002ad556c812dc98bae9f5 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Sat, 27 Sep 2014 15:42:02 +0200 Subject: [PATCH] Added post searching by date --- TODO | 3 - src/SearchServices/Filters/PostFilter.php | 1 + .../Parsers/PostSearchParser.php | 73 +++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index 6968cd9a..ddfde125 100644 --- a/TODO +++ b/TODO @@ -37,9 +37,6 @@ everything related to posts: - fav:3..5 - score:3..5 - tag:3..5 - - date:today - - date:yesterday - - date:yyyy[-mm[-dd]]..yyyy[-mm[-dd]] - filesize:3K..5M - imgsize:huge/large/medium/small - hash:postName diff --git a/src/SearchServices/Filters/PostFilter.php b/src/SearchServices/Filters/PostFilter.php index 38794fd8..e641f669 100644 --- a/src/SearchServices/Filters/PostFilter.php +++ b/src/SearchServices/Filters/PostFilter.php @@ -5,4 +5,5 @@ class PostFilter extends BasicFilter implements IFilter { const REQUIREMENT_TAG = 'tag'; const REQUIREMENT_ID = 'id'; + const REQUIREMENT_DATE = 'uploadTime'; } diff --git a/src/SearchServices/Parsers/PostSearchParser.php b/src/SearchServices/Parsers/PostSearchParser.php index 02b4f957..418550af 100644 --- a/src/SearchServices/Parsers/PostSearchParser.php +++ b/src/SearchServices/Parsers/PostSearchParser.php @@ -27,6 +27,35 @@ class PostSearchParser extends AbstractSearchParser $requirement->setNegated($token->isNegated()); $filter->addRequirement($requirement); } + + elseif ($token->getKey() === 'date') + { + if (substr_count($token->getValue(), '..') === 1) + { + list ($dateMin, $dateMax) = explode('..', $token->getValue()); + $timeMin = $this->dateToTime($dateMin)[0]; + $timeMax = $this->dateToTime($dateMax)[1]; + } + else + { + $date = $token->getValue(); + list ($timeMin, $timeMax) = $this->dateToTime($date); + } + + $finalString = ''; + if ($timeMin) + $finalString .= date('c', $timeMin); + $finalString .= '..'; + if ($timeMax) + $finalString .= date('c', $timeMax); + + $requirement = new \Szurubooru\SearchServices\Requirements\Requirement(); + $requirement->setType(\Szurubooru\SearchServices\Filters\PostFilter::REQUIREMENT_DATE); + $requirement->setValue($this->createRequirementValue($finalString, self::ALLOW_RANGES)); + $requirement->setNegated($token->isNegated()); + $filter->addRequirement($requirement); + } + else { throw new \BadMethodCallException('Not supported'); @@ -37,4 +66,48 @@ class PostSearchParser extends AbstractSearchParser { throw new \BadMethodCallException('Not supported'); } + + private function dateToTime($value) + { + $value = strtolower(trim($value)); + if (!$value) + { + return null; + } + elseif ($value === 'today') + { + $timeMin = mktime(0, 0, 0); + $timeMax = mktime(24, 0, -1); + } + elseif ($value === 'yesterday') + { + $timeMin = mktime(-24, 0, 0); + $timeMax = mktime(0, 0, -1); + } + elseif (preg_match('/^(\d{4})$/', $value, $matches)) + { + $year = intval($matches[1]); + $timeMin = mktime(0, 0, 0, 1, 1, $year); + $timeMax = mktime(0, 0, -1, 1, 1, $year + 1); + } + elseif (preg_match('/^(\d{4})-(\d{1,2})$/', $value, $matches)) + { + $year = intval($matches[1]); + $month = intval($matches[2]); + $timeMin = mktime(0, 0, 0, $month, 1, $year); + $timeMax = mktime(0, 0, -1, $month + 1, 1, $year); + } + elseif (preg_match('/^(\d{4})-(\d{1,2})-(\d{1,2})$/', $value, $matches)) + { + $year = intval($matches[1]); + $month = intval($matches[2]); + $day = intval($matches[3]); + $timeMin = mktime(0, 0, 0, $month, $day, $year); + $timeMax = mktime(0, 0, -1, $month, $day + 1, $year); + } + else + throw new \Exception('Invalid date format: ' . $value); + + return [$timeMin, $timeMax]; + } }