*/ class core extends model { /** * ArangoDB connection daa * * @var string ARANGODB Path to the file with ArangoDB session connection data */ final public const string ARANGODB = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'settings' . DIRECTORY_SEPARATOR . 'arangodb.php'; /** * ArangoDB * * @var arangodb $arangodb Instance of the ArangoDB session */ protected static arangodb $arangodb; /** * Constructor * * @param bool $initialize Initialize a model? * @param ?arangodb $arangodb Instance of the ArangoDB session * * @return void */ public function __construct(bool $initialize = true, ?arangodb $arangodb = null) { // For the extends system parent::__construct($initialize); if ($initialize) { // Initializing is requested // Writing an instance of a session of ArangoDB to the property self::$arangodb = $arangodb ?? new arangodb(require static::ARANGODB); } } /** * Read document from ArangoDB * * @param string $filter Expression for filtering (AQL) * @param string $sort Expression for sorting (AQL) * @param int $amount Amount of documents for collect * @param int $page Page * @param string $return Expression describing the parameters to return (AQL) * @param array $parameters Binded parameters for placeholders ['placeholder' => parameter] * @param array &$errors Registry of errors * * @return mixed An array of instances of documents from ArangoDB, if they are found */ public static function _read( string $filter = '', string $sort = 'd.created DESC, d._key DESC', int $amount = 1, int $page = 1, string $return = 'd', array $parameters = [], array &$errors = [] ): _document|static|array|null { try { if (collection::initialize(static::COLLECTION, static::TYPE)) { // Initialized the collection // Read from ArangoDB $result = collection::execute( sprintf( <<<'AQL' FOR d IN @@collection %s %s LIMIT @offset, @amount RETURN %s AQL, empty($filter) ? '' : "FILTER $filter", empty($sort) ? '' : "SORT $sort", empty($return) ? 'd' : $return ), [ '@collection' => static::COLLECTION, 'offset' => --$page <= 0 ? 0 : $page * $amount, 'amount' => $amount ] + $parameters, errors: $errors ); if ($amount === 1 && $result instanceof _document) { // Received only 1 document and @todo rebuild // Initializing the object $object = new static; if (method_exists($object, '__document')) { // Object can implement a document from ArangoDB // Writing the instance of document from ArangoDB to the implement object $object->__document($result); // Exit (success) return $object; } } // Exit (success) return $result; } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); } catch (exception $e) { // Writing to registry of errors $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } // Exit (fail) return null; } /** * Write * * @param string $name Name of the property * @param mixed $value Value of the property * * @return void */ public function __set(string $name, mixed $value = null): void { match ($name) { 'arangodb' => (function () use ($value) { if (isset(static::$arangodb)) throw new exception('Forbidden to reinitialize the ArangoDB session($this::$arangodb)', status::internal_server_error->value); else if ($value instanceof arangodb) self::$arangodb = $value; else throw new exception('Session of connection to ArangoDB ($this::$arangodb) is need to be mirzaev\arangodb\connection', status::internal_server_error->value); })(), default => parent::__set($name, $value) }; } /** * Read * * @param string $name Name of the property * * @return mixed Content of the property, if they are found */ public function __get(string $name): mixed { return match ($name) { default => parent::__get($name) }; } /** * Delete * * @param string $name Name of the property * * @return void */ public function __unset(string $name): void { // Deleting a property and exit (success) parent::__unset($name); } /** * Check of initialization * * @param string $name Name of the property * * @return bool The property is initialized? */ public function __isset(string $name): bool { // Check of initialization of the property and exit (success) return parent::__isset($name); } /** * Call a static property or method * * @param string $name Name of the property or the method * @param array $arguments Arguments for the method */ public static function __callStatic(string $name, array $arguments): mixed { return match ($name) { 'arangodb' => (new static)->__get('arangodb'), default => throw new exception("Not found: $name", 500) }; } }