*/ class core extends model { /** * Postfix for name of models files */ final public const POSTFIX = ''; /** * Path to the file with settings of connecting to the ArangoDB */ final public const ARANGODB = '../settings/arangodb.php'; /** * Instance of the session of ArangoDB */ protected static arangodb $arangodb; /** * Name of the collection in ArangoDB */ public const COLLECTION = 'THIS_COLLECTION_SHOULD_NOT_EXIST_REPLACE_IT_IN_THE_MODEL'; /** * Constructor of an instance * * @param bool $initialize Initialize a model? * @param ?arangodb $arangodb Instance of a session of ArangoDB * * @return void */ public function __construct(bool $initialize = true, ?arangodb $arangodb = null) { // For the extends system parent::__construct($initialize); if ($initialize) { // Initializing is requested if (isset($arangodb)) { // Recieved an instance of a session of ArangoDB // Write an instance of a session of ArangoDB to the property $this->__set('arangodb', $arangodb); } else { // Not recieved an instance of a session of ArangoDB // Initializing of an instance of a session of ArangoDB $this->__get('arangodb'); } } } /** * Read 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 &$errors The registry on errors * * @return _document|array|null 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 &$errors = [] ): _document|array|null { try { if (collection::init(static::$arangodb->session, static::COLLECTION)) { // Initialized the collection // Read from ArangoDB and exit (success) return collection::search( static::$arangodb->session, sprintf( <<<'AQL' FOR d IN %s %s %s LIMIT %d, %d RETURN %s AQL, static::COLLECTION, empty($filter) ? '' : "FILTER $filter", empty($sort) ? '' : "SORT $sort", --$page <= 0 ? 0 : $amount * $page, $amount, $return ) ); } else throw new exception('Failed to initialize the collection'); } catch (exception $e) { // Write to the registry of errors $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } // Exit (fail) return null; } /** * Delete from ArangoDB * * @param _document $instance Instance of the document from ArangoDB * @param array &$errors The registry on errors * * @return bool Deleted from ArangoDB without errors? */ public static function delete(_document $instance, array &$errors = []): bool { try { if (collection::init(static::$arangodb->session, static::COLLECTION)) { // Initialized the collection // Delete from ArangoDB and exit (success) return (new _document_handler(static::$arangodb->session))->remove($instance); } else throw new exception('Failed to initialize the collection'); } catch (exception $e) { // Write to the registry of errors $errors[] = [ 'text' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stack' => $e->getTrace() ]; } // Exit (fail) return false; } /** * Update in ArangoDB * * @param _document $instance Instance of the document from ArangoDB * * @return bool Writed to ArangoDB without errors? */ public static function update(_document $instance): bool { // Update in ArangoDB and exit (success) return document::update(static::$arangodb->session, $instance); } /** * 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 ($this->__isset('arangodb')) { // Is alredy initialized // Exit (fail) throw new exception('Forbidden to reinitialize the session of ArangoDB ($this::$arangodb)', 500); } else { // Is not already initialized if ($value instanceof arangodb) { // Recieved an appropriate value // Write the property and exit (success) self::$arangodb = $value; } else { // Recieved an inappropriate value // Exit (fail) throw new exception('Session of ArangoDB ($this::$arangodb) is need to be mirzaev\arangodb\connection', 500); } } })(), 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) { 'arangodb' => (function () { try { if (!$this->__isset('arangodb')) { // Is not initialized // Initializing of a default value from settings $this->__set('arangodb', new arangodb(require static::ARANGODB)); } // Exit (success) return self::$arangodb; } catch (exception) { // Exit (fail) return null; } })(), 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 { match ($name) { 'arangodb' => (new static)->__get('arangodb'), default => throw new exception("Not found: $name", 500) }; } }