Comparator   A
last analyzed

Complexity

Total Complexity 20

Size/Duplication

Total Lines 183
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 20
c 1
b 0
f 0
lcom 1
cbo 1
dl 0
loc 183
ccs 50
cts 50
cp 1
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A compare() 0 4 1
B compareDateTime() 0 21 9
A compareDate() 0 4 1
A compareTime() 0 4 1
A compareWeek() 0 4 1
A compareMonth() 0 4 1
A compareYear() 0 4 1
A resetTime() 0 7 1
A resetDate() 0 7 1
A resetWeek() 0 7 1
A resetMonth() 0 7 1
A resetYear() 0 7 1
1
<?php
2
/**
3
 * GpsLab component.
4
 *
5
 * @author    Peter Gribanov <[email protected]>
6
 * @copyright Copyright (c) 2016, Peter Gribanov
7
 * @license   http://opensource.org/licenses/MIT
8
 */
9
10
namespace GpsLab\Bundle\DateBundle;
11
12
use GpsLab\Bundle\DateBundle\Exception\InvalidCompareOperatorException;
13
14
class Comparator
15
{
16
    const EQ = '=';
17
    const NEQ = '!=';
18
    const LT = '<';
19
    const LTE = '<=';
20
    const GT = '>';
21
    const GTE = '>=';
22
23
    /**
24
     * Synonym for Comparator::compareDateTime().
25
     *
26
     * @param \DateTime $x
27
     * @param string $operator
28
     * @param \DateTime $y
29
     *
30
     * @return bool
31
     */
32 25
    public function compare(\DateTime $x, $operator, \DateTime $y)
33
    {
34 25
        return $this->compareDateTime($x, $operator, $y);
35
    }
36
37
    /**
38
     * Compare date and time.
39
     *
40
     * @param \DateTime $x
41
     * @param string $operator
42
     * @param \DateTime $y
43
     *
44
     * @return bool
45
     */
46 160
    public function compareDateTime(\DateTime $x, $operator, \DateTime $y)
47
    {
48
        switch ($operator) {
49 160
            case self::EQ:
50 160
            case '==':
51 24
                return $x == $y;
52 136
            case self::NEQ:
53 136
            case '<>':
54 24
                return $x != $y;
55 112
            case self::GT:
56 24
                return $x > $y;
57 88
            case self::GTE:
58 24
                return $x >= $y;
59 64
            case self::LT:
60 26
                return $x < $y;
61 38
            case self::LTE:
62 24
                return $x <= $y;
63 14
            default:
64 14
                throw InvalidCompareOperatorException::create($operator);
65 14
        }
66
    }
67
68
    /**
69
     * Compare only date. Not compare time.
70
     *
71
     * @param \DateTime $x
72
     * @param string $operator
73
     * @param \DateTime $y
74
     *
75
     * @return bool
76
     */
77 26
    public function compareDate(\DateTime $x, $operator, \DateTime $y)
78
    {
79 26
        return $this->compareDateTime($this->resetTime($x), $operator, $this->resetTime($y));
80
    }
81
82
    /**
83
     * Compare only time.
84
     *
85
     * @param \DateTime $x
86
     * @param string $operator
87
     * @param \DateTime $y
88
     *
89
     * @return bool
90
     */
91 26
    public function compareTime(\DateTime $x, $operator, \DateTime $y)
92
    {
93 26
        return $this->compareDateTime($this->resetDate($x), $operator, $this->resetDate($y));
94
    }
95
96
    /**
97
     * @param \DateTime $x
98
     * @param string $operator
99
     * @param \DateTime $y
100
     *
101
     * @return bool
102
     */
103 28
    public function compareWeek(\DateTime $x, $operator, \DateTime $y)
104
    {
105 28
        return $this->compareDateTime($this->resetWeek($x), $operator, $this->resetWeek($y));
106
    }
107
108
    /**
109
     * @param \DateTime $x
110
     * @param string $operator
111
     * @param \DateTime $y
112
     *
113
     * @return bool
114
     */
115 26
    public function compareMonth(\DateTime $x, $operator, \DateTime $y)
116
    {
117 26
        return $this->compareDateTime($this->resetMonth($x), $operator, $this->resetMonth($y));
118
    }
119
120
    /**
121
     * @param \DateTime $x
122
     * @param string $operator
123
     * @param \DateTime $y
124
     *
125
     * @return bool
126
     */
127 26
    public function compareYear(\DateTime $x, $operator, \DateTime $y)
128
    {
129 26
        return $this->compareDateTime($this->resetYear($x), $operator, $this->resetYear($y));
130
    }
131
132
    /**
133
     * @param \DateTime $date
134
     *
135
     * @return \DateTime
136
     */
137 26
    protected function resetTime(\DateTime $date)
138
    {
139 26
        $date = clone $date;
140 26
        $date->setTime(0, 0, 0);
141
142 26
        return $date;
143
    }
144
145
    /**
146
     * @param \DateTime $date
147
     *
148
     * @return \DateTime
149
     */
150 26
    protected function resetDate(\DateTime $date)
151
    {
152 26
        $date = clone $date;
153 26
        $date->setDate(1, 1, 1);
154
155 26
        return $date;
156
    }
157
158
    /**
159
     * @param \DateTime $date
160
     *
161
     * @return \DateTime
162
     */
163 28
    protected function resetWeek(\DateTime $date)
164
    {
165 28
        $date = clone $date;
166 28
        $date->modify('Monday this week')->setTime(0, 0, 0);
167
168 28
        return $date;
169
    }
170
171
    /**
172
     * @param \DateTime $date
173
     *
174
     * @return \DateTime
175
     */
176 26
    protected function resetMonth(\DateTime $date)
177
    {
178 26
        $date = clone $date;
179 26
        $date->modify('first day of this month')->setTime(0, 0, 0);
180
181 26
        return $date;
182
    }
183
184
    /**
185
     * @param \DateTime $date
186
     *
187
     * @return \DateTime
188
     */
189 26
    protected function resetYear(\DateTime $date)
190
    {
191 26
        $date = clone $date;
192 26
        $date->modify('first day of this year')->setTime(0, 0, 0);
193
194 26
        return $date;
195
    }
196
}
197