13
13
14
14
use Doctrine \ORM \QueryBuilder ;
15
15
use Dunglas \ApiBundle \Api \ResourceInterface ;
16
- use Dunglas \ApiBundle \Doctrine \Orm \Util \QueryUtils ;
16
+ use Dunglas \ApiBundle \Doctrine \Orm \Util \QueryNameGenerator ;
17
17
use Symfony \Component \HttpFoundation \Request ;
18
18
19
19
/**
@@ -46,12 +46,10 @@ class DateFilter extends AbstractFilter
46
46
*/
47
47
public function apply (ResourceInterface $ resource , QueryBuilder $ queryBuilder , Request $ request )
48
48
{
49
- $ fieldNames = $ this ->getDateFieldNames ($ resource );
50
-
51
49
foreach ($ this ->extractProperties ($ request ) as $ property => $ values ) {
52
50
// Expect $values to be an array having the period as keys and the date value as values
53
51
if (
54
- !isset ( $ fieldNames [ $ property] ) ||
52
+ !$ this -> isDateField ( $ property, $ resource ) ||
55
53
!is_array ($ values ) ||
56
54
!$ this ->isPropertyEnabled ($ property ) ||
57
55
!$ this ->isPropertyMapped ($ property , $ resource )
@@ -68,7 +66,7 @@ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder, R
68
66
$ parentAlias = $ alias ;
69
67
70
68
foreach ($ propertyParts ['associations ' ] as $ association ) {
71
- $ alias = QueryUtils ::generateJoinAlias ($ association );
69
+ $ alias = QueryNameGenerator ::generateJoinAlias ($ association );
72
70
$ queryBuilder ->join (sprintf ('%s.%s ' , $ parentAlias , $ association ), $ alias );
73
71
$ parentAlias = $ alias ;
74
72
}
@@ -78,10 +76,6 @@ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder, R
78
76
79
77
$ nullManagement = isset ($ this ->properties [$ property ]) ? $ this ->properties [$ property ] : null ;
80
78
81
- if (self ::EXCLUDE_NULL === $ nullManagement ) {
82
- $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->isNotNull (sprintf ('%s.%s ' , $ alias , $ field )));
83
- }
84
-
85
79
if (isset ($ values [self ::PARAMETER_BEFORE ])) {
86
80
$ this ->addWhere (
87
81
$ queryBuilder ,
@@ -110,22 +104,21 @@ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder, R
110
104
* Adds the where clause according to the chosen null management.
111
105
*
112
106
* @param QueryBuilder $queryBuilder
113
- * @param string $alias
114
- * @param string $field
115
- * @param string $operator
116
- * @param string $value
117
- * @param int|null $nullManagement
107
+ * @param string $alias
108
+ * @param string $field
109
+ * @param string $operator
110
+ * @param string $value
111
+ * @param int|null $nullManagement
118
112
*/
119
113
private function addWhere (QueryBuilder $ queryBuilder , $ alias , $ field , $ operator , $ value , $ nullManagement )
120
114
{
121
- $ valueParameter = QueryUtils ::generateParameterName (sprintf ('%s_%s ' , $ field , $ operator ));
115
+ $ valueParameter = QueryNameGenerator ::generateParameterName (sprintf ('%s_%s ' , $ field , $ operator ));
122
116
$ baseWhere = sprintf ('%s.%s %s :%s ' , $ alias , $ field , self ::PARAMETER_BEFORE === $ operator ? '<= ' : '>= ' , $ valueParameter );
123
117
124
118
if (null === $ nullManagement || self ::EXCLUDE_NULL === $ nullManagement ) {
125
119
$ queryBuilder ->andWhere ($ baseWhere );
126
120
} elseif (
127
- (self ::PARAMETER_BEFORE === $ operator && self ::INCLUDE_NULL_BEFORE === $ nullManagement )
128
- ||
121
+ (self ::PARAMETER_BEFORE === $ operator && self ::INCLUDE_NULL_BEFORE === $ nullManagement ) ||
129
122
(self ::PARAMETER_AFTER === $ operator && self ::INCLUDE_NULL_AFTER === $ nullManagement )
130
123
) {
131
124
$ queryBuilder ->andWhere ($ queryBuilder ->expr ()->orX (
@@ -140,6 +133,10 @@ private function addWhere(QueryBuilder $queryBuilder, $alias, $field, $operator,
140
133
}
141
134
142
135
$ queryBuilder ->setParameter ($ valueParameter , new \DateTime ($ value ));
136
+
137
+ if (self ::EXCLUDE_NULL === $ nullManagement ) {
138
+ $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->isNotNull (sprintf ('%s.%s ' , $ alias , $ field )));
139
+ }
143
140
}
144
141
145
142
/**
@@ -148,11 +145,19 @@ private function addWhere(QueryBuilder $queryBuilder, $alias, $field, $operator,
148
145
public function getDescription (ResourceInterface $ resource )
149
146
{
150
147
$ description = [];
151
- foreach ($ this ->getClassMetadata ($ resource )->getFieldNames () as $ fieldName ) {
152
- if ($ this ->isPropertyEnabled ($ fieldName )) {
153
- $ description += $ this ->getFilterDescription ($ fieldName , self ::PARAMETER_BEFORE );
154
- $ description += $ this ->getFilterDescription ($ fieldName , self ::PARAMETER_AFTER );
148
+
149
+ $ properties = $ this ->properties ;
150
+ if (null === $ properties ) {
151
+ $ properties = array_fill_keys ($ this ->getClassMetadata ($ resource )->getFieldNames (), null );
152
+ }
153
+
154
+ foreach ($ properties as $ property => $ nullManagement ) {
155
+ if (!$ this ->isPropertyMapped ($ property , $ resource ) || !$ this ->isDateField ($ property , $ resource )) {
156
+ continue ;
155
157
}
158
+
159
+ $ description += $ this ->getFilterDescription ($ property , self ::PARAMETER_BEFORE );
160
+ $ description += $ this ->getFilterDescription ($ property , self ::PARAMETER_AFTER );
156
161
}
157
162
158
163
return $ description ;
@@ -178,23 +183,18 @@ private function getFilterDescription($fieldName, $period)
178
183
}
179
184
180
185
/**
181
- * Gets names of fields with a date type .
186
+ * Determines whether the given property refers to a date field .
182
187
*
188
+ * @param string $property
183
189
* @param ResourceInterface $resource
184
190
*
185
191
* @return array
186
192
*/
187
- private function getDateFieldNames ( ResourceInterface $ resource )
193
+ private function isDateField ( $ property , ResourceInterface $ resource )
188
194
{
189
- $ classMetadata = $ this ->getClassMetadata ($ resource );
190
- $ dateFieldNames = [];
191
-
192
- foreach ($ classMetadata ->getFieldNames () as $ fieldName ) {
193
- if (isset (self ::$ doctrineDateTypes [$ classMetadata ->getTypeOfField ($ fieldName )])) {
194
- $ dateFieldNames [$ fieldName ] = true ;
195
- }
196
- }
195
+ $ propertyParts = $ this ->splitPropertyParts ($ property );
196
+ $ metadata = $ this ->getNestedMetadata ($ resource , $ propertyParts ['associations ' ]);
197
197
198
- return $ dateFieldNames ;
198
+ return isset ( self :: $ doctrineDateTypes [ $ metadata -> getTypeOfField ( $ propertyParts [ ' field ' ])]) ;
199
199
}
200
200
}
0 commit comments