Query::getRange()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 1
nop 1
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @package Cadmium\Framework\DB
5
 * @author Anton Romanov
6
 * @copyright Copyright (c) 2015-2017, Anton Romanov
7
 * @link http://cadmium-cms.com
8
 */
9
10
namespace DB {
11
12
	use Type;
13
14
	abstract class Query {
15
16
		protected $query = '';
17
18
		/**
19
		 * Get a field/table name
20
		 */
21
22
		protected function getName(string $name) : string {
23
24
			return preg_replace('/[^a-zA-Z0-9_]/', '_', trim($name));
25
		}
26
27
		/**
28
		 * Get a field value
29
		 */
30
31
		protected function getValue(string $value) : string {
32
33
			return ('\'' . addslashes($value) . '\'');
34
		}
35
36
		/**
37
		 * Get a range of values
38
		 */
39
40
		protected function getRange(array $value) : string {
41
42
			$parser = function ($value) { if (is_scalar($value)) return $this->getValue($value); };
43
44
			return ('(' . implode(', ', array_filter(array_map($parser, $value))) . ')');
45
		}
46
47
		/**
48
		 * Get an operatable value (value with an operator)
49
		 */
50
51
		protected function getOperatable($value) {
52
53
			if (is_scalar($value)) return ('= ' . $this->getValue($value));
54
55
			if (is_array($value)) return ('IN ' . $this->getRange($value));
56
57
			if ($value instanceof Type\Not) return ('NOT ' . $this->getValue($value->get()));
58
59
			if ($value instanceof Type\Like) return ('LIKE ' . $this->getValue($value->get()));
60
61
			if ($value instanceof Type\LessThan) return ('< ' . $value->get());
62
63
			if ($value instanceof Type\GreaterThan) return ('> ' . $value->get());
64
65
			if ($value instanceof Type\LessThanOrEqual) return ('<= ' . $value->get());
66
67
			if ($value instanceof Type\GreaterThanOrEqual) return ('>= ' . $value->get());
68
69
			# ------------------------
70
71
			return '';
72
		}
73
74
		/**
75
		 * Get a field sorting direction
76
		 */
77
78
		protected function getDirection(string $direction) : string {
79
80
			return ((strtoupper($direction) !== 'DESC') ? 'ASC' : 'DESC');
81
		}
82
83
		/**
84
		 * Convert a data array to a string
85
		 */
86
87
		protected function getString($source = null, string $pattern = '', string $separator = '') : string {
88
89
			if (!is_array($source)) return (is_scalar($source) ? strval($source) : '');
90
91
			$regexs = ['key' => '/\^([a-z]+)/', 'value' => '/\$([a-z]+)/']; $matches = ['key' => [], 'value' => []];
92
93
			$parsers = ['name' => 'getName', 'value' => 'getValue', 'range' => 'getRange',
94
95
						'operatable' => 'getOperatable', 'direction' => 'getDirection'];
96
97
			$output = []; $count = 0;
98
99
			# Parse pattern
100
101
			foreach ($regexs as $name => $regex) preg_match($regex, $pattern, $matches[$name]);
102
103
			# Process replacements
104
105
			foreach ($source as $key => $value) {
106
107
				$output[$count] = $pattern; $item = &$output[$count++];
108
109
				foreach ($matches as $name => $match) if (isset($match[1]) && isset($parsers[$match[1]])) {
110
111
					try { $replace = [$this, $parsers[$match[1]]]($$name); } catch (\TypeError $e) { $replace = ''; }
112
113
					$item = str_replace($match[0], $replace, $item);
114
				}
115
			}
116
117
			# ------------------------
118
119
			return implode($separator, $output);
120
		}
121
122
		/**
123
		 * Convert the object to a string
124
		 */
125
126
		public function __toString() : string {
127
128
			return $this->query;
129
		}
130
	}
131
}
132