Passed
Push — master ( 3b562b...c53b79 )
by Jean-Christophe
05:56
created

ConditionParser::countParts()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 0
dl 0
loc 4
ccs 4
cts 4
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Ubiquity\orm\parser;
4
5
use Ubiquity\utils\base\UArray;
6
use Ubiquity\orm\OrmUtils;
7
use Ubiquity\db\SqlUtils;
8
9
class ConditionParser {
10
	private $firstPart;
11
	private $condition;
12
	private $parts=[];
13
	private $params;
14
	private $invertedParams=true;
15
	
16 43
	public function __construct($condition=null,$firstPart=null,$params=null){
17 43
		$this->condition=$condition;
18 43
		$this->firstPart=$firstPart;
19 43
		if(is_array($params)){
20 6
			$this->setParams($params);
21
		}
22 43
	}
23
	
24 23
	public function addKeyValues($keyValues,$classname,$separator=" AND ") {
25 23
		if(!is_array($keyValues)){
26 17
			$this->condition=$this->parseKey($keyValues, $classname);
27
		}else{
28 10
			if(!UArray::isAssociative($keyValues)){
29 6
				if(isset($classname)){
30 6
					$keys=OrmUtils::getKeyFields($classname);
31 6
					if(is_array($keys)){
32 6
						$keyValues=\array_combine($keys, $keyValues);
33
					}
34
				}
35
			}
36 10
			$retArray=array ();
37 10
			foreach ( $keyValues as $key => $value ) {
38 10
				if($this->addParams($value)){
39 10
					$retArray[]=SqlUtils::$quote . $key . SqlUtils::$quote . " = ?";
40
				}
41
			}
42 10
			$this->condition=implode($separator, $retArray);
43
		}
44 23
	}
45
	
46 34
	private function addParams($value){
47 34
		if(!isset($this->params[$value])){
48 34
			return $this->params[$value]=true;
49
		}
50 13
		return false;
51
	}
52
	
53 24
	public function addPart($condition,$value){
54 24
		if($this->addParams($value)){
55 24
			$this->parts[]=$condition;
56 24
			return true;
57
		}
58
		return false;
59
	}
60
	
61 19
	public function addParts($condition,$values){
62 19
		foreach ($values as $value){
63 19
			if($this->addParams($value)){
64 19
				$this->parts[]=$condition;
65
			}
66
		}
67 19
	}
68
	
69 27
	public function compileParts($separator=" OR "){
70 27
		if($separator==" OR " && sizeof($this->parts)>3){
71 20
			$parts=$this->refactorParts();
72 20
			$conditions=[];
73 20
			foreach ($parts as $part=>$values){
74 20
				$values[0]="SELECT ? as _id";
75 20
				$conditions[]=" INNER JOIN (".implode(" UNION ALL SELECT ", $values).") as _tmp ON ".$part."=_tmp._id";
76
			}
77 20
			$this->condition=implode(" ", $conditions);
78
		}else{
79 23
			$this->condition=implode($separator, $this->parts);
80
		}
81 27
	}
82
	
83 20
	private function refactorParts(){
84 20
		$result=[];
85 20
		foreach ($this->parts as $part){
86 20
			$part=str_replace("= ?", "", $part);
87 20
			$result[$part][]='?';
88
		}
89 20
		return $result;
90
	}
91
	
92 17
	private function parseKey($keyValues,$className){
93 17
		$condition=$keyValues;
94 17
		if (strrpos($keyValues, "=") === false && strrpos($keyValues, ">") === false && strrpos($keyValues, "<") === false) {
95 5
			if($this->addParams($keyValues)){
96 5
				$condition=SqlUtils::$quote. OrmUtils::getFirstKey($className) . SqlUtils::$quote."= ?";
97
			}
98
		}
99 17
		return $condition;
100
	}
101
	
102
	/**
103
	 * @return string
104
	 */
105 43
	public function getCondition() {
106 43
		if(!isset($this->firstPart)|| $this->firstPart==='')
107 43
			return $this->condition;
108 3
		$ret=$this->firstPart;
109 3
		if(isset($this->condition)){
110 3
			$ret.=" WHERE ".$this->condition;
111
		}
112 3
		return $ret;
113
	}
114
	
115
	/**
116
	 * @return mixed
117
	 */
118 43
	public function getParams() {
119 43
		if(is_array($this->params)){
120 38
			if($this->invertedParams){
121 34
				return array_keys($this->params);
122
			}
123 7
			return $this->params;
124
		}
125 31
		return;
126
	}
127
	
128
	/**
129
	 * @return mixed
130
	 */
131 24
	public function hasParam($value) {
132 24
		if(is_array($this->params)){
133 17
			if($this->invertedParams){
134 17
				return isset($this->params[$value]);
135
			}
136
			return array_search($value,$this->params)!==false;
137
		}
138 24
		return false;
139
	}
140
	
141 24
	public function countParts(){
142 24
		if(is_array($this->params))
143 17
			return sizeof($this->params);
144 24
		return 0;
145
	}
146
	
147
	/**
148
	 * @param string $condition
149
	 */
150
	public function setCondition($condition) {
151
		$this->condition = $condition;
152
		return $this;
153
	}
154
	
155
	/**
156
	 * @param mixed $params
157
	 */
158 7
	public function setParams($params) {
159 7
		$this->params = $params;
160 7
		$this->invertedParams=false;
161 7
		return $this;
162
	}
163
	
164 24
	public function limitOne(){
165 24
		$limit="";
166 24
		if(\stripos($this->condition, " limit ")===false){
167 24
			$limit=" limit 1";
168
		}
169 24
		$this->condition.=$limit;
170 24
	}
171
	
172 11
	public static function simple($condition,$params){
173 11
		$cParser=new ConditionParser($condition);
174 11
		$cParser->addParams($params);
175 11
		return $cParser;
176
	}
177
	
178
}
179
180