Completed
Push — master ( d4511b...6b9e03 )
by Ron
03:07
created

OptionalDBFilterMap::recursiveGet()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 14
rs 9.2
cc 4
eloc 10
nc 4
nop 3
1
<?php
2
namespace Kir\MySQL\Builder\Expr;
3
4
use Exception;
5
6
class OptionalDBFilterMap implements OptionalExpression {
7
	/** @var */
8
	private $expression;
9
	/** @var mixed */
10
	private $data;
11
	/** @var callable|null */
12
	private $validator;
13
14
	/**
15
	 * @param string $expression
16
	 * @param array $data
17
	 * @param string|string[] $keyPath
18
	 * @param callable|null $validator
19
	 */
20
	public function __construct($expression, array $data, $keyPath, $validator = null) {
21
		$this->expression = $expression;
22
		$this->data = $data;
23
		$keyPath = $this->buildKey($keyPath);
24
		$this->data = $this->recursiveGet($data, $keyPath, null);
25
		if($validator === null) {
26
			$validator = function ($data) {
27
				return (string) $data !== '';
28
			};
29
		}
30
		$this->validator = $validator;
31
	}
32
33
	/**
34
	 * @return mixed
35
	 */
36
	public function getExpression() {
37
		return $this->expression;
38
	}
39
40
	/**
41
	 * @return bool
42
	 */
43
	public function isValid() {
44
		return call_user_func($this->validator, $this->data);
45
	}
46
47
	/**
48
	 * @return mixed
49
	 */
50
	public function getData() {
51
		return [$this->data];
52
	}
53
54
	/**
55
	 * @param string|string[] $keyPath
56
	 * @return string
57
	 * @throws Exception
58
	 */
59
	private function buildKey($keyPath) {
60
		if(is_string($keyPath)) {
61
			$keyPath = explode('.', $keyPath);
62
		}
63
		if(!is_array($keyPath)) {
64
			throw new Exception('Invalid key');
65
		}
66
		return $keyPath;
67
	}
68
69
	/**
70
	 * @param array $array
71
	 * @param array $path
72
	 * @param mixed $default
73
	 * @return array
74
	 */
75
	private function recursiveGet($array, $path, $default) {
76
		$count = count($path);
77
		if (!$count) {
78
			return $default;
79
		}
80
		for($idx = 0; $idx < $count; $idx++) {
81
			$part = $path[$idx];
82
			if(!array_key_exists($part, $array)) {
83
				return $default;
84
			}
85
			$array = $array[$part];
86
		}
87
		return $array;
88
	}
89
}
90