open-orchestra/open-orchestra-mongo-libs

View on GitHub
Pagination/MongoTrait/FilterTypeStrategy/Strategies/DateFilterStrategy.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace OpenOrchestra\Pagination\MongoTrait\FilterTypeStrategy\Strategies;

use OpenOrchestra\Pagination\FilterType\FilterTypeInterface;
use MongoDate;

/**
 * Class DateFilterStrategy
 */
class DateFilterStrategy implements FilterTypeInterface
{
    const FILTER_TYPE =  'date';

    /**
     * @param string $type
     *
     * @return bool
     */
    public function support($type)
    {
        return $type === self::FILTER_TYPE;
    }

    /**
     * @param string $name
     * @param string $value
     * @param string $documentName
     * @param string $format
     *
     * @return array
     */
    public function generateFilter($name, $value, $documentName='', $format='')
    {
        if ($format != '') {
            $pattern = '/^'.preg_replace(array('/dd/', '/mm/', '/yyyy/', '/yy/'), '(\d+)', preg_quote($format, '/')).'(.*)$/';

            $positionDay = strpos ($format, 'dd');
            $positionMonth = strpos ($format, 'mm');
            $positionYear = strpos ($format, 'yy');
            $rankDay = 1 + (int) ($positionDay > $positionMonth) + (int) ($positionDay > $positionYear);
            $rankMonth = 1 + (int) ($positionMonth > $positionDay) + (int) ($positionMonth > $positionYear);
            $rankYear = 1 + (int) ($positionYear > $positionDay) + (int) ($positionYear > $positionMonth);

            $replacement = '$'.$rankYear.'-$'.$rankMonth.'-$'.$rankDay.'$4';

            $value = preg_replace($pattern, $replacement, $value);
        }
        $strTime = strtotime($value);
        if ("00:00:00" ==  date('H:i:s', $strTime)) {
            $dateGte = new MongoDate($strTime);
            $dateLte = new MongoDate(strtotime($value.' + 1 DAY'));
            $filter = array( $name => array( '$gte' => $dateGte, '$lt' => $dateLte));

            return $filter;
        }
        $value = new MongoDate(strtotime($value));
        $filter = array($name => $value);

        return $filter;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'date_filter';
    }
}