11<?php
22namespace Kir \MySQL \Builder \Expr ;
33
4+ use Kir \MySQL \Builder \Helpers \RecursiveStructureAccess ;
45use RuntimeException ;
56
67class DBExprFilter implements OptionalExpression {
78 /** @var mixed */
89 private $ expression ;
10+ /** @var bool */
11+ private $ hasValue ;
912 /** @var mixed */
1013 private $ value ;
1114 /** @var string[] */
@@ -24,21 +27,18 @@ class DBExprFilter implements OptionalExpression {
2427 */
2528 public function __construct ($ expression , array $ data , $ keyPath , $ validator = null , $ validationResultHandler = null ) {
2629 $ this ->expression = $ expression ;
27- $ this ->value = $ data ;
2830 $ this ->keyPath = $ this ->buildKey ($ keyPath );
29- $ this ->value = $ this ->recursiveGet ($ data , $ this ->keyPath , null );
31+ $ this ->hasValue = RecursiveStructureAccess::recursiveHas ($ data , $ this ->keyPath );
32+ $ this ->value = RecursiveStructureAccess::recursiveGet ($ data , $ this ->keyPath , null );
3033 if ($ validator === null ) {
31- $ validator = function ($ data ) {
32- if (is_array ($ data )) {
33- return $ this ->isValidArray ($ data );
34- }
35- return (string ) $ data !== '' ;
34+ $ validator = function () {
35+ return true ;
3636 };
3737 }
38+ $ this ->validator = $ validator ;
3839 if ($ validationResultHandler === null ) {
3940 $ validationResultHandler = static function () {};
4041 }
41- $ this ->validator = $ validator ;
4242 $ this ->validationResultHandler = $ validationResultHandler ;
4343 }
4444
@@ -53,6 +53,9 @@ public function getExpression() {
5353 * @return bool
5454 */
5555 public function isValid () {
56+ if (!$ this ->hasValue ) {
57+ return false ;
58+ }
5659 $ result = call_user_func ($ this ->validator , $ this ->value );
5760 call_user_func ($ this ->validationResultHandler , $ result , [
5861 'value ' => $ this ->value ,
@@ -95,25 +98,4 @@ private function isValidArray(array $array) {
9598 });
9699 return count ($ data ) > 0 ;
97100 }
98-
99- /**
100- * @param array $array
101- * @param array $path
102- * @param mixed $default
103- * @return array
104- */
105- private function recursiveGet ($ array , $ path , $ default ) {
106- $ count = count ($ path );
107- if (!$ count ) {
108- return $ default ;
109- }
110- foreach ($ path as $ idxValue ) {
111- $ part = $ idxValue ;
112- if (!array_key_exists ($ part , $ array )) {
113- return $ default ;
114- }
115- $ array = $ array [$ part ];
116- }
117- return $ array ;
118- }
119101}
0 commit comments