Compare commits

...

38 Commits

Author SHA1 Message Date
Arsen Mirzaev Tatyano-Muradovich bbb53cca05 bebra 2022-12-18 21:53:38 +10:00
Arsen Mirzaev Tatyano-Muradovich a14fb0709f composer json 2022-12-18 21:50:47 +10:00
Arsen Mirzaev Tatyano-Muradovich df1f06ad80 LEVENSHTEIN 2022-12-18 21:46:08 +10:00
Arsen Mirzaev Tatyano-Muradovich 7a6e6fbada Исправления 2021-03-29 10:20:46 +10:00
Arsen Mirzaev Tatyano-Muradovich a7abed56d6 Доработка удаления, обновления и генерации запроса 2021-03-22 05:01:43 +10:00
Arsen Mirzaev Tatyano-Muradovich 1592238e5f Исправление метода удаления документа: remove() 2021-03-16 02:41:18 +10:00
Arsen Mirzaev Tatyano-Muradovich bb4fa52274 foreach(); 2021-03-07 21:03:17 +10:00
Arsen Mirzaev Tatyano-Muradovich 7288baa959 Добавлен оператор "!=", переработка, оптимизация 2021-02-24 08:22:04 +10:00
RedHood bf44832914 Добавление LET, Traversal. рефакторинг 2021-01-31 11:36:27 +10:00
RedHood 5faa656ede Продолжение разработки поиска по представлениям 2021-01-24 16:35:24 +10:00
RedHood 3355611e20 Начало работы над search() 2021-01-20 13:59:35 +10:00
RedHood a4be42cc82 Смена пространств имён 2021-01-20 12:08:50 +10:00
RedHood b1f31103eb Небольшие правки 2021-01-19 22:29:25 +10:00
RedHood 6c308b92e7 Ещё одна небольшая правка composer.json 2021-01-19 22:18:34 +10:00
RedHood 0dd8e7da47 Правки composer.json 2021-01-19 22:04:07 +10:00
RedHood 386f28c618 Исправление composer.json 2021-01-19 21:55:20 +10:00
RedHood fbed4c8f9a Инициализация composer 2021-01-19 21:24:40 +10:00
explosivebit fe5ba29f09
Add rus lang 2017-12-22 13:52:34 +03:00
explosivebit b833a36a9f
Update RUS readme 2017-12-22 13:49:18 +03:00
explosivebit 528aa8d565
Merge pull request #2 from elfarqy/master
Resolve #11
2017-12-22 13:43:28 +03:00
_alvian 858e86bfab add graphHandler 2017-12-22 13:55:09 +07:00
_alvian 183b2c6343 fixing composer json 2017-12-11 10:51:07 +07:00
_alvian cc0fc40e10 Merge remote-tracking branch 'upstream/master' 2017-12-06 10:19:17 +07:00
_alvian 91f93ca8a0 Add connectionHandler and export params 2017-12-06 10:12:19 +07:00
_alvian d0649796c5 change deprecated object to baseobject 2017-11-10 15:33:59 +07:00
_alvian 75b00ccc59 fixing configuration in main 2017-10-09 14:16:41 +07:00
_alvian addcb6ee18 fix config in main 2017-10-09 13:12:10 +07:00
_alvian 24ff4cd697 git fix name and dependencies 2017-10-09 13:07:44 +07:00
_alvian 7d44b5fa7b git fix class using in Query 2017-10-09 13:07:27 +07:00
_alvian 6ccd02730c fix import class in connection 2017-10-09 13:07:02 +07:00
_alvian 9c704db451 fixing connection use 2017-10-09 11:19:40 +07:00
_alvian 2f4c725b51 change composer package definition 2017-10-09 11:12:05 +07:00
_alvian 094e92df66 enhance query based on arangodb 3.2 2017-10-03 07:34:02 +07:00
_alvian c4c9b29e88 enhance connection based on new class in arangodb php 2017-10-03 06:20:15 +07:00
explosivebit ed85a8859f Merge pull request #1 from elfarqy/master
Translating readme changelog from russia to english.
2017-06-21 16:08:38 +03:00
elfarqy f8db82e5b0 fixing typo 2017-06-21 09:19:14 +07:00
elfarqy fc1ee326ab translating readme.md in english version 2017-06-21 09:17:51 +07:00
Ilya Rumyancev (MacBook) 99d42076a6 Добавлен русский Readme 2017-04-14 13:49:11 +03:00
20 changed files with 2302 additions and 1369 deletions

4
.gitignore vendored
View File

@ -1,3 +1 @@
composer.phar /vendor
composer.lock
vendor

1242
Query.php

File diff suppressed because it is too large Load Diff

207
README.RU.md Normal file
View File

@ -0,0 +1,207 @@
Коннектор ArangoDb PHP для Yii 2
===========================
Это расширение [ArangoDB](http://www.arangodb.org/) обеспечивает интеграцию в фрэймворком Yii2.
Установка
------------
Это расширение требует [ArangoDB PHP Extension](https://github.com/triAGENS/ArangoDB-PHP)
Предпочтительный способ установки с помощью [composer](http://getcomposer.org/download/).
Или запустить команду
```
php composer.phar require --prefer-dist explosivebit/yii2-arangodb "*"
```
или добавить в файл "composer.json"
```
"explosivebit/yii2-arangodb": "*"
```
Использование
-------------
Чтобы использовать это расширение, просто добавьте следующий код в конфигурацию вашего приложения:
```php
return [
//....
'components' => [
'arangodb' => [
'class' => '\explosivebit\arangodb\Connection',
'connectionOptions' => [
ArangoDBClient\ConnectionOptions::OPTION_DATABASE => "mydatabase",
ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529',
ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE => 'Basic',
//ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER => '',
//ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD => '',
],
],
],
];
```
С помощью экземпляра подключения вы можете обращаться к базам данных, коллекциям и документам.
Для выполнения запросов «search» вы должны использовать следующий класс `\explosivebit\arangodb\Query`:
```php
use explosivebit\arangodb\Query;
$query = new Query;
// compose the query
$query->select(['name', 'status'])
->collection('customer')
->limit(10);
// execute the query
$rows = $query->all();
```
Использование ActiveRecord ArangoDB
------------------------------
Этот клас обеспечивает аналогичное решение yii2 ActiveRecord, `\yii\db\ActiveRecord`.
Чтобы объявить класс ActiveRecord, вам необходимо расширить `\explosivebit\arangodb\ActiveRecord` и
реализовать методы `collectionName` и `attributes`:
```php
use explosivebit\arangodb\ActiveRecord;
class Customer extends ActiveRecord
{
/**
* @return string the name of the index associated with this ActiveRecord class.
*/
public static function collectionName()
{
return 'customer';
}
/**
* @return array list of attribute names.
*/
public function attributes()
{
return ['_key', 'name', 'email', 'address', 'status'];
}
}
```
Примечание: имя первичного ключа ('_key') любой коллекции должно всегда присутствовать и настроено как атрибут.
Вы можете использовать `\yii\data\ActiveDataProvider` c `\explosivebit\arangodb\Query` а также `\explosivebit\arangodb\ActiveQuery`:
```php
use yii\data\ActiveDataProvider;
use explosivebit\arangodb\Query;
$query = new Query;
$query->collection('customer')->where(['status' => 2]);
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
]
]);
$models = $provider->getModels();
```
```php
use yii\data\ActiveDataProvider;
use app\models\Customer;
$provider = new ActiveDataProvider([
'query' => Customer::find(),
'pagination' => [
'pageSize' => 10,
]
]);
$models = $provider->getModels();
```
Использование миграций
----------------
ArangoDB миграции осуществляются через `explosivebit\arangodb\console\controllers\MigrateController`, который является аналогом стандартных миграций yii2
`\yii\console\controllers\MigrateController`.
Чтобы включить миграции в ваше приложение , вы должны настроить конфигурацию консольного приложения:
```php
return [
// ...
'controllerMap' => [
'arangodb-migrate' => 'explosivebit\arangodb\console\controllers\MigrateController'
],
];
```
Ниже приведены примеры использования некоторых команд
```
# создание новой миграции user 'create_user_collection'
yii arangodb-migrate/create create_user_collection
# применить все новые миграции
yii arangodb-migrate
# применить 1у миграцию
yii arangodb-migrate/up 1
# откатить все миграции
yii arangodb-migrate/down
# откатить 1у миграцию
yii arangodb-migrate/down 1
```
После создания можно настроить миграции:
При запуске миграции как в примера ниже создается обычная `document` коллекция с именем миграции, для создания `edge` коллекции необходимо прописать дополнительный параметр `Type => 3`.
Пример такого запроса: `$this->createCollection('serices',['Type' => 3]);`. Если нужно создать `document` коллекцию то удалите параметр `'Type' => 3` или вместо цифры 3 встаьте 2.
```
class m170413_210957_create_services_collection extends \explosivebit\arangodb\Migration
{
public function up()
{
# При запуске миграции создается коллекция "services" с типом edge
$this->createCollection('serices',['Type' => 3]);
}
public function down()
{
# При запуске отката миграции удаляется коллекция "services"
$this->dropCollection('services');
}
}
```
Использование Debug Panel
-----------------
Добавьте панель ArangoDb в вашу конфигурацию `yii\debug\Module`
```php
return [
'bootstrap' => ['debug'],
'modules' => [
'debug' => 'yii\debug\Module',
'panels' => [
'arango' => [
'class' => 'explosivebit\arangodb\panels\arangodb\ArangoDbPanel',
],
],
...
],
...
];
```

View File

@ -1,3 +1,6 @@
[Описание на Русском](https://github.com/explosivebit/yii2-arangodb/blob/master/README.RU.md)
ArangoDb Extension for Yii 2 ArangoDb Extension for Yii 2
=========================== ===========================
@ -38,11 +41,11 @@ return [
'arangodb' => [ 'arangodb' => [
'class' => '\explosivebit\arangodb\Connection', 'class' => '\explosivebit\arangodb\Connection',
'connectionOptions' => [ 'connectionOptions' => [
triagens\ArangoDb\ConnectionOptions::OPTION_DATABASE => "mydatabase", ArangoDBClient\ConnectionOptions::OPTION_DATABASE => "mydatabase",
triagens\ArangoDb\ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529',
triagens\ArangoDb\ConnectionOptions::OPTION_AUTH_TYPE => 'Basic', ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE => 'Basic',
//triagens\ArangoDb\ConnectionOptions::OPTION_AUTH_USER => '', //ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER => '',
//triagens\ArangoDb\ConnectionOptions::OPTION_AUTH_PASSWD => '', //ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD => '',
], ],
], ],
], ],
@ -59,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();
@ -105,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' => [
@ -155,8 +158,36 @@ yii arangodb-migrate/create create_user_collection
# applies ALL new migrations # applies ALL new migrations
yii arangodb-migrate yii arangodb-migrate
# Apply 1 migration
yii arangodb-migrate/up 1
# reverts the last applied migration # reverts the last applied migration
yii arangodb-migrate/down yii arangodb-migrate/down
# Rollback 1 migration
yii arangodb-migrate/down 1
```
Once migration created, you can configure the migration:
When you start the migration as in the example below, you create a normal document collection with the migration name, you need to add an additional parameter `Type => 3` to create the `edge collection`. Example of such a query: `$this-> createCollection ('services', ['Type' => 3] );` If you want to create a document collection, then delete the `'Type' => 3` or replace the number 3 with 2.
```php
class m170413_210957_create_services_collection extends \explosivebit\arangodb\Migration
{
public function up()
{
# When you start the migration, a collection of "services" with the edge type is created
$this->createCollection('services',['Type' => 3]);
}
public function down()
{
# When the migration rollback starts, the collection "services"
$this->dropCollection('services');
}
}
``` ```

View File

@ -1,26 +1,45 @@
{ {
"name": "explosivebit/yii2-arangodb", "name": "mirzaev/yii2-arangodb",
"description": "Yii2 arangodb components", "description": "Library for connecting ArangoDB to Yii2",
"keywords": [
"Yii2",
"ArangoDB"
],
"type": "yii2-extension", "type": "yii2-extension",
"keywords": ["yii2","arangodb"], "license": "WTFPL",
"license": "GPL-3.0+", "homepage": "https://git.mirzaev.sexy/mirzaev/yii2-arangodb",
"authors": [ "authors": [
{
"name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy",
"role": "Programmer"
},
{ {
"name": "Ilya Rumyantsev", "name": "Ilya Rumyantsev",
"email": "explosivebit@gmail.com" "email": "explosivebit@gmail.com"
},
{
"name": "Alvian Burhanuddin",
"email": "alvianthelfarqy@gmail.com"
} }
], ],
"minimum-stability": "dev",
"require": { "require": {
"yiisoft/yii2": "*", "php": "^8.0.0",
"triagens/arangodb": "*" "yiisoft/yii2": "2.*",
"triagens/arangodb": "~3.2"
}, },
"require-dev": { "require-dev": {
"yiisoft/yii2-debug": "*" "yiisoft/yii2-debug": "*"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"explosivebit\\arangodb\\": "" "mirzaev\\yii2\\arangodb\\": "mirzaev/yii2/arangodb"
}
},
"autoload-dev": {
"psr-4": {
"mirzaev\\yii2\\arangodb\\tests\\": "mirzaev/yii2/arangodb/tests"
} }
} }
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
use Yii; use Yii;
use yii\db\ActiveQueryInterface; use yii\db\ActiveQueryInterface;
@ -20,7 +20,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
parent::__construct($config); parent::__construct($config);
} }
protected function buildQuery($query = null, $params = []) protected function genQuery($query = null, array $params = [])
{ {
if ($this->primaryModel !== null) { if ($this->primaryModel !== null) {
// lazy loading // lazy loading
@ -46,7 +46,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
} }
} }
return parent::buildQuery($query, $params); return parent::genQuery($query, $params);
} }
private function createModels($rows) private function createModels($rows)
@ -103,17 +103,21 @@ class ActiveQuery extends Query implements ActiveQueryInterface
public function all($db = null) public function all($db = null)
{ {
$statement = $this->createCommand($db); $statement = $this->createCommand($db);
$token = $this->getRawAql($statement); $token = $this->getRawAql($statement);
Yii::info($token, 'explosivebit\arangodb\Query::query');
Yii::info($token, 'mirzaev\yii2\arangodb\Query::query');
try { try {
Yii::beginProfile($token, 'explosivebit\arangodb\Query::query'); Yii::beginProfile($token, 'mirzaev\yii2\arangodb\Query::query');
$cursor = $statement->execute(); $cursor = $statement->execute();
$rows = $cursor->getAll(); $rows = $cursor->getAll();
Yii::endProfile($token, 'explosivebit\arangodb\Query::query'); Yii::endProfile($token, 'mirzaev\yii2\arangodb\Query::query');
} catch (\Exception $ex) { } catch (\Exception $ex) {
Yii::endProfile($token, 'explosivebit\arangodb\Query::query'); Yii::endProfile($token, 'mirzaev\yii2\arangodb\Query::query');
throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex);
} }
if (!empty($rows)) { if (!empty($rows)) {
$models = $this->createModels($rows); $models = $this->createModels($rows);
if (!empty($this->with)) { if (!empty($this->with)) {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
use Yii; use Yii;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
@ -102,13 +102,12 @@ 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::className(), [get_called_class()]); $query = Yii::createObject(ActiveQuery::class, [get_called_class()]);
$query->from(static::collectionName())->select(static::collectionName()); $query->in(static::collectionName())->select(static::collectionName());
return $query; return $query;
} }
@ -123,6 +122,14 @@ abstract class ActiveRecord extends BaseActiveRecord
$row = $row->getAll(); $row = $row->getAll();
} }
if (!is_iterable($row)) {
// Если нельзя обработать полученные данные
// Например, если прочитан NULL, то далее будет ошибка при обработке в foreach
// Реинициализация
$row = [];
}
parent::populateRecord($record, $row); parent::populateRecord($record, $row);
} }
@ -163,6 +170,7 @@ abstract class ActiveRecord extends BaseActiveRecord
if ($runValidation && !$this->validate($attributes)) { if ($runValidation && !$this->validate($attributes)) {
return false; return false;
} }
$result = $this->insertInternal($attributes, $options); $result = $this->insertInternal($attributes, $options);
return $result; return $result;
@ -182,7 +190,9 @@ abstract class ActiveRecord extends BaseActiveRecord
} }
$newId = static::getDb()->getDocumentHandler()->save(static::collectionName(), $values); $newId = static::getDb()->getDocumentHandler()->save(static::collectionName(), $values);
static::populateRecord($this, static::getDb()->getDocument(static::collectionName(), $newId)); static::populateRecord($this, static::getDb()->getDocument(static::collectionName(), $newId));
$this->setIsNewRecord(false); $this->setIsNewRecord(false);
$changedAttributes = array_fill_keys(array_keys($values), null); $changedAttributes = array_fill_keys(array_keys($values), null);
@ -210,8 +220,11 @@ abstract class ActiveRecord extends BaseActiveRecord
$this->afterSave(false, $values); $this->afterSave(false, $values);
return 0; return 0;
} }
$condition = $this->getOldPrimaryKey(true); $condition = $this->getOldPrimaryKey(true);
$lock = $this->optimisticLock(); $lock = $this->optimisticLock();
if ($lock !== null) { if ($lock !== null) {
if (!isset($values[$lock])) { if (!isset($values[$lock])) {
$values[$lock] = $this->$lock + 1; $values[$lock] = $this->$lock + 1;
@ -223,13 +236,18 @@ abstract class ActiveRecord extends BaseActiveRecord
$this->setAttribute($key, $attribute); $this->setAttribute($key, $attribute);
} }
$rows = (new Query())->options($options)->update( $rows = (new Query())
static::collectionName(), ->options($options)
$values, ->in(static::collectionName())
[ ->where(['_key' => $this->getOldAttribute('_key')])
'_key' => $this->getOldAttribute('_key'), ->update(
] array_merge(
); $values,
[
'_key' => $this->getOldAttribute('_key'),
]
)
);
if ($lock !== null && !$rows) { if ($lock !== null && !$rows) {
throw new StaleObjectException('The object being updated is outdated.'); throw new StaleObjectException('The object being updated is outdated.');
@ -251,7 +269,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/ */
public static function getDb() public static function getDb()
{ {
return \Yii::$app->get('arangodb'); return Yii::$app->get('arangodb');
} }
protected static function findByCondition($condition) protected static function findByCondition($condition)
@ -291,7 +309,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/ */
public static function updateAll($attributes, $condition = [], $options = []) public static function updateAll($attributes, $condition = [], $options = [])
{ {
return (new Query())->options($options)->update(static::collectionName(), $attributes, $condition); return (new Query())->options($options)->in(static::collectionName())->update($attributes, $condition);
} }
/** /**
@ -312,7 +330,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/ */
public static function deleteAll($condition = [], $options = []) public static function deleteAll($condition = [], $options = [])
{ {
return (new Query())->options($options)->remove(static::collectionName(), $condition); return (new Query())->options($options)->in(static::collectionName())->remove($condition);
} }
public static function truncate() public static function truncate()
@ -362,6 +380,7 @@ abstract class ActiveRecord extends BaseActiveRecord
public function delete($options = []) public function delete($options = [])
{ {
$result = false; $result = false;
if ($this->beforeDelete()) { if ($this->beforeDelete()) {
$result = $this->deleteInternal($options); $result = $this->deleteInternal($options);
$this->afterDelete(); $this->afterDelete();
@ -377,14 +396,23 @@ abstract class ActiveRecord extends BaseActiveRecord
protected function deleteInternal($options = []) protected function deleteInternal($options = [])
{ {
$condition = $this->getOldPrimaryKey(true); $condition = $this->getOldPrimaryKey(true);
$lock = $this->optimisticLock(); $lock = $this->optimisticLock();
if ($lock !== null) { if ($lock !== null) {
$condition[$lock] = $this->$lock; $condition[$lock] = $this->$lock;
} }
$result = (new Query())->options($options)->remove(static::collectionName(), $condition);
$result = (new Query())
->options($options)
->in(static::collectionName())
->where($condition)
->remove();
if ($lock !== null && !$result) { if ($lock !== null && !$result) {
throw new StaleObjectException('The object being deleted is outdated.'); throw new StaleObjectException('The object being deleted is outdated.');
} }
$this->setOldAttributes(null); $this->setOldAttributes(null);
return $result; return $result;

View File

@ -1,15 +1,10 @@
<?php <?php
/**
* User: evgen-d
* Date: 08.10.14
* Time: 16:00
*/
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
use yii\base\Object; use yii\base\BaseObject;
class AqlExpression extends Object class AqlExpression extends BaseObject
{ {
/** /**
* @var string the AQL expression represented by this object * @var string the AQL expression represented by this object
@ -37,4 +32,3 @@ class AqlExpression extends Object
return $this->expression; return $this->expression;
} }
} }

View File

@ -1,18 +1,21 @@
<?php <?php
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
use ArangoDBClient\EdgeHandler;
use ArangoDBClient\Export;
use ArangoDBClient\GraphHandler;
use Yii; use Yii;
use triagens\ArangoDb\CollectionHandler; use ArangoDBClient\CollectionHandler;
use triagens\ArangoDb\ConnectionOptions; use ArangoDBClient\ConnectionOptions;
use triagens\ArangoDb\Document; use ArangoDBClient\Document;
use triagens\ArangoDb\DocumentHandler; use ArangoDBClient\DocumentHandler;
use triagens\ArangoDb\Statement; use ArangoDBClient\Statement;
use triagens\ArangoDb\UpdatePolicy; use ArangoDBClient\UpdatePolicy;
use yii\base\Object; use yii\base\BaseObject;
class Connection extends Object class Connection extends BaseObject
{ {
private $connection = null; private $connection = null;
@ -42,6 +45,10 @@ class Connection extends Object
private $collectionHandler = null; private $collectionHandler = null;
/** @var null|DocumentHandler $documentHandler */ /** @var null|DocumentHandler $documentHandler */
private $documentHandler = null; private $documentHandler = null;
/** @var null|EdgeHandler $documentHandler */
private $edgeHandler = null;
/** @var null|EdgeHandler $graphHandler */
private $graphHandler = null;
public function init() public function init()
{ {
@ -49,18 +56,28 @@ class Connection extends Object
$token = 'Opening ArangoDB connection: ' . $this->connectionOptions[ConnectionOptions::OPTION_ENDPOINT]; $token = 'Opening ArangoDB connection: ' . $this->connectionOptions[ConnectionOptions::OPTION_ENDPOINT];
try { try {
Yii::info($token, 'explosivebit\arangodb\Connection::open'); Yii::info($token, 'mirzaev\yii2\arangodb\Connection::open');
Yii::beginProfile($token, 'explosivebit\arangodb\Connection::open'); Yii::beginProfile($token, 'mirzaev\yii2\arangodb\Connection::open');
$this->connection = new \triagens\ArangoDb\Connection($this->connectionOptions); $this->connection = new \ArangoDBClient\Connection($this->connectionOptions);
$this->collectionHandler = new CollectionHandler($this->connection); $this->collectionHandler = new CollectionHandler($this->connection);
$this->documentHandler = new DocumentHandler($this->connection); $this->documentHandler = new DocumentHandler($this->connection);
Yii::endProfile($token, 'explosivebit\arangodb\Connection::open'); $this->edgeHandler = new EdgeHandler($this->connection);
$this->graphHandler = new GraphHandler($this->connection);
Yii::endProfile($token, 'mirzaev\yii2\arangodb\Connection::open');
} catch (\Exception $ex) { } catch (\Exception $ex) {
Yii::endProfile($token, 'explosivebit\arangodb\Connection::open'); Yii::endProfile($token, 'mirzaev\yii2\arangodb\Connection::open');
throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); throw new \Exception($ex->getMessage(), (int)$ex->getCode(), $ex);
} }
} }
/**
* @return EdgeHandler|null
*/
public function getGraphHandler(): EdgeHandler
{
return $this->graphHandler;
}
/** /**
* @return null|CollectionHandler * @return null|CollectionHandler
*/ */
@ -86,6 +103,14 @@ class Connection extends Object
return $this->documentHandler; return $this->documentHandler;
} }
/**
* @return null|EdgeHandler
*/
public function getEdgeHandler()
{
return $this->edgeHandler;
}
/** /**
* @param $collectionId * @param $collectionId
* @param $documentId * @param $documentId
@ -104,4 +129,12 @@ class Connection extends Object
{ {
return new Statement($this->connection, $options); return new Statement($this->connection, $options);
} }
/**
* @param array $options
* @return Export
*/
public function getExport($options = []) {
return new Export($this->connection, $options);
}
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
class Exception extends \yii\base\Exception class Exception extends \yii\base\Exception
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
use yii\base\Component; use yii\base\Component;
use yii\db\MigrationInterface; use yii\db\MigrationInterface;
@ -22,7 +22,8 @@ abstract class Migration extends Component implements MigrationInterface
public function init() public function init()
{ {
parent::init(); parent::init();
$this->db = Instance::ensure($this->db, Connection::className());
$this->db = Instance::ensure($this->db, Connection::class);
} }
public function execute($aql, $bindValues = [], $params = []) public function execute($aql, $bindValues = [], $params = [])
@ -86,4 +87,6 @@ abstract class Migration extends Component implements MigrationInterface
$this->db->getCollectionHandler()->truncate($collection); $this->db->getCollectionHandler()->truncate($collection);
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
} }
// Разработать создание графов и представлений
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,6 @@
<?php <?php
/**
* User: evgen-d
* Date: 08.10.14
* Time: 16:04
*/
namespace explosivebit\arangodb; namespace mirzaev\yii2\arangodb;
use yii\base\Arrayable; use yii\base\Arrayable;
@ -56,4 +51,3 @@ class Serializer
return $data; return $data;
} }
} }

View File

@ -1,11 +1,11 @@
<?php <?php
namespace explosivebit\arangodb\console\controllers; namespace mirzaev\yii2\arangodb\console\controllers;
use explosivebit\arangodb\Connection; use mirzaev\yii2\arangodb\Connection;
use explosivebit\arangodb\Exception; use mirzaev\yii2\arangodb\Exception;
use explosivebit\arangodb\Migration; use mirzaev\yii2\arangodb\Migration;
use explosivebit\arangodb\Query; use mirzaev\yii2\arangodb\Query;
use yii; use yii;
use yii\console\controllers\BaseMigrateController; use yii\console\controllers\BaseMigrateController;
@ -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

@ -1,9 +1,9 @@
<?php <?php
namespace explosivebit\arangodb\panels\arangodb; namespace mirzaev\yii2\arangodb\panels\arangodb;
use explosivebit\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;
@ -31,11 +31,11 @@ class ArangoDbPanel extends Panel
$target->messages, $target->messages,
Logger::LEVEL_PROFILE, Logger::LEVEL_PROFILE,
[ [
'explosivebit\arangodb\Query::query', 'mirzaev\yii2\arangodb\Query::query',
'explosivebit\arangodb\Query::insert', 'mirzaev\yii2\arangodb\Query::insert',
'explosivebit\arangodb\Query::update', 'mirzaev\yii2\arangodb\Query::update',
'explosivebit\arangodb\Query::remove', 'mirzaev\yii2\arangodb\Query::remove',
'explosivebit\arangodb\Query::execute', 'mirzaev\yii2\arangodb\Query::execute',
] ]
); );
} }
@ -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,
@ -136,15 +136,15 @@ class ArangoDbPanel extends Panel
protected function getQueryType($category) { protected function getQueryType($category) {
switch ($category) { switch ($category) {
case 'explosivebit\arangodb\Query::query' : case 'mirzaev\yii2\arangodb\Query::query' :
return 'SELECT'; return 'SELECT';
case 'explosivebit\arangodb\Query::insert' : case 'mirzaev\yii2\arangodb\Query::insert' :
return 'INSERT'; return 'INSERT';
case 'explosivebit\arangodb\Query::update' : case 'mirzaev\yii2\arangodb\Query::update' :
return 'UPDATE'; return 'UPDATE';
case 'explosivebit\arangodb\Query::remove' : case 'mirzaev\yii2\arangodb\Query::remove' :
return 'REMOVE'; return 'REMOVE';
case 'explosivebit\arangodb\Query::execute' : case 'mirzaev\yii2\arangodb\Query::execute' :
return 'EXECUTE'; return 'EXECUTE';
default : default :
return ''; return '';
@ -155,4 +155,4 @@ class ArangoDbPanel extends Panel
{ {
return ['arango-messages' => $this->getProfileLogs()]; return ['arango-messages' => $this->getProfileLogs()];
} }
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace explosivebit\arangodb\panels\arangodb\models; namespace mirzaev\yii2\arangodb\panels\arangodb\models;
use yii; use yii;
use yii\data\ArrayDataProvider; use yii\data\ArrayDataProvider;

View File

@ -0,0 +1,32 @@
<?php
/**
* This view is used by console/controllers/MigrateController.php
* The following variables are available in this view:
*/
/* @var $className string the new migration class name */
echo <<<HTML
<?php
use mirzaev\yii2\arangodb\Migration;
class $className extends Migration
{
public function up()
{
/**
* @param string Название коллекции
* @param array Тип коллекции (2 - документ, 3 - ребро)
*/
\$this->createCollection('$className', ['type' => 2]);
}
public function down()
{
\$this->dropCollection('$className');
}
}
HTML;
?>

View File

@ -1,22 +0,0 @@
<?php
/**
* This view is used by console/controllers/MigrateController.php
* The following variables are available in this view:
*/
/* @var $className string the new migration class name */
echo "<?php\n";
?>
class <?= $className ?> extends \explosivebit\arangodb\Migration
{
public function up()
{
$this->createCollection('<?= $className ?>',[]);
}
public function down()
{
$this->dropCollection('<?= $className ?>');
}
}