-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathConditionBuilder.php
104 lines (90 loc) · 2.75 KB
/
ConditionBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
/**
* Created by PhpStorm.
* User: execut
* Date: 10/18/17
* Time: 6:04 PM
*/
namespace execut\oData;
use yii\base\BaseObject;
use yii\base\Exception;
class ConditionBuilder extends BaseObject
{
public $tableSchema = null;
protected function isEmptyGuid($value) {
return $value === null;
}
public function buildColumnCondition($column, $value, $operator = null) {
if ($operator == null) {
$operator = $this->detectOperatorByColumnType($column);
}
$value = $this->escapeValue($value);
switch ($operator) {
case 'substringof':
return 'substringof(\'' . $value . '\', ' . $column . ')';
break;
case 'like':
return 'like(' . $column . ', \'' . $value . '\')';
break;
case 'eqGuid':
if ($this->isEmptyGuid($value)) {
return;
}
return $column . ' eq guid\'' . $value . '\'';
break;
case 'eq':
return '\'' . $value . '\' eq ' . $column . '';
break;
case 'bool':
$value = (bool) $value;
if ($value) {
$value = 'true';
} else {
$value = 'false';
}
return $column . ' eq ' . $value;
break;
case 'castToGuid':
$type = $this->getColumnType($column);
return $column . ' eq cast(guid\'' . $value . '\', \'' . $type . '\')';
}
}
protected function getColumnType($name) {
if ($name === 'Заказы/Заказ_Key') {
return 'Edm.Guid';
}
$column = $this->tableSchema->getColumn($name);
if (!$column) {
throw new Exception('Column "' . $name . '" is not found');
}
return $column->dbType;
}
public function escapeValue($value) {
return str_replace(['\'', '%27', "\n", "\r", "\0"], '', $value);
}
public function detectOperatorByColumnType($column) {
$type = $this->getColumnType($column);
switch ($type) {
case 'text2':
return 'substringof';
break;
case 'text':
return 'like';
break;
case 'Edm.Guid':
return 'eqGuid';
break;
case 'Edm.String':
case 'Edm.Int64':
case 'Edm.Double':
case 'Edm.Int':
return 'eq';
break;
case 'Edm.Boolean':
return 'bool';
break;
default:
return 'castToGuid';
}
}
}