13 Commits
0.5.0 ... 1.3.0

9 changed files with 325 additions and 2375 deletions

2
.gitignore vendored Normal file → Executable file
View File

@@ -1 +1,3 @@
vendor
composer.lock
!.gitignore

11
LICENSE Normal file
View File

@@ -0,0 +1,11 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

3
README.md Normal file
View File

@@ -0,0 +1,3 @@
# PHP 8.2 Framework for working with ArangoDB
🤟 Very simple and flexible, easy to scale and integrate

82
composer.json Normal file → Executable file
View File

@@ -1,35 +1,47 @@
{
"name": "mirzaev/arangodb",
"description": "Реализация управления хранилищем данных ArangoDB",
"keywords": [
"ArangoDB"
],
"type": "library",
"license": "WTFPL",
"homepage": "https://git.hood.su/mirzaev/arangodb",
"authors": [
{
"name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy",
"role": "Developer"
}
],
"require": {
"php": "^8.1",
"triagens/arangodb": "~3.8"
},
"require-dev": {
"phpunit/phpunit": "^9.3.3"
},
"autoload": {
"psr-4": {
"mirzaev\\arangodb\\": "mirzaev/arangodb/system"
}
},
"autoload-dev": {
"psr-4": {
"mirzaev\\arangodb\\tests\\": "mirzaev/arangodb/tests"
}
}
}
{
"name": "mirzaev/arangodb",
"description": "Simple PHP-framework for ArangoDB",
"readme": "README.md",
"keywords": [
"ArangoDB"
],
"type": "library",
"license": "WTFPL",
"homepage": "https://git.hood.su/mirzaev/arangodb",
"authors": [
{
"name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy",
"role": "Developer"
}
],
"support": {
"email": "arsen@mirzaev.sexy",
"wiki": "https://git.mirzaev.sexy/mirzaev/arangodb/manual",
"issues": "https://git.mirzaev.sexy/mirzaev/arangodb/issues"
},
"funding": [
{
"type": "funding",
"url": "https://fund.mirzaev.sexy"
}
],
"require": {
"php": "^8.2",
"triagens/arangodb": "~3.8"
},
"require-dev": {
"phpunit/phpunit": "^9.3.3"
},
"autoload": {
"psr-4": {
"mirzaev\\arangodb\\": "mirzaev/arangodb/system"
}
},
"autoload-dev": {
"psr-4": {
"mirzaev\\arangodb\\tests\\": "mirzaev/arangodb/tests"
}
}
}

2098
composer.lock generated

File diff suppressed because it is too large Load Diff

243
mirzaev/arangodb/system/collection.php Normal file → Executable file
View File

@@ -1,118 +1,125 @@
<?php
declare(strict_types=1);
namespace mirzaev\arangodb;
use mirzaev\arangodb\terminal;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Collection as _collection;
use ArangoDBClient\Statement as _statement;
use ArangoDBClient\Document as _document;
use ArangoDBClient\CollectionHandler as _collection_handler;
/**
* Коллекция
*
* @package mirzaev\arangodb
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class collection
{
/**
* Инициализация
*
* @param _connection $session Сессия соединения с базой данных
* @param string $name Название
* @param bool $edge Обрабатывать как ребро? (иначе: вершина)
* @param ?terminal $terminal Инстанция терминала
*
* @return string|null Идентификатор коллекции
*/
public static function init(_connection $session, string $name, bool $edge = false, ?terminal $terminal = null): ?string
{
// Инициализация
$collections = new _collection_handler($session);
if (!$collections->has($name)) {
// Не найдана коллекция
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Коллекция \"$name\" не найдена");
// Запись коллекции на сервер и его ответ в буфер возврата
$id = $collections->create($name, ['type' => $edge ? _collection::TYPE_EDGE : _collection::TYPE_DOCUMENT]);
if ($collections->has($name)) {
// Коллекция найдена (записана)
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Создана коллекция \"$name\" с типом " . ($edge ? 'ребро' : 'документ'));
// Возврат идентификатора коллекции
return $id;
}
} else {
// Найдена коллекция
// Возврат идентификатора коллекции
return $name;
}
return null;
}
/**
* Поиск
*
* @param _connection $session Сессия соединения с базой данных
* @param string $query AQL-запрос
*
* @return _document|null Инстанция документа
*/
public static function search(_connection $session, string $query): ?_document
{
// Поиск журнала
$journal = (new _statement(
$session,
[
'query' => $query,
"batchSize" => 1000,
"sanitize" => true
]
))->execute();
// Инициализация буфера вывода
$buffer = [];
foreach ($journal as $key => $value) {
$buffer[$key] = $value;
}
return $buffer[0] ?? null;
}
/**
* Очистка
*
* @param _connection $session Сессия соединения с базой данных
* @param string $name Название
*
* @return bool Статус выполнения
*/
public static function truncate(_connection $session, string $name): bool
{
// Инициализация
$collections = new _collection_handler($session);
if ($collections->has($name)) {
// Найдена коллекция
// Очистка
return $collections->truncate($name);
}
return false;
}
}
<?php
declare(strict_types=1);
namespace mirzaev\arangodb;
use mirzaev\arangodb\terminal;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Collection as _collection;
use ArangoDBClient\Statement as _statement;
use ArangoDBClient\Document as _document;
use ArangoDBClient\CollectionHandler as _collection_handler;
/**
* Коллекция
*
* @package mirzaev\arangodb
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class collection
{
/**
* Инициализация
*
* @param _connection $session Сессия соединения с базой данных
* @param string $name Название
* @param bool $edge Обрабатывать как ребро? (иначе: вершина)
* @param ?terminal $terminal Инстанция терминала
*
* @return string|null Идентификатор коллекции
*/
public static function init(_connection $session, string $name, bool $edge = false, ?terminal $terminal = null): ?string
{
// Инициализация
$collections = new _collection_handler($session);
if (!$collections->has($name)) {
// Не найдана коллекция
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Коллекция \"$name\" не найдена");
// Запись коллекции на сервер и его ответ в буфер возврата
$id = $collections->create($name, ['type' => $edge ? _collection::TYPE_EDGE : _collection::TYPE_DOCUMENT]);
if ($collections->has($name)) {
// Коллекция найдена (записана)
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Создана коллекция \"$name\" с типом " . ($edge ? 'ребро' : 'документ'));
// Возврат идентификатора коллекции
return $id;
}
} else {
// Найдена коллекция
// Возврат идентификатора коллекции
return $name;
}
return null;
}
/**
* Поиск
*
* @param _connection $session Сессия соединения с базой данных
* @param string $query AQL-запрос
* @param array $binds Binds for query [bind => value]
*
* @return _document|array|string|int|null Инстанция документа
*/
public static function search(_connection $session, string $query, array $binds = []): _document|string|array|int|null
{
// Statement instance initialization
$instance = new _statement(
$session,
[
'query' => $query,
"batchSize" => 1000,
"sanitize" => true
]
);
// Binds application
$instance->bind($binds);
// Sending the request
$response = $instance->execute();
// Инициализация буфера вывода
$buffer = [];
foreach ($response->getAll() as $key => $value) {
$buffer[$key] = $value;
}
return is_array($buffer) && count($buffer) > 1 ? $buffer : $buffer[0] ?? null;
}
/**
* Очистка
*
* @param _connection $session Сессия соединения с базой данных
* @param string $name Название
*
* @return bool Статус выполнения
*/
public static function truncate(_connection $session, string $name): bool
{
// Инициализация
$collections = new _collection_handler($session);
if ($collections->has($name)) {
// Найдена коллекция
// Очистка
return $collections->truncate($name);
}
return false;
}
}

0
mirzaev/arangodb/system/connection.php Normal file → Executable file
View File

215
mirzaev/arangodb/system/document.php Normal file → Executable file
View File

@@ -1,101 +1,114 @@
<?php
declare(strict_types=1);
namespace mirzaev\arangodb;
use mirzaev\arangodb\terminal;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Document as _document;
use ArangoDBClient\Edge as _edge;
use ArangoDBClient\DocumentHandler as _document_handler;
use ArangoDBClient\EdgeHandler as _edge_handler;
/**
* Документ
*
* @package mirzaev\arangodb
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class document
{
/**
* Записать
*
* @param _connection $session Сессия соединения с базой данных
* @param string $collection Коллекция
* @param ?array $data Данные
* @param ?array $metadata Метаданные
* @param bool $check Проверка на запись в базу данных
* @param ?terminal $terminal Инстанция терминала
*
* @return string|null Идентификатор
*/
public static function write(_connection $session, string $collection, ?array $data = [], ?array $metadata = [], bool $check = true, ?terminal $terminal = null): ?string
{
// Инициализация коллекции
collection::init($session, $collection, isset($metadata['_from'], $metadata['_to']));
if (isset($metadata['_from'], $metadata['_to'])) {
// Ребро
// Инициализация обработчика рёбер
$documents = new _edge_handler($session);
// Инициализация ребра
$document = new _edge();
// Инициализация вершин
$_from = $metadata['_from'];
$_to = $metadata['_to'];
// Деинициализация из входных данных
unset($metadata['_from'], $metadata['_to']);
} else {
// Вершина
// Инициализация обработчика вершин
$documents = new _document_handler($session);
// Инициализация вершины
$document = new _document();
}
foreach (['data' => $data, 'metadata' => ($metadata ?? []) + ['created' => time()]] as $key => $value) {
// Перебор параметров
// Запись в инстанцию документа
$document->set($key, $value);
}
// Запись на сервер и его ответ в буфер возврата
$id = isset($_from, $_to) ? $documents->saveEdge($collection, $_from, $_to, $document) : $documents->insert($collection, $document);
if ($check && $terminal instanceof terminal && $documents->has($collection, $id)) {
// Документ записан
// Запись в вывод
$terminal::write("В коллекции \"$collection\" создан документ \"$id\"");
}
// Возврат идентификатора коллекции
return $id;
}
/**
* Обновить
*
* @param _connection $session Сессия соединения с базой данных
* @param _document $document Инстанция документа вершины
*
* @return bool Статус обработки
*/
public static function update(_connection $session, _document $document): bool {
// Инициализация обработчика вершин
$documents = new _document_handler($session);
// Запись в базу данных
return $documents->update($document);
}
}
<?php
declare(strict_types=1);
namespace mirzaev\arangodb;
use mirzaev\arangodb\terminal;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Document as _document;
use ArangoDBClient\Edge as _edge;
use ArangoDBClient\DocumentHandler as _document_handler;
use ArangoDBClient\EdgeHandler as _edge_handler;
/**
* Документ
*
* @package mirzaev\arangodb
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class document
{
/**
* Записать
*
* @param _connection $session Сессия соединения с базой данных
* @param string $collection Коллекция
* @param ?array $data Данные
* @param bool $check Проверка на запись в базу данных
* @param ?terminal $terminal Инстанция терминала
*
* @return string|null Идентификатор
*/
public static function write(_connection $session, string $collection, ?array $data = [], bool $check = false, ?terminal $terminal = null): ?string
{
// Инициализация коллекции
collection::init($session, $collection, isset($data['_from'], $data['_to']));
if (isset($data['_from'], $data['_to'])) {
// Ребро
// Инициализация обработчика рёбер
$documents = new _edge_handler($session);
// Инициализация ребра
$document = new _edge();
// Инициализация вершин
$_from = $data['_from'];
$_to = $data['_to'];
// Деинициализация из входных данных
unset($data['_from'], $data['_to']);
} else {
// Вершина
// Инициализация обработчика вершин
$documents = new _document_handler($session);
// Инициализация вершины
$document = new _document();
}
// Инициализация даты создания
$created = time();
foreach (['created' => $created, 'updated' => $created] + $data as $key => $value) {
// Перебор параметров
// Запись в инстанцию документа
$document->set($key, $value);
}
// Запись на сервер и его ответ в буфер возврата
$id = isset($_from, $_to) ? $documents->saveEdge($collection, $_from, $_to, $document) : $documents->insert($collection, $document);
if ($check && $documents->has($collection, $id)) {
// Найден записанный документ
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" создан документ \"$id\"");
} else if ($check) {
// Не найден записанный документ
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" не удалось найти созданный или создать документ");
return null;
}
// Возврат идентификатора коллекции
return $id;
}
/**
* Обновить
*
* @param _connection $session Сессия соединения с базой данных
* @param _document $document Инстанция документа вершины
*
* @return bool Статус обработки
*/
public static function update(_connection $session, _document $document): bool
{
// Инициализация обработчика вершин
$documents = new _document_handler($session);
// Запись даты обновления в инстанцию документа
$document->set('updated', time());
// Запись в базу данных
return $documents->update($document);
}
}

46
mirzaev/arangodb/system/terminal.php Normal file → Executable file
View File

@@ -1,23 +1,23 @@
<?php
declare(strict_types=1);
namespace mirzaev\arangodb;
class terminal
{
/**
* Префикс
*/
protected const PREFIX = 'arangodb';
/**
* Запись в вывод
*
* @param string $text Текст сообщения
*/
public static function write(string $text): void
{
echo sprintf("[%s] $text\n", self::PREFIX);
}
}
<?php
declare(strict_types=1);
namespace mirzaev\arangodb;
class terminal
{
/**
* Префикс
*/
protected const PREFIX = 'arangodb';
/**
* Запись в вывод
*
* @param string $text Текст сообщения
*/
public static function write(string $text): void
{
echo sprintf("[%s] $text\n", self::PREFIX);
}
}