Passed
Push — master ( 7f0dd2...2d27c8 )
by Richard
01:42
created

WhereBuilder::getOperator()   B

Complexity

Conditions 7
Paths 12

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 8
nc 12
nop 1
dl 0
loc 12
rs 8.2222
c 0
b 0
f 0
1
<?php
2
namespace Maphper\Lib\Sql;
3
4
class WhereBuilder {
5
    //Needs to be broken up into better methods
6
	public function createSql($fields, $mode = \Maphper\Maphper::FIND_EXACT | \Maphper\Maphper::FIND_AND){
7
		$args = [];
8
		$sql = [];
9
10
		foreach ($fields as $key => $value) {
11
            if ($value instanceof \DateTime) {
12
    			if ($value->format('H:i:s')  == '00:00:00') $value = $value->format('Y-m-d');
13
    			else $value = $value->format('Y-m-d H:i:s');
14
    		}
15
16
            if (is_object($value)) continue;
17
			if (is_numeric($key) && is_array($value)) {
18
				$result = $this->createSql($value, $key);
19
				foreach ($result['args'] as $arg_key => $arg) $args[$arg_key] = $arg;
20
				foreach ($result['sql'] as $arg) $sql[] = $arg;
21
			}
22
			else if (\Maphper\Maphper::FIND_BETWEEN & $mode) {
23
				$sql[] = $key . '>= :' . $key . 'from';
24
				$sql[] = $key . ' <= :' . $key . 'to';
25
26
				$args[$key . 'from'] = $value[0];
27
				$args[$key . 'to'] = $value[1];
28
			}
29
			else if (!is_numeric($key) && is_array($value)) {
30
				$inSql = [];
31
				$count = count($value);
32
				for ($i = 0; $i < $count; $i++) {
33
					$args[$key . $i] = $value[$i];
34
					$inSql[] = ':' . $key . $i;
35
				}
36
				if (count($inSql) == 0) return [];
37
				else $sql[] = $key . ' IN ( ' .  implode(', ', $inSql) . ')';
38
			}
39
			else if ($value === NULL) {
40
				$nullSql = $key . ' IS ';
41
				if (\Maphper\Maphper::FIND_NOT & $mode) $nullSql .= 'NOT ';
42
				$sql[] = $nullSql . 'NULL';
43
			}
44
			else {
45
46
				if (\Maphper\Maphper::FIND_LIKE & $mode) {
47
					$operator = 'LIKE';
48
					$value = '%' . $value . '%';
49
				}
50
				else if (\Maphper\Maphper::FIND_STARTS & $mode) {
51
					$operator = 'LIKE';
52
					$value = $value . '%';
53
				}
54
				else $operator = $this->getOperator($mode);
55
56
				$args[$key] = $value;
57
				$sql[] = $key . ' ' . $operator . ' :' . $key;
58
			}
59
		}
60
61
		if (\Maphper\Maphper::FIND_OR & $mode) $query = implode(' OR  ', $sql);
62
		else $query = implode(' AND ', $sql);
63
		if (!empty($query)) $query = '(' . $query . ')';
64
		return ['args' => $args, 'sql' => $query];
65
	}
66
67
    private function getOperator($mode) {
68
        $operator = "";
69
70
        if (\Maphper\Maphper::FIND_NOCASE & $mode) $operator = 'LIKE';
71
        else if (\Maphper\Maphper::FIND_BIT & $mode) $operator = '&';
72
        else if (\Maphper\Maphper::FIND_GREATER & $mode) $operator = '>';
73
        else if (\Maphper\Maphper::FIND_LESS & $mode) $operator = '<';
74
        else if (\Maphper\Maphper::FIND_NOT & $mode) $operator = '!=';
75
76
        if (\Maphper\Maphper::FIND_EXACT & $mode) $operator .= '=';
77
78
        return $operator;
79
    }
80
}
81