Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8c8d34f5b2 | ||
![]() |
96c80c1a77 | ||
![]() |
03bff66b62 | ||
![]() |
b92e8792f0 | ||
![]() |
cbc26916ea | ||
![]() |
b3a5b7b51f | ||
![]() |
778513b3bb | ||
![]() |
eb5e18dfd6 | ||
![]() |
bb7b1b8f8e |
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user