Добавлен оператор "!=", переработка, оптимизация

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-02-24 08:22:04 +10:00
parent bf44832914
commit 7288baa959
7 changed files with 193 additions and 164 deletions

View File

@ -57,7 +57,7 @@ use explosivebit\arangodb\Query;
$query = new Query; $query = new Query;
// compose the query // compose the query
$query->select(['name', 'status']) $query->select(['name', 'status'])
->from('customer') ->collection('customer')
->limit(10); ->limit(10);
// execute the query // execute the query
$rows = $query->all(); $rows = $query->all();
@ -103,7 +103,7 @@ use yii\data\ActiveDataProvider;
use explosivebit\arangodb\Query; use explosivebit\arangodb\Query;
$query = new Query; $query = new Query;
$query->from('customer')->where(['status' => 2]); $query->collection('customer')->where(['status' => 2]);
$provider = new ActiveDataProvider([ $provider = new ActiveDataProvider([
'query' => $query, 'query' => $query,
'pagination' => [ 'pagination' => [

View File

@ -62,7 +62,7 @@ use explosivebit\arangodb\Query;
$query = new Query; $query = new Query;
// compose the query // compose the query
$query->select(['name', 'status']) $query->select(['name', 'status'])
->from('customer') ->collection('customer')
->limit(10); ->limit(10);
// execute the query // execute the query
$rows = $query->all(); $rows = $query->all();
@ -108,7 +108,7 @@ use yii\data\ActiveDataProvider;
use explosivebit\arangodb\Query; use explosivebit\arangodb\Query;
$query = new Query; $query = new Query;
$query->from('customer')->where(['status' => 2]); $query->collection('customer')->where(['status' => 2]);
$provider = new ActiveDataProvider([ $provider = new ActiveDataProvider([
'query' => $query, 'query' => $query,
'pagination' => [ 'pagination' => [

View File

@ -20,7 +20,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
parent::__construct($config); parent::__construct($config);
} }
protected function genQuery($query = null, $params = []) protected function genQuery($query = null, array $params = [])
{ {
if ($this->primaryModel !== null) { if ($this->primaryModel !== null) {
// lazy loading // lazy loading

View File

@ -102,9 +102,8 @@ abstract class ActiveRecord extends BaseActiveRecord
* // FOR customer IN customer FILTER customer.age>30 RETURN customer * // FOR customer IN customer FILTER customer.age>30 RETURN customer
* $customers = Customer::find()->where('age>30')->all(); * $customers = Customer::find()->where('age>30')->all();
* *
* @return ActiveQueryInterface the newly created [[ActiveQueryInterface|ActiveQuery]] instance.
*/ */
public static function find() public static function find(): ActiveQuery
{ {
/** @var ActiveQuery $query */ /** @var ActiveQuery $query */
$query = Yii::createObject(ActiveQuery::class, [get_called_class()]); $query = Yii::createObject(ActiveQuery::class, [get_called_class()]);

View File

@ -4,7 +4,7 @@ namespace mirzaev\yii2\arangodb;
use Yii; use Yii;
use yii\base\Component; use yii\base\Component;
use yii\base\InvalidParamException; use yii\base\InvalidArgumentException;
use yii\base\NotSupportedException; use yii\base\NotSupportedException;
use yii\db\QueryInterface; use yii\db\QueryInterface;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
@ -67,6 +67,18 @@ class Query extends Component implements QueryInterface
public $offset; public $offset;
/**
* Поиск
*
* [свойство => его значение]
*/
public array $search;
/**
* Тип поиска
*/
public string $searchType = 'START';
public $orderBy; public $orderBy;
public $indexBy; public $indexBy;
@ -94,7 +106,7 @@ class Query extends Component implements QueryInterface
* @param $params * @param $params
* @return array [$aql, $params] * @return array [$aql, $params]
*/ */
private static function prepareBindVars($aql, $params) private static function prepareBindVars($aql, array $params)
{ {
$search = []; $search = [];
$replace = []; $replace = [];
@ -169,7 +181,7 @@ class Query extends Component implements QueryInterface
* @param $fields * @param $fields
* @return $this * @return $this
*/ */
public function select($fields) public function select($fields): self
{ {
$this->select = $fields; $this->select = $fields;
@ -180,7 +192,7 @@ class Query extends Component implements QueryInterface
* @param $collection * @param $collection
* @return $this * @return $this
*/ */
public function collection(string $collection) public function collection(string $collection): self
{ {
$this->collection = $collection; $this->collection = $collection;
@ -189,7 +201,7 @@ class Query extends Component implements QueryInterface
/** /**
*/ */
public function for(string|array $for) public function for(string|array $for): self
{ {
$this->for = $for; $this->for = $for;
@ -198,13 +210,23 @@ class Query extends Component implements QueryInterface
/** /**
*/ */
public function in(string|array $in) public function in(string|array $in): self
{ {
$this->in = $in; $this->in = $in;
return $this; return $this;
} }
/**
*/
public function search(array $text, string $type = 'START'): self
{
$this->search = $text;
$this->searchType = $type;
return $this;
}
/** /**
* Обойти коллекцию вершин по направлению * Обойти коллекцию вершин по направлению
@ -216,12 +238,12 @@ class Query extends Component implements QueryInterface
* @param mixed $vertex Коллекция вершин из которой требуется обход * @param mixed $vertex Коллекция вершин из которой требуется обход
* @param string $direction Направление ('INBOUND', 'OUTBOUND', 'ANY') * @param string $direction Направление ('INBOUND', 'OUTBOUND', 'ANY')
*/ */
public function traversal(string $vertex, string $direction = 'INBOUND'): static public function traversal(string $vertex, string $direction = 'ANY'): static
{ {
$this->traversals[] = [ $this->traversals[] = [
match ($direction) { match (strtoupper($direction)) {
'INBOUND', 'OUTBOUND', 'ANY' => $direction, 'INBOUND', 'OUTBOUND', 'ANY' => $direction,
default => null default => 'ANY'
} }
=> $vertex => $vertex
]; ];
@ -260,7 +282,7 @@ class Query extends Component implements QueryInterface
* 1. "IN account" * 1. "IN account"
* 2. "IN INBOUND supply account_edge_supply" * 2. "IN INBOUND supply account_edge_supply"
*/ */
protected static function genIn(string|array|null $in, array $traversals = null): string protected static function genIn(string|array|null $in, array $traversals = []): string
{ {
if (is_array($in)) { if (is_array($in)) {
// Если передан массив, то конвертировать в строку // Если передан массив, то конвертировать в строку
@ -334,11 +356,10 @@ class Query extends Component implements QueryInterface
* @param $params * @param $params
* @return string * @return string
*/ */
protected function genWhere($condition, &$params) protected function genWhere($condition, array &$params)
{ {
$where = $this->genCondition($condition, $params);
return $where ? 'FILTER ' . $where : ''; return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : '';
} }
/** /**
@ -348,7 +369,7 @@ class Query extends Component implements QueryInterface
* *
* @todo Разобраться с этим говном * @todo Разобраться с этим говном
*/ */
protected function genCondition($condition, &$params) protected function genCondition($condition, array &$params)
{ {
if (!is_array($condition)) { if (!is_array($condition)) {
return (string) $condition; return (string) $condition;
@ -356,16 +377,23 @@ class Query extends Component implements QueryInterface
return ''; return '';
} }
if (isset($condition[0])) { // operator format: operator, operand 1, operand 2, ... /**
* @todo Переписать под новую архитектуру
*/
if (isset($condition[0]) && is_string($condition[0])) {
// Формат: operator, operand 1, operand 2, ...
$operator = strtoupper($condition[0]); $operator = strtoupper($condition[0]);
if (isset($this->conditionBuilders[$operator])) { if (isset($this->conditionBuilders[$operator])) {
$method = $this->conditionBuilders[$operator]; $method = $this->conditionBuilders[$operator];
array_shift($condition); array_shift($condition);
return $this->$method($operator, $condition, $params); return $this->$method($operator, $condition, $params);
} else { } else {
throw new InvalidParamException('Found unknown operator in query: ' . $operator); throw new InvalidArgumentException('Found unknown operator in query: ' . $operator);
} }
} else { // hash format: 'column1' => 'value1', 'column2' => 'value2', ... } else {
// hash format: 'column1' => 'value1', 'column2' => 'value2', ...
return $this->genHashCondition($condition, $params); return $this->genHashCondition($condition, $params);
} }
} }
@ -376,27 +404,92 @@ class Query extends Component implements QueryInterface
* @return string * @return string
* @throws Exception * @throws Exception
*/ */
protected function genHashCondition($condition, &$params) protected function genHashCondition(array $condition, array &$params)
{ {
$parts = []; $parts = [];
foreach ($condition as $column => $value) {
if (is_array($value) || $value instanceof Query) { foreach ($condition as $key => $value) {
// IN condition // Перебор выражений
$parts[] = $this->genInCondition('IN', [$column, $value], $params);
// Инициализация
$operator = $condition['operator'] ?? '==';
if (is_int($key) && is_array($value)) {
// Обычный массив (вложенное выражение)
// Начало рекурсивного поиска выражений
recursive_expressions_search:
// Реинициализация
$operator = $value['operator'] ?? $operator;
foreach ($value as $key => $value) {
// Перебор выражений в сложном режиме
if (is_int($key) && is_array($value)) {
// Многомерный массив
// Рекурсивный поиск выражений
goto recursive_expressions_search;
}
// Защита алгоритма от использования параметров как продолжения выражения
$break = true;
// Генерация
$this->filterHashCondition($key, $value, $params, $parts, $operator);
}
} else { } else {
if (strpos($column, '(') === false) { // Ассоциативный массив (простой режим)
$column = $this->quoteColumnName($column);
} if (isset($break)) {
if ($value === null) { // Обработка завершена дальше в цикле идут параметры
$parts[] = "$column == null";
} else { break;
$phName = self::PARAM_PREFIX . count($params);
$parts[] = "$column==@$phName";
$params[$phName] = $value;
} }
// Генерация
$this->filterHashCondition($key, $value, $params, $parts, $operator);
}
}
return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')';
}
/**
* @todo Можно добавить проверку операторов
*/
protected function filterHashCondition(mixed $column, mixed $value, array &$params, array &$parts, string $operator = '==')
{
if (is_array($value) || $value instanceof Query) {
// Правый операнд передан как массив или инстанция Query
// IN condition
$parts[] = $this->genInCondition('IN', [$column, $value], $params);
} else {
// Правый операнд передан как строка (подразумевается)
if (strpos($column, '(') === false) {
$column = $this->quoteColumnName($column);
}
if ($value === null) {
// Конвертация null
// Генерация
$parts[] = "$column $operator null";
} else {
// Обычная обработка параметра
$phName = self::PARAM_PREFIX . count($params);
// Генерация
$parts[] = "$column $operator @$phName";
$params[$phName] = $value;
} }
} }
return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')';
} }
/** /**
@ -432,7 +525,7 @@ class Query extends Component implements QueryInterface
protected function genNotCondition($operator, $operands, &$params) protected function genNotCondition($operator, $operands, &$params)
{ {
if (count($operands) != 1) { if (count($operands) != 1) {
throw new InvalidParamException("Operator '$operator' requires exactly one operand."); throw new InvalidArgumentException("Operator '$operator' requires exactly one operand.");
} }
$operand = reset($operands); $operand = reset($operands);
@ -468,7 +561,7 @@ class Query extends Component implements QueryInterface
if ($values instanceof Query) { if ($values instanceof Query) {
// sub-query // sub-query
list($sql, $params) = $this->genQuery($values, $params); list($sql, $params) = $this->genQuery($values, $params);
$column = (array)$column; $column = $column;
if (is_array($column)) { if (is_array($column)) {
foreach ($column as $i => $col) { foreach ($column as $i => $col) {
if (strpos($col, '(') === false) { if (strpos($col, '(') === false) {
@ -477,6 +570,7 @@ class Query extends Component implements QueryInterface
} }
return '(' . implode(', ', $column) . ") {$this->conditionMap[$operator]} ($sql)"; return '(' . implode(', ', $column) . ") {$this->conditionMap[$operator]} ($sql)";
} else { } else {
if (strpos($column, '(') === false) { if (strpos($column, '(') === false) {
$column = $this->quoteColumnName($column); $column = $this->quoteColumnName($column);
} }
@ -556,12 +650,12 @@ class Query extends Component implements QueryInterface
* describe the interval that column value should be in. * describe the interval that column value should be in.
* @param array $params the binding parameters to be populated * @param array $params the binding parameters to be populated
* @return string the generated AQL expression * @return string the generated AQL expression
* @throws InvalidParamException if wrong number of operands have been given. * @throws InvalidArgumentException if wrong number of operands have been given.
*/ */
public function genBetweenCondition($operator, $operands, &$params) public function genBetweenCondition($operator, $operands, &$params)
{ {
if (!isset($operands[0], $operands[1], $operands[2])) { if (!isset($operands[0], $operands[1], $operands[2])) {
throw new InvalidParamException("Operator '$operator' requires three operands."); throw new InvalidArgumentException("Operator '$operator' requires three operands.");
} }
list($column, $value1, $value2) = $operands; list($column, $value1, $value2) = $operands;
@ -586,7 +680,7 @@ class Query extends Component implements QueryInterface
protected function genLikeCondition($operator, $condition, &$params) protected function genLikeCondition($operator, $condition, &$params)
{ {
if (!(isset($condition[0]) && isset($condition[1]))) { if (!(isset($condition[0]) && isset($condition[1]))) {
throw new InvalidParamException("You must set 'column' and 'pattern' params"); throw new InvalidArgumentException("You must set 'column' and 'pattern' params");
} }
$caseInsensitive = isset($condition[2]) ? (bool)$condition[2] : false; $caseInsensitive = isset($condition[2]) ? (bool)$condition[2] : false;
return $this->conditionMap[$operator] return $this->conditionMap[$operator]
@ -671,18 +765,21 @@ class Query extends Component implements QueryInterface
* @param null $query * @param null $query
* @param array $params * @param array $params
* @return array * @return array
*
* @todo Оптимизировать и создать регулируемую очередь выполнения
*/ */
protected function genQuery($query = null, $params = []) protected function genQuery($query = null, array $params = [])
{ {
$query = isset($query) ? $query : $this; isset($query) ? $query : $query = $this;
$params = empty($params) ? $query->params : array_merge($params, $query->params); $params = array_merge($params, $query->params);
$clauses = [ $clauses = [
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->genWhere($query->where, $params), $this->genWhere($query->where, $params),
isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null,
$this->genOrderBy($query->orderBy, $params), $this->genOrderBy($query->orderBy, $params),
$this->genLimit($query->limit, $query->offset, $params), $this->genLimit($query->limit, $query->offset, $params),
$this->genSelect($query->select, $params), $this->genSelect($query->select, $params),
@ -848,75 +945,6 @@ class Query extends Component implements QueryInterface
true; true;
} }
/**
* Представление
*
* Работа с представлениями
*
* @see https://www.arangodb.com/docs/3.7/http/views.html
*
* @param string $collection
* @param string|array $vars
* @param array $expression
* @param string $type
* @param array $params
* @param Connection $db
*/
public function view(string $collection, string|array|null $vars = null, array $expression = null, string $type = null, array $params = [], $db = null): array
{
$this->collection = $collection;
$clauses = [
$this->genFor($collection),
$this->genIn($collection),
$this->genSearch($expression, $type),
$this->genLimit($this->limit, 0),
$this->genOptions(),
$this->genSelect($vars, $params)
];
$aql = implode($this->separator, array_filter($clauses));
$params = ArrayHelper::merge(
$params,
[
'query' => $aql,
'bindVars' => $params,
]
);
$statement = $this->getStatement($params, $db);
$token = $this->getRawAql($statement);
Yii::info($token, 'mirzaev\yii2\arangodb\Query::search');
try {
Yii::beginProfile($token, 'mirzaev\yii2\arangodb\Query::search');
$cursor = $statement->execute();
Yii::endProfile($token, 'mirzaev\yii2\arangodb\Query::search');
} catch (Exception $ex) {
Yii::endProfile($token, 'mirzaev\yii2\arangodb\Query::search');
throw new Exception($ex->getMessage(), (int) $ex->getCode(), $ex);
}
return $this->prepareResult($cursor->getAll());
}
/**
* Поиск ребра
*
* Работа с представлениями
*/
// public function searchEdge(string $collection, string $_from, string $_to, string|array|null $vars = null, string $direction = 'INBOUND', array $expression = null, array $params = [], $db = null)
// {
// $this->collection = $collection;
// $clauses = [
// $this->genFor($_from),
// $this->genLet($collection, $this->genFor([$_from, $collection], [$_to, $collection], $direction), $params),
// $this->genLimit($this->limit, 0),
// $this->genOptions(),
// $this->genSelect($vars, $params)
// ];
// $aql = implode($this->separator, array_filter($clauses));
// }
/** /**
* @param $collection * @param $collection
* @param array $condition * @param array $condition
@ -1026,10 +1054,10 @@ class Query extends Component implements QueryInterface
$condition = '"' . $value . '"'; $condition = '"' . $value . '"';
} }
$result .= 'LET ' . $name . ' = ' . $condition . ', '; $result .= 'LET ' . $name . ' = ' . $condition . ' ';
} }
return trim($result, ', '); return trim($result);
} }
/** /**
@ -1171,13 +1199,14 @@ class Query extends Component implements QueryInterface
} }
/** /**
* @param array|string $condition * @param array $expression
* @param array $params
* @return $this|static
*/ */
public function where($condition) public function where($expression)
{ {
$this->where = $condition; $this->where = match (true) {
is_null($this->where) => $expression,
default => ['AND', $this->where, $expression]
};
return $this; return $this;
} }
@ -1198,12 +1227,12 @@ class Query extends Component implements QueryInterface
*/ */
public function andWhere($condition, $params = []) public function andWhere($condition, $params = [])
{ {
if ($this->where === null) { if (is_null($this->where)) {
$this->where = $condition; $this->where = $condition;
} else { } else {
$this->where = ['AND', $this->where, $condition]; $this->where = ['AND', $this->where, $condition];
} }
$this->addParams($params); $this->params($params);
return $this; return $this;
} }
@ -1219,7 +1248,7 @@ class Query extends Component implements QueryInterface
} else { } else {
$this->where = ['OR', $this->where, $condition]; $this->where = ['OR', $this->where, $condition];
} }
$this->addParams($params); $this->params($params);
return $this; return $this;
} }
@ -1261,12 +1290,9 @@ class Query extends Component implements QueryInterface
public function filterStartsWith(array $expression): string public function filterStartsWith(array $expression): string
{ {
// Инициализация
$return = [];
// Генерация // Генерация
foreach ($expression as $key => $value) { foreach ($expression as $key => $value) {
if ($return) { if (isset($return)) {
$return .= ' OR STARTS_WITH(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\")"; $return .= ' OR STARTS_WITH(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\")";
} else { } else {
$return = 'STARTS_WITH(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\")"; $return = 'STARTS_WITH(' . $this->quoteCollectionName($this->collection) . ".$key, \"$value\")";
@ -1495,35 +1521,36 @@ class Query extends Component implements QueryInterface
* @param array $params list of query parameter values indexed by parameter placeholders. * @param array $params list of query parameter values indexed by parameter placeholders.
* For example, `[':name' => 'Dan', ':age' => 31]`. * For example, `[':name' => 'Dan', ':age' => 31]`.
* @return static the query object itself * @return static the query object itself
* @see addParams()
*/
public function params($params)
{
$this->params = $params;
return $this;
}
/**
* Adds additional parameters to be bound to the query.
* @param array $params list of query parameter values indexed by parameter placeholders.
* For example, `[':name' => 'Dan', ':age' => 31]`.
* @return static the query object itself
* @see params() * @see params()
*/ */
public function addParams($params) public function params(array ...$params)
{ {
if (!empty($params)) { foreach ($params as $params) {
if (empty($this->params)) { // Перебор параметров
$this->params = $params;
} else { $this->params = match (true) {
foreach ($params as $name => $value) { empty($this->params) => $params,
if (is_integer($name)) { default => (function ($params) {
$this->params[] = $value; // Инициализация
} else { $return = [];
$this->params[$name] = $value;
foreach ($params as $name => $value) {
// Перебор параметров
if (is_integer($name)) {
// Обычный массив
$return[] = $value;
} else {
// Ассоциативный массив
$return[$name] = $value;
}
} }
}
} return array_merge($this->params, $return);
})($params)
};
} }
return $this; return $this;

View File

@ -17,15 +17,18 @@ class MigrateController extends BaseMigrateController
* @var string the name of the collection for keeping applied migration information. * @var string the name of the collection for keeping applied migration information.
*/ */
public $migrationCollection = 'migration'; public $migrationCollection = 'migration';
/** /**
* @var string the directory storing the migration classes. This can be either * @var string the directory storing the migration classes. This can be either
* a path alias or a directory. * a path alias or a directory.
*/ */
public $migrationPath = '@app/migrations/arangodb'; public $migrationPath = '@app/migrations/arangodb';
/** /**
* @inheritdoc * @inheritdoc
*/ */
public $templateFile = '@explosivebit/arangodb/views/migration.php'; public $templateFile = '@mirzaev/yii2/arangodb/views/migration.php';
/** /**
* @var Connection|string the DB connection object or the application * @var Connection|string the DB connection object or the application
* component ID of the DB connection. * component ID of the DB connection.
@ -55,7 +58,7 @@ class MigrateController extends BaseMigrateController
if (parent::beforeAction($action)) { if (parent::beforeAction($action)) {
if ($action->id !== 'create') { if ($action->id !== 'create') {
if (is_string($this->db)) { if (is_string($this->db)) {
$this->db = \Yii::$app->get($this->db); $this->db = yii::$app->get($this->db);
} }
if (!$this->db instanceof Connection) { if (!$this->db instanceof Connection) {
throw new Exception("The 'db' option must refer to the application component ID of a ArangoDB connection."); throw new Exception("The 'db' option must refer to the application component ID of a ArangoDB connection.");
@ -104,7 +107,7 @@ class MigrateController extends BaseMigrateController
{ {
$query = new Query; $query = new Query;
$rows = $query->select(['version' => 'version', 'apply_time' => 'apply_time']) $rows = $query->select(['version' => 'version', 'apply_time' => 'apply_time'])
->from($this->migrationCollection) ->collection($this->migrationCollection)
->orderBy('version DESC') ->orderBy('version DESC')
->limit($limit) ->limit($limit)
->all($this->db); ->all($this->db);

View File

@ -3,7 +3,7 @@
namespace mirzaev\yii2\arangodb\panels\arangodb; namespace mirzaev\yii2\arangodb\panels\arangodb;
use mirzaev\yii2\arangodb\panels\arangodb\models\ArangoDb; use mirzaev\yii2\arangodb\panels\arangodb\models\ArangoDb;
use Yii; use yii;
use yii\debug\Panel; use yii\debug\Panel;
use yii\log\Logger; use yii\log\Logger;
@ -48,7 +48,7 @@ class ArangoDbPanel extends Panel
protected function calculateTimings() protected function calculateTimings()
{ {
if ($this->_timings === null) { if ($this->_timings === null) {
$this->_timings = Yii::getLogger()->calculateTimings($this->data['arango-messages']); $this->_timings = yii::getLogger()->calculateTimings($this->data['arango-messages']);
} }
return $this->_timings; return $this->_timings;
@ -82,8 +82,8 @@ class ArangoDbPanel extends Panel
$queryCount = count($timings); $queryCount = count($timings);
$queryTime = number_format($this->getTotalQueryTime($timings) * 1000) . ' ms'; $queryTime = number_format($this->getTotalQueryTime($timings) * 1000) . ' ms';
return \Yii::$app->view->render( return \yii::$app->view->render(
'@explosivebit/arangodb/panels/arangodb/views/summary', '@mirzaev/yii2/arangodb/panels/arangodb/views/summary',
[ [
'timings' => $this->calculateTimings(), 'timings' => $this->calculateTimings(),
'queryCount' => $queryCount, 'queryCount' => $queryCount,
@ -99,9 +99,9 @@ class ArangoDbPanel extends Panel
public function getDetail() public function getDetail()
{ {
$searchModel = new ArangoDb(); $searchModel = new ArangoDb();
$dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels()); $dataProvider = $searchModel->search(yii::$app->request->getQueryParams(), $this->getModels());
return Yii::$app->view->render('@explosivebit/arangodb/panels/arangodb/views/detail', [ return yii::$app->view->render('@mirzaev/yii2/arangodb/panels/arangodb/views/detail', [
'panel' => $this, 'panel' => $this,
'dataProvider' => $dataProvider, 'dataProvider' => $dataProvider,
'searchModel' => $searchModel, 'searchModel' => $searchModel,