diff --git a/src/Search/Filters/PostFilter.php b/src/Search/Filters/PostFilter.php index 5bac8cdb..c87ba2fc 100644 --- a/src/Search/Filters/PostFilter.php +++ b/src/Search/Filters/PostFilter.php @@ -20,6 +20,7 @@ class PostFilter extends BasicFilter implements IFilter const REQUIREMENT_TAG = 'tag'; const REQUIREMENT_ID = 'id'; const REQUIREMENT_CREATION_TIME = 'creationTime'; + const REQUIREMENT_LAST_EDIT_TIME = 'lastEditTime'; const REQUIREMENT_HASH = 'name'; const REQUIREMENT_TAG_COUNT = 'tagCount'; const REQUIREMENT_FAV_COUNT = 'favCount'; diff --git a/src/Search/Parsers/AbstractSearchParser.php b/src/Search/Parsers/AbstractSearchParser.php index b5b64108..a2f8937b 100644 --- a/src/Search/Parsers/AbstractSearchParser.php +++ b/src/Search/Parsers/AbstractSearchParser.php @@ -96,6 +96,31 @@ abstract class AbstractSearchParser $filter->addRequirement($requirement); } + protected function addRequirementFromDateRangeToken($filter, $token, $type) + { + 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); + + $token->setValue($finalString); + $this->addRequirementFromToken($filter, $token, $type, self::ALLOW_RANGES); + } + private function getOrderColumn($tokenText) { $map = $this->getOrderColumnMap(); @@ -204,4 +229,47 @@ abstract class AbstractSearchParser return str_replace('_', '', strtolower($text)); } + 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]; + } } diff --git a/src/Search/Parsers/PostSearchParser.php b/src/Search/Parsers/PostSearchParser.php index b1d1812f..0908c39b 100644 --- a/src/Search/Parsers/PostSearchParser.php +++ b/src/Search/Parsers/PostSearchParser.php @@ -66,7 +66,8 @@ class PostSearchParser extends AbstractSearchParser [ [['id'], [$this, 'addIdRequirement']], [['hash', 'name'], [$this, 'addHashRequirement']], - [['date', 'time'], [$this, 'addDateRequirement']], + [['date', 'time', 'creation_date', 'creation_time'], [$this, 'addCreationTimeRequirement']], + [['edit_date', 'edit_time'], [$this, 'addLastEditTimeRequirement']], [['tag_count', 'tags'], [$this, 'addTagCountRequirement']], [['fav_count', 'favs'], [$this, 'addFavCountRequirement']], [['comment_count', 'comments'], [$this, 'addCommentCountRequirement']], @@ -181,33 +182,20 @@ class PostSearchParser extends AbstractSearchParser self::ALLOW_COMPOSITE); } - private function addDateRequirement($filter, $token) + private function addCreationTimeRequirement($filter, $token) { - 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); - - $token->setValue($finalString); - $this->addRequirementFromToken( + $this->addRequirementFromDateRangeToken( $filter, $token, - PostFilter::REQUIREMENT_CREATION_TIME, - self::ALLOW_RANGES); + PostFilter::REQUIREMENT_CREATION_TIME); + } + + private function addLastEditTimeRequirement($filter, $token) + { + $this->addRequirementFromDateRangeToken( + $filter, + $token, + PostFilter::REQUIREMENT_LAST_EDIT_TIME); } private function addTagCountRequirement($filter, $token) @@ -318,48 +306,4 @@ class PostSearchParser extends AbstractSearchParser $requirement->setNegated($isNegated); $filter->addRequirement($requirement); } - - 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]; - } }