foreach();

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-03-07 21:03:17 +10:00
parent 7288baa959
commit bb4fa52274

View File

@ -61,6 +61,8 @@ class Query extends Component implements QueryInterface
*/ */
public array $traversals = []; public array $traversals = [];
public $foreach = [];
public $where = []; public $where = [];
public $limit; public $limit;
@ -351,6 +353,46 @@ class Query extends Component implements QueryInterface
return $prefix . $name; return $prefix . $name;
} }
/**
* Генерация AQL кода "FOR IN"
*
* @param $condition
* @param $params
* @return string
*/
protected function genForeach(array $conditions): ?string
{
// Инициализация
$aql = '';
foreach ($conditions as $condition) {
// Перебор выражений
genForeach_recursion:
foreach ($condition as $FOR => $IN) {
// Инициализация операндов
if (is_int($FOR) && is_array($IN)) {
// Вложенный массив (неожиданные входные данные)
// Реинициализация
$condition = $IN;
// Перебор вложенного массива
goto genForeach_recursion;
}
$aql .= "FOR $FOR IN $IN ";
}
}
// Постобработка
$aql = trim($aql);
return $aql;
}
/** /**
* @param $condition * @param $condition
* @param $params * @param $params
@ -358,7 +400,6 @@ class Query extends Component implements QueryInterface
*/ */
protected function genWhere($condition, array &$params) protected function genWhere($condition, array &$params)
{ {
return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : ''; return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : '';
} }
@ -380,7 +421,7 @@ class Query extends Component implements QueryInterface
/** /**
* @todo Переписать под новую архитектуру * @todo Переписать под новую архитектуру
*/ */
if (isset($condition[0]) && is_string($condition[0])) { if (isset($condition[0]) && is_string($condition[0]) && count($condition) > 1) {
// Формат: operator, operand 1, operand 2, ... // Формат: operator, operand 1, operand 2, ...
$operator = strtoupper($condition[0]); $operator = strtoupper($condition[0]);
@ -426,7 +467,11 @@ class Query extends Component implements QueryInterface
foreach ($value as $key => $value) { foreach ($value as $key => $value) {
// Перебор выражений в сложном режиме // Перебор выражений в сложном режиме
if (is_int($key) && is_array($value)) { if (is_int($key) && is_string($value)) {
// $key = $value;
// $value = null;
} else if (is_int($key) && is_array($value)) {
// Многомерный массив // Многомерный массив
// Рекурсивный поиск выражений // Рекурсивный поиск выражений
@ -451,7 +496,6 @@ class Query extends Component implements QueryInterface
// Генерация // Генерация
$this->filterHashCondition($key, $value, $params, $parts, $operator); $this->filterHashCondition($key, $value, $params, $parts, $operator);
} }
} }
return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')'; return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')';
@ -467,6 +511,10 @@ class Query extends Component implements QueryInterface
// IN condition // IN condition
$parts[] = $this->genInCondition('IN', [$column, $value], $params); $parts[] = $this->genInCondition('IN', [$column, $value], $params);
} else if (is_int($column) && is_string($value)) {
// Передача без ключа массива (строка с готовым выражением)
$parts[] = $value;
} else { } else {
// Правый операнд передан как строка (подразумевается) // Правый операнд передан как строка (подразумевается)
@ -778,6 +826,7 @@ class Query extends Component implements QueryInterface
static::genFor($query->for ?? $query->collection), static::genFor($query->for ?? $query->collection),
static::genIn($query->in ?? $query->collection, $query->traversals), static::genIn($query->in ?? $query->collection, $query->traversals),
static::genLet($query->vars), static::genLet($query->vars),
$this->genForeach($query->foreach),
$this->genWhere($query->where, $params), $this->genWhere($query->where, $params),
isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null, isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null,
$this->genOrderBy($query->orderBy, $params), $this->genOrderBy($query->orderBy, $params),
@ -1198,6 +1247,23 @@ class Query extends Component implements QueryInterface
return $this; return $this;
} }
/**
* Перебор
*
* FOR НАЗВАНИЕ IN ПЕРЕМЕННАЯ
*
* @param array $expression ['НАЗВАНИЕ' => 'ПЕРЕМЕННАЯ']
*/
public function foreach(array $expression)
{
$this->foreach = match (true) {
empty($this->foreach) => [$expression],
default => $this->foreach []= [$expression]
};
return $this;
}
/** /**
* @param array $expression * @param array $expression
*/ */