Compare commits

..

9 Commits

Author SHA1 Message Date
Arsen Mirzaev Tatyano-Muradovich 8c8d34f5b2 Исправление версии пакета (без изменений) 2021-07-26 05:29:30 +10:00
Arsen Mirzaev Tatyano-Muradovich 96c80c1a77 Возможность создавать бесконечное количество FOR (foreach) 2021-07-26 05:27:33 +10:00
Arsen Mirzaev Tatyano-Muradovich 03bff66b62 Тест доступа к репозиторию 2021-06-30 14:44:54 +10:00
Arsen Mirzaev Tatyano-Muradovich b92e8792f0 Добавление фильтра STARTS_WIDTH для регистронезависимого поиска 2021-06-29 09:07:43 +10:00
Arsen Mirzaev Tatyano-Muradovich cbc26916ea Исправления 2021-04-12 05:27:43 +10:00
Arsen Mirzaev Tatyano-Muradovich b3a5b7b51f Исправление ошибок 2021-04-11 11:51:59 +10:00
Arsen Mirzaev Tatyano-Muradovich 778513b3bb Исправление ошибок и обработка for 2021-04-11 11:48:55 +10:00
Arsen Mirzaev Tatyano-Muradovich eb5e18dfd6 Исправление ошибки в genQuery() 2021-04-11 03:30:56 +10:00
Arsen Mirzaev Tatyano-Muradovich bb7b1b8f8e Улучшение логики запросов 2021-04-11 02:39:51 +10:00
2 changed files with 39 additions and 128 deletions

View File

@ -1,19 +1,19 @@
{
"name": "mirzaev/yii2-arangodb",
"description": "Library for connecting ArangoDB to Yii2",
"description": "Library for connecting ArangoDB-PHP to Yii2",
"keywords": [
"Yii2",
"ArangoDB"
],
"type": "yii2-extension",
"license": "WTFPL",
"homepage": "https://git.mirzaev.sexy/mirzaev/yii2-arangodb",
"license": "AGPL-3.0-or-later",
"homepage": "https://git.hood.su/mirzaev/yii2/arangodb",
"authors": [
{
"name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy",
"role": "Programmer"
"email": "red@hood.su",
"homepage": "https://hood.su/mirzaev",
"role": "Developer"
},
{
"name": "Ilya Rumyantsev",

View File

@ -74,19 +74,24 @@ class Query extends Component implements QueryInterface
*
* [свойство => его значение]
*/
public array|string $search;
public array $search;
/**
* Фильтр
* Тип поиска
*/
public string $searchType = 'START';
/**
* Поиск
*
* [свойство => его значение]
*/
public array|string $filter;
public array $filter;
/**
* Отладка
* Тип поиска
*/
public bool $debug = false;
public string $filterType = 'START';
public $orderBy;
@ -152,11 +157,6 @@ class Query extends Component implements QueryInterface
]
);
if ($this->debug) {
var_dump($aql);
die;
}
return $this->getStatement($options, $db);
}
@ -233,18 +233,20 @@ class Query extends Component implements QueryInterface
/**
*/
public function search(array|string $expressions): self
public function search(array $text, string $type = 'START'): self
{
$this->search = $expressions;
$this->search = $text;
$this->searchType = $type;
return $this;
}
/**
*/
public function filter(array|string $expressions): self
public function filter(array $text, string $type = 'START'): self
{
$this->filter = $expressions;
$this->filter = $text;
$this->filterType = $type;
return $this;
}
@ -785,13 +787,8 @@ class Query extends Component implements QueryInterface
return '';
}
$orders = [];
foreach ($columns as $name => $direction) {
$orders[] = $this->quoteColumnName($name) . match($direction) {
SORT_DESC => ' DESC',
SORT_ASC => ' ASC',
default => ''
};
$orders[] = $this->quoteColumnName($name) . ($direction === SORT_DESC ? ' DESC' : '');
}
return 'SORT ' . implode(', ', $orders);
@ -870,9 +867,9 @@ class Query extends Component implements QueryInterface
$query::genIn($query->in, $query->traversals),
$query::genLet($query->lets),
$query->genForeach($query->foreach),
isset($query->search) ? $query->genSearch($query->search) : null,
isset($query->filter) ? $query->genFilter($query->filter) : null,
$query->genWhere($query->where, $params),
isset($query->search) ? $query->genSearch($query->search, $query->searchType) : null,
isset($query->filter) ? $query->genFilter($query->filter, $query->filterType) : null,
$query->genOrderBy($query->orderBy, $params),
$query->genLimit($query->limit, $query->offset, $params),
$query->genSelect($query->select, $params),
@ -880,11 +877,6 @@ class Query extends Component implements QueryInterface
$aql = implode($query->separator, array_filter($clauses));
if ($query->debug) {
var_dump($aql);
die;
}
return self::prepareBindVars($aql, $params);
}
@ -945,7 +937,6 @@ class Query extends Component implements QueryInterface
$statement = $this->createCommand($db);
$token = $this->getRawAql($statement);
Yii::info($token, 'mirzaev\yii2\arangodb\Query::query');
@ -1137,31 +1128,16 @@ class Query extends Component implements QueryInterface
* @param $columns
* @return string
*/
protected function genSearch(array|string $expressions): string
protected function genSearch(array $expression, string $type = 'START'): string
{
if (is_string($expressions)) return $expressions;
// Инициализация строки запроса
$query = 'SEARCH ';
foreach ($expressions as $expression) {
// Перебор выражений
// Инициализация оператора
$operator = isset($expression['operator']) ? ' ' . $expression['operator'] . ' ' : '';
// Генерация строки запроса
$query .= match (strtoupper($expression['type'])) {
'START', 'STARTS', 'STARTS_WITH' => $operator . $this->filterStartsWith($expression['condition']),
'START_SENSETIVE' => $operator . $this->filterStartsWith($expression['condition'], sensetive: true),
'CONTAINS', 'LIKE' => $operator . $this->filterContains($expression['condition']),
'LEVENSHTEIN' => $operator . $this->filterLevenshtein($expression['condition'], ...$expression['parameters']),
'PHRASE' => $operator . $this->filterPhrase($expression['condition'], ...$expression['parameters']),
default => $operator . Serializer::encode($expression['condition'])
};
}
return $query;
return match (strtoupper($type)) {
'START', 'STARTS', 'STARTS_WITH' => $query . $this->filterStartsWith($expression),
'START_SENSETIVE' => $query . $this->filterStartsWith($expression, sensetive: true),
'CONTAINS', 'LIKE' => $query . $this->filterContains($expression),
default => $query . Serializer::encode($expression)
};
}
/**
@ -1169,31 +1145,16 @@ class Query extends Component implements QueryInterface
* @param $columns
* @return string
*/
protected function genFilter(array|string $expressions): string
protected function genFilter(array $expression, string $type = 'START'): string
{
if (isString($expressions)) return $expressions;
// Инициализация строки запроса
$query = 'FILTER ';
foreach ($expressions as $expression) {
// Перебор выражений
// Инициализация оператора
$operator = isset($expression['operator']) ? ' ' . $expression['operator'] . ' ' : '';
// Генерация строки запроса
$query .= match (strtoupper($expression['type'])) {
'START', 'STARTS', 'STARTS_WITH' => $operator . $this->filterStartsWith($expression['condition']),
'START_SENSETIVE' => $operator . $this->filterStartsWith($expression['condition'], sensetive: true),
'CONTAINS', 'LIKE' => $operator . $this->filterContains($expression['condition']),
'LEVENSHTEIN' => $operator . $this->filterLevenshtein($expression['condition'], ...$expression['parameters']),
'PHRASE' => $operator . $this->filterPhrase($expression['condition'], ...$expression['parameters']),
default => $operator . Serializer::encode($expression['condition'])
};
}
return $query;
return match (strtoupper($type)) {
'START', 'STARTS', 'STARTS_WITH' => $query . $this->filterStartsWith($expression),
'START_SENSETIVE' => $query . $this->filterStartsWith($expression, sensetive: true),
'CONTAINS', 'LIKE' => $query . $this->filterContains($expression),
default => $query . Serializer::encode($expression)
};
}
/**
@ -1396,17 +1357,6 @@ class Query extends Component implements QueryInterface
return $this;
}
/**
* @param array $expression
*/
public function debug(bool $status = true)
{
$this->debug = $status;
return $this;
}
/**
*/
public function let(string $name, mixed $value): static
@ -1533,44 +1483,6 @@ class Query extends Component implements QueryInterface
return $return;
}
public function filterPhrase(array $expression, string $analyzer = 'text_en'): string
{
// Инициализация
$return = [];
foreach ($expression as $key => $value) {
// Перебор выражений
if ($return) {
$return .= ' OR PHRASE(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\", \"$analyzer\")";
} else {
$return = 'PHRASE(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\", \"$analyzer\")";
}
}
return $return;
}
public function filterLevenshtein(array $expression, string $analyzer = 'text_en', int $distance = 3, bool $transpositions = true): string
{
// Инициализация
$return = [];
$transpositions = $transpositions ? 'true' : 'false';
foreach ($expression as $key => $value) {
// Перебор выражений
if ($return) {
$return .= ' OR ANALYZER(LEVENSHTEIN_MATCH(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\", $distance, $transpositions), \"$analyzer\")";
} else {
$return = 'ANALYZER(LEVENSHTEIN_MATCH(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\", $distance, $transpositions), \"$analyzer\")";
}
}
return $return;
}
/**
* Adds an additional WHERE condition to the existing one but ignores [[isEmpty()|empty operands]].
* The new condition and the existing one will be joined using the 'AND' operator.
@ -1768,7 +1680,6 @@ class Query extends Component implements QueryInterface
$result[$column] = SORT_ASC;
}
}
return $result;
}
}