1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
index.php
См. документацию.
1<?php
2namespace Bitrix\Perfmon\Sql;
3
4use Bitrix\Main\NotSupportedException;
5
6class Index extends BaseObject
7{
8 public $unique = false;
9 public $fulltext = false;
10 public $using = '';
11 public $columns = [];
12
18 public function __construct($name = '', $unique, $fulltext=false)
19 {
20 parent::__construct($name);
21 $this->unique = (bool)$unique;
22 $this->fulltext = (bool)$fulltext;
23 }
24
32 public function addColumn($name)
33 {
34 $this->columns[] = trim($name);
35 $this->setBody(implode(', ', $this->columns));
36 return $this;
37 }
38
52 public static function create(Tokenizer $tokenizer, $unique = false, $fulltext = false, $indexName = '')
53 {
54 if (!$indexName)
55 {
56 if ($tokenizer->testUpperText('IF'))
57 {
58 $tokenizer->skipWhiteSpace();
59
60 if ($tokenizer->testUpperText('NOT'))
61 {
62 $tokenizer->skipWhiteSpace();
63 }
64
65 if ($tokenizer->testUpperText('EXISTS'))
66 {
67 $tokenizer->skipWhiteSpace();
68 }
69 }
70
71 if ($tokenizer->getCurrentToken()->text !== '(')
72 {
73 $indexName = $tokenizer->getCurrentToken()->text;
74 $tokenizer->nextToken();
75 $tokenizer->skipWhiteSpace();
76 }
77 }
78
79 if ($tokenizer->testUpperText('ON'))
80 {
81 $tokenizer->skipWhiteSpace();
82 $tokenizer->nextToken();
83 $tokenizer->skipWhiteSpace();
84 }
85
86 if ($tokenizer->testUpperText('USING'))
87 {
88 $tokenizer->skipWhiteSpace();
89 $indexType = $tokenizer->getCurrentToken()->text;
90 if (strtoupper($indexType) !== 'GIN')
91 {
92 throw new NotSupportedException("'GIN' expected. line:" . $tokenizer->getCurrentToken()->line);
93 }
94 $fulltext = true;
95 $tokenizer->nextToken();
96 $tokenizer->skipWhiteSpace();
97 }
98
99 $index = new self($indexName, $unique, $fulltext);
100
101 if ($tokenizer->testText('('))
102 {
103 $tokenizer->skipWhiteSpace();
104 $token = $tokenizer->getCurrentToken();
105 $level = $token->level;
106 $column = '';
107 do
108 {
109 if ($token->text === ',')
110 {
111 $index->addColumn($column);
112 $column = '';
113 }
114 else
115 {
116 $column .= $token->text;
117 }
118 $token = $tokenizer->nextToken();
119 }
120 while (!$tokenizer->endOfInput() && $token->level >= $level);
121
122 if ($column)
123 {
124 $index->addColumn($column);
125 }
126
127 if (!$tokenizer->testText(')'))
128 {
129 throw new NotSupportedException("')' expected. line:" . $tokenizer->getCurrentToken()->line);
130 }
131
132 //USING BTREE
133 $tokenizer->skipWhiteSpace();
134 if ($tokenizer->testText('USING'))
135 {
136 $tokenizer->skipWhiteSpace();
137 $token = $tokenizer->nextToken();
138 $index->using = $token->text;
139 }
140 }
141 else
142 {
143 throw new NotSupportedException("'(' expected. line:" . $tokenizer->getCurrentToken()->line);
144 }
145
146 return $index;
147 }
148
159 public static function searchTableName(Tokenizer $tokenizer)
160 {
161 $lineToken = $tokenizer->getCurrentToken();
162 while (!$tokenizer->endOfInput())
163 {
164 if ($tokenizer->getCurrentToken()->upper === 'ON')
165 {
166 $tokenizer->nextToken();
167 $tokenizer->skipWhiteSpace();
168 return;
169 }
170 $tokenizer->nextToken();
171 }
172 throw new NotSupportedException('Index: table name not found. line: ' . $lineToken->line);
173 }
174
182 public function getCreateDdl($dbType = '')
183 {
184 switch ($dbType)
185 {
186 case 'MYSQL':
187 return 'CREATE ' . ($this->fulltext ? 'FULLTEXT ' : '') . ($this->unique ? 'UNIQUE ' : '') . 'INDEX ' . $this->name . ' ON ' . $this->parent->name . '(' . $this->body . ')';
188 case 'PGSQL':
189 return 'CREATE ' . ($this->unique ? 'UNIQUE ' : '') . 'INDEX ' . $this->name . ' ON ' . $this->parent->name . ($this->fulltext ? ' USING GIN (' . $this->body . ')' : '(' . $this->body . ')');
190 default:
191 return '// ' . get_class($this) . ':getDropDdl for database type [' . $dbType . '] not implemented';
192 }
193 }
194
202 public function getDropDdl($dbType = '')
203 {
204 switch ($dbType)
205 {
206 case 'MYSQL':
207 case 'MSSQL':
208 return 'DROP INDEX ' . $this->name . ' ON ' . $this->parent->name;
209 case 'ORACLE':
210 case 'PGSQL':
211 return 'DROP INDEX ' . $this->name;
212 default:
213 return '// ' . get_class($this) . ':getDropDdl for database type [' . $dbType . '] not implemented';
214 }
215 }
216
225 public function getModifyDdl(BaseObject $target, $dbType = '')
226 {
227 return [
228 $this->getDropDdl($dbType),
229 $target->getCreateDdl($dbType),
230 ];
231 }
232}
setBody($body)
Определения base_object.php:33
getCreateDdl($dbType='')
Определения base_object.php:172
getCreateDdl($dbType='')
Определения index.php:182
$columns
Определения index.php:11
static create(Tokenizer $tokenizer, $unique=false, $fulltext=false, $indexName='')
Определения index.php:52
$unique
Определения index.php:8
static searchTableName(Tokenizer $tokenizer)
Определения index.php:159
getModifyDdl(BaseObject $target, $dbType='')
Определения index.php:225
addColumn($name)
Определения index.php:32
$using
Определения index.php:10
__construct($name='', $unique, $fulltext=false)
Определения index.php:18
getDropDdl($dbType='')
Определения index.php:202
$fulltext
Определения index.php:9
$dbType
Определения autoload.php:6