Passed
Push — master ( dfeadf...0d8182 )
by Jean-Christophe
04:51
created

ConditionParser::getParams()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

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