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 $foreach = [];
public $where = [];
public $limit;
@ -351,6 +353,46 @@ class Query extends Component implements QueryInterface
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 $params
@ -358,7 +400,6 @@ class Query extends Component implements QueryInterface
*/
protected function genWhere($condition, array &$params)
{
return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : '';
}
@ -380,7 +421,7 @@ class Query extends Component implements QueryInterface
/**
* @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 = strtoupper($condition[0]);
@ -426,7 +467,11 @@ class Query extends Component implements QueryInterface
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);
}
}
return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')';
@ -467,6 +511,10 @@ class Query extends Component implements QueryInterface
// IN condition
$parts[] = $this->genInCondition('IN', [$column, $value], $params);
} else if (is_int($column) && is_string($value)) {
// Передача без ключа массива (строка с готовым выражением)
$parts[] = $value;
} else {
// Правый операнд передан как строка (подразумевается)
@ -778,6 +826,7 @@ class Query extends Component implements QueryInterface
static::genFor($query->for ?? $query->collection),
static::genIn($query->in ?? $query->collection, $query->traversals),
static::genLet($query->vars),
$this->genForeach($query->foreach),
$this->genWhere($query->where, $params),
isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null,
$this->genOrderBy($query->orderBy, $params),
@ -1198,6 +1247,23 @@ class Query extends Component implements QueryInterface
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
*/