Passed
Push — master ( 4162a6...5bc725 )
by Jean-Christophe
05:05
created

ConditionParser::getCondition()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 4

Importance

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